From a975de9ea9108d5489d9d4ce733a6ffc2ae61bed Mon Sep 17 00:00:00 2001 From: Neloreck Date: Sun, 25 Jun 2023 03:31:32 +0300 Subject: [PATCH 01/12] Added tests for `getConfigSwitchConditions`. --- src/engine/core/utils/ini/config.test.ts | 240 ++++++++++++++++++++-- src/engine/core/utils/ini/config.ts | 17 +- src/engine/core/utils/scheme/setup.ts | 2 +- src/fixtures/engine/mocks/scheme.mocks.ts | 11 + src/fixtures/lua/index.ts | 1 + src/fixtures/lua/mocks/index.ts | 1 + src/fixtures/lua/mocks/lua_utils.ts | 4 +- 7 files changed, 246 insertions(+), 30 deletions(-) create mode 100644 src/fixtures/lua/mocks/index.ts diff --git a/src/engine/core/utils/ini/config.test.ts b/src/engine/core/utils/ini/config.test.ts index 54f476aa7..89b4bba5d 100644 --- a/src/engine/core/utils/ini/config.test.ts +++ b/src/engine/core/utils/ini/config.test.ts @@ -1,9 +1,12 @@ import { describe, expect, it } from "@jest/globals"; +import { registerStoryLink } from "@/engine/core/database"; import { IBaseSchemeLogic } from "@/engine/core/schemes"; -import { addConditionToList } from "@/engine/core/utils/ini/config"; -import { LuaArray, TIndex } from "@/engine/lib/types"; -import { luaTableToObject } from "@/fixtures/lua/mocks/lua_utils"; +import { addConditionToList, getConfigSwitchConditions, parseConditionsList } from "@/engine/core/utils/ini"; +import { LuaArray, ServerObject, TIndex } from "@/engine/lib/types"; +import { mockBaseSchemeLogic } from "@/fixtures/engine"; +import { luaTableToArray, luaTableToObject } from "@/fixtures/lua"; +import { mockIniFile, mockServerAlifeObject } from "@/fixtures/xray"; describe("'config' utils for ini file", () => { it("'addCondition' util should fill table and return new index", () => { @@ -33,21 +36,220 @@ describe("'config' utils for ini file", () => { expect(firstIndex).toBe(2); expect(secondIndex).toBe(3); - expect(luaTableToObject(list)).toEqual({ - "1": { - condlist: {}, - name: "first", - npc_id: 123, - v1: 1, - v2: null, - }, - "2": { - condlist: {}, - name: "second", - npc_id: 333, - v1: "a", - v2: "b", - }, - }); + expect(luaTableToArray(list)).toEqual([ + luaTableToObject( + mockBaseSchemeLogic({ + name: "first", + npc_id: 123, + v1: 1, + }) + ), + luaTableToObject( + mockBaseSchemeLogic({ + name: "second", + npc_id: 333, + v1: "a", + v2: "b", + }) + ), + ]); + }); + + it("getConfigSwitchConditions correctly parse empty/other ini files conditions", () => { + expect( + getConfigSwitchConditions( + mockIniFile("test.ltx", { + existing: { + on_signal: "true", + }, + }), + "not_existing" + ) + ).toBeNull(); + + expect( + luaTableToObject( + getConfigSwitchConditions( + mockIniFile("test.ltx", { + existing: {}, + }), + "existing" + ) + ) + ).toEqual({}); + + expect( + luaTableToObject( + getConfigSwitchConditions( + mockIniFile("test.ltx", { + existing: { + first: 1, + second: "b", + }, + }), + "existing" + ) + ) + ).toEqual({}); + }); + + it("getConfigSwitchConditions correctly parse different listed conditions", () => { + expect( + luaTableToArray( + getConfigSwitchConditions( + mockIniFile("test.ltx", { + existing: { + another: 1, + something: "else", + on_actor_dist_le: "3 | {=actor_has_weapon} remark", + }, + }), + "existing" + ) + ) + ).toEqual([ + luaTableToObject( + mockBaseSchemeLogic({ + v1: 3, + name: "on_actor_dist_le", + condlist: parseConditionsList("{=actor_has_weapon} remark"), + }) + ), + ]); + + expect( + luaTableToArray( + getConfigSwitchConditions( + mockIniFile("test.ltx", { + existing: { + on_actor_dist_le_nvis: "31 | {=actor_condition} value", + on_actor_dist_ge: "55 | {=another_cond} another", + }, + }), + "existing" + ) + ) + ).toEqual([ + luaTableToObject( + mockBaseSchemeLogic({ + v1: 31, + name: "on_actor_dist_le_nvis", + condlist: parseConditionsList("{=actor_condition} value"), + }) + ), + luaTableToObject( + mockBaseSchemeLogic({ + v1: 55, + name: "on_actor_dist_ge", + condlist: parseConditionsList("{=another_cond} another"), + }) + ), + ]); + + const serverObject: ServerObject = mockServerAlifeObject(); + + registerStoryLink(serverObject.id, "test-cfg-sid"); + + expect( + luaTableToArray( + getConfigSwitchConditions( + mockIniFile("test.ltx", { + existing: { + on_actor_dist_ge_nvis: "100|test1", + on_signal: "anim_end|test2", + on_info: "{+pri_a28_infop} test3", + on_timer: "50|test4", + on_game_timer: "10|test5", + on_actor_in_zone: "zat_b38|test7", + on_actor_not_in_zone: "zat_b38|test8", + on_actor_inside: "test9", + on_actor_outside: "test10", + on_npc_in_zone: "test-cfg-sid|jup_hide_a6|test11", + on_npc_not_in_zone: "test-cfg-sid|jup_hide_a6|test12", + }, + }), + "existing" + ) + ) + ).toEqual([ + luaTableToObject( + mockBaseSchemeLogic({ + v1: 100, + name: "on_actor_dist_ge_nvis", + condlist: parseConditionsList("test1"), + }) + ), + luaTableToObject( + mockBaseSchemeLogic({ + v1: "anim_end", + name: "on_signal", + condlist: parseConditionsList("test2"), + }) + ), + luaTableToObject( + mockBaseSchemeLogic({ + name: "on_info", + condlist: parseConditionsList("{+pri_a28_infop} test3"), + }) + ), + luaTableToObject( + mockBaseSchemeLogic({ + v1: 50, + name: "on_timer", + condlist: parseConditionsList("test4"), + }) + ), + luaTableToObject( + mockBaseSchemeLogic({ + v1: 10, + name: "on_game_timer", + condlist: parseConditionsList("test5"), + }) + ), + luaTableToObject( + mockBaseSchemeLogic({ + v1: "zat_b38", + name: "on_actor_in_zone", + condlist: parseConditionsList("test7"), + }) + ), + luaTableToObject( + mockBaseSchemeLogic({ + v1: "zat_b38", + name: "on_actor_not_in_zone", + condlist: parseConditionsList("test8"), + }) + ), + luaTableToObject( + mockBaseSchemeLogic({ + name: "on_actor_inside", + condlist: parseConditionsList("test9"), + }) + ), + luaTableToObject( + mockBaseSchemeLogic({ + name: "on_actor_outside", + condlist: parseConditionsList("test10"), + }) + ), + luaTableToObject( + mockBaseSchemeLogic({ + v1: "test-cfg-sid", + v2: "jup_hide_a6", + npc_id: serverObject.id, + name: "on_npc_in_zone", + condlist: parseConditionsList("test11"), + }) + ), + luaTableToObject( + mockBaseSchemeLogic({ + v1: "test-cfg-sid", + v2: "jup_hide_a6", + npc_id: serverObject.id, + name: "on_npc_not_in_zone", + condlist: parseConditionsList("test12"), + }) + ), + ]); }); }); diff --git a/src/engine/core/utils/ini/config.ts b/src/engine/core/utils/ini/config.ts index adb41ffdb..c440b57e5 100644 --- a/src/engine/core/utils/ini/config.ts +++ b/src/engine/core/utils/ini/config.ts @@ -273,37 +273,38 @@ export function getObjectConfigOverrides(ini: IniFile, section: TSection, object } /** - * todo - * todo - * todo * Get switch conditions for provided scheme section like `mob_home@2`. * Parses all possible switch cases for checking and switching later if conditions are satisfied. + * + * @param ini - target ini config file + * @param section - section in ini file to read + * @return optional list of scheme logic switcher descriptors */ export function getConfigSwitchConditions(ini: IniFile, section: TSection): Optional> { const conditionsList: LuaArray = new LuaTable(); - let index: TIndex = 1; if (!ini.section_exist(tostring(section))) { return null; } const linesCount: TCount = ini.line_count(section); + let index: TIndex = 1; function addConditions( func: (ini: IniFile, section: TSection, id: TStringId) => Optional, cond: ESchemeCondition ): void { for (const lineNumber of $range(0, linesCount - 1)) { - const [, id, value] = ini.r_line(section, lineNumber, "", ""); - const [searchIndex] = string.find(id, "^" + cond + "%d*$"); + const [, key] = ini.r_line(section, lineNumber, "", ""); + const [searchIndex] = string.find(key, "^" + cond + "%d*$"); if (searchIndex !== null) { - index = addConditionToList(conditionsList, index, func(ini, section, id)); + index = addConditionToList(conditionsList, index, func(ini, section, key)); } } } - // todo: Move conditions to enum. + // todo: Move conditions to enum/switcher object? addConditions(readIniNumberAndConditionList, ESchemeCondition.ON_ACTOR_DISTANCE_LESS_THAN); addConditions(readIniNumberAndConditionList, ESchemeCondition.ON_ACTOR_DISTANCE_LESS_THAN_NOT_VISIBLE); addConditions(readIniNumberAndConditionList, ESchemeCondition.ON_ACTOR_DISTANCE_GREATER_THAN); diff --git a/src/engine/core/utils/scheme/setup.ts b/src/engine/core/utils/scheme/setup.ts index de2988cab..8c9541a20 100644 --- a/src/engine/core/utils/scheme/setup.ts +++ b/src/engine/core/utils/scheme/setup.ts @@ -1,6 +1,6 @@ import { stalker_ids, world_property } from "xray16"; -import { IRegistryObjectState, registry } from "@/engine/core/database"; +import { registry } from "@/engine/core/database"; import { EEvaluatorId, TAbstractSchemeConstructor } from "@/engine/core/schemes"; import { assert } from "@/engine/core/utils/assertion"; import { LuaLogger } from "@/engine/core/utils/logging"; diff --git a/src/fixtures/engine/mocks/scheme.mocks.ts b/src/fixtures/engine/mocks/scheme.mocks.ts index 6ce4297a9..c3ce1c398 100644 --- a/src/fixtures/engine/mocks/scheme.mocks.ts +++ b/src/fixtures/engine/mocks/scheme.mocks.ts @@ -45,6 +45,17 @@ export function mockCondition(base: Partial = {}): IConf }; } +/** + * Mock generic switch condition. + */ +export function mockSwitchCondition({ + section = "test-section", + infop_check = new LuaTable(), + infop_set = new LuaTable(), +}: Partial): IConfigSwitchCondition { + return { infop_check, infop_set, section }; +} + /** * Mock whole condlist. */ diff --git a/src/fixtures/lua/index.ts b/src/fixtures/lua/index.ts index a7d8b03da..ad02d3f42 100644 --- a/src/fixtures/lua/index.ts +++ b/src/fixtures/lua/index.ts @@ -1,2 +1,3 @@ export * from "@/fixtures/lua/mockLuaLib"; +export * from "@/fixtures/lua/mocks"; export * from "@/fixtures/lua/mocks/LuaTable.mock"; diff --git a/src/fixtures/lua/mocks/index.ts b/src/fixtures/lua/mocks/index.ts new file mode 100644 index 000000000..55ea3c0ba --- /dev/null +++ b/src/fixtures/lua/mocks/index.ts @@ -0,0 +1 @@ +export * from "@/fixtures/lua/mocks/lua_utils"; diff --git a/src/fixtures/lua/mocks/lua_utils.ts b/src/fixtures/lua/mocks/lua_utils.ts index c1cfc6a49..1cbf3b951 100644 --- a/src/fixtures/lua/mocks/lua_utils.ts +++ b/src/fixtures/lua/mocks/lua_utils.ts @@ -1,10 +1,10 @@ -import { AnyObject, Optional } from "@/engine/lib/types"; +import { AnyObject, LuaArray, Optional } from "@/engine/lib/types"; import { MockLuaTable } from "@/fixtures/lua/mocks/LuaTable.mock"; /** * todo; */ -export function luaTableToArray(value: LuaTable): Array { +export function luaTableToArray(value: Optional>): Array { if (value instanceof MockLuaTable) { return [...(value as unknown as Map).values()].map((it) => { return mapFromLua(it); From ada8f1b429e4021a241923eb37a52983879c6fff Mon Sep 17 00:00:00 2001 From: Neloreck Date: Sun, 25 Jun 2023 05:06:07 +0300 Subject: [PATCH 02/12] `parseSynData` removed. `parseData1v` -> `parseBoneStateDescriptors` and tests for it. Custom jest expect matchers for easier testing. --- cli/test/jest.config.ts | 1 + cli/test/jest_after_env.ts | 3 + .../configs/scripts/labx8/lx8_toilet_door.ltx | 2 +- src/engine/core/managers/world/DropManager.ts | 22 +- .../ph_door/ISchemePhysicalDoorState.ts | 9 +- .../schemes/ph_door/SchemePhysicalDoor.ts | 4 +- .../ph_idle/ISchemePhysicalIdleState.ts | 9 +- .../schemes/ph_idle/SchemePhysicalIdle.ts | 4 +- .../sr_teleport/SchemeTeleport.test.ts | 3 +- .../core/schemes/sr_timer/SchemeTimer.test.ts | 3 +- .../schemes/wounded/ISchemeWoundedState.ts | 1 - .../core/schemes/wounded/SchemeWounded.ts | 4 +- src/engine/core/utils/ini/config.test.ts | 313 ++++++++---------- src/engine/core/utils/ini/parse.test.ts | 168 +++++----- src/engine/core/utils/ini/parse.ts | 100 ++---- src/engine/core/utils/ini/read.test.ts | 19 +- src/engine/core/utils/ini/types.ts | 10 +- src/engine/core/utils/scheme/logic.test.ts | 10 +- src/fixtures/jest/extendJest.ts | 20 ++ src/fixtures/jest/index.ts | 1 + src/fixtures/jest/matchers/index.ts | 4 + .../jest/matchers/to_equal_lua_arrays.ts | 16 + .../jest/matchers/to_equal_lua_tables.ts | 13 + .../matchers/to_strict_equal_lua_arrays.ts | 14 + .../matchers/to_strict_equal_lua_tables.ts | 13 + src/fixtures/lua/mockLuaLib.test.ts | 3 +- src/fixtures/lua/mocks/LuaTable.mock.ts | 2 +- src/fixtures/lua/mocks/lua_utils.ts | 10 +- src/fixtures/xray/mocks/objects/index.ts | 2 +- src/typedefs/jest/index.d.ts | 15 + 30 files changed, 405 insertions(+), 393 deletions(-) create mode 100644 cli/test/jest_after_env.ts create mode 100644 src/fixtures/jest/extendJest.ts create mode 100644 src/fixtures/jest/index.ts create mode 100644 src/fixtures/jest/matchers/index.ts create mode 100644 src/fixtures/jest/matchers/to_equal_lua_arrays.ts create mode 100644 src/fixtures/jest/matchers/to_equal_lua_tables.ts create mode 100644 src/fixtures/jest/matchers/to_strict_equal_lua_arrays.ts create mode 100644 src/fixtures/jest/matchers/to_strict_equal_lua_tables.ts create mode 100644 src/typedefs/jest/index.d.ts diff --git a/cli/test/jest.config.ts b/cli/test/jest.config.ts index 84a8fc540..2d35be2de 100644 --- a/cli/test/jest.config.ts +++ b/cli/test/jest.config.ts @@ -19,6 +19,7 @@ module.exports = { testEnvironment: "node", rootDir: ROOT_DIR, setupFiles: [path.resolve(__dirname, "./jest_global.ts")], + setupFilesAfterEnv: [path.resolve(__dirname, "./jest_after_env.ts")], roots: [""], collectCoverage: true, coverageReporters: ["json", "html"], diff --git a/cli/test/jest_after_env.ts b/cli/test/jest_after_env.ts new file mode 100644 index 000000000..3a4ba624d --- /dev/null +++ b/cli/test/jest_after_env.ts @@ -0,0 +1,3 @@ +import { extendJest } from "@/fixtures/jest/extendJest"; + +extendJest(); diff --git a/src/engine/configs/scripts/labx8/lx8_toilet_door.ltx b/src/engine/configs/scripts/labx8/lx8_toilet_door.ltx index ccbe95423..4f1af9ea6 100644 --- a/src/engine/configs/scripts/labx8/lx8_toilet_door.ltx +++ b/src/engine/configs/scripts/labx8/lx8_toilet_door.ltx @@ -29,7 +29,7 @@ snd_open_start = metal_small_open snd_close_start = metal_small_close_start snd_close_stop = metal_small_close_stop ;on_use = ph_door@open -hit_on_bone = 4 | ph_door@open_2 %+lx8_toilet_door_open_again% | 2 | ph_door@open_2 %+lx8_toilet_door_open_again% +hit_on_bone = 4|ph_door@open_2 %+lx8_toilet_door_open_again%|2|ph_door@open_2 %+lx8_toilet_door_open_again% on_info = {+lx8_toilet_burer_dead} ph_door@free on_info2 = {+pri_a19_lab_x16_info} ph_door@open_2 diff --git a/src/engine/core/managers/world/DropManager.ts b/src/engine/core/managers/world/DropManager.ts index dcb4046d8..32a8d7cb4 100644 --- a/src/engine/core/managers/world/DropManager.ts +++ b/src/engine/core/managers/world/DropManager.ts @@ -129,24 +129,24 @@ export class DropManager extends AbstractCoreManager { const itemsDropCountByDifficulty: TCount = DEATH_GENERIC_LTX.line_count(itemsDropSectionByDifficulty); for (const it of $range(0, itemsDropCountByDifficulty - 1)) { - const [result, id, value] = DEATH_GENERIC_LTX.r_line(itemsDropSectionByDifficulty, it, "", ""); - const sectionDropCount: [Optional, Optional] = parseNumbersList(value); + const [, key, value] = DEATH_GENERIC_LTX.r_line(itemsDropSectionByDifficulty, it, "", ""); + const sectionDropCount: LuaArray = parseNumbersList(value); - if (sectionDropCount[0] === null) { - abort("Error on [death_ini] declaration. Section [%s], line [%s]", itemsDropSectionByDifficulty, tostring(id)); + if (sectionDropCount.has(1)) { + abort("Error on [death_ini] declaration. Section [%s], line [%s]", itemsDropSectionByDifficulty, tostring(key)); } // Do not drop in level if not registered, declare as 0. - if (!this.itemsLevelDropMultiplayer.has(id)) { - this.itemsLevelDropMultiplayer.set(id, 0); + if (!this.itemsLevelDropMultiplayer.has(key)) { + this.itemsLevelDropMultiplayer.set(key, 0); } - const min: TCount = sectionDropCount[0]; - const max: TCount = sectionDropCount[1] === null ? min : sectionDropCount[1]; + const min: TCount = sectionDropCount.get(1); + const max: TCount = sectionDropCount.has(2) ? sectionDropCount.get(2) : min; - this.itemsDropCountByLevel.set(id, { - min: tonumber(min)! * this.itemsLevelDropMultiplayer.get(id), - max: tonumber(max)! * this.itemsLevelDropMultiplayer.get(id), + this.itemsDropCountByLevel.set(key, { + min: tonumber(min)! * this.itemsLevelDropMultiplayer.get(key), + max: tonumber(max)! * this.itemsLevelDropMultiplayer.get(key), }); } diff --git a/src/engine/core/schemes/ph_door/ISchemePhysicalDoorState.ts b/src/engine/core/schemes/ph_door/ISchemePhysicalDoorState.ts index bbc7b8191..9dbbb5c56 100644 --- a/src/engine/core/schemes/ph_door/ISchemePhysicalDoorState.ts +++ b/src/engine/core/schemes/ph_door/ISchemePhysicalDoorState.ts @@ -1,6 +1,6 @@ import type { IBaseSchemeState } from "@/engine/core/schemes/base"; -import type { IConfigSwitchConditionsDescriptor, TConditionList } from "@/engine/core/utils/ini/types"; -import type { LuaArray, Optional, TDistance, TLabel } from "@/engine/lib/types"; +import type { IBoneStateDescriptor, IConfigSwitchConditionsDescriptor } from "@/engine/core/utils/ini/types"; +import type { LuaArray, Optional, TLabel } from "@/engine/lib/types"; /** * todo; @@ -20,8 +20,5 @@ export interface ISchemePhysicalDoorState extends IBaseSchemeState { snd_close_stop: string; script_used_more_than_once: Optional; on_use: Optional; - hit_on_bone: LuaArray<{ - dist: Optional; - state: Optional; - }>; + hit_on_bone: LuaArray; } diff --git a/src/engine/core/schemes/ph_door/SchemePhysicalDoor.ts b/src/engine/core/schemes/ph_door/SchemePhysicalDoor.ts index f6bf93f41..eaae65284 100644 --- a/src/engine/core/schemes/ph_door/SchemePhysicalDoor.ts +++ b/src/engine/core/schemes/ph_door/SchemePhysicalDoor.ts @@ -2,7 +2,7 @@ import { AbstractScheme } from "@/engine/core/schemes/base"; import { ISchemePhysicalDoorState } from "@/engine/core/schemes/ph_door/ISchemePhysicalDoorState"; import { PhysicalDoorManager } from "@/engine/core/schemes/ph_door/PhysicalDoorManager"; import { getConfigSwitchConditions } from "@/engine/core/utils/ini/config"; -import { parseData1v } from "@/engine/core/utils/ini/parse"; +import { parseBoneStateDescriptors } from "@/engine/core/utils/ini/parse"; import { readIniBoolean, readIniConditionList, readIniString } from "@/engine/core/utils/ini/read"; import { LuaLogger } from "@/engine/core/utils/logging"; import { ClientObject, IniFile } from "@/engine/lib/types"; @@ -49,7 +49,7 @@ export class SchemePhysicalDoor extends AbstractScheme { } } - state.hit_on_bone = parseData1v(object, readIniString(ini, section, "hit_on_bone", false, "")); + state.hit_on_bone = parseBoneStateDescriptors(readIniString(ini, section, "hit_on_bone", false, "")); } /** diff --git a/src/engine/core/schemes/ph_idle/ISchemePhysicalIdleState.ts b/src/engine/core/schemes/ph_idle/ISchemePhysicalIdleState.ts index eceda6add..ad7081f3b 100644 --- a/src/engine/core/schemes/ph_idle/ISchemePhysicalIdleState.ts +++ b/src/engine/core/schemes/ph_idle/ISchemePhysicalIdleState.ts @@ -1,15 +1,12 @@ import type { IBaseSchemeLogic, IBaseSchemeState } from "@/engine/core/schemes/base"; -import type { TConditionList } from "@/engine/core/utils/ini/types"; -import type { LuaArray, Optional, TDistance } from "@/engine/lib/types"; +import type { IBoneStateDescriptor } from "@/engine/core/utils/ini/types"; +import type { LuaArray, Optional } from "@/engine/lib/types"; /** * todo; */ export interface ISchemePhysicalIdleState extends IBaseSchemeState { - hit_on_bone: LuaArray<{ - dist: Optional; - state: Optional; - }>; + hit_on_bone: LuaArray; nonscript_usable: boolean; on_use: Optional; tips: string; diff --git a/src/engine/core/schemes/ph_idle/SchemePhysicalIdle.ts b/src/engine/core/schemes/ph_idle/SchemePhysicalIdle.ts index 8cd4b53a2..05ad4cd13 100644 --- a/src/engine/core/schemes/ph_idle/SchemePhysicalIdle.ts +++ b/src/engine/core/schemes/ph_idle/SchemePhysicalIdle.ts @@ -2,7 +2,7 @@ import { AbstractScheme } from "@/engine/core/schemes/base"; import { ISchemePhysicalIdleState } from "@/engine/core/schemes/ph_idle/ISchemePhysicalIdleState"; import { PhysicalIdleManager } from "@/engine/core/schemes/ph_idle/PhysicalIdleManager"; import { getConfigSwitchConditions } from "@/engine/core/utils/ini/config"; -import { parseData1v } from "@/engine/core/utils/ini/parse"; +import { parseBoneStateDescriptors } from "@/engine/core/utils/ini/parse"; import { readIniBoolean, readIniConditionList, readIniString } from "@/engine/core/utils/ini/read"; import { LuaLogger } from "@/engine/core/utils/logging"; import { ClientObject, EScheme, ESchemeType, IniFile, TSection } from "@/engine/lib/types"; @@ -23,7 +23,7 @@ export class SchemePhysicalIdle extends AbstractScheme { const state: ISchemePhysicalIdleState = AbstractScheme.assign(object, ini, scheme, section); state.logic = getConfigSwitchConditions(ini, section); - state.hit_on_bone = parseData1v(object, readIniString(ini, section, "hit_on_bone", false, "")); + state.hit_on_bone = parseBoneStateDescriptors(readIniString(ini, section, "hit_on_bone", false, "")); state.nonscript_usable = readIniBoolean(ini, section, "nonscript_usable", false); state.on_use = readIniConditionList(ini, section, "on_use"); state.tips = readIniString(ini, section, "tips", false, "", ""); diff --git a/src/engine/core/schemes/sr_teleport/SchemeTeleport.test.ts b/src/engine/core/schemes/sr_teleport/SchemeTeleport.test.ts index 663c64b05..bca594047 100644 --- a/src/engine/core/schemes/sr_teleport/SchemeTeleport.test.ts +++ b/src/engine/core/schemes/sr_teleport/SchemeTeleport.test.ts @@ -5,7 +5,6 @@ import { ISchemeTeleportState } from "@/engine/core/schemes/sr_teleport/ISchemeT import { SchemeTeleport } from "@/engine/core/schemes/sr_teleport/SchemeTeleport"; import { loadSchemeImplementation } from "@/engine/core/utils/scheme/setup"; import { ClientObject, EScheme, ESchemeType, IniFile } from "@/engine/lib/types"; -import { luaTableToArray } from "@/fixtures/lua/mocks/lua_utils"; import { mockClientGameObject, mockIniFile } from "@/fixtures/xray"; describe("SchemeTeleport functionality", () => { @@ -49,7 +48,7 @@ describe("SchemeTeleport functionality", () => { expect(schemeState.timeout).toBe(500); expect(schemeState.maxTotalProbability).toBe(2); expect(schemeState.points.length()).toBe(3); - expect(luaTableToArray(schemeState.points)).toEqual([ + expect(schemeState.points).toEqualLuaArrays([ { look: "al", point: "ap", diff --git a/src/engine/core/schemes/sr_timer/SchemeTimer.test.ts b/src/engine/core/schemes/sr_timer/SchemeTimer.test.ts index c263eef9e..ec051c293 100644 --- a/src/engine/core/schemes/sr_timer/SchemeTimer.test.ts +++ b/src/engine/core/schemes/sr_timer/SchemeTimer.test.ts @@ -5,7 +5,6 @@ import { ETimerType, ISchemeTimerState } from "@/engine/core/schemes/sr_timer/IS import { SchemeTimer } from "@/engine/core/schemes/sr_timer/SchemeTimer"; import { loadSchemeImplementation } from "@/engine/core/utils/scheme/setup"; import { ClientObject, EScheme, ESchemeType, IniFile } from "@/engine/lib/types"; -import { luaTableToObject } from "@/fixtures/lua/mocks/lua_utils"; import { mockClientGameObject, mockIniFile } from "@/fixtures/xray"; describe("SchemeTimer functionality", () => { @@ -60,7 +59,7 @@ describe("SchemeTimer functionality", () => { expect(schemeState.startValue).toBe(15_000); expect(schemeState.timerId).toBe("timerId123"); expect(schemeState.string).toBe("label"); - expect(luaTableToObject(schemeState.onValue)).toEqual({ + expect(schemeState.onValue).toEqualLuaTables({ condlist: { "1": { infop_check: { diff --git a/src/engine/core/schemes/wounded/ISchemeWoundedState.ts b/src/engine/core/schemes/wounded/ISchemeWoundedState.ts index ab3360b11..5a8c2db51 100644 --- a/src/engine/core/schemes/wounded/ISchemeWoundedState.ts +++ b/src/engine/core/schemes/wounded/ISchemeWoundedState.ts @@ -15,7 +15,6 @@ export interface ISchemeWoundedState extends IBaseSchemeState { hp_victim: LuaArray; hp_cover: LuaArray; hp_fight: LuaArray; - syndata: LuaArray; help_start_dialog: Optional; use_medkit: Optional; help_dialog: TNumberId; diff --git a/src/engine/core/schemes/wounded/SchemeWounded.ts b/src/engine/core/schemes/wounded/SchemeWounded.ts index 45f36415e..c31f70330 100644 --- a/src/engine/core/schemes/wounded/SchemeWounded.ts +++ b/src/engine/core/schemes/wounded/SchemeWounded.ts @@ -6,7 +6,7 @@ import { ActionWounded } from "@/engine/core/schemes/wounded/actions"; import { EvaluatorCanFight, EvaluatorWounded } from "@/engine/core/schemes/wounded/evaluators"; import { ISchemeWoundedState } from "@/engine/core/schemes/wounded/ISchemeWoundedState"; import { WoundManager } from "@/engine/core/schemes/wounded/WoundManager"; -import { parseData, parseSynData } from "@/engine/core/utils/ini/parse"; +import { parseData } from "@/engine/core/utils/ini/parse"; import { readIniBoolean, readIniString } from "@/engine/core/utils/ini/read"; import { LuaLogger } from "@/engine/core/utils/logging"; import { getCharacterCommunity } from "@/engine/core/utils/object/object_general"; @@ -175,7 +175,6 @@ export class SchemeWounded extends AbstractScheme { state.hp_victim = parseData(defaults.hp_victim); state.hp_cover = parseData(defaults.hp_cover); state.hp_fight = parseData(defaults.hp_fight); - state.syndata = parseSynData(defaults.syndata); state.help_dialog = defaults.help_dialog; state.help_start_dialog = null; state.use_medkit = defaults.use_medkit; @@ -189,7 +188,6 @@ export class SchemeWounded extends AbstractScheme { state.hp_victim = parseData(readIniString(ini, section, "hp_victim", false, "", defaults.hp_victim)); state.hp_cover = parseData(readIniString(ini, section, "hp_cover", false, "", defaults.hp_cover)); state.hp_fight = parseData(readIniString(ini, section, "hp_fight", false, "", defaults.hp_fight)); - state.syndata = parseSynData(readIniString(ini, section, "syndata", false, "", defaults.syndata)); state.help_dialog = readIniString(ini, section, "help_dialog", false, "", defaults.help_dialog); state.help_start_dialog = readIniString(ini, section, "help_start_dialog", false, "", null); state.use_medkit = readIniBoolean(ini, section, "use_medkit", false, defaults.use_medkit); diff --git a/src/engine/core/utils/ini/config.test.ts b/src/engine/core/utils/ini/config.test.ts index 89b4bba5d..656ed3743 100644 --- a/src/engine/core/utils/ini/config.test.ts +++ b/src/engine/core/utils/ini/config.test.ts @@ -5,7 +5,6 @@ import { IBaseSchemeLogic } from "@/engine/core/schemes"; import { addConditionToList, getConfigSwitchConditions, parseConditionsList } from "@/engine/core/utils/ini"; import { LuaArray, ServerObject, TIndex } from "@/engine/lib/types"; import { mockBaseSchemeLogic } from "@/fixtures/engine"; -import { luaTableToArray, luaTableToObject } from "@/fixtures/lua"; import { mockIniFile, mockServerAlifeObject } from "@/fixtures/xray"; describe("'config' utils for ini file", () => { @@ -36,22 +35,18 @@ describe("'config' utils for ini file", () => { expect(firstIndex).toBe(2); expect(secondIndex).toBe(3); - expect(luaTableToArray(list)).toEqual([ - luaTableToObject( - mockBaseSchemeLogic({ - name: "first", - npc_id: 123, - v1: 1, - }) - ), - luaTableToObject( - mockBaseSchemeLogic({ - name: "second", - npc_id: 333, - v1: "a", - v2: "b", - }) - ), + expect(list).toEqualLuaArrays([ + mockBaseSchemeLogic({ + name: "first", + npc_id: 123, + v1: 1, + }), + mockBaseSchemeLogic({ + name: "second", + npc_id: 333, + v1: "a", + v2: "b", + }), ]); }); @@ -68,82 +63,68 @@ describe("'config' utils for ini file", () => { ).toBeNull(); expect( - luaTableToObject( - getConfigSwitchConditions( - mockIniFile("test.ltx", { - existing: {}, - }), - "existing" - ) + getConfigSwitchConditions( + mockIniFile("test.ltx", { + existing: {}, + }), + "existing" ) - ).toEqual({}); + ).toEqualLuaArrays([]); expect( - luaTableToObject( - getConfigSwitchConditions( - mockIniFile("test.ltx", { - existing: { - first: 1, - second: "b", - }, - }), - "existing" - ) + getConfigSwitchConditions( + mockIniFile("test.ltx", { + existing: { + first: 1, + second: "b", + }, + }), + "existing" ) - ).toEqual({}); + ).toEqualLuaArrays([]); }); it("getConfigSwitchConditions correctly parse different listed conditions", () => { expect( - luaTableToArray( - getConfigSwitchConditions( - mockIniFile("test.ltx", { - existing: { - another: 1, - something: "else", - on_actor_dist_le: "3 | {=actor_has_weapon} remark", - }, - }), - "existing" - ) + getConfigSwitchConditions( + mockIniFile("test.ltx", { + existing: { + another: 1, + something: "else", + on_actor_dist_le: "3 | {=actor_has_weapon} remark", + }, + }), + "existing" ) - ).toEqual([ - luaTableToObject( - mockBaseSchemeLogic({ - v1: 3, - name: "on_actor_dist_le", - condlist: parseConditionsList("{=actor_has_weapon} remark"), - }) - ), + ).toEqualLuaArrays([ + mockBaseSchemeLogic({ + v1: 3, + name: "on_actor_dist_le", + condlist: parseConditionsList("{=actor_has_weapon} remark"), + }), ]); expect( - luaTableToArray( - getConfigSwitchConditions( - mockIniFile("test.ltx", { - existing: { - on_actor_dist_le_nvis: "31 | {=actor_condition} value", - on_actor_dist_ge: "55 | {=another_cond} another", - }, - }), - "existing" - ) + getConfigSwitchConditions( + mockIniFile("test.ltx", { + existing: { + on_actor_dist_le_nvis: "31 | {=actor_condition} value", + on_actor_dist_ge: "55 | {=another_cond} another", + }, + }), + "existing" ) - ).toEqual([ - luaTableToObject( - mockBaseSchemeLogic({ - v1: 31, - name: "on_actor_dist_le_nvis", - condlist: parseConditionsList("{=actor_condition} value"), - }) - ), - luaTableToObject( - mockBaseSchemeLogic({ - v1: 55, - name: "on_actor_dist_ge", - condlist: parseConditionsList("{=another_cond} another"), - }) - ), + ).toEqualLuaArrays([ + mockBaseSchemeLogic({ + v1: 31, + name: "on_actor_dist_le_nvis", + condlist: parseConditionsList("{=actor_condition} value"), + }), + mockBaseSchemeLogic({ + v1: 55, + name: "on_actor_dist_ge", + condlist: parseConditionsList("{=another_cond} another"), + }), ]); const serverObject: ServerObject = mockServerAlifeObject(); @@ -151,105 +132,81 @@ describe("'config' utils for ini file", () => { registerStoryLink(serverObject.id, "test-cfg-sid"); expect( - luaTableToArray( - getConfigSwitchConditions( - mockIniFile("test.ltx", { - existing: { - on_actor_dist_ge_nvis: "100|test1", - on_signal: "anim_end|test2", - on_info: "{+pri_a28_infop} test3", - on_timer: "50|test4", - on_game_timer: "10|test5", - on_actor_in_zone: "zat_b38|test7", - on_actor_not_in_zone: "zat_b38|test8", - on_actor_inside: "test9", - on_actor_outside: "test10", - on_npc_in_zone: "test-cfg-sid|jup_hide_a6|test11", - on_npc_not_in_zone: "test-cfg-sid|jup_hide_a6|test12", - }, - }), - "existing" - ) + getConfigSwitchConditions( + mockIniFile("test.ltx", { + existing: { + on_actor_dist_ge_nvis: "100|test1", + on_signal: "anim_end|test2", + on_info: "{+pri_a28_infop} test3", + on_timer: "50|test4", + on_game_timer: "10|test5", + on_actor_in_zone: "zat_b38|test7", + on_actor_not_in_zone: "zat_b38|test8", + on_actor_inside: "test9", + on_actor_outside: "test10", + on_npc_in_zone: "test-cfg-sid|jup_hide_a6|test11", + on_npc_not_in_zone: "test-cfg-sid|jup_hide_a6|test12", + }, + }), + "existing" ) - ).toEqual([ - luaTableToObject( - mockBaseSchemeLogic({ - v1: 100, - name: "on_actor_dist_ge_nvis", - condlist: parseConditionsList("test1"), - }) - ), - luaTableToObject( - mockBaseSchemeLogic({ - v1: "anim_end", - name: "on_signal", - condlist: parseConditionsList("test2"), - }) - ), - luaTableToObject( - mockBaseSchemeLogic({ - name: "on_info", - condlist: parseConditionsList("{+pri_a28_infop} test3"), - }) - ), - luaTableToObject( - mockBaseSchemeLogic({ - v1: 50, - name: "on_timer", - condlist: parseConditionsList("test4"), - }) - ), - luaTableToObject( - mockBaseSchemeLogic({ - v1: 10, - name: "on_game_timer", - condlist: parseConditionsList("test5"), - }) - ), - luaTableToObject( - mockBaseSchemeLogic({ - v1: "zat_b38", - name: "on_actor_in_zone", - condlist: parseConditionsList("test7"), - }) - ), - luaTableToObject( - mockBaseSchemeLogic({ - v1: "zat_b38", - name: "on_actor_not_in_zone", - condlist: parseConditionsList("test8"), - }) - ), - luaTableToObject( - mockBaseSchemeLogic({ - name: "on_actor_inside", - condlist: parseConditionsList("test9"), - }) - ), - luaTableToObject( - mockBaseSchemeLogic({ - name: "on_actor_outside", - condlist: parseConditionsList("test10"), - }) - ), - luaTableToObject( - mockBaseSchemeLogic({ - v1: "test-cfg-sid", - v2: "jup_hide_a6", - npc_id: serverObject.id, - name: "on_npc_in_zone", - condlist: parseConditionsList("test11"), - }) - ), - luaTableToObject( - mockBaseSchemeLogic({ - v1: "test-cfg-sid", - v2: "jup_hide_a6", - npc_id: serverObject.id, - name: "on_npc_not_in_zone", - condlist: parseConditionsList("test12"), - }) - ), + ).toEqualLuaArrays([ + mockBaseSchemeLogic({ + v1: 100, + name: "on_actor_dist_ge_nvis", + condlist: parseConditionsList("test1"), + }), + mockBaseSchemeLogic({ + v1: "anim_end", + name: "on_signal", + condlist: parseConditionsList("test2"), + }), + mockBaseSchemeLogic({ + name: "on_info", + condlist: parseConditionsList("{+pri_a28_infop} test3"), + }), + mockBaseSchemeLogic({ + v1: 50, + name: "on_timer", + condlist: parseConditionsList("test4"), + }), + mockBaseSchemeLogic({ + v1: 10, + name: "on_game_timer", + condlist: parseConditionsList("test5"), + }), + mockBaseSchemeLogic({ + v1: "zat_b38", + name: "on_actor_in_zone", + condlist: parseConditionsList("test7"), + }), + mockBaseSchemeLogic({ + v1: "zat_b38", + name: "on_actor_not_in_zone", + condlist: parseConditionsList("test8"), + }), + mockBaseSchemeLogic({ + name: "on_actor_inside", + condlist: parseConditionsList("test9"), + }), + mockBaseSchemeLogic({ + name: "on_actor_outside", + condlist: parseConditionsList("test10"), + }), + mockBaseSchemeLogic({ + v1: "test-cfg-sid", + v2: "jup_hide_a6", + npc_id: serverObject.id, + name: "on_npc_in_zone", + condlist: parseConditionsList("test11"), + }), + mockBaseSchemeLogic({ + v1: "test-cfg-sid", + v2: "jup_hide_a6", + npc_id: serverObject.id, + name: "on_npc_not_in_zone", + condlist: parseConditionsList("test12"), + }), ]); }); }); diff --git a/src/engine/core/utils/ini/parse.test.ts b/src/engine/core/utils/ini/parse.test.ts index 0ac6ec45e..882a214cc 100644 --- a/src/engine/core/utils/ini/parse.test.ts +++ b/src/engine/core/utils/ini/parse.test.ts @@ -3,6 +3,7 @@ import { describe, expect, it } from "@jest/globals"; import { getSchemeFromSection, parseAllSectionToTable, + parseBoneStateDescriptors, parseConditionsList, parseFunctionParams, parseInfoPortions, @@ -18,49 +19,47 @@ import { import { IConfigCondition } from "@/engine/core/utils/ini/types"; import { NIL } from "@/engine/lib/constants/words"; import { Flags32, IniFile, LuaArray } from "@/engine/lib/types"; -import { luaTableToArray, luaTableToObject } from "@/fixtures/lua/mocks/lua_utils"; -import { mockIniFile } from "@/fixtures/xray"; -import { MockFlags32 } from "@/fixtures/xray/mocks/objects/Flags32.mock"; +import { MockFlags32, mockIniFile } from "@/fixtures/xray"; describe("'ini_data' parsing utils", () => { it("Should correctly parse names array", () => { - expect(luaTableToArray(parseStringsList("a, b, c"))).toEqual(["a", "b", "c"]); - expect(luaTableToArray(parseStringsList("a b c"))).toEqual(["a", "b", "c"]); - expect(luaTableToArray(parseStringsList("name_1, example_b, name_complex_here"))).toEqual([ + expect(parseStringsList("a, b, c")).toEqualLuaArrays(["a", "b", "c"]); + expect(parseStringsList("a b c")).toEqualLuaArrays(["a", "b", "c"]); + expect(parseStringsList("name_1, example_b, name_complex_here")).toEqualLuaArrays([ "name_1", "example_b", "name_complex_here", ]); - expect(luaTableToArray(parseStringsList("-1, 2, -3"))).toEqual(["-1", "2", "-3"]); - expect(luaTableToArray(parseStringsList("-1 2 -3"))).toEqual(["-1", "2", "-3"]); - expect(luaTableToArray(parseStringsList("-1.5 2.255"))).toEqual(["-1.5", "2.255"]); - expect(luaTableToArray(parseStringsList("a_b, c_d"))).toEqual(["a_b", "c_d"]); + expect(parseStringsList("-1, 2, -3")).toEqualLuaArrays(["-1", "2", "-3"]); + expect(parseStringsList("-1 2 -3")).toEqualLuaArrays(["-1", "2", "-3"]); + expect(parseStringsList("-1.5 2.255")).toEqualLuaArrays(["-1.5", "2.255"]); + expect(parseStringsList("a_b, c_d")).toEqualLuaArrays(["a_b", "c_d"]); }); it("Should correctly parse numbers array", () => { - expect(luaTableToArray(parseNumbersList("1, 2, 3, 4"))).toEqual([1, 2, 3, 4]); - expect(luaTableToArray(parseNumbersList("1.5, 2.33, 3.0"))).toEqual([1.5, 2.33, 3.0]); - expect(luaTableToArray(parseNumbersList("1.5 2.33 3.0"))).toEqual([1.5, 2.33, 3.0]); - expect(luaTableToArray(parseNumbersList("1.5 2.33, 3.0"))).toEqual([1.5, 2.33, 3.0]); - expect(luaTableToArray(parseNumbersList("15, 0, -43, 9999"))).toEqual([15, 0, -43, 9999]); - expect(luaTableToArray(parseNumbersList("15 0 -43 9999"))).toEqual([15, 0, -43, 9999]); + expect(parseNumbersList("1, 2, 3, 4")).toEqualLuaArrays([1, 2, 3, 4]); + expect(parseNumbersList("1.5, 2.33, 3.0")).toEqualLuaArrays([1.5, 2.33, 3.0]); + expect(parseNumbersList("1.5 2.33 3.0")).toEqualLuaArrays([1.5, 2.33, 3.0]); + expect(parseNumbersList("1.5 2.33, 3.0")).toEqualLuaArrays([1.5, 2.33, 3.0]); + expect(parseNumbersList("15, 0, -43, 9999")).toEqualLuaArrays([15, 0, -43, 9999]); + expect(parseNumbersList("15 0 -43 9999")).toEqualLuaArrays([15, 0, -43, 9999]); }); it("Should correctly parse spawn details", () => { - expect(luaTableToArray(parseSpawnDetails(""))).toEqual([]); - expect(luaTableToArray(parseSpawnDetails("1,1"))).toEqual([ + expect(parseSpawnDetails("")).toEqualLuaArrays([]); + expect(parseSpawnDetails("1,1")).toEqualLuaArrays([ { count: 1, probability: 1, }, ]); - expect(luaTableToArray(parseSpawnDetails("2, 0.2"))).toEqual([ + expect(parseSpawnDetails("2, 0.2")).toEqualLuaArrays([ { count: 2, probability: 0.2, }, ]); - expect(luaTableToArray(parseSpawnDetails("5,0.5,4,0.3"))).toEqual([ + expect(parseSpawnDetails("5,0.5,4,0.3")).toEqualLuaArrays([ { count: 5, probability: 0.5, @@ -73,33 +72,41 @@ describe("'ini_data' parsing utils", () => { }); it("Should correctly parse call parameters", () => { - expect(luaTableToArray(parseParameters(NIL))).toEqual([NIL]); - expect(luaTableToArray(parseParameters("abcd"))).toEqual(["abcd"]); - expect(luaTableToArray(parseParameters("a|b|c|d"))).toEqual(["a", "b", "c", "d"]); - expect(luaTableToArray(parseParameters("a|{+ex_info =some_cb(true:d:1) !is_rainy} abc"))).toEqual([ + expect(parseParameters(NIL)).toEqualLuaArrays([NIL]); + expect(parseParameters("abcd")).toEqualLuaArrays(["abcd"]); + expect(parseParameters("a|b|c|d")).toEqualLuaArrays(["a", "b", "c", "d"]); + expect(parseParameters("a|{+ex_info =some_cb(true:d:1) !is_rainy} abc")).toEqualLuaArrays([ "a", "{+ex_info =some_cb(true:d:1) !is_rainy} abc", ]); }); it("Should correctly parse condition lists", () => { - expect(luaTableToArray(parseConditionsList("{+zat_b104_task_end}4,0"))).toStrictEqual([ + expect(parseConditionsList("{+zat_b104_task_end}4,0")).toStrictEqualLuaArrays([ { infop_check: { 1: { name: "zat_b104_task_end", required: true } }, infop_set: {}, section: "4" }, { infop_check: {}, section: "0", infop_set: {} }, ]); - expect(luaTableToArray(parseConditionsList("zat_b28_heli_3_crash_name"))).toStrictEqual([ + // Check with spacings etc. + expect(parseConditionsList(" { +zat_b104_task_end +another } 4 , 0 ")).toStrictEqualLuaArrays([ + { + infop_check: { 1: { name: "zat_b104_task_end", required: true }, 2: { name: "another", required: true } }, + infop_set: {}, + section: "4", + }, + { infop_check: {}, section: "0", infop_set: {} }, + ]); + + expect(parseConditionsList("zat_b28_heli_3_crash_name")).toStrictEqualLuaArrays([ { infop_check: {}, section: "zat_b28_heli_3_crash_name", infop_set: {} }, ]); expect( - luaTableToArray( - parseConditionsList( - "{+jup_b218_pripyat_group_gathering}0,{+zat_b28_heli_3_searched}4," + - "{+zat_b100_heli_2_searched}4,{+zat_b101_heli_5_searched}4,0" - ) + parseConditionsList( + "{+jup_b218_pripyat_group_gathering}0,{+zat_b28_heli_3_searched}4," + + "{+zat_b100_heli_2_searched}4,{+zat_b101_heli_5_searched}4,0" ) - ).toStrictEqual([ + ).toStrictEqualLuaArrays([ { infop_check: { 1: { name: "jup_b218_pripyat_group_gathering", required: true } }, section: "0", @@ -112,13 +119,11 @@ describe("'ini_data' parsing utils", () => { ]); expect( - luaTableToArray( - parseConditionsList( - "{+zat_b57_bloodsucker_lair_clear}0,{+zat_b38_disappearance_stalkers_meet_cop_later_give}1," + - "{+zat_b38_failed}3,0" - ) + parseConditionsList( + "{+zat_b57_bloodsucker_lair_clear}0,{+zat_b38_disappearance_stalkers_meet_cop_later_give}1," + + "{+zat_b38_failed}3,0" ) - ).toStrictEqual([ + ).toStrictEqualLuaArrays([ { infop_check: { 1: { name: "zat_b57_bloodsucker_lair_clear", required: true } }, section: "0", infop_set: {} }, { infop_check: { 1: { name: "zat_b38_disappearance_stalkers_meet_cop_later_give", required: true } }, @@ -129,9 +134,7 @@ describe("'ini_data' parsing utils", () => { { infop_check: {}, section: "0", infop_set: {} }, ]); - expect( - luaTableToArray(parseConditionsList("sr_idle@end%=create_squad(zat_b56_polter_squad:zat_b56)%")) - ).toStrictEqual([ + expect(parseConditionsList("sr_idle@end%=create_squad(zat_b56_polter_squad:zat_b56)%")).toStrictEqualLuaArrays([ { infop_check: {}, section: "sr_idle@end", @@ -142,12 +145,10 @@ describe("'ini_data' parsing utils", () => { ]); expect( - luaTableToArray( - parseConditionsList( - "{-zat_b42_mayron_spawn}sr_idle%=spawn_corpse(zat_b42_mayron:zat_b42_mayron_walk)+zat_b42_mayron_spawn%" - ) + parseConditionsList( + "{-zat_b42_mayron_spawn}sr_idle%=spawn_corpse(zat_b42_mayron:zat_b42_mayron_walk)+zat_b42_mayron_spawn%" ) - ).toStrictEqual([ + ).toStrictEqualLuaArrays([ { infop_check: { "1": { name: "zat_b42_mayron_spawn", required: false } }, section: "sr_idle", @@ -165,7 +166,7 @@ describe("'ini_data' parsing utils", () => { "=spawn_corpse(zat_b42_mayron:zat_b42_mayron_walk)+zat_b42_mayron_spawn" ); - expect(luaTableToObject(first)).toEqual({ + expect(first).toEqualLuaTables({ "1": { expected: true, func: "spawn_corpse", @@ -186,7 +187,7 @@ describe("'ini_data' parsing utils", () => { " ~50 !another" ); - expect(luaTableToObject(second)).toEqual({ + expect(second).toEqualLuaTables({ "1": { name: "save_zat_b42_arrived_to_controler_lair", required: true, @@ -211,23 +212,23 @@ describe("'ini_data' parsing utils", () => { const third: LuaArray = new LuaTable(); expect(parseInfoPortions(third, null)).toBe(third); - expect(luaTableToObject(parseInfoPortions(third, null))).toEqual({}); + expect(parseInfoPortions(third, null)).toEqualLuaTables({}); }); it("'parseFunctionParams' should correctly parse list of parameters for condlists", () => { - expect(luaTableToArray(parseFunctionParams("zat_b42_mayron:zat_b42_mayron_walk"))).toEqual([ + expect(parseFunctionParams("zat_b42_mayron:zat_b42_mayron_walk")).toEqualLuaArrays([ "zat_b42_mayron", "zat_b42_mayron_walk", ]); - expect(luaTableToArray(parseFunctionParams("1:zat_b42_mayron_walk:2"))).toEqual([1, "zat_b42_mayron_walk", 2]); - expect(luaTableToArray(parseFunctionParams("1:-2:3.5:-5.5:-2.3a:c"))).toEqual([1, -2, 3.5, -5.5, "-2.3a", "c"]); + expect(parseFunctionParams("1:zat_b42_mayron_walk:2")).toEqualLuaArrays([1, "zat_b42_mayron_walk", 2]); + expect(parseFunctionParams("1:-2:3.5:-5.5:-2.3a:c")).toEqualLuaArrays([1, -2, 3.5, -5.5, "-2.3a", "c"]); }); it("'parseWaypointData' should correctly parse generic paths to waypoint data", () => { const flags: Flags32 = MockFlags32.mock(); - expect(luaTableToObject(parseWaypointData("zat_b53_particle_play_point_5", flags, "wp00"))).toEqual({ flags }); - expect(luaTableToObject(parseWaypointData("zat_b53_particle_play_point_5", flags, "wp02|a=patrol"))).toEqual({ + expect(parseWaypointData("zat_b53_particle_play_point_5", flags, "wp00")).toEqualLuaTables({ flags }); + expect(parseWaypointData("zat_b53_particle_play_point_5", flags, "wp02|a=patrol")).toEqualLuaTables({ flags, a: { "1": { @@ -237,19 +238,17 @@ describe("'ini_data' parsing utils", () => { }, }, }); - expect(luaTableToObject(parseWaypointData("zat_b53_particle_play_point_5", flags, "wp00|p=30|t=10000"))).toEqual({ + expect(parseWaypointData("zat_b53_particle_play_point_5", flags, "wp00|p=30|t=10000")).toEqualLuaTables({ flags, p: "30", t: "10000", }); - expect(luaTableToObject(parseWaypointData("zat_b53_particle_play_point_5", flags, "wp09|p=70|t=10000"))).toEqual({ + expect(parseWaypointData("zat_b53_particle_play_point_5", flags, "wp09|p=70|t=10000")).toEqualLuaTables({ flags, p: "70", t: "10000", }); - expect( - luaTableToObject(parseWaypointData("zat_b53_particle_play_point_5", flags, "wp10|t=10000|a=search")) - ).toEqual({ + expect(parseWaypointData("zat_b53_particle_play_point_5", flags, "wp10|t=10000|a=search")).toEqualLuaTables({ flags, a: { "1": { @@ -266,7 +265,7 @@ describe("'ini_data' parsing utils", () => { const flags: Flags32 = MockFlags32.mock(); expect(parseWaypointsData(null)).toBeNull(); - expect(luaTableToObject(parseWaypointsData("zat_b40_smart_terrain_zat_b40_merc_01_walk"))).toEqual({ + expect(parseWaypointsData("zat_b40_smart_terrain_zat_b40_merc_01_walk")).toEqualLuaTables({ "0": { a: { "1": { @@ -299,7 +298,7 @@ describe("'ini_data' parsing utils", () => { }, }); - expect(luaTableToObject(parseWaypointsData("zat_b40_smart_terrain_zat_b40_merc_02_look"))).toEqual({ + expect(parseWaypointsData("zat_b40_smart_terrain_zat_b40_merc_02_look")).toEqualLuaTables({ "0": { flags: {}, p: "30", @@ -338,17 +337,15 @@ describe("'ini_data' parsing utils", () => { const flags: Flags32 = MockFlags32.mock(); expect( - luaTableToObject( - parseWaypointsDataFromList( - "zat_b40_smart_terrain_zat_b40_merc_01_walk", - 3, - [0, "wp55|a=patrol"], - [1, "wp66|a=patrol"], - [2, "wp77|a=patrol"] - ) + parseWaypointsDataFromList( + "zat_b40_smart_terrain_zat_b40_merc_01_walk", + 3, + [0, "wp55|a=patrol"], + [1, "wp66|a=patrol"], + [2, "wp77|a=patrol"] ) - ).toEqual({ - "0": { + ).toEqualLuaArrays([ + { a: { "1": { infop_check: {}, @@ -358,7 +355,7 @@ describe("'ini_data' parsing utils", () => { }, flags, }, - "1": { + { a: { "1": { infop_check: {}, @@ -368,7 +365,7 @@ describe("'ini_data' parsing utils", () => { }, flags, }, - "2": { + { a: { "1": { infop_check: {}, @@ -378,7 +375,22 @@ describe("'ini_data' parsing utils", () => { }, flags, }, - }); + ]); + }); + + it("'parseBoneStateDescriptors' should correctly parse bones data", () => { + expect( + parseBoneStateDescriptors( + "4|ph_door@open_2 %+lx8_toilet_door_open_again%|2|ph_door@open_2 %+lx8_toilet_door_open_again%" + ) + ).toEqualLuaArrays([ + { index: 4, state: parseConditionsList("ph_door@open_2 %+lx8_toilet_door_open_again%") }, + { index: 2, state: parseConditionsList("ph_door@open_2 %+lx8_toilet_door_open_again%") }, + ]); + expect(parseBoneStateDescriptors("1|ph_door@free|2|ph_door@free")).toEqualLuaArrays([ + { index: 1, state: parseConditionsList("ph_door@free") }, + { index: 2, state: parseConditionsList("ph_door@free") }, + ]); }); it("'parseAllSectionToTable' should correctly parse ini section to matching lua table", () => { @@ -398,18 +410,18 @@ describe("'ini_data' parsing utils", () => { }, }); - expect(luaTableToObject(parseAllSectionToTable(ini, "section1"))).toEqual({ + expect(parseAllSectionToTable(ini, "section1")).toEqualLuaTables({ a: "a1", b: "b2", c: "c", d: 10, }); - expect(luaTableToObject(parseAllSectionToTable(ini, "section2"))).toEqual({ + expect(parseAllSectionToTable(ini, "section2")).toEqualLuaTables({ a: "a1", d: 10, }); - expect(luaTableToObject(parseAllSectionToTable(ini, "section3"))).toBeNull(); - expect(luaTableToObject(parseAllSectionToTable(ini, "section4"))).toBeNull(); + expect(parseAllSectionToTable(ini, "section3")).toBeNull(); + expect(parseAllSectionToTable(ini, "section4")).toBeNull(); }); it("'parseStringOptional' should correctly handle values", () => { diff --git a/src/engine/core/utils/ini/parse.ts b/src/engine/core/utils/ini/parse.ts index b1a884011..7caf6d9ec 100644 --- a/src/engine/core/utils/ini/parse.ts +++ b/src/engine/core/utils/ini/parse.ts @@ -2,6 +2,7 @@ import { flags32, patrol } from "xray16"; import { abort, assert, assertDefined } from "@/engine/core/utils/assertion"; import { + IBoneStateDescriptor, IConfigCondition, IConfigSwitchCondition, ISpawnDescriptor, @@ -13,8 +14,6 @@ import { trimString } from "@/engine/core/utils/string"; import { TInfoPortion } from "@/engine/lib/constants/info_portions"; import { NIL, TRUE } from "@/engine/lib/constants/words"; import { - AnyArgs, - ClientObject, EScheme, Flags32, IniFile, @@ -53,15 +52,14 @@ export function parseStringsList(data: string): LuaAr * Parse util to transform string of numbers to array. * Example: "1, 2, 3" -> [1, 2, 3]. * - * @param base - string to parse. + * @param data - string to parse. * @returns parsed array of numbers. */ -export function parseNumbersList>(base: string): T; -export function parseNumbersList(data: string): LuaArray { - const result: LuaArray = new LuaTable(); +export function parseNumbersList(data: string): LuaArray { + const result: LuaArray = new LuaTable(); for (const it of string.gfind(data, "([%-%d%.]+)%,*")) { - table.insert(result, tonumber(it) as number); + table.insert(result, tonumber(it) as T); } return result; @@ -136,16 +134,17 @@ export function parseParameters(data: T): LuaArray { * Parse condition list supplied from game ltx files. * Used as conditional descriptor of actions/info portions/effects and things to switch engine logic based on state. * - * -- {+infop1} section1 %-infop2%, {+infop3 -infop4} section2 ... - * -- { - * -- 1 = { infop_check = { 1 = {"infop1" = true} }, infop_set = { 1 = {"infop2" = false } }, section = "section1" }, - * -- 2 = { infop_check = { 1 = {"infop3" = true}, 2 = {"infop4" = false} }, infop_set = {}, section = "section2" }, - * -- } + * Example: + * {+infop1} section1 %-infop2%, {+infop3 -infop4} section2 ... + * { + * 1 = { infop_check = { 1 = {"infop1" = true} }, infop_set = { 1 = {"infop2" = false } }, section = "section1" }, + * 2 = { infop_check = { 1 = {"infop3" = true}, 2 = {"infop4" = false} }, infop_set = {}, section = "section2" }, + * } * * todo: trimming of whitespaces * - * @param data - string to parse - * @returns parsed condlist + * @param data - raw string from config to parse + * @returns parsed condlist descriptor */ export function parseConditionsList(data: string): TConditionList { const result: LuaArray = new LuaTable(); @@ -414,37 +413,6 @@ export function parseWaypointsDataFromList( return list; } -/** - * todo; - */ -export function parseSynData(target: Optional): LuaArray<{ zone: null; state: string; sound: string }> { - const collection: LuaArray = new LuaTable(); - - if (target) { - for (const name of string.gfind(target, "(%|*[^%|]+%|*)%p*")) { - const dat = { - zone: null, - state: null as Optional, - sound: null as Optional, - }; - - const [tPosition] = string.find(name, "@", 1, true); - const [sPosition] = string.find(name, "|", 1, true); - - const state = string.sub(name, 1, tPosition - 1); - const sound = - sPosition !== null ? string.sub(name, tPosition + 1, sPosition - 1) : string.sub(name, tPosition + 1); - - dat.state = state; - dat.sound = sound; - - table.insert(collection, dat); - } - } - - return collection; -} - /** * todo; */ @@ -496,41 +464,25 @@ export function parseData(target: Optional): LuaArray<{ } /** - * todo; - * todo; - * todo; + * Parse descriptors for bone index. + * Matches bone index to related state condlist. + * + * @param data - input string to parse + * @returns list of bone state descriptors */ -export function parseData1v( - object: ClientObject, - data: Optional -): LuaArray<{ - dist: Optional; - state: Optional; -}> { - const target: LuaArray<{ - dist: Optional; - state: Optional>; - }> = new LuaTable(); +export function parseBoneStateDescriptors(data: Optional): LuaArray { + const target: LuaArray = new LuaTable(); if (data) { for (const name of string.gfind(data, "(%|*%d+%|[^%|]+)%p*")) { - const dat = { - dist: null as Optional, - state: null as Optional>, - }; - const [position] = string.find(name, "|", 1, true); + const index: TIndex = tonumber(string.sub(name, 1, position - 1)) as TIndex; + const state: Optional = string.sub(name, position + 1); - const dist = string.sub(name, 1, position - 1); - const state = string.sub(name, position + 1); - - dat.dist = tonumber(dist)!; - - if (state !== null) { - dat.state = parseConditionsList(state); - } - - target.set(tonumber(dist)!, dat); + target.set(index, { + index: index, + state: state !== null ? parseConditionsList(state) : null, + }); } } diff --git a/src/engine/core/utils/ini/read.test.ts b/src/engine/core/utils/ini/read.test.ts index 80aab2771..5a4cef2ff 100644 --- a/src/engine/core/utils/ini/read.test.ts +++ b/src/engine/core/utils/ini/read.test.ts @@ -11,7 +11,6 @@ import { readIniTwoNumbers, } from "@/engine/core/utils/ini/read"; import { IniFile, Optional } from "@/engine/lib/types"; -import { luaTableToObject } from "@/fixtures/lua/mocks/lua_utils"; import { mockIniFile } from "@/fixtures/xray/mocks/ini"; describe("'read' utils for ini file", () => { @@ -95,7 +94,7 @@ describe("'read' utils for ini file", () => { const firstScheme: Optional = readIniConditionList(ini, "section1", "a"); - expect(luaTableToObject(firstScheme)).toEqual({ + expect(firstScheme).toEqualLuaTables({ name: "a", condlist: { "1": { @@ -116,7 +115,7 @@ describe("'read' utils for ini file", () => { const secondScheme: Optional = readIniConditionList(ini, "section1", "b"); - expect(luaTableToObject(secondScheme)).toEqual({ + expect(secondScheme).toEqualLuaTables({ name: "b", condlist: { "1": { @@ -143,7 +142,7 @@ describe("'read' utils for ini file", () => { }, }); - expect(luaTableToObject(readIniNumberAndConditionList(ini, "section1", "a"))).toEqual({ + expect(readIniNumberAndConditionList(ini, "section1", "a")).toEqualLuaTables({ name: "a", condlist: { "1": { @@ -167,7 +166,7 @@ describe("'read' utils for ini file", () => { v2: null, }); - expect(luaTableToObject(readIniNumberAndConditionList(ini, "section1", "b"))).toEqual({ + expect(readIniNumberAndConditionList(ini, "section1", "b")).toEqualLuaTables({ name: "b", condlist: { "1": { @@ -191,7 +190,7 @@ describe("'read' utils for ini file", () => { v2: null, }); - expect(luaTableToObject(readIniNumberAndConditionList(ini, "section1", "c"))).toEqual({ + expect(readIniNumberAndConditionList(ini, "section1", "c")).toEqualLuaTables({ name: "c", condlist: { "1": { @@ -232,7 +231,7 @@ describe("'read' utils for ini file", () => { }, }); - expect(luaTableToObject(readIniStringAndCondList(ini, "section1", "a"))).toEqual({ + expect(readIniStringAndCondList(ini, "section1", "a")).toEqualLuaTables({ name: "a", condlist: { "1": { @@ -259,7 +258,7 @@ describe("'read' utils for ini file", () => { v2: null, }); - expect(luaTableToObject(readIniStringAndCondList(ini, "section1", "b"))).toEqual({ + expect(readIniStringAndCondList(ini, "section1", "b")).toEqualLuaTables({ name: "b", condlist: { "1": { @@ -282,7 +281,7 @@ describe("'read' utils for ini file", () => { }, }); - expect(luaTableToObject(readIniConditionList(ini, "section1", "a"))).toEqual({ + expect(readIniConditionList(ini, "section1", "a")).toEqualLuaTables({ name: "a", condlist: { "1": { @@ -309,7 +308,7 @@ describe("'read' utils for ini file", () => { v2: null, }); - expect(luaTableToObject(readIniConditionList(ini, "section1", "b"))).toEqual({ + expect(readIniConditionList(ini, "section1", "b")).toEqualLuaTables({ name: "b", condlist: { "1": { diff --git a/src/engine/core/utils/ini/types.ts b/src/engine/core/utils/ini/types.ts index 8fc25822c..05196ae47 100644 --- a/src/engine/core/utils/ini/types.ts +++ b/src/engine/core/utils/ini/types.ts @@ -1,5 +1,5 @@ import type { TInfoPortion } from "@/engine/lib/constants/info_portions"; -import type { Flags32, LuaArray, Optional, TCount, TName, TProbability, TSection } from "@/engine/lib/types"; +import type { Flags32, LuaArray, Optional, TCount, TIndex, TName, TProbability, TSection } from "@/engine/lib/types"; /** * todo; @@ -66,3 +66,11 @@ export interface IConfigSwitchConditionsDescriptor { * todo; */ export type TConditionList = LuaArray; + +/** + * todo; + */ +export interface IBoneStateDescriptor { + index: Optional; // Bone index. + state: Optional; // Matching state. +} diff --git a/src/engine/core/utils/scheme/logic.test.ts b/src/engine/core/utils/scheme/logic.test.ts index 756da4cde..79679b3b3 100644 --- a/src/engine/core/utils/scheme/logic.test.ts +++ b/src/engine/core/utils/scheme/logic.test.ts @@ -12,12 +12,7 @@ import { import { MapDisplayManager } from "@/engine/core/managers/interface"; import { SmartTerrain } from "@/engine/core/objects"; import { ISmartTerrainJob } from "@/engine/core/objects/server/smart_terrain/types"; -import { - ESchemeEvent, - IBaseSchemeState, - ObjectRestrictionsManager, - TAbstractSchemeConstructor, -} from "@/engine/core/schemes"; +import { IBaseSchemeState, ObjectRestrictionsManager, TAbstractSchemeConstructor } from "@/engine/core/schemes"; import { SchemeAbuse } from "@/engine/core/schemes/abuse"; import { SchemeCombat } from "@/engine/core/schemes/combat"; import { SchemeCombatIgnore } from "@/engine/core/schemes/combat_ignore"; @@ -50,7 +45,6 @@ import { loadSchemeImplementation, loadSchemeImplementations } from "@/engine/co import { NIL } from "@/engine/lib/constants/words"; import { ClientObject, EScheme, ESchemeType, IniFile, ServerHumanObject } from "@/engine/lib/types"; import { getSchemeAction, mockSchemeState } from "@/fixtures/engine/mocks"; -import { luaTableToObject } from "@/fixtures/lua/mocks/lua_utils"; import { MockAlifeSimulator, mockClientGameObject, mockIniFile, mockServerAlifeHumanStalker } from "@/fixtures/xray"; import { MockCTime } from "@/fixtures/xray/mocks/CTime.mock"; @@ -272,7 +266,7 @@ describe("'scheme logic' utils", () => { expect(object.set_dest_level_vertex_id).toHaveBeenCalledWith(255); expect(getSchemeAction(state[EScheme.HIT] as IBaseSchemeState).activateScheme).toHaveBeenCalledWith(false, object); - expect(luaTableToObject(state.overrides)).toEqual({ + expect(state.overrides).toEqualLuaTables({ combat_ignore: null, combat_ignore_keep_when_attacked: false, combat_type: null, diff --git a/src/fixtures/jest/extendJest.ts b/src/fixtures/jest/extendJest.ts new file mode 100644 index 000000000..bdc758e77 --- /dev/null +++ b/src/fixtures/jest/extendJest.ts @@ -0,0 +1,20 @@ +import { expect } from "@jest/globals"; + +import { + toEqualLuaArrays, + toEqualLuaTables, + toStrictEqualLuaArrays, + toStrictEqualLuaTables, +} from "@/fixtures/jest/matchers"; + +/** + * Add custom matchers to jest for simpler testing. + */ +export function extendJest(): void { + expect.extend({ + toEqualLuaArrays, + toEqualLuaTables, + toStrictEqualLuaArrays, + toStrictEqualLuaTables, + }); +} diff --git a/src/fixtures/jest/index.ts b/src/fixtures/jest/index.ts new file mode 100644 index 000000000..ca290290e --- /dev/null +++ b/src/fixtures/jest/index.ts @@ -0,0 +1 @@ +export * from "@/fixtures/jest/extendJest"; diff --git a/src/fixtures/jest/matchers/index.ts b/src/fixtures/jest/matchers/index.ts new file mode 100644 index 000000000..78eb83d93 --- /dev/null +++ b/src/fixtures/jest/matchers/index.ts @@ -0,0 +1,4 @@ +export * from "@/fixtures/jest/matchers/to_equal_lua_arrays"; +export * from "@/fixtures/jest/matchers/to_equal_lua_tables"; +export * from "@/fixtures/jest/matchers/to_strict_equal_lua_arrays"; +export * from "@/fixtures/jest/matchers/to_strict_equal_lua_tables"; diff --git a/src/fixtures/jest/matchers/to_equal_lua_arrays.ts b/src/fixtures/jest/matchers/to_equal_lua_arrays.ts new file mode 100644 index 000000000..713a22e1d --- /dev/null +++ b/src/fixtures/jest/matchers/to_equal_lua_arrays.ts @@ -0,0 +1,16 @@ +import { expect } from "@jest/globals"; +import { ExpectationResult } from "expect"; + +import { luaTableToArray } from "@/fixtures/lua/mocks/lua_utils"; + +/** + * Compare two lua array tables. + */ +export function toEqualLuaArrays( + received: LuaTable, + actual: LuaTable +): ExpectationResult { + expect(luaTableToArray(received)).toEqual(luaTableToArray(actual)); + + return { pass: true, message: () => "Expect two lua array tables to match." }; +} diff --git a/src/fixtures/jest/matchers/to_equal_lua_tables.ts b/src/fixtures/jest/matchers/to_equal_lua_tables.ts new file mode 100644 index 000000000..37cda7f6a --- /dev/null +++ b/src/fixtures/jest/matchers/to_equal_lua_tables.ts @@ -0,0 +1,13 @@ +import { expect } from "@jest/globals"; +import { ExpectationResult } from "expect"; + +import { luaTableToObject } from "@/fixtures/lua/mocks/lua_utils"; + +/** + * Compare two lua tables. + */ +export function toEqualLuaTables(received: LuaTable, actual: LuaTable): ExpectationResult { + expect(luaTableToObject(received)).toEqual(luaTableToObject(actual)); + + return { pass: true, message: () => "Expect two lua tables to match." }; +} diff --git a/src/fixtures/jest/matchers/to_strict_equal_lua_arrays.ts b/src/fixtures/jest/matchers/to_strict_equal_lua_arrays.ts new file mode 100644 index 000000000..d9defd271 --- /dev/null +++ b/src/fixtures/jest/matchers/to_strict_equal_lua_arrays.ts @@ -0,0 +1,14 @@ +import { expect } from "@jest/globals"; +import { ExpectationResult } from "expect"; + +import { LuaArray } from "@/engine/lib/types"; +import { luaTableToArray } from "@/fixtures/lua/mocks/lua_utils"; + +/** + * Compare two lua array tables. + */ +export function toStrictEqualLuaArrays(received: LuaArray, actual: LuaArray): ExpectationResult { + expect(luaTableToArray(received)).toStrictEqual(luaTableToArray(actual)); + + return { pass: true, message: () => "Expect two lua array tables to match." }; +} diff --git a/src/fixtures/jest/matchers/to_strict_equal_lua_tables.ts b/src/fixtures/jest/matchers/to_strict_equal_lua_tables.ts new file mode 100644 index 000000000..fa7dfa939 --- /dev/null +++ b/src/fixtures/jest/matchers/to_strict_equal_lua_tables.ts @@ -0,0 +1,13 @@ +import { expect } from "@jest/globals"; +import { ExpectationResult } from "expect"; + +import { luaTableToObject } from "@/fixtures/lua/mocks/lua_utils"; + +/** + * Compare two lua tables. + */ +export function toStrictEqualLuaTables(received: LuaTable, actual: LuaTable): ExpectationResult { + expect(luaTableToObject(received)).toStrictEqual(luaTableToObject(actual)); + + return { pass: true, message: () => "Expect two lua tables to match." }; +} diff --git a/src/fixtures/lua/mockLuaLib.test.ts b/src/fixtures/lua/mockLuaLib.test.ts index 9fadad839..31b58a9fd 100644 --- a/src/fixtures/lua/mockLuaLib.test.ts +++ b/src/fixtures/lua/mockLuaLib.test.ts @@ -1,7 +1,6 @@ import { describe, expect, it } from "@jest/globals"; import { LuaArray } from "@/engine/lib/types"; -import { luaTableToArray } from "@/fixtures/lua/mocks/lua_utils"; import { MockLuaTable } from "@/fixtures/lua/mocks/LuaTable.mock"; describe("'lua' VM mocks to test libraries", () => { @@ -69,7 +68,7 @@ describe("'lua' VM mocks to test libraries", () => { expect(example.get(1)).toBe("a"); expect(example.get(2)).toBe("b"); - expect(luaTableToArray(example)).toEqual(["a", "b"]); + expect(example).toEqualLuaArrays(["a", "b"]); }); it("math should be mocked", () => { diff --git a/src/fixtures/lua/mocks/LuaTable.mock.ts b/src/fixtures/lua/mocks/LuaTable.mock.ts index 342a70113..35448e118 100644 --- a/src/fixtures/lua/mocks/LuaTable.mock.ts +++ b/src/fixtures/lua/mocks/LuaTable.mock.ts @@ -1,6 +1,6 @@ import { jest } from "@jest/globals"; -import { AnyObject, LuaArray } from "@/engine/lib/types"; +import type { AnyObject, LuaArray } from "@/engine/lib/types"; /** * todo; diff --git a/src/fixtures/lua/mocks/lua_utils.ts b/src/fixtures/lua/mocks/lua_utils.ts index 1cbf3b951..15621a77b 100644 --- a/src/fixtures/lua/mocks/lua_utils.ts +++ b/src/fixtures/lua/mocks/lua_utils.ts @@ -1,14 +1,16 @@ -import { AnyObject, LuaArray, Optional } from "@/engine/lib/types"; +import type { AnyObject, LuaArray, Optional } from "@/engine/lib/types"; import { MockLuaTable } from "@/fixtures/lua/mocks/LuaTable.mock"; /** - * todo; + * Transform lua table to array for easier testing with equals checks. */ -export function luaTableToArray(value: Optional>): Array { +export function luaTableToArray(value: Optional>): Array { if (value instanceof MockLuaTable) { return [...(value as unknown as Map).values()].map((it) => { return mapFromLua(it); }); + } else if (Array.isArray(value)) { + return value.map((it) => mapFromLua(it)); } else { throw new Error(`Unexpected type instance provided for casting utility: '${typeof value}'.`); } @@ -29,7 +31,7 @@ export function luaTableToObject(value: Optional luaTableToObject(value)); + return value.map((it) => luaTableToObject(it)); } else if (typeof value === "object") { return Object.entries(value).reduce((acc, [key, value]) => { acc[key as unknown as string] = luaTableToObject(value); diff --git a/src/fixtures/xray/mocks/objects/index.ts b/src/fixtures/xray/mocks/objects/index.ts index 963f69317..b93638ecc 100644 --- a/src/fixtures/xray/mocks/objects/index.ts +++ b/src/fixtures/xray/mocks/objects/index.ts @@ -1,4 +1,4 @@ -export * from "@/fixtures/xray/mocks/objects/path/Patrol.mock"; +export * from "@/fixtures/xray/mocks/objects/Flags32.mock"; export * from "@/fixtures/xray/mocks/objects/AbstractLuabindClass"; export * from "@/fixtures/xray/mocks/objects/AlifeSimulator.mock"; diff --git a/src/typedefs/jest/index.d.ts b/src/typedefs/jest/index.d.ts new file mode 100644 index 000000000..35a914609 --- /dev/null +++ b/src/typedefs/jest/index.d.ts @@ -0,0 +1,15 @@ +import { ExpectationResult } from "expect"; + +export * from "expect"; + +/** + * Extension methods for jest expect checks. + */ +declare module "expect" { + export interface Matchers> { + toEqualLuaTables(expected: Record | LuaTable): ExpectationResult; + toStrictEqualLuaTables(expected: Record | LuaTable): ExpectationResult; + toEqualLuaArrays(expected: Array | LuaTable): ExpectationResult; + toStrictEqualLuaArrays(expected: Array | LuaTable): ExpectationResult; + } +} From 1085f5a33dbc720207ea2cb08199d3e3f83a276a Mon Sep 17 00:00:00 2001 From: Neloreck Date: Sun, 25 Jun 2023 19:39:57 +0300 Subject: [PATCH 03/12] Adding tests for section switchers. Memo for condlist parsing. Moved schemeWounded parse util to separate place. --- src/engine/core/database/registry.test.ts | 3 +- src/engine/core/database/registry.ts | 5 + src/engine/core/managers/world/DropManager.ts | 2 +- .../schemes/base/ObjectRestrictionsManager.ts | 5 +- .../actions/ActionSmartCoverActivity.ts | 45 ++--- .../core/schemes/wounded/SchemeWounded.ts | 104 +++++++++--- src/engine/core/utils/ini/config.test.ts | 7 +- src/engine/core/utils/ini/config.ts | 58 +++---- src/engine/core/utils/ini/parse.test.ts | 160 +++++++++++++++++- src/engine/core/utils/ini/parse.ts | 63 ++----- src/engine/lib/constants/words.ts | 5 + 11 files changed, 304 insertions(+), 153 deletions(-) diff --git a/src/engine/core/database/registry.test.ts b/src/engine/core/database/registry.test.ts index 05f3f22f8..88d656ef7 100644 --- a/src/engine/core/database/registry.test.ts +++ b/src/engine/core/database/registry.test.ts @@ -4,7 +4,7 @@ import { registry } from "@/engine/core/database/registry"; describe("registry storage", () => { it("storage to contain all fields", () => { - expect(Object.keys(registry)).toHaveLength(36); + expect(Object.keys(registry)).toHaveLength(37); }); it("storage to initialize with correct data", () => { @@ -13,6 +13,7 @@ describe("registry storage", () => { expect(registry.activeSmartTerrainId).toBeNull(); expect(registry.managers instanceof LuaTable).toBeTruthy(); expect(registry.schemes instanceof LuaTable).toBeTruthy(); + expect(registry.conditionLists instanceof LuaTable).toBeTruthy(); expect(registry.actorCombat instanceof LuaTable).toBeTruthy(); expect(registry.objects instanceof LuaTable).toBeTruthy(); expect(registry.offlineObjects instanceof LuaTable).toBeTruthy(); diff --git a/src/engine/core/database/registry.ts b/src/engine/core/database/registry.ts index 7438df087..76feb037f 100644 --- a/src/engine/core/database/registry.ts +++ b/src/engine/core/database/registry.ts @@ -20,6 +20,7 @@ import type { CampStoryManager } from "@/engine/core/schemes/camper"; import type { PatrolManager } from "@/engine/core/schemes/patrol"; import type { ReachTaskPatrolManager } from "@/engine/core/schemes/reach_task"; import type { LightManager } from "@/engine/core/schemes/sr_light"; +import type { TConditionList } from "@/engine/core/utils/ini/types"; import type { ERelation } from "@/engine/core/utils/relation"; import { storyNames, TStoryName } from "@/engine/lib/constants/story_names"; import type { @@ -59,6 +60,10 @@ export const registry = { * List of activated schemes in game. */ schemes: new LuaTable(), + /** + * Memoized condlist for parsing simplification, where key is string data and value is parsed descriptor. + */ + conditionLists: new LuaTable(), /** * Set of objects in combat with actor. */ diff --git a/src/engine/core/managers/world/DropManager.ts b/src/engine/core/managers/world/DropManager.ts index 32a8d7cb4..e98430848 100644 --- a/src/engine/core/managers/world/DropManager.ts +++ b/src/engine/core/managers/world/DropManager.ts @@ -132,7 +132,7 @@ export class DropManager extends AbstractCoreManager { const [, key, value] = DEATH_GENERIC_LTX.r_line(itemsDropSectionByDifficulty, it, "", ""); const sectionDropCount: LuaArray = parseNumbersList(value); - if (sectionDropCount.has(1)) { + if (!sectionDropCount.has(1)) { abort("Error on [death_ini] declaration. Section [%s], line [%s]", itemsDropSectionByDifficulty, tostring(key)); } diff --git a/src/engine/core/schemes/base/ObjectRestrictionsManager.ts b/src/engine/core/schemes/base/ObjectRestrictionsManager.ts index d7ce9d367..b2df53602 100644 --- a/src/engine/core/schemes/base/ObjectRestrictionsManager.ts +++ b/src/engine/core/schemes/base/ObjectRestrictionsManager.ts @@ -1,5 +1,4 @@ import { IRegistryObjectState, registry } from "@/engine/core/database"; -import { getParametersString } from "@/engine/core/utils/ini/config"; import { parseStringsList } from "@/engine/core/utils/ini/parse"; import { readIniString } from "@/engine/core/utils/ini/read"; import { LuaLogger } from "@/engine/core/utils/logging"; @@ -64,7 +63,7 @@ export class ObjectRestrictionsManager { logger.info("Activate restrictions:", objectName, section); // Update OUT restrictors based on active / ini restrictors. - const [outRestrictorString] = getParametersString(readIniString(ini, section, "out_restr", false, "", "")); + const outRestrictorString: string = readIniString(ini, section, "out_restr", false, "", ""); const newOutRestrictors: LuaArray = parseStringsList(outRestrictorString); const oldOutRestrictors: LuaArray = parseStringsList(this.object.out_restrictions()); @@ -115,7 +114,7 @@ export class ObjectRestrictionsManager { } // Update IN restrictors based on active / ini restrictors. - const [inRestrictorString] = getParametersString(readIniString(ini, section, "in_restr", false, "", "")); + const inRestrictorString: string = readIniString(ini, section, "in_restr", false, "", ""); const newInRestrictor: LuaArray = parseStringsList(inRestrictorString); const oldInRestrictor: LuaArray = parseStringsList(this.object.in_restrictions()); diff --git a/src/engine/core/schemes/smartcover/actions/ActionSmartCoverActivity.ts b/src/engine/core/schemes/smartcover/actions/ActionSmartCoverActivity.ts index 1cf23a9d6..a50202929 100644 --- a/src/engine/core/schemes/smartcover/actions/ActionSmartCoverActivity.ts +++ b/src/engine/core/schemes/smartcover/actions/ActionSmartCoverActivity.ts @@ -10,9 +10,7 @@ import { ISchemeSmartCoverState, } from "@/engine/core/schemes/smartcover/ISchemeSmartCoverState"; import { abort } from "@/engine/core/utils/assertion"; -import { getParametersString, pickSectionFromCondList } from "@/engine/core/utils/ini/config"; -import { parseConditionsList } from "@/engine/core/utils/ini/parse"; -import { TConditionList } from "@/engine/core/utils/ini/types"; +import { parseConditionsList, pickSectionFromCondList, TConditionList } from "@/engine/core/utils/ini"; import { LuaLogger } from "@/engine/core/utils/logging"; import { NIL } from "@/engine/lib/constants/words"; import { ClientObject, Optional, StringOptional, TName, TNumberId, Vector } from "@/engine/lib/types"; @@ -42,9 +40,6 @@ export class ActionSmartCoverActivity extends action_base { this.state = state; } - /** - * todo: Description. - */ public override initialize(): void { super.initialize(); @@ -92,30 +87,26 @@ export class ActionSmartCoverActivity extends action_base { // --object.set_smart_cover_target_selector() this.targetEnemyId = null; - const [coverName, used] = getParametersString(this.state.cover_name as string); + this.coverName = this.state.cover_name as string; - this.coverName = coverName; - - if (this.coverName !== this.state.cover_name || used === false) { - if (registry.smartCovers.get(this.coverName) === null) { - abort("There is no smart_cover with name [%s]", this.coverName); - } + if (registry.smartCovers.get(this.coverName) === null) { + abort("There is no smart_cover with name [%s]", this.coverName); + } - setStalkerState(this.object, EStalkerState.SMART_COVER, null, null, null, null); + setStalkerState(this.object, EStalkerState.SMART_COVER, null, null, null, null); - this.targetPathCondlist = parseConditionsList(this.state.target_path); - this.checkTarget(); + this.targetPathCondlist = parseConditionsList(this.state.target_path); + this.checkTarget(); - this.coverСondlist = parseConditionsList(this.state.cover_state); - this.coverState = pickSectionFromCondList(registry.actor, this.object, this.coverСondlist) as ECoverState; - this.targetSelector(this.object); - this.checkTargetSelector(); + this.coverСondlist = parseConditionsList(this.state.cover_state); + this.coverState = pickSectionFromCondList(registry.actor, this.object, this.coverСondlist) as ECoverState; + this.targetSelector(this.object); + this.checkTargetSelector(); - this.object.idle_min_time(this.state.idle_min_time); - this.object.idle_max_time(this.state.idle_max_time); - this.object.lookout_min_time(this.state.lookout_min_time); - this.object.lookout_max_time(this.state.lookout_max_time); - } + this.object.idle_min_time(this.state.idle_min_time); + this.object.idle_max_time(this.state.idle_max_time); + this.object.lookout_min_time(this.state.lookout_min_time); + this.object.lookout_max_time(this.state.lookout_max_time); } /** @@ -149,9 +140,7 @@ export class ActionSmartCoverActivity extends action_base { ); if (targetPathSection !== NIL && targetPathSection !== null) { - const [targetPath, used] = getParametersString(targetPathSection); - - this.targetPath = targetPath; + this.targetPath = targetPathSection; if (this.targetPath !== NIL) { if (level.patrol_path_exists(this.targetPath)) { diff --git a/src/engine/core/schemes/wounded/SchemeWounded.ts b/src/engine/core/schemes/wounded/SchemeWounded.ts index c31f70330..998b437f9 100644 --- a/src/engine/core/schemes/wounded/SchemeWounded.ts +++ b/src/engine/core/schemes/wounded/SchemeWounded.ts @@ -6,13 +6,22 @@ import { ActionWounded } from "@/engine/core/schemes/wounded/actions"; import { EvaluatorCanFight, EvaluatorWounded } from "@/engine/core/schemes/wounded/evaluators"; import { ISchemeWoundedState } from "@/engine/core/schemes/wounded/ISchemeWoundedState"; import { WoundManager } from "@/engine/core/schemes/wounded/WoundManager"; -import { parseData } from "@/engine/core/utils/ini/parse"; -import { readIniBoolean, readIniString } from "@/engine/core/utils/ini/read"; +import { IConfigSwitchCondition, parseConditionsList, readIniBoolean, readIniString } from "@/engine/core/utils/ini"; import { LuaLogger } from "@/engine/core/utils/logging"; import { getCharacterCommunity } from "@/engine/core/utils/object/object_general"; import { communities, TCommunity } from "@/engine/lib/constants/communities"; import { NIL } from "@/engine/lib/constants/words"; -import { ActionPlanner, AnyObject, ClientObject, IniFile, Maybe, Optional, TNumberId } from "@/engine/lib/types"; +import { + ActionPlanner, + AnyObject, + ClientObject, + IniFile, + LuaArray, + Maybe, + Optional, + TDistance, + TNumberId, +} from "@/engine/lib/types"; import { EScheme, ESchemeType, TSection } from "@/engine/lib/types/scheme"; const woundedByState: Record = { @@ -30,18 +39,12 @@ export class SchemeWounded extends AbstractScheme { public static override readonly SCHEME_SECTION: EScheme = EScheme.WOUNDED; public static override readonly SCHEME_TYPE: ESchemeType = ESchemeType.STALKER; - /** - * todo: Description. - */ public static override activate(object: ClientObject, ini: IniFile, scheme: EScheme, section: TSection): void { const state: ISchemeWoundedState = AbstractScheme.assign(object, ini, scheme, section); state.woundManager = new WoundManager(object, state); } - /** - * todo: Description. - */ public static override add( object: ClientObject, ini: IniFile, @@ -79,9 +82,6 @@ export class SchemeWounded extends AbstractScheme { .add_precondition(new world_property(EEvaluatorId.CAN_FIGHT, true)); } - /** - * todo: Description. - */ public static override reset( object: ClientObject, scheme: EScheme, @@ -169,12 +169,12 @@ export class SchemeWounded extends AbstractScheme { // Initialize state: if (tostring(section) === NIL) { - state.hp_state = parseData(defaults.hp_state); - state.hp_state_see = parseData(defaults.hp_state_see); - state.psy_state = parseData(defaults.psy_state); - state.hp_victim = parseData(defaults.hp_victim); - state.hp_cover = parseData(defaults.hp_cover); - state.hp_fight = parseData(defaults.hp_fight); + state.hp_state = SchemeWounded.parseData(defaults.hp_state); + state.hp_state_see = SchemeWounded.parseData(defaults.hp_state_see); + state.psy_state = SchemeWounded.parseData(defaults.psy_state); + state.hp_victim = SchemeWounded.parseData(defaults.hp_victim); + state.hp_cover = SchemeWounded.parseData(defaults.hp_cover); + state.hp_fight = SchemeWounded.parseData(defaults.hp_fight); state.help_dialog = defaults.help_dialog; state.help_start_dialog = null; state.use_medkit = defaults.use_medkit; @@ -182,12 +182,18 @@ export class SchemeWounded extends AbstractScheme { state.enable_talk = true; state.not_for_help = defaults.not_for_help; } else { - state.hp_state = parseData(readIniString(ini, section, "hp_state", false, "", defaults.hp_state)); - state.hp_state_see = parseData(readIniString(ini, section, "hp_state_see", false, "", defaults.hp_state_see)); - state.psy_state = parseData(readIniString(ini, section, "psy_state", false, "", defaults.psy_state)); - state.hp_victim = parseData(readIniString(ini, section, "hp_victim", false, "", defaults.hp_victim)); - state.hp_cover = parseData(readIniString(ini, section, "hp_cover", false, "", defaults.hp_cover)); - state.hp_fight = parseData(readIniString(ini, section, "hp_fight", false, "", defaults.hp_fight)); + state.hp_state = SchemeWounded.parseData(readIniString(ini, section, "hp_state", false, "", defaults.hp_state)); + state.hp_state_see = SchemeWounded.parseData( + readIniString(ini, section, "hp_state_see", false, "", defaults.hp_state_see) + ); + state.psy_state = SchemeWounded.parseData( + readIniString(ini, section, "psy_state", false, "", defaults.psy_state) + ); + state.hp_victim = SchemeWounded.parseData( + readIniString(ini, section, "hp_victim", false, "", defaults.hp_victim) + ); + state.hp_cover = SchemeWounded.parseData(readIniString(ini, section, "hp_cover", false, "", defaults.hp_cover)); + state.hp_fight = SchemeWounded.parseData(readIniString(ini, section, "hp_fight", false, "", defaults.hp_fight)); state.help_dialog = readIniString(ini, section, "help_dialog", false, "", defaults.help_dialog); state.help_start_dialog = readIniString(ini, section, "help_start_dialog", false, "", null); state.use_medkit = readIniBoolean(ini, section, "use_medkit", false, defaults.use_medkit); @@ -246,4 +252,54 @@ export class SchemeWounded extends AbstractScheme { return false; } + + /** + * todo; + */ + private static parseData(target: Optional): LuaArray<{ + dist: Optional; + state: Optional>; + sound: Optional>; + }> { + const collection: LuaArray = new LuaTable(); + + if (target) { + for (const name of string.gfind(target, "(%|*%d+%|[^%|]+)%p*")) { + const dat = { + dist: null as Optional, + state: null as Optional>, + sound: null as Optional>, + }; + + const [tPosition] = string.find(name, "|", 1, true); + const [sPosition] = string.find(name, "@", 1, true); + + const dist = string.sub(name, 1, tPosition - 1); + + let state: Optional = null; + let sound: Optional = null; + + if (sPosition !== null) { + state = string.sub(name, tPosition + 1, sPosition - 1); + sound = string.sub(name, sPosition + 1); + } else { + state = string.sub(name, tPosition + 1); + } + + dat.dist = tonumber(dist)!; + + if (state !== null) { + dat.state = parseConditionsList(state); + } + + if (sound !== null) { + dat.sound = parseConditionsList(sound); + } + + table.insert(collection, dat); + } + } + + return collection; + } } diff --git a/src/engine/core/utils/ini/config.test.ts b/src/engine/core/utils/ini/config.test.ts index 656ed3743..3aadb82d7 100644 --- a/src/engine/core/utils/ini/config.test.ts +++ b/src/engine/core/utils/ini/config.test.ts @@ -2,7 +2,12 @@ import { describe, expect, it } from "@jest/globals"; import { registerStoryLink } from "@/engine/core/database"; import { IBaseSchemeLogic } from "@/engine/core/schemes"; -import { addConditionToList, getConfigSwitchConditions, parseConditionsList } from "@/engine/core/utils/ini"; +import { + addConditionToList, + getConfigSwitchConditions, + getParametersString, + parseConditionsList, +} from "@/engine/core/utils/ini"; import { LuaArray, ServerObject, TIndex } from "@/engine/lib/types"; import { mockBaseSchemeLogic } from "@/fixtures/engine"; import { mockIniFile, mockServerAlifeObject } from "@/fixtures/xray"; diff --git a/src/engine/core/utils/ini/config.ts b/src/engine/core/utils/ini/config.ts index c440b57e5..dd4446b5a 100644 --- a/src/engine/core/utils/ini/config.ts +++ b/src/engine/core/utils/ini/config.ts @@ -18,7 +18,7 @@ import { TConditionList } from "@/engine/core/utils/ini/types"; import { LuaLogger } from "@/engine/core/utils/logging"; import { logicsConfig } from "@/engine/lib/configs/LogicsConfig"; import { TInfoPortion } from "@/engine/lib/constants/info_portions"; -import { NIL } from "@/engine/lib/constants/words"; +import { NEVER, NIL } from "@/engine/lib/constants/words"; import { AlifeSimulator, AnyCallable, @@ -32,6 +32,7 @@ import { TCount, TIndex, TName, + TProbability, TRate, TSection, TStringId, @@ -39,22 +40,11 @@ import { const logger: LuaLogger = new LuaLogger($filename); -/** - * todo; - */ -export function getParametersString(data: string): LuaMultiReturn<[string, boolean]> { - const [outString, num] = string.gsub(data, "%$script_id%$", NIL); - - if (num > 0) { - return $multi(outString, true); - } else { - return $multi(data, false); - } -} - /** * todo; * todo: Probably not used anywhere, check. Original regexp - "(%|*[^%|]+%|*)%p*". + * + * */ export function getInfosFromData(object: ClientObject, data: Optional): LuaArray { const infos: LuaArray = new LuaTable(); @@ -75,23 +65,25 @@ export function getInfosFromData(object: ClientObject, data: Optional): } /** - * @returns picked section based on condlist. + * Pick resulting scheme based on info portions and xr_conditions requirements. + * Process side effects of such checks and give needed infos and call effects on switch. + * + * @param actor - actor client object + * @param object - target client object + * @param condlist - target condlist to process + * @returns picked section based on condlist and actual checks */ export function pickSectionFromCondList( actor: ClientObject, object: Optional, condlist: TConditionList ): Optional { - let randomValue: Optional = null; // -- math.random(100) - for (const [, switchCondition] of condlist) { let areInfoPortionConditionsMet = true; for (const [, configCondition] of switchCondition.infop_check) { if (configCondition.prob) { - if (!randomValue) { - randomValue = math.random(100); - } + const randomValue: TProbability = math.random(100); if (configCondition.prob < randomValue) { areInfoPortionConditionsMet = false; @@ -151,35 +143,31 @@ export function pickSectionFromCondList( } if (areInfoPortionConditionsMet) { - for (const [, infop] of switchCondition.infop_set) { - if (infop.func) { - const effect: Optional = (_G as AnyObject)["xr_effects"][infop.func]; + for (const [, configCondition] of switchCondition.infop_set) { + if (configCondition.func) { + const effect: Optional = (_G as AnyObject)["xr_effects"][configCondition.func]; if (!effect) { abort( "object '%s': pickSectionFromCondList: function '%s' is not defined in xr_effects.", object?.name(), - infop.func + configCondition.func ); } - effect(actor, object, infop.params); - } else if (infop.required) { - if (!hasAlifeInfo(infop.name)) { - giveInfo(infop.name); + effect(actor, object, configCondition.params); + } else if (configCondition.required) { + if (!hasAlifeInfo(configCondition.name)) { + giveInfo(configCondition.name); } } else { - if (hasAlifeInfo(infop.name)) { - disableInfo(infop.name); + if (hasAlifeInfo(configCondition.name)) { + disableInfo(configCondition.name); } } } - if (switchCondition.section === "never") { - return null; - } else { - return switchCondition.section as T; - } + return switchCondition.section === NEVER ? null : (switchCondition.section as T); } } diff --git a/src/engine/core/utils/ini/parse.test.ts b/src/engine/core/utils/ini/parse.test.ts index 882a214cc..2cb28b272 100644 --- a/src/engine/core/utils/ini/parse.test.ts +++ b/src/engine/core/utils/ini/parse.test.ts @@ -1,5 +1,9 @@ -import { describe, expect, it } from "@jest/globals"; +import { describe, expect, it, jest } from "@jest/globals"; +import { registerActor } from "@/engine/core/database"; +import { extern } from "@/engine/core/utils/binding"; +import { disableInfo, giveInfo, hasAlifeInfo } from "@/engine/core/utils/info_portion"; +import { pickSectionFromCondList } from "@/engine/core/utils/ini/config"; import { getSchemeFromSection, parseAllSectionToTable, @@ -18,11 +22,11 @@ import { } from "@/engine/core/utils/ini/parse"; import { IConfigCondition } from "@/engine/core/utils/ini/types"; import { NIL } from "@/engine/lib/constants/words"; -import { Flags32, IniFile, LuaArray } from "@/engine/lib/types"; -import { MockFlags32, mockIniFile } from "@/fixtures/xray"; +import { ClientObject, Flags32, IniFile, LuaArray } from "@/engine/lib/types"; +import { mockActorClientGameObject, mockClientGameObject, MockFlags32, mockIniFile } from "@/fixtures/xray"; describe("'ini_data' parsing utils", () => { - it("Should correctly parse names array", () => { + it("'parseStringsList' should correctly parse names array", () => { expect(parseStringsList("a, b, c")).toEqualLuaArrays(["a", "b", "c"]); expect(parseStringsList("a b c")).toEqualLuaArrays(["a", "b", "c"]); expect(parseStringsList("name_1, example_b, name_complex_here")).toEqualLuaArrays([ @@ -36,7 +40,7 @@ describe("'ini_data' parsing utils", () => { expect(parseStringsList("a_b, c_d")).toEqualLuaArrays(["a_b", "c_d"]); }); - it("Should correctly parse numbers array", () => { + it("'parseNumbersList' should correctly parse numbers array", () => { expect(parseNumbersList("1, 2, 3, 4")).toEqualLuaArrays([1, 2, 3, 4]); expect(parseNumbersList("1.5, 2.33, 3.0")).toEqualLuaArrays([1.5, 2.33, 3.0]); expect(parseNumbersList("1.5 2.33 3.0")).toEqualLuaArrays([1.5, 2.33, 3.0]); @@ -45,7 +49,7 @@ describe("'ini_data' parsing utils", () => { expect(parseNumbersList("15 0 -43 9999")).toEqualLuaArrays([15, 0, -43, 9999]); }); - it("Should correctly parse spawn details", () => { + it("'parseSpawnDetails' should correctly parse spawn details", () => { expect(parseSpawnDetails("")).toEqualLuaArrays([]); expect(parseSpawnDetails("1,1")).toEqualLuaArrays([ { @@ -71,7 +75,7 @@ describe("'ini_data' parsing utils", () => { ]); }); - it("Should correctly parse call parameters", () => { + it("'parseParameters' should correctly parse call parameters", () => { expect(parseParameters(NIL)).toEqualLuaArrays([NIL]); expect(parseParameters("abcd")).toEqualLuaArrays(["abcd"]); expect(parseParameters("a|b|c|d")).toEqualLuaArrays(["a", "b", "c", "d"]); @@ -81,7 +85,9 @@ describe("'ini_data' parsing utils", () => { ]); }); - it("Should correctly parse condition lists", () => { + it("'parseConditionsList' should correctly parse condition lists", () => { + // Memo check. + expect(parseConditionsList("{+zat_b104_task_end}4,0")).toBe(parseConditionsList("{+zat_b104_task_end}4,0")); expect(parseConditionsList("{+zat_b104_task_end}4,0")).toStrictEqualLuaArrays([ { infop_check: { 1: { name: "zat_b104_task_end", required: true } }, infop_set: {}, section: "4" }, { infop_check: {}, section: "0", infop_set: {} }, @@ -393,6 +399,144 @@ describe("'ini_data' parsing utils", () => { ]); }); + it("'pickSectionFromCondList' should correctly throw on unexpected callbacks", () => { + const actor: ClientObject = mockActorClientGameObject(); + const target: ClientObject = mockClientGameObject(); + + registerActor(actor); + + expect(() => pickSectionFromCondList(actor, target, parseConditionsList("{=not_existing_cb}simple"))).toThrow(); + expect(() => { + pickSectionFromCondList(actor, target, parseConditionsList("simple%=not_existing_cb(a|b)%")); + }).toThrow(); + }); + + it("pickSectionFromCondList should correctly check probability", () => { + const actor: ClientObject = mockActorClientGameObject(); + const target: ClientObject = mockClientGameObject(); + + registerActor(actor); + + jest.spyOn(math, "random").mockImplementation(() => 50); + + expect(pickSectionFromCondList(actor, target, parseConditionsList("{~10}a,{~100}b, c"))).toBe("b"); + expect(pickSectionFromCondList(actor, target, parseConditionsList("{~10}a,{~10}b, c"))).toBe("c"); + expect(pickSectionFromCondList(actor, target, parseConditionsList("{~10}a,{~1000}b, c"))).toBe("b"); + expect(pickSectionFromCondList(actor, target, parseConditionsList("{~100}a,{~1000}b, c"))).toBe("a"); + expect(pickSectionFromCondList(actor, target, parseConditionsList("{~40}a,{~50}b, c"))).toBe("b"); + + jest.spyOn(math, "random").mockImplementation(() => 70); + + expect(pickSectionFromCondList(actor, target, parseConditionsList("{~60}a,{~50}b, {~75}c, d"))).toBe("c"); + }); + + it("'pickSectionFromCondList' should correctly check condition callbacks and call effects", () => { + const actor: ClientObject = mockActorClientGameObject(); + const target: ClientObject = mockClientGameObject(); + + registerActor(actor); + + const firstEffect = jest.fn(); + const secondEffect = jest.fn(); + const thirdEffect = jest.fn(); + + extern("xr_effects.first", firstEffect); + extern("xr_effects.second", secondEffect); + extern("xr_effects.third", secondEffect); + + const firstCondition = jest.fn(() => true); + const secondCondition = jest.fn(() => false); + + extern("xr_conditions.first", firstCondition); + extern("xr_conditions.second", secondCondition); + + expect(pickSectionFromCondList(actor, target, parseConditionsList("{=first !second}a,b"))).toBe("a"); + expect(pickSectionFromCondList(actor, target, parseConditionsList("{!first !second}a,b"))).toBe("b"); + expect(pickSectionFromCondList(actor, target, parseConditionsList("{!first =second}a,b"))).toBe("b"); + expect(pickSectionFromCondList(actor, target, parseConditionsList("{=first =second}a,b"))).toBe("b"); + + expect(pickSectionFromCondList(actor, target, parseConditionsList("{=first !second}a%=first(a:1)%,b"))).toBe("a"); + expect(pickSectionFromCondList(actor, target, parseConditionsList("{!first !second}a,b%=second%"))).toBe("b"); + expect(pickSectionFromCondList(actor, target, parseConditionsList("{!first =second}a%=third%,b"))).toBe("b"); + + expect(firstEffect.mock.calls[0]).toEqualLuaArrays([actor, target, { "1": "a", "2": 1 }]); + expect(secondEffect).toHaveBeenCalledWith(actor, target, null); + expect(thirdEffect).not.toHaveBeenCalled(); + }); + + it("'pickSectionFromCondList' should correctly pick and process info from list", () => { + const actor: ClientObject = mockActorClientGameObject(); + const target: ClientObject = mockClientGameObject(); + + registerActor(actor); + + expect(pickSectionFromCondList(actor, target, parseConditionsList("simple"))).toBe("simple"); + expect( + pickSectionFromCondList( + actor, + target, + parseConditionsList("{+test_info -unexpected_info} simple %+another_info -available_info%, fallback") + ) + ).toBe("fallback"); + + giveInfo("available_info"); + giveInfo("test_info"); + giveInfo("unexpected_info"); + + expect( + pickSectionFromCondList( + actor, + target, + parseConditionsList("{+test_info -unexpected_info} simple %+another_info -available_info%, fallback") + ) + ).toBe("fallback"); + + disableInfo("unexpected_info"); + + expect(hasAlifeInfo("test_info")).toBe(true); + expect(hasAlifeInfo("unexpected_info")).toBe(false); + expect(hasAlifeInfo("available_info")).toBe(true); + expect( + pickSectionFromCondList( + actor, + target, + parseConditionsList("{+test_info -unexpected_info} simple %+another_info -available_info%, fallback") + ) + ).toBe("simple "); + + expect(hasAlifeInfo("another_info")).toBe(true); + expect(hasAlifeInfo("available_info")).toBe(false); + }); + + it("'pickSectionFromCondList' should correctly handle combination of all factors", () => { + const actor: ClientObject = mockActorClientGameObject(); + const target: ClientObject = mockClientGameObject(); + + registerActor(actor); + giveInfo("test_info"); + + jest.spyOn(math, "random").mockImplementation(() => 50); + + const firstEffect = jest.fn(); + const firstCondition = jest.fn(() => true); + const secondCondition = jest.fn(() => false); + + extern("xr_effects.first", firstEffect); + extern("xr_conditions.first", firstCondition); + extern("xr_conditions.second", secondCondition); + + expect( + pickSectionFromCondList( + actor, + target, + parseConditionsList( + "{+test_info -unexpected_info =first !second ~45}a,{+test_info +unexpected_info ~60}b," + + "{+test_info -unexpected_info =first =second}c,{+test_info -unexpected_info =first !second ~51}d,e" + ) + ) + ).toBe("d"); + }); + it("'parseAllSectionToTable' should correctly parse ini section to matching lua table", () => { const ini: IniFile = mockIniFile("example.ltx", { section1: { diff --git a/src/engine/core/utils/ini/parse.ts b/src/engine/core/utils/ini/parse.ts index 7caf6d9ec..9db5b1b13 100644 --- a/src/engine/core/utils/ini/parse.ts +++ b/src/engine/core/utils/ini/parse.ts @@ -1,5 +1,6 @@ import { flags32, patrol } from "xray16"; +import { registry } from "@/engine/core/database/registry"; import { abort, assert, assertDefined } from "@/engine/core/utils/assertion"; import { IBoneStateDescriptor, @@ -22,7 +23,6 @@ import { Patrol, StringOptional, TCount, - TDistance, TIndex, TName, TPath, @@ -141,12 +141,18 @@ export function parseParameters(data: T): LuaArray { * 2 = { infop_check = { 1 = {"infop3" = true}, 2 = {"infop4" = false} }, infop_set = {}, section = "section2" }, * } * - * todo: trimming of whitespaces + * todo: trimming of whitespaces in names + * todo: throw on empty string? * * @param data - raw string from config to parse * @returns parsed condlist descriptor */ export function parseConditionsList(data: string): TConditionList { + // All condition lists are just readonly descriptors. Cache them. + if (registry.conditionLists.has(data)) { + return registry.conditionLists.get(data); + } + const result: LuaArray = new LuaTable(); for (const condition of string.gfind(data, "%s*([^,]+)%s*")) { @@ -182,6 +188,9 @@ export function parseConditionsList(data: string): TConditionList { }); } + // Memoize condlist. + registry.conditionLists.set(data, result); + return result; } @@ -413,56 +422,6 @@ export function parseWaypointsDataFromList( return list; } -/** - * todo; - */ -export function parseData(target: Optional): LuaArray<{ - dist: Optional; - state: Optional>; - sound: Optional>; -}> { - const collection: LuaArray = new LuaTable(); - - if (target) { - for (const name of string.gfind(target, "(%|*%d+%|[^%|]+)%p*")) { - const dat = { - dist: null as Optional, - state: null as Optional>, - sound: null as Optional>, - }; - - const [tPosition] = string.find(name, "|", 1, true); - const [sPosition] = string.find(name, "@", 1, true); - - const dist = string.sub(name, 1, tPosition - 1); - - let state: Optional = null; - let sound: Optional = null; - - if (sPosition !== null) { - state = string.sub(name, tPosition + 1, sPosition - 1); - sound = string.sub(name, sPosition + 1); - } else { - state = string.sub(name, tPosition + 1); - } - - dat.dist = tonumber(dist)!; - - if (state !== null) { - dat.state = parseConditionsList(state); - } - - if (sound !== null) { - dat.sound = parseConditionsList(sound); - } - - table.insert(collection, dat); - } - } - - return collection; -} - /** * Parse descriptors for bone index. * Matches bone index to related state condlist. diff --git a/src/engine/lib/constants/words.ts b/src/engine/lib/constants/words.ts index 9ff5c5eee..c4a8063f1 100644 --- a/src/engine/lib/constants/words.ts +++ b/src/engine/lib/constants/words.ts @@ -3,6 +3,11 @@ */ export const NIL = "nil" as const; +/** + * Null stringified by lua. + */ +export const NEVER = "never" as const; + /** * True stringified by lua. */ From abd6e942b92789d6cd953ba638115de45ea7a4ae Mon Sep 17 00:00:00 2001 From: Neloreck Date: Sun, 25 Jun 2023 23:14:42 +0300 Subject: [PATCH 04/12] Adding unit tests for ini/config. --- src/engine/core/utils/ini/config.test.ts | 114 +++++++++++++++++- src/engine/core/utils/ini/config.ts | 35 +++--- .../core/utils/object/object_general.ts | 14 ++- 3 files changed, 140 insertions(+), 23 deletions(-) diff --git a/src/engine/core/utils/ini/config.test.ts b/src/engine/core/utils/ini/config.test.ts index 3aadb82d7..62f098405 100644 --- a/src/engine/core/utils/ini/config.test.ts +++ b/src/engine/core/utils/ini/config.test.ts @@ -1,19 +1,123 @@ import { describe, expect, it } from "@jest/globals"; -import { registerStoryLink } from "@/engine/core/database"; +import { registerActor, registerObject, registerStoryLink } from "@/engine/core/database"; import { IBaseSchemeLogic } from "@/engine/core/schemes"; +import { giveInfo } from "@/engine/core/utils/info_portion"; import { addConditionToList, + getConfigObjectAndZone, getConfigSwitchConditions, - getParametersString, + getObjectConfigOverrides, + getSectionsFromConditionLists, parseConditionsList, } from "@/engine/core/utils/ini"; -import { LuaArray, ServerObject, TIndex } from "@/engine/lib/types"; +import { NIL } from "@/engine/lib/constants/words"; +import { ClientObject, LuaArray, ServerObject, TIndex } from "@/engine/lib/types"; import { mockBaseSchemeLogic } from "@/fixtures/engine"; -import { mockIniFile, mockServerAlifeObject } from "@/fixtures/xray"; +import { mockActorClientGameObject, mockClientGameObject, mockIniFile, mockServerAlifeObject } from "@/fixtures/xray"; describe("'config' utils for ini file", () => { - it("'addCondition' util should fill table and return new index", () => { + it("getInfosFromData should correctly parse data list of condition lists", () => { + registerActor(mockActorClientGameObject()); + giveInfo("test"); + + expect(getSectionsFromConditionLists(mockClientGameObject(), "a|b|c")).toEqualLuaArrays(["a", "b", "c"]); + expect(getSectionsFromConditionLists(mockClientGameObject(), "a|{+not_existing}b,c|{+test}d,e")).toEqualLuaArrays([ + "a", + "c", + "d", + ]); + }); + + it("getConfigObjectAndZone should correctly parse story id and zone pair", () => { + const serverObject: ServerObject = mockServerAlifeObject(); + + registerStoryLink(serverObject.id, "zat_cop_id"); + + expect( + getConfigObjectAndZone( + mockIniFile("test.ltx", { + test: { + key: "zat_cop_id|zat_b38_actor_jump_down|{+a -b}walker@get_out", + }, + }), + "test", + "key" + ) + ).toEqualLuaTables({ + condlist: parseConditionsList("{+a -b} walker@get_out"), + name: "key", + npc_id: 100000, + v1: "zat_cop_id", + v2: "zat_b38_actor_jump_down", + }); + }); + + it("getObjectConfigOverrides should correctly parse overrides", () => { + const object: ClientObject = mockClientGameObject(); + + registerObject(object); + + expect(getObjectConfigOverrides(mockIniFile("test.ltx", { empty: {} }), "empty", object)).toEqualLuaTables({ + combat_ignore: null, + combat_ignore_keep_when_attacked: false, + combat_type: null, + max_post_combat_time: 10, + min_post_combat_time: 5, + on_combat: null, + on_offline_condlist: parseConditionsList(NIL), + soundgroup: null, + }); + + expect( + getObjectConfigOverrides( + mockIniFile("test.ltx", { + empty: { + heli_hunter: "first", + combat_ignore_cond: "second", + combat_ignore_keep_when_attacked: "third", + combat_type: "fourth", + on_combat: "fifth", + post_combat_time: "10, 50", + on_offline: "sixth", + soundgroup: "seventh", + }, + }), + "empty", + object + ) + ).toEqualLuaTables({ + combat_ignore: { + condlist: parseConditionsList("second"), + name: "combat_ignore_cond", + npc_id: null, + v1: null, + v2: null, + }, + combat_ignore_keep_when_attacked: "third", + combat_type: { + condlist: parseConditionsList("fourth"), + name: "combat_type", + npc_id: null, + v1: null, + v2: null, + }, + heli_hunter: parseConditionsList("first"), + max_post_combat_time: 50, + min_post_combat_time: 10, + on_combat: { + condlist: parseConditionsList("fifth"), + name: "on_combat", + npc_id: null, + v1: null, + v2: null, + }, + on_offline_condlist: parseConditionsList("sixth"), + soundgroup: "seventh", + }); + }); + + it("addCondition util should fill table and return new index", () => { const list: LuaArray = new LuaTable(); expect(addConditionToList(list, 1, null)).toBe(1); diff --git a/src/engine/core/utils/ini/config.ts b/src/engine/core/utils/ini/config.ts index dd4446b5a..4d79738b1 100644 --- a/src/engine/core/utils/ini/config.ts +++ b/src/engine/core/utils/ini/config.ts @@ -33,7 +33,6 @@ import { TIndex, TName, TProbability, - TRate, TSection, TStringId, } from "@/engine/lib/types"; @@ -41,12 +40,14 @@ import { const logger: LuaLogger = new LuaLogger($filename); /** - * todo; - * todo: Probably not used anywhere, check. Original regexp - "(%|*[^%|]+%|*)%p*". - * + * Parse array of `|` separated condition lists. + * Original regexp - "(%|*[^%|]+%|*)%p*". * + * @param object - target client object + * @param data - target data list string to parse + * @returns parsed list of sections from processed condition lists */ -export function getInfosFromData(object: ClientObject, data: Optional): LuaArray { +export function getSectionsFromConditionLists(object: ClientObject, data: Optional): LuaArray { const infos: LuaArray = new LuaTable(); const actor: ClientObject = registry.actor; @@ -175,17 +176,21 @@ export function pickSectionFromCondList( } /** - * todo; - * todo; - * todo; + * Parse config field containing zone name, story ID and condlist. + * Example: `zat_cop_id|zat_b38_actor_jump_down|walker@get_out`. + * + * @param ini - target ini file to read + * @param section - target section to read + * @param field - section field name to read + * @returns parse scheme logic descriptor */ export function getConfigObjectAndZone(ini: IniFile, section: TSection, field: TName): Optional { const target: Optional = readIniTwoStringsAndConditionsList(ini, section, field); - if (target !== null) { + if (target) { const simulator: Optional = alife(); - if (simulator !== null) { + if (simulator) { const serverObject: Optional = simulator.object(getObjectIdByStoryId(target.v1 as string)!); if (serverObject) { @@ -202,10 +207,12 @@ export function getConfigObjectAndZone(ini: IniFile, section: TSection, field: T } /** - * todo; - * todo; - * todo; - * todo; + * Get config overrides from object logics section. + * + * @param ini - target ini file + * @param section - section name to read from ini file + * @param object - target client object + * @returns overrides object */ export function getObjectConfigOverrides(ini: IniFile, section: TSection, object: ClientObject): AnyObject { const overrides: AnyObject = {}; diff --git a/src/engine/core/utils/object/object_general.ts b/src/engine/core/utils/object/object_general.ts index ae10fe5be..44f2cedf9 100644 --- a/src/engine/core/utils/object/object_general.ts +++ b/src/engine/core/utils/object/object_general.ts @@ -4,9 +4,9 @@ import { IRegistryObjectState, registry } from "@/engine/core/database"; import { AnomalyZoneBinder, SmartTerrain } from "@/engine/core/objects"; import { Squad } from "@/engine/core/objects/server/squad/Squad"; import { EStalkerState } from "@/engine/core/objects/state"; -import { assert, assertDefined } from "@/engine/core/utils/assertion"; +import { assertDefined } from "@/engine/core/utils/assertion"; import { isCseAlifeObject, isStalker } from "@/engine/core/utils/check/is"; -import { getInfosFromData, pickSectionFromCondList } from "@/engine/core/utils/ini/config"; +import { getSectionsFromConditionLists, pickSectionFromCondList } from "@/engine/core/utils/ini/config"; import { parseConditionsList } from "@/engine/core/utils/ini/parse"; import { readIniBoolean, readIniNumber, readIniString } from "@/engine/core/utils/ini/read"; import { TConditionList } from "@/engine/core/utils/ini/types"; @@ -281,8 +281,14 @@ export function areObjectsOnSameLevel(first: ServerObject, second: ServerObject) * todo; */ export function setObjectInfo(object: ClientObject, ini: IniFile, section: TSection): void { - const inInfosList: LuaArray = getInfosFromData(object, readIniString(ini, section, "in", false, "")); - const outInfosList: LuaArray = getInfosFromData(object, readIniString(ini, section, "out", false, "")); + const inInfosList: LuaArray = getSectionsFromConditionLists( + object, + readIniString(ini, section, "in", false, "") + ); + const outInfosList: LuaArray = getSectionsFromConditionLists( + object, + readIniString(ini, section, "out", false, "") + ); for (const [index, infoPortion] of inInfosList) { object.give_info_portion(infoPortion); From e4003bb51ee37b757e636d5c4a080e8df0312fcc Mon Sep 17 00:00:00 2001 From: Neloreck Date: Mon, 26 Jun 2023 00:07:43 +0300 Subject: [PATCH 05/12] Actor relation to faction utils moved. Added tests for actor relation utils. Added mock actor in registry/client/server utility. Mocks extended. --- src/engine/core/utils/check/check.ts | 40 +++++-------------- src/engine/core/utils/object/index.ts | 2 + src/engine/core/utils/relation/check.test.ts | 38 +++++++++++++++++- src/engine/core/utils/relation/check.ts | 38 +++++++++++++++++- .../scripts/declarations/conditions/object.ts | 4 +- .../declarations/conditions/relation.ts | 8 ++-- .../declarations/dialogs/dialogs_jupiter.ts | 3 +- .../declarations/dialogs/dialogs_zaton.ts | 6 +-- src/fixtures/engine/mocks/index.ts | 3 +- src/fixtures/engine/mocks/registry.mocks.ts | 23 +++++++++++ .../relationRegistryInterface.mock.ts | 13 ++++-- .../xray/mocks/objects/AlifeSimulator.mock.ts | 4 ++ .../server/cse_alife_creature_actor.mock.ts | 2 +- 13 files changed, 135 insertions(+), 49 deletions(-) create mode 100644 src/engine/core/utils/object/index.ts create mode 100644 src/fixtures/engine/mocks/registry.mocks.ts diff --git a/src/engine/core/utils/check/check.ts b/src/engine/core/utils/check/check.ts index 963262418..a5f0d878b 100644 --- a/src/engine/core/utils/check/check.ts +++ b/src/engine/core/utils/check/check.ts @@ -1,4 +1,4 @@ -import { alife, danger_object, device, game_graph, relation_registry } from "xray16"; +import { alife, danger_object, device, game_graph } from "xray16"; import { getObjectIdByStoryId, getServerObjectByStoryId, IRegistryObjectState, registry } from "@/engine/core/database"; import { SimulationBoardManager } from "@/engine/core/managers/interaction/SimulationBoardManager"; @@ -11,10 +11,9 @@ import { ISchemeWoundedState } from "@/engine/core/schemes/wounded"; import { isStalker } from "@/engine/core/utils/check/is"; import { pickSectionFromCondList } from "@/engine/core/utils/ini/config"; import { getCharacterCommunity } from "@/engine/core/utils/object/object_general"; -import { EGoodwill } from "@/engine/core/utils/relation/types"; import { logicsConfig } from "@/engine/lib/configs/LogicsConfig"; import { surgeConfig } from "@/engine/lib/configs/SurgeConfig"; -import { communities, TCommunity } from "@/engine/lib/constants/communities"; +import { communities } from "@/engine/lib/constants/communities"; import { ACTOR_ID } from "@/engine/lib/constants/ids"; import { lootableTableExclude, TLootableExcludeItem } from "@/engine/lib/constants/items/lootable_table"; import { TLevel } from "@/engine/lib/constants/levels"; @@ -40,14 +39,20 @@ import { } from "@/engine/lib/types"; /** - * todo; + * Check whether story object exists. + * + * @param storyId - story ID to check existing + * @returns whether story object exists */ -export function isSquadExisting(squadStoryId: TStringId): boolean { - return getServerObjectByStoryId(squadStoryId) !== null; +export function isStoryObjectExisting(storyId: TStringId): boolean { + return getServerObjectByStoryId(storyId) !== null; } /** * Is provided target stalker and alive. + * + * @param targetObject - client/server object or story ID to check + * @returns whether target stalker object is alive */ export function isStalkerAlive(targetObject: ClientObject | ServerHumanObject | TStringId): boolean { let targetId: Optional = null; @@ -69,29 +74,6 @@ export function isStalkerAlive(targetObject: ClientObject | ServerHumanObject | } } -/** - * todo; - */ -export function isActorEnemyWithFaction(faction: TCommunity, actor: ClientObject = registry.actor): boolean { - return relation_registry.community_goodwill(faction, actor.id()) <= EGoodwill.ENEMIES; -} - -/** - * todo; - */ -export function isActorFriendWithFaction(faction: TCommunity, actor: ClientObject = registry.actor): boolean { - return relation_registry.community_goodwill(faction, actor.id()) >= EGoodwill.FRIENDS; -} - -/** - * todo; - */ -export function isActorNeutralWithFaction(faction: TCommunity, actor: ClientObject = registry.actor): boolean { - const goodwill: number = relation_registry.community_goodwill(faction, actor.id()); - - return goodwill > EGoodwill.ENEMIES && goodwill < EGoodwill.FRIENDS; -} - /** * @returns whether provided object is on a provided level. */ diff --git a/src/engine/core/utils/object/index.ts b/src/engine/core/utils/object/index.ts new file mode 100644 index 000000000..3a06ab546 --- /dev/null +++ b/src/engine/core/utils/object/index.ts @@ -0,0 +1,2 @@ +export * from "@/engine/core/utils/object/object_general"; +export * from "@/engine/core/utils/object/object_find"; diff --git a/src/engine/core/utils/relation/check.test.ts b/src/engine/core/utils/relation/check.test.ts index 2442c8c4a..44ce6a07e 100644 --- a/src/engine/core/utils/relation/check.test.ts +++ b/src/engine/core/utils/relation/check.test.ts @@ -1,10 +1,13 @@ import { beforeEach, describe, expect, it } from "@jest/globals"; -import { registerStoryLink, registry } from "@/engine/core/database"; +import { registerActor, registerStoryLink, registry } from "@/engine/core/database"; import { Squad } from "@/engine/core/objects"; import { areCommunitiesEnemies, areCommunitiesFriendly, + isActorEnemyWithFaction, + isActorFriendWithFaction, + isActorNeutralWithFaction, isAnySquadMemberEnemyToActor, isAnySquadMemberFriendToActor, } from "@/engine/core/utils/relation/check"; @@ -13,7 +16,7 @@ import { ERelation } from "@/engine/core/utils/relation/types"; import { communities } from "@/engine/lib/constants/communities"; import { ACTOR_ID } from "@/engine/lib/constants/ids"; import { ServerGroupObject } from "@/engine/lib/types"; -import { mockRelationsSquads } from "@/fixtures/engine"; +import { mockRegisteredActor, mockRelationsSquads } from "@/fixtures/engine"; import { MockAlifeSimulator, mockServerAlifeCreatureActor, mockServerAlifeOnlineOfflineGroup } from "@/fixtures/xray"; describe("'relation/check' utils", () => { @@ -24,6 +27,37 @@ describe("'relation/check' utils", () => { MockAlifeSimulator.removeFromRegistry(ACTOR_ID); }); + it("'isActorEnemyWithFaction' should check object faction relation", () => { + mockRegisteredActor(); + + expect(isActorEnemyWithFaction(communities.army)).toBe(false); + expect(isActorEnemyWithFaction(communities.stalker)).toBe(false); + expect(isActorEnemyWithFaction(communities.bandit)).toBe(false); + expect(isActorEnemyWithFaction(communities.monolith)).toBe(true); + expect(isActorEnemyWithFaction(communities.monster)).toBe(true); + }); + + it("'isActorFriendWithFaction' should check object faction relation", () => { + mockRegisteredActor(); + + expect(isActorFriendWithFaction(communities.actor)).toBe(true); + expect(isActorFriendWithFaction(communities.army)).toBe(true); + expect(isActorFriendWithFaction(communities.stalker)).toBe(false); + expect(isActorFriendWithFaction(communities.bandit)).toBe(false); + expect(isActorFriendWithFaction(communities.monolith)).toBe(false); + expect(isActorFriendWithFaction(communities.monster)).toBe(false); + }); + + it("'isActorNeutralWithFaction' should check object faction relation", () => { + mockRegisteredActor(); + + expect(isActorNeutralWithFaction(communities.army)).toBe(false); + expect(isActorNeutralWithFaction(communities.stalker)).toBe(true); + expect(isActorNeutralWithFaction(communities.bandit)).toBe(true); + expect(isActorNeutralWithFaction(communities.monolith)).toBe(false); + expect(isActorNeutralWithFaction(communities.monster)).toBe(false); + }); + it("'isSquadCommunityEnemyToActor' should correctly check relation", () => { expect(() => getSquadCommunityRelationToActor("not-existing")).toThrow( "Squad with story id 'not-existing' was not found." diff --git a/src/engine/core/utils/relation/check.ts b/src/engine/core/utils/relation/check.ts index 640beb76f..f97021317 100644 --- a/src/engine/core/utils/relation/check.ts +++ b/src/engine/core/utils/relation/check.ts @@ -1,11 +1,47 @@ import { relation_registry } from "xray16"; +import { registry } from "@/engine/core/database/registry"; import { Squad } from "@/engine/core/objects"; import { getSquadCommunityRelationToActor } from "@/engine/core/utils/relation/get"; import { EGoodwill, ERelation } from "@/engine/core/utils/relation/types"; import { communities, TCommunity } from "@/engine/lib/constants/communities"; import { ACTOR_ID } from "@/engine/lib/constants/ids"; -import { Optional, TStringId } from "@/engine/lib/types"; +import { ClientObject, Optional, TCount, TStringId } from "@/engine/lib/types"; + +/** + * Check whether is enemy with faction. + * + * @param faction - target faction to check + * @param actor - optional actor object override + * @returns whether actor is enemy with faction + */ +export function isActorEnemyWithFaction(faction: TCommunity, actor: ClientObject = registry.actor): boolean { + return relation_registry.community_goodwill(faction, actor.id()) <= EGoodwill.ENEMIES; +} + +/** + * Check whether is friend with faction. + * + * @param faction - target faction to check + * @param actor - optional actor object override + * @returns whether actor is friend with faction + */ +export function isActorFriendWithFaction(faction: TCommunity, actor: ClientObject = registry.actor): boolean { + return relation_registry.community_goodwill(faction, actor.id()) >= EGoodwill.FRIENDS; +} + +/** + * Check whether is neutral with faction. + * + * @param faction - target faction to check + * @param actor - optional actor object override + * @returns whether actor is neutral with faction + */ +export function isActorNeutralWithFaction(faction: TCommunity, actor: ClientObject = registry.actor): boolean { + const goodwill: TCount = relation_registry.community_goodwill(faction, actor.id()); + + return goodwill > EGoodwill.ENEMIES && goodwill < EGoodwill.FRIENDS; +} /** * Check whether squad is enemy to actor. diff --git a/src/engine/scripts/declarations/conditions/object.ts b/src/engine/scripts/declarations/conditions/object.ts index 78a25a28d..d2d1cb6c4 100644 --- a/src/engine/scripts/declarations/conditions/object.ts +++ b/src/engine/scripts/declarations/conditions/object.ts @@ -25,7 +25,7 @@ import { isObjectInZone, isObjectWounded, isPlayingSound, - isSquadExisting, + isStoryObjectExisting, } from "@/engine/core/utils/check/check"; import { isMonster, isStalker } from "@/engine/core/utils/check/is"; import { hasAlifeInfo } from "@/engine/core/utils/info_portion"; @@ -804,7 +804,7 @@ extern("xr_conditions.squad_exist", (actor: ClientObject, npc: ClientObject, p: if (storyId === null) { abort("Wrong parameter story_id[%s] in squad_exist function", tostring(storyId)); } else { - return isSquadExisting(storyId); + return isStoryObjectExisting(storyId); } }); diff --git a/src/engine/scripts/declarations/conditions/relation.ts b/src/engine/scripts/declarations/conditions/relation.ts index dce156b0d..d6f530569 100644 --- a/src/engine/scripts/declarations/conditions/relation.ts +++ b/src/engine/scripts/declarations/conditions/relation.ts @@ -3,16 +3,14 @@ import { Squad } from "@/engine/core/objects"; import { ISchemeDeathState } from "@/engine/core/schemes/death"; import { abort, assert } from "@/engine/core/utils/assertion"; import { extern, getExtern } from "@/engine/core/utils/binding"; -import { - isActorEnemyWithFaction, - isActorFriendWithFaction, - isActorNeutralWithFaction, -} from "@/engine/core/utils/check/check"; import { LuaLogger } from "@/engine/core/utils/logging"; import { getCharacterCommunity } from "@/engine/core/utils/object/object_general"; import { areCommunitiesEnemies, areCommunitiesFriendly, + isActorEnemyWithFaction, + isActorFriendWithFaction, + isActorNeutralWithFaction, isAnySquadMemberEnemyToActor, isAnySquadMemberFriendToActor, } from "@/engine/core/utils/relation"; diff --git a/src/engine/scripts/declarations/dialogs/dialogs_jupiter.ts b/src/engine/scripts/declarations/dialogs/dialogs_jupiter.ts index dbf476e82..40b481338 100644 --- a/src/engine/scripts/declarations/dialogs/dialogs_jupiter.ts +++ b/src/engine/scripts/declarations/dialogs/dialogs_jupiter.ts @@ -7,10 +7,9 @@ import { getPortableStoreValue } from "@/engine/core/database/portable_store"; import { TreasureManager } from "@/engine/core/managers/world/TreasureManager"; import { AnomalyZoneBinder } from "@/engine/core/objects/binders/zones/AnomalyZoneBinder"; import { extern, getExtern } from "@/engine/core/utils/binding"; -import { isActorEnemyWithFaction } from "@/engine/core/utils/check/check"; import { disableInfo, giveInfo, hasAlifeInfo } from "@/engine/core/utils/info_portion"; import { LuaLogger } from "@/engine/core/utils/logging"; -import { getObjectsRelationSafe } from "@/engine/core/utils/relation/get"; +import { getObjectsRelationSafe, isActorEnemyWithFaction } from "@/engine/core/utils/relation"; import { getNpcSpeaker, giveItemsToActor, diff --git a/src/engine/scripts/declarations/dialogs/dialogs_zaton.ts b/src/engine/scripts/declarations/dialogs/dialogs_zaton.ts index 122ece0d0..40225989e 100644 --- a/src/engine/scripts/declarations/dialogs/dialogs_zaton.ts +++ b/src/engine/scripts/declarations/dialogs/dialogs_zaton.ts @@ -7,7 +7,7 @@ import { getPortableStoreValue, setPortableStoreValue } from "@/engine/core/data import { ENotificationDirection, NotificationManager } from "@/engine/core/managers/interface/notifications"; import { TreasureManager } from "@/engine/core/managers/world/TreasureManager"; import { extern, getExtern } from "@/engine/core/utils/binding"; -import { isSquadExisting } from "@/engine/core/utils/check/check"; +import { isStoryObjectExisting } from "@/engine/core/utils/check/check"; import { disableInfo, giveInfo, hasAlifeInfo } from "@/engine/core/utils/info_portion"; import { LuaLogger } from "@/engine/core/utils/logging"; import { @@ -545,7 +545,7 @@ extern( return false; } - return !isSquadExisting("zat_b7_stalkers_victims_1"); + return !isStoryObjectExisting("zat_b7_stalkers_victims_1"); } ); @@ -553,7 +553,7 @@ extern( * todo; */ extern("dialogs_zaton.zat_b7_squad_alive", (firstSpeaker: ClientObject, secondSpeaker: ClientObject): boolean => { - return isSquadExisting("zat_b7_stalkers_victims_1"); + return isStoryObjectExisting("zat_b7_stalkers_victims_1"); }); /** diff --git a/src/fixtures/engine/mocks/index.ts b/src/fixtures/engine/mocks/index.ts index 8cfac2d1e..46e9c208d 100644 --- a/src/fixtures/engine/mocks/index.ts +++ b/src/fixtures/engine/mocks/index.ts @@ -1,3 +1,4 @@ +export * from "@/fixtures/engine/mocks/registry.mocks"; export * from "@/fixtures/engine/mocks/scheme.mocks"; -export * from "@/fixtures/engine/mocks/squads.mocks"; export * from "@/fixtures/engine/mocks/scheme.mocks"; +export * from "@/fixtures/engine/mocks/squads.mocks"; diff --git a/src/fixtures/engine/mocks/registry.mocks.ts b/src/fixtures/engine/mocks/registry.mocks.ts new file mode 100644 index 000000000..d79948ca3 --- /dev/null +++ b/src/fixtures/engine/mocks/registry.mocks.ts @@ -0,0 +1,23 @@ +import { IRegistryObjectState, registerActor } from "@/engine/core/database"; +import { ClientObject, ServerActorObject } from "@/engine/lib/types"; +import { mockActorClientGameObject, mockServerAlifeCreatureActor } from "@/fixtures/xray/mocks/objects"; + +export interface IMockActorDetails { + actorClientObject: ClientObject; + actorServerObject: ServerActorObject; + actorState: IRegistryObjectState; +} + +/** + * Mock actor client/server side. + */ +export function mockRegisteredActor( + actorClientPartial: Partial = {}, + actorServerPartial: Partial = {} +): IMockActorDetails { + const actorClientObject: ClientObject = mockActorClientGameObject(actorClientPartial); + const actorServerObject: ServerActorObject = mockServerAlifeCreatureActor(actorServerPartial); + const actorState: IRegistryObjectState = registerActor(actorClientObject); + + return { actorClientObject, actorServerObject, actorState }; +} diff --git a/src/fixtures/xray/mocks/interface/relationRegistryInterface.mock.ts b/src/fixtures/xray/mocks/interface/relationRegistryInterface.mock.ts index c39e10995..ca75b9b6b 100644 --- a/src/fixtures/xray/mocks/interface/relationRegistryInterface.mock.ts +++ b/src/fixtures/xray/mocks/interface/relationRegistryInterface.mock.ts @@ -1,7 +1,8 @@ import { jest } from "@jest/globals"; import { IXR_relation_registry } from "xray16"; -import { TName, TNumberId } from "@/engine/lib/types"; +import { Optional, ServerHumanObject, TName, TNumberId } from "@/engine/lib/types"; +import { MockAlifeSimulator } from "@/fixtures/xray/mocks/objects/AlifeSimulator.mock"; import { charactersGoodwill, communityGoodwill } from "@/fixtures/xray/mocks/relations"; /** @@ -9,8 +10,14 @@ import { charactersGoodwill, communityGoodwill } from "@/fixtures/xray/mocks/rel */ export const mockRelationRegistryInterface: IXR_relation_registry = { change_community_goodwill: jest.fn((community_a: string, value2: number, value3: number): void => {}), - community_goodwill: jest.fn((community: string, object_id: number): number => { - return -1; + community_goodwill: jest.fn((community: string, objectId: TNumberId): number => { + const object: Optional = MockAlifeSimulator.getFromRegistry(objectId); + + if (!object) { + throw new Error(`Object is not registered: '${objectId}'.`); + } + + return mockRelationRegistryInterface.community_relation(community, object.community()); }), community_relation: jest.fn((from: TName, to: TName): number => { const descriptor = communityGoodwill[from]; diff --git a/src/fixtures/xray/mocks/objects/AlifeSimulator.mock.ts b/src/fixtures/xray/mocks/objects/AlifeSimulator.mock.ts index 63934e114..8b956a8e5 100644 --- a/src/fixtures/xray/mocks/objects/AlifeSimulator.mock.ts +++ b/src/fixtures/xray/mocks/objects/AlifeSimulator.mock.ts @@ -17,6 +17,10 @@ export class MockAlifeSimulator { delete MockAlifeSimulator.registry[id]; } + public static getFromRegistry(id: number): Optional { + return (MockAlifeSimulator.registry[id] as T) || null; + } + public static getInstance(): MockAlifeSimulator { if (!MockAlifeSimulator.simulator) { MockAlifeSimulator.simulator = new MockAlifeSimulator(); diff --git a/src/fixtures/xray/mocks/objects/server/cse_alife_creature_actor.mock.ts b/src/fixtures/xray/mocks/objects/server/cse_alife_creature_actor.mock.ts index 80203f886..ddcdc08f9 100644 --- a/src/fixtures/xray/mocks/objects/server/cse_alife_creature_actor.mock.ts +++ b/src/fixtures/xray/mocks/objects/server/cse_alife_creature_actor.mock.ts @@ -9,7 +9,7 @@ import { } from "@/fixtures/xray/mocks/objects/server/cse_alife_dynamic_object_visual.mock"; /** - * todo; + * Class based server object mock. */ export class MockAlifeCreatureActor extends MockAlifeDynamicObjectVisual { public override id: TNumberId = 0; From 58acb0d310a4bf849c8ac73a2690f53ded1000d5 Mon Sep 17 00:00:00 2001 From: Neloreck Date: Mon, 26 Jun 2023 01:05:12 +0300 Subject: [PATCH 06/12] Moving object/checkers utils to separate modules. --- .../core/managers/world/SurgeManager.ts | 8 +- src/engine/core/utils/check/check.ts | 82 +------------------ src/engine/core/utils/ini/config.ts | 2 +- src/engine/core/utils/object/index.ts | 1 + .../core/utils/object/object_location.test.ts | 29 +++++++ .../core/utils/object/object_location.ts | 62 ++++++++++++++ src/engine/core/utils/scheme/switch.ts | 2 +- .../scripts/declarations/conditions/actor.ts | 7 +- .../scripts/declarations/conditions/object.ts | 8 +- .../scripts/declarations/conditions/quests.ts | 2 +- .../scripts/declarations/effects/actor.ts | 6 +- .../scripts/declarations/effects/position.ts | 7 +- .../scripts/declarations/effects/quests.ts | 34 ++++---- .../xray/mocks/objects/AlifeSimulator.mock.ts | 2 + 14 files changed, 134 insertions(+), 118 deletions(-) create mode 100644 src/engine/core/utils/object/object_location.test.ts create mode 100644 src/engine/core/utils/object/object_location.ts diff --git a/src/engine/core/managers/world/SurgeManager.ts b/src/engine/core/managers/world/SurgeManager.ts index 80b679d86..63d7f5adf 100644 --- a/src/engine/core/managers/world/SurgeManager.ts +++ b/src/engine/core/managers/world/SurgeManager.ts @@ -13,12 +13,7 @@ import { GlobalSoundManager } from "@/engine/core/managers/sounds/GlobalSoundMan import { WeatherManager } from "@/engine/core/managers/world/WeatherManager"; import { AnomalyZoneBinder, SmartTerrain } from "@/engine/core/objects"; import { Squad } from "@/engine/core/objects/server/squad/Squad"; -import { - isBlackScreen, - isImmuneToSurge, - isObjectOnLevel, - isSurgeEnabledOnLevel, -} from "@/engine/core/utils/check/check"; +import { isBlackScreen, isImmuneToSurge, isSurgeEnabledOnLevel } from "@/engine/core/utils/check/check"; import { isArtefact, isStoryObject } from "@/engine/core/utils/check/is"; import { executeConsoleCommand, getConsoleFloatCommand } from "@/engine/core/utils/console"; import { createAutoSave } from "@/engine/core/utils/game_save"; @@ -27,6 +22,7 @@ import { pickSectionFromCondList } from "@/engine/core/utils/ini/config"; import { parseConditionsList } from "@/engine/core/utils/ini/parse"; import { TConditionList } from "@/engine/core/utils/ini/types"; import { LuaLogger } from "@/engine/core/utils/logging"; +import { isObjectOnLevel } from "@/engine/core/utils/object/object_location"; import { readTimeFromPacket, writeTimeToPacket } from "@/engine/core/utils/time"; import { createVector } from "@/engine/core/utils/vector"; import { surgeConfig } from "@/engine/lib/configs/SurgeConfig"; diff --git a/src/engine/core/utils/check/check.ts b/src/engine/core/utils/check/check.ts index a5f0d878b..7867fb804 100644 --- a/src/engine/core/utils/check/check.ts +++ b/src/engine/core/utils/check/check.ts @@ -11,6 +11,7 @@ import { ISchemeWoundedState } from "@/engine/core/schemes/wounded"; import { isStalker } from "@/engine/core/utils/check/is"; import { pickSectionFromCondList } from "@/engine/core/utils/ini/config"; import { getCharacterCommunity } from "@/engine/core/utils/object/object_general"; +import { isObjectInZone } from "@/engine/core/utils/object/object_location"; import { logicsConfig } from "@/engine/lib/configs/LogicsConfig"; import { surgeConfig } from "@/engine/lib/configs/SurgeConfig"; import { communities } from "@/engine/lib/constants/communities"; @@ -30,10 +31,8 @@ import { Optional, ServerCreatureObject, ServerHumanObject, - ServerObject, TDangerType, TDistance, - TName, TNumberId, TStringId, } from "@/engine/lib/types"; @@ -74,13 +73,6 @@ export function isStalkerAlive(targetObject: ClientObject | ServerHumanObject | } } -/** - * @returns whether provided object is on a provided level. - */ -export function isObjectOnLevel(object: Optional, levelName: TName): boolean { - return object !== null && alife().level_name(game_graph().vertex(object.m_game_vertex_id).level_id()) === levelName; -} - /** * @returns whether provided community squad is immune to surge. */ @@ -113,13 +105,6 @@ export function isLevelChanging(): boolean { : game_graph().vertex(simulator.actor().m_game_vertex_id).level_id() !== simulator.level_id(); } -/** - * @returns whether object is inside another object. - */ -export function isObjectInZone(object: Optional, zone: Optional): boolean { - return object !== null && zone !== null && zone.inside(object.position()); -} - /** * @returns whether object is wounded. */ @@ -313,35 +298,6 @@ export function isObjectEnemy(object: ClientObject, enemy: ClientObject, state: return true; } -/** - * todo; - * todo; - * todo; - */ -export function isActorInZone(zone: Optional): boolean { - const actor: Optional = registry.actor; - - return actor !== null && zone !== null && zone.inside(actor.position()); -} - -/** - * todo; - * todo; - * todo; - */ -export function isActorInZoneWithName(zoneName: TName, actor: Optional = registry.actor): boolean { - const zone: Optional = registry.zones.get(zoneName); - - return actor !== null && zone !== null && zone.inside(actor.position()); -} - -/** - * @returns whether provided enemy object is actor. - */ -export function isActorEnemy(object: ClientObject): boolean { - return object.id() === registry.actor.id(); -} - /** * @returns whether actor is alive. */ @@ -356,42 +312,6 @@ export function isSeenByActor(object: ClientObject): boolean { return registry.actor.see(object); } -/** - * @returns whether distance between objects greater or equal. - */ -export function isDistanceBetweenObjectsGreaterOrEqual( - first: ClientObject, - second: ClientObject, - distance: TDistance -): boolean { - return first.position().distance_to_sqr(second.position()) >= distance * distance; -} - -/** - * @returns whether distance between objects less or equal. - */ -export function isDistanceBetweenObjectsLessOrEqual( - first: ClientObject, - second: ClientObject, - distance: TDistance -): boolean { - return first.position().distance_to_sqr(second.position()) <= distance * distance; -} - -/** - * @returns whether distance to actor greater or equal. - */ -export function isDistanceToActorGreaterOrEqual(object: ClientObject, distance: TDistance): boolean { - return object.position().distance_to_sqr(registry.actor.position()) >= distance * distance; -} - -/** - * @returns whether distance to actor less or equal. - */ -export function isDistanceToActorLessOrEqual(object: ClientObject, distance: TDistance): boolean { - return object.position().distance_to_sqr(registry.actor.position()) <= distance * distance; -} - /** * @returns whether currently black screen is visible and rendering is paused. */ diff --git a/src/engine/core/utils/ini/config.ts b/src/engine/core/utils/ini/config.ts index 4d79738b1..ba007f276 100644 --- a/src/engine/core/utils/ini/config.ts +++ b/src/engine/core/utils/ini/config.ts @@ -190,7 +190,7 @@ export function getConfigObjectAndZone(ini: IniFile, section: TSection, field: T if (target) { const simulator: Optional = alife(); - if (simulator) { + if (simulator !== null) { const serverObject: Optional = simulator.object(getObjectIdByStoryId(target.v1 as string)!); if (serverObject) { diff --git a/src/engine/core/utils/object/index.ts b/src/engine/core/utils/object/index.ts index 3a06ab546..42f5abed4 100644 --- a/src/engine/core/utils/object/index.ts +++ b/src/engine/core/utils/object/index.ts @@ -1,2 +1,3 @@ export * from "@/engine/core/utils/object/object_general"; +export * from "@/engine/core/utils/object/object_location"; export * from "@/engine/core/utils/object/object_find"; diff --git a/src/engine/core/utils/object/object_location.test.ts b/src/engine/core/utils/object/object_location.test.ts new file mode 100644 index 000000000..06a803318 --- /dev/null +++ b/src/engine/core/utils/object/object_location.test.ts @@ -0,0 +1,29 @@ +import { describe, expect, it } from "@jest/globals"; +import { alife, game_graph } from "xray16"; + +import { isObjectInZone, isObjectOnLevel } from "@/engine/core/utils/object/object_location"; +import { ClientObject, ServerObject } from "@/engine/lib/types"; +import { mockClientGameObject, mockServerAlifeObject } from "@/fixtures/xray"; + +describe("object location utils", () => { + it("'isObjectInZone' check object inside", () => { + const object: ClientObject = mockClientGameObject(); + const zone: ClientObject = mockClientGameObject(); + + expect(isObjectInZone(object, zone)).toBe(false); + expect(zone.inside).toHaveBeenCalledWith(object.position()); + expect(isObjectInZone(null, null)).toBe(false); + expect(isObjectInZone(object, null)).toBe(false); + expect(isObjectInZone(null, zone)).toBe(false); + }); + + it("'isObjectOnLevel' check object inside", () => { + const object: ServerObject = mockServerAlifeObject(); + + expect(isObjectOnLevel(null, "zaton")).toBe(false); + expect(isObjectOnLevel(object, "pripyat")).toBe(true); + + expect(game_graph().vertex(object.m_game_vertex_id).level_id()).toBe(1); + expect(alife().level_name).toHaveBeenCalledWith(1); + }); +}); diff --git a/src/engine/core/utils/object/object_location.ts b/src/engine/core/utils/object/object_location.ts new file mode 100644 index 000000000..49ffaef1f --- /dev/null +++ b/src/engine/core/utils/object/object_location.ts @@ -0,0 +1,62 @@ +import { alife, game_graph } from "xray16"; + +import { registry } from "@/engine/core/database"; +import { ClientObject, Optional, ServerObject, TDistance, TName } from "@/engine/lib/types"; + +/** + * Check whether object is inside another zone object. + * + * @param object - target client object to check + * @param zone - target zone to check + * @returns whether object is inside zone object. + */ +export function isObjectInZone(object: Optional, zone: Optional): boolean { + return object !== null && zone !== null && zone.inside(object.position()); +} + +/** + * Check whether object is on matching level. + * + * @param object - target object to check + * @param levelName - target level name + * @returns whether provided object is on a level + */ +export function isObjectOnLevel(object: Optional, levelName: TName): boolean { + return object !== null && alife().level_name(game_graph().vertex(object.m_game_vertex_id).level_id()) === levelName; +} + +/** + * @returns whether distance between objects greater or equal. + */ +export function isDistanceBetweenObjectsGreaterOrEqual( + first: ClientObject, + second: ClientObject, + distance: TDistance +): boolean { + return first.position().distance_to_sqr(second.position()) >= distance * distance; +} + +/** + * @returns whether distance between objects less or equal. + */ +export function isDistanceBetweenObjectsLessOrEqual( + first: ClientObject, + second: ClientObject, + distance: TDistance +): boolean { + return first.position().distance_to_sqr(second.position()) <= distance * distance; +} + +/** + * @returns whether distance to actor greater or equal. + */ +export function isDistanceToActorGreaterOrEqual(object: ClientObject, distance: TDistance): boolean { + return object.position().distance_to_sqr(registry.actor.position()) >= distance * distance; +} + +/** + * @returns whether distance to actor less or equal. + */ +export function isDistanceToActorLessOrEqual(object: ClientObject, distance: TDistance): boolean { + return object.position().distance_to_sqr(registry.actor.position()) <= distance * distance; +} diff --git a/src/engine/core/utils/scheme/switch.ts b/src/engine/core/utils/scheme/switch.ts index 66657e7a9..d68f2a7f8 100644 --- a/src/engine/core/utils/scheme/switch.ts +++ b/src/engine/core/utils/scheme/switch.ts @@ -3,10 +3,10 @@ import { game, level, time_global } from "xray16"; import { IRegistryObjectState, registry } from "@/engine/core/database"; import { ESchemeEvent, IBaseSchemeLogic, IBaseSchemeState } from "@/engine/core/schemes"; import { abort, assert } from "@/engine/core/utils/assertion"; -import { isObjectInZone } from "@/engine/core/utils/check/check"; import { pickSectionFromCondList } from "@/engine/core/utils/ini/config"; import { LuaLogger } from "@/engine/core/utils/logging"; import { isActorSeenByObject } from "@/engine/core/utils/object/object_general"; +import { isObjectInZone } from "@/engine/core/utils/object/object_location"; import { emitSchemeEvent } from "@/engine/core/utils/scheme/event"; import { activateSchemeBySection } from "@/engine/core/utils/scheme/logic"; import { getDistanceBetween } from "@/engine/core/utils/vector"; diff --git a/src/engine/scripts/declarations/conditions/actor.ts b/src/engine/scripts/declarations/conditions/actor.ts index 6b47f6837..979feb6c2 100644 --- a/src/engine/scripts/declarations/conditions/actor.ts +++ b/src/engine/scripts/declarations/conditions/actor.ts @@ -7,10 +7,12 @@ import { ISchemeDeathState } from "@/engine/core/schemes/death"; import { ISchemeHitState } from "@/engine/core/schemes/hit"; import { abort, assertDefined } from "@/engine/core/utils/assertion"; import { extern } from "@/engine/core/utils/binding"; -import { isActorAlive, isActorEnemy, isObjectInZone } from "@/engine/core/utils/check/check"; +import { isActorAlive } from "@/engine/core/utils/check/check"; import { isWeapon } from "@/engine/core/utils/check/is"; import { LuaLogger } from "@/engine/core/utils/logging"; +import { isObjectInZone } from "@/engine/core/utils/object/object_location"; import { npcInActorFrustum } from "@/engine/core/utils/vector"; +import { ACTOR_ID } from "@/engine/lib/constants/ids"; import { AnyArgs, ClientObject, EScheme, LuaArray, Optional, TCount, TDistance, TSection } from "@/engine/lib/types"; const logger: LuaLogger = new LuaLogger($filename); @@ -40,7 +42,8 @@ extern("xr_conditions.actor_in_surge_cover", (actor: ClientObject, npc: ClientOb * todo; */ extern("xr_conditions.is_enemy_actor", (object: ClientObject): boolean => { - return isActorEnemy(object); + // todo: Probably always true. + return object.id() === ACTOR_ID; }); /** diff --git a/src/engine/scripts/declarations/conditions/object.ts b/src/engine/scripts/declarations/conditions/object.ts index d2d1cb6c4..a9d43a760 100644 --- a/src/engine/scripts/declarations/conditions/object.ts +++ b/src/engine/scripts/declarations/conditions/object.ts @@ -19,10 +19,7 @@ import { SchemeDeimos } from "@/engine/core/schemes/sr_deimos"; import { abort } from "@/engine/core/utils/assertion"; import { extern } from "@/engine/core/utils/binding"; import { - isDistanceBetweenObjectsGreaterOrEqual, - isDistanceBetweenObjectsLessOrEqual, isHeavilyWounded, - isObjectInZone, isObjectWounded, isPlayingSound, isStoryObjectExisting, @@ -31,6 +28,11 @@ import { isMonster, isStalker } from "@/engine/core/utils/check/is"; import { hasAlifeInfo } from "@/engine/core/utils/info_portion"; import { LuaLogger } from "@/engine/core/utils/logging"; import { getObjectSmartTerrain, getObjectSquad } from "@/engine/core/utils/object/object_general"; +import { + isDistanceBetweenObjectsGreaterOrEqual, + isDistanceBetweenObjectsLessOrEqual, + isObjectInZone, +} from "@/engine/core/utils/object/object_location"; import { captions, TCaption } from "@/engine/lib/constants/captions"; import { infoPortions } from "@/engine/lib/constants/info_portions"; import { FALSE } from "@/engine/lib/constants/words"; diff --git a/src/engine/scripts/declarations/conditions/quests.ts b/src/engine/scripts/declarations/conditions/quests.ts index 20a3e31fe..0149c2b6a 100644 --- a/src/engine/scripts/declarations/conditions/quests.ts +++ b/src/engine/scripts/declarations/conditions/quests.ts @@ -4,9 +4,9 @@ import { getObjectByStoryId, getServerObjectByStoryId, registry } from "@/engine import { AnomalyZoneBinder, Squad } from "@/engine/core/objects"; import { abort } from "@/engine/core/utils/assertion"; import { extern, getExtern } from "@/engine/core/utils/binding"; -import { isObjectInZone } from "@/engine/core/utils/check/check"; import { hasAlifeInfo } from "@/engine/core/utils/info_portion"; import { LuaLogger } from "@/engine/core/utils/logging"; +import { isObjectInZone } from "@/engine/core/utils/object/object_location"; import { distanceBetween } from "@/engine/core/utils/vector"; import { infoPortions, TInfoPortion } from "@/engine/lib/constants/info_portions"; import { zones } from "@/engine/lib/constants/zones"; diff --git a/src/engine/scripts/declarations/effects/actor.ts b/src/engine/scripts/declarations/effects/actor.ts index c86c2742d..b00cea1ae 100644 --- a/src/engine/scripts/declarations/effects/actor.ts +++ b/src/engine/scripts/declarations/effects/actor.ts @@ -19,8 +19,8 @@ import { TreasureManager } from "@/engine/core/managers/world/TreasureManager"; import { Squad } from "@/engine/core/objects"; import { abort, assert, assertDefined } from "@/engine/core/utils/assertion"; import { extern } from "@/engine/core/utils/binding"; -import { isActorInZoneWithName } from "@/engine/core/utils/check/check"; import { LuaLogger } from "@/engine/core/utils/logging"; +import { isObjectInZone } from "@/engine/core/utils/object"; import { giveItemsToActor } from "@/engine/core/utils/task_reward"; import { animations } from "@/engine/lib/constants/animation/animations"; import { detectors, TDetector } from "@/engine/lib/constants/items/detectors"; @@ -416,8 +416,8 @@ extern("xr_effects.sleep", (actor: ClientObject): void => { zones.actor_surge_hide_2, ]); - for (const [index, zone] of sleepZones) { - if (isActorInZoneWithName(zone, actor)) { + for (const [, zone] of sleepZones) { + if (isObjectInZone(actor, registry.zones.get(zone))) { SleepManager.getInstance().showSleepDialog(); break; } diff --git a/src/engine/scripts/declarations/effects/position.ts b/src/engine/scripts/declarations/effects/position.ts index b98b1cbfd..fadd34d07 100644 --- a/src/engine/scripts/declarations/effects/position.ts +++ b/src/engine/scripts/declarations/effects/position.ts @@ -4,8 +4,8 @@ import { getObjectIdByStoryId, getServerObjectByStoryId, registry, resetStalkerS import { Squad } from "@/engine/core/objects"; import { abort, assertDefined } from "@/engine/core/utils/assertion"; import { extern } from "@/engine/core/utils/binding"; -import { isActorInZoneWithName } from "@/engine/core/utils/check/check"; import { LuaLogger } from "@/engine/core/utils/logging"; +import { isObjectInZone } from "@/engine/core/utils/object"; import { ClientObject, Optional, @@ -16,6 +16,7 @@ import { TName, TNumberId, TProbability, + TRate, TStringId, Vector, } from "@/engine/lib/types"; @@ -101,13 +102,13 @@ extern("xr_effects.teleport_actor", (actor: ClientObject, object: ClientObject, if (params[1] !== null) { const look: Patrol = new patrol(params[1]); - const dir: number = -look.point(0).sub(point.point(0)).getH(); + const dir: TRate = -look.point(0).sub(point.point(0)).getH(); actor.set_actor_direction(dir); } for (const [k, v] of registry.noWeaponZones) { - if (isActorInZoneWithName(k, actor)) { + if (isObjectInZone(actor, registry.zones.get(k))) { registry.noWeaponZones.set(k, true); } } diff --git a/src/engine/scripts/declarations/effects/quests.ts b/src/engine/scripts/declarations/effects/quests.ts index 12ee96042..50ebd1215 100644 --- a/src/engine/scripts/declarations/effects/quests.ts +++ b/src/engine/scripts/declarations/effects/quests.ts @@ -12,9 +12,9 @@ import { EStalkerState } from "@/engine/core/objects/state"; import { showFreeplayDialog } from "@/engine/core/ui/game/FreeplayDialog"; import { abort } from "@/engine/core/utils/assertion"; import { extern, getExtern } from "@/engine/core/utils/binding"; -import { isActorInZoneWithName } from "@/engine/core/utils/check/check"; import { createAutoSave } from "@/engine/core/utils/game_save"; import { disableInfo, giveInfo, hasAlifeInfo } from "@/engine/core/utils/info_portion"; +import { isObjectInZone } from "@/engine/core/utils/object"; import { spawnObject, spawnObjectInObject, spawnSquadInSmart } from "@/engine/core/utils/spawn"; import { giveItemsToActor, takeItemFromActor } from "@/engine/core/utils/task_reward"; import { copyVector, createEmptyVector, createVector } from "@/engine/core/utils/vector"; @@ -67,10 +67,10 @@ extern("xr_effects.show_freeplay_dialog", (actor: ClientObject, npc: ClientObjec /** * todo; */ -extern("xr_effects.jup_b32_place_scanner", (actor: ClientObject, npc: ClientObject): void => { +extern("xr_effects.jup_b32_place_scanner", (actor: ClientObject): void => { for (const i of $range(1, 5)) { if ( - isActorInZoneWithName("jup_b32_sr_scanner_place_" + i, actor) && + isObjectInZone(actor, registry.zones.get("jup_b32_sr_scanner_place_" + i)) && !hasAlifeInfo(("jup_b32_scanner_" + i + "_placed") as TInfoPortion) ) { giveInfo(("jup_b32_scanner_" + i + "_placed") as TInfoPortion); @@ -85,15 +85,15 @@ extern("xr_effects.jup_b32_place_scanner", (actor: ClientObject, npc: ClientObje /** * todo; */ -extern("xr_effects.jup_b32_pda_check", (actor: ClientObject, npc: ClientObject): void => { +extern("xr_effects.jup_b32_pda_check", (actor: ClientObject): void => { MapDisplayManager.getInstance().updateAnomalyZonesDisplay(); }); /** * todo; */ -extern("xr_effects.pri_b306_generator_start", (actor: ClientObject, npc: ClientObject): void => { - if (isActorInZoneWithName(zones.pri_b306_sr_generator, actor)) { +extern("xr_effects.pri_b306_generator_start", (actor: ClientObject): void => { + if (isObjectInZone(actor, registry.zones.get(zones.pri_b306_sr_generator))) { giveInfo(infoPortions.pri_b306_lift_generator_used); } }); @@ -102,7 +102,7 @@ extern("xr_effects.pri_b306_generator_start", (actor: ClientObject, npc: ClientO * todo; */ extern("xr_effects.jup_b206_get_plant", (actor: ClientObject, object: ClientObject): void => { - if (isActorInZoneWithName(zones.jup_b206_sr_quest_line, actor)) { + if (isObjectInZone(actor, registry.zones.get(zones.jup_b206_sr_quest_line))) { giveInfo(infoPortions.jup_b206_anomalous_grove_has_plant); giveItemsToActor(questItems.jup_b206_plant); @@ -118,7 +118,7 @@ extern("xr_effects.jup_b206_get_plant", (actor: ClientObject, object: ClientObje * todo; */ extern("xr_effects.pas_b400_switcher", (actor: ClientObject, npc: ClientObject): void => { - if (isActorInZoneWithName(zones.pas_b400_sr_switcher, actor)) { + if (isObjectInZone(actor, registry.zones.get(zones.pas_b400_sr_switcher))) { giveInfo(infoPortions.pas_b400_switcher_use); } }); @@ -127,7 +127,7 @@ extern("xr_effects.pas_b400_switcher", (actor: ClientObject, npc: ClientObject): * todo; */ extern("xr_effects.jup_b209_place_scanner", (actor: ClientObject, npc: ClientObject): void => { - if (isActorInZoneWithName(zones.jup_b209_hypotheses)) { + if (isObjectInZone(actor, registry.zones.get(zones.jup_b209_hypotheses))) { createAutoSave(captions.st_save_jup_b209_placed_mutant_scanner); giveInfo(infoPortions.jup_b209_scanner_placed); takeItemFromActor(questItems.jup_b209_monster_scanner); @@ -139,7 +139,7 @@ extern("xr_effects.jup_b209_place_scanner", (actor: ClientObject, npc: ClientObj * todo; */ extern("xr_effects.jup_b9_heli_1_searching", (actor: ClientObject, npc: ClientObject): void => { - if (isActorInZoneWithName(zones.jup_b9_heli_1, actor)) { + if (isObjectInZone(actor, registry.zones.get(zones.jup_b9_heli_1))) { giveInfo(infoPortions.jup_b9_heli_1_searching); } }); @@ -148,7 +148,7 @@ extern("xr_effects.jup_b9_heli_1_searching", (actor: ClientObject, npc: ClientOb * todo; */ extern("xr_effects.pri_a18_use_idol", (actor: ClientObject, npc: ClientObject): void => { - if (isActorInZoneWithName(zones.pri_a18_use_idol_restrictor, actor)) { + if (isObjectInZone(actor, registry.zones.get(zones.pri_a18_use_idol_restrictor))) { giveInfo(infoPortions.pri_a18_run_cam); } }); @@ -157,7 +157,7 @@ extern("xr_effects.pri_a18_use_idol", (actor: ClientObject, npc: ClientObject): * todo; */ extern("xr_effects.jup_b8_heli_4_searching", (actor: ClientObject, npc: ClientObject): void => { - if (isActorInZoneWithName(zones.jup_b8_heli_4)) { + if (isObjectInZone(actor, registry.zones.get(zones.jup_b8_heli_4))) { giveInfo(infoPortions.jup_b8_heli_4_searching); } }); @@ -166,7 +166,7 @@ extern("xr_effects.jup_b8_heli_4_searching", (actor: ClientObject, npc: ClientOb * todo; */ extern("xr_effects.jup_b10_ufo_searching", (actor: ClientObject, npc: ClientObject): void => { - if (isActorInZoneWithName(zones.jup_b10_ufo_restrictor)) { + if (isObjectInZone(actor, registry.zones.get(zones.jup_b10_ufo_restrictor))) { giveInfo(infoPortions.jup_b10_ufo_memory_started); giveItemsToActor(questItems.jup_b10_ufo_memory); } @@ -176,7 +176,7 @@ extern("xr_effects.jup_b10_ufo_searching", (actor: ClientObject, npc: ClientObje * todo; */ extern("xr_effects.zat_b101_heli_5_searching", (actor: ClientObject, npc: ClientObject): void => { - if (isActorInZoneWithName(zones.zat_b101_heli_5)) { + if (isObjectInZone(actor, registry.zones.get(zones.zat_b101_heli_5))) { giveInfo(infoPortions.zat_b101_heli_5_searching); } }); @@ -185,7 +185,7 @@ extern("xr_effects.zat_b101_heli_5_searching", (actor: ClientObject, npc: Client * todo; */ extern("xr_effects.zat_b28_heli_3_searching", (actor: ClientObject, npc: ClientObject): void => { - if (isActorInZoneWithName(zones.zat_b28_heli_3)) { + if (isObjectInZone(actor, registry.zones.get(zones.zat_b28_heli_3))) { giveInfo(infoPortions.zat_b28_heli_3_searching); } }); @@ -194,7 +194,7 @@ extern("xr_effects.zat_b28_heli_3_searching", (actor: ClientObject, npc: ClientO * todo; */ extern("xr_effects.zat_b100_heli_2_searching", (actor: ClientObject, npc: ClientObject): void => { - if (isActorInZoneWithName(zones.zat_b100_heli_2)) { + if (isObjectInZone(actor, registry.zones.get(zones.zat_b100_heli_2))) { giveInfo("zat_b100_heli_2_searching"); } }); @@ -895,7 +895,7 @@ extern("xr_effects.pri_a28_talk_ssu_video_end", (actor: ClientObject, npc: Clien * todo; */ extern("xr_effects.zat_b33_pic_snag_container", (actor: ClientObject, npc: ClientObject): void => { - if (isActorInZoneWithName(zones.zat_b33_tutor)) { + if (isObjectInZone(actor, registry.zones.get(zones.zat_b33_tutor))) { giveItemsToActor(questItems.zat_b33_safe_container); giveInfo(infoPortions.zat_b33_find_package); diff --git a/src/fixtures/xray/mocks/objects/AlifeSimulator.mock.ts b/src/fixtures/xray/mocks/objects/AlifeSimulator.mock.ts index 8b956a8e5..bc3ea0704 100644 --- a/src/fixtures/xray/mocks/objects/AlifeSimulator.mock.ts +++ b/src/fixtures/xray/mocks/objects/AlifeSimulator.mock.ts @@ -37,6 +37,8 @@ export class MockAlifeSimulator { public create_ammo = jest.fn(() => {}); + public level_name = jest.fn(() => "pripyat"); + public release = jest.fn((object: ServerObject) => { MockAlifeSimulator.removeFromRegistry(object.id); }); From bdad4ceb36050bb85d30efef16edf3ed50217fe2 Mon Sep 17 00:00:00 2001 From: Neloreck Date: Mon, 26 Jun 2023 02:20:42 +0300 Subject: [PATCH 07/12] Extended mocks. Continue testing/moving object related utils by categories. --- .../managers/interaction/TravelManager.ts | 2 +- .../server/smart_terrain/SmartTerrain.ts | 2 +- src/engine/core/objects/server/squad/Squad.ts | 6 +- .../server/squad/simulation_activities.ts | 2 +- src/engine/core/utils/alife.ts | 2 +- src/engine/core/utils/object/index.ts | 1 + src/engine/core/utils/object/object_find.ts | 2 +- .../core/utils/object/object_general.ts | 46 ---------- .../core/utils/object/object_location.test.ts | 83 +++++++++++++++++-- .../core/utils/object/object_location.ts | 56 +++++++++++-- src/engine/core/utils/object/object_state.ts | 10 +++ src/engine/core/utils/vector.ts | 16 +++- .../scripts/declarations/dialogs/dialogs.ts | 2 +- src/fixtures/xray/mocks/CGameGraph.mock.ts | 11 ++- src/fixtures/xray/mocks/CVertex.mock.ts | 18 ++-- src/fixtures/xray/mocks/vector.mock.ts | 6 +- 16 files changed, 182 insertions(+), 83 deletions(-) create mode 100644 src/engine/core/utils/object/object_state.ts diff --git a/src/engine/core/managers/interaction/TravelManager.ts b/src/engine/core/managers/interaction/TravelManager.ts index 329f03e40..7f2617025 100644 --- a/src/engine/core/managers/interaction/TravelManager.ts +++ b/src/engine/core/managers/interaction/TravelManager.ts @@ -20,7 +20,7 @@ import { getObjectSmartTerrain, getObjectSquad, getServerDistanceBetween, -} from "@/engine/core/utils/object/object_general"; +} from "@/engine/core/utils/object"; import { isAnySquadMemberEnemyToActor } from "@/engine/core/utils/relation"; import { postProcessors } from "@/engine/lib/constants/animation/post_processors"; import { captions } from "@/engine/lib/constants/captions/captions"; diff --git a/src/engine/core/objects/server/smart_terrain/SmartTerrain.ts b/src/engine/core/objects/server/smart_terrain/SmartTerrain.ts index 7430f77ee..732acb214 100644 --- a/src/engine/core/objects/server/smart_terrain/SmartTerrain.ts +++ b/src/engine/core/objects/server/smart_terrain/SmartTerrain.ts @@ -68,7 +68,7 @@ import { TConditionList, } from "@/engine/core/utils/ini"; import { LuaLogger } from "@/engine/core/utils/logging"; -import { areObjectsOnSameLevel } from "@/engine/core/utils/object/object_general"; +import { areObjectsOnSameLevel } from "@/engine/core/utils/object"; import { ERelation } from "@/engine/core/utils/relation"; import { activateSchemeBySection, diff --git a/src/engine/core/objects/server/squad/Squad.ts b/src/engine/core/objects/server/squad/Squad.ts index 607b09614..f4e4bc224 100644 --- a/src/engine/core/objects/server/squad/Squad.ts +++ b/src/engine/core/objects/server/squad/Squad.ts @@ -55,15 +55,13 @@ import { TConditionList, } from "@/engine/core/utils/ini"; import { LuaLogger } from "@/engine/core/utils/logging"; -import { areObjectsOnSameLevel } from "@/engine/core/utils/object/object_general"; +import { areObjectsOnSameLevel } from "@/engine/core/utils/object"; import { areCommunitiesEnemies, ERelation, getSquadMembersRelationToActor, getSquadMembersRelationToActorSafe, - setClientObjectRelation, setObjectSympathy, - setServerObjectRelation, } from "@/engine/core/utils/relation"; import { isEmpty } from "@/engine/core/utils/table"; import { gameConfig } from "@/engine/lib/configs/GameConfig"; @@ -730,7 +728,7 @@ export class Squad extends cse_alife_online_offline_group implements ISimulation areObjectsOnSameLevel(serverObject, alife().actor()) && spawnPosition.distance_to_sqr(alife().actor().position) <= alife().switch_distance() * alife().switch_distance() ) { - // todo: Delete also, same as with stalkers and monsters??? Memory leak probable + // todo: Delete also, same as with stalkers and monsters? registry.spawnedVertexes.set(serverObject.id, lvi); } diff --git a/src/engine/core/objects/server/squad/simulation_activities.ts b/src/engine/core/objects/server/squad/simulation_activities.ts index 3f0e9b934..c59c6546c 100644 --- a/src/engine/core/objects/server/squad/simulation_activities.ts +++ b/src/engine/core/objects/server/squad/simulation_activities.ts @@ -3,7 +3,7 @@ import { ISimulationActivityDescriptor, SmartTerrain } from "@/engine/core/objec import { Squad } from "@/engine/core/objects/server/squad/Squad"; import { hasAlifeInfo } from "@/engine/core/utils/info_portion"; import { LuaLogger } from "@/engine/core/utils/logging"; -import { getServerDistanceBetween } from "@/engine/core/utils/object/object_general"; +import { getServerDistanceBetween } from "@/engine/core/utils/object"; import { isAnySquadMemberEnemyToActor } from "@/engine/core/utils/relation"; import { isInTimeInterval } from "@/engine/core/utils/time"; import { communities, TCommunity } from "@/engine/lib/constants/communities"; diff --git a/src/engine/core/utils/alife.ts b/src/engine/core/utils/alife.ts index 1e8af2084..2d5d3b579 100644 --- a/src/engine/core/utils/alife.ts +++ b/src/engine/core/utils/alife.ts @@ -3,7 +3,7 @@ import { alife } from "xray16"; import { Squad } from "@/engine/core/objects"; import { TSimulationObject } from "@/engine/core/objects/server/types"; import { LuaLogger } from "@/engine/core/utils/logging"; -import { areObjectsOnSameLevel, getServerDistanceBetween } from "@/engine/core/utils/object/object_general"; +import { areObjectsOnSameLevel, getServerDistanceBetween } from "@/engine/core/utils/object/object_location"; import { logicsConfig } from "@/engine/lib/configs/LogicsConfig"; import { MAX_I32 } from "@/engine/lib/constants/memory"; import { ServerObject, TDistance, TRate } from "@/engine/lib/types"; diff --git a/src/engine/core/utils/object/index.ts b/src/engine/core/utils/object/index.ts index 42f5abed4..59f460929 100644 --- a/src/engine/core/utils/object/index.ts +++ b/src/engine/core/utils/object/index.ts @@ -1,3 +1,4 @@ export * from "@/engine/core/utils/object/object_general"; export * from "@/engine/core/utils/object/object_location"; +export * from "@/engine/core/utils/object/object_state"; export * from "@/engine/core/utils/object/object_find"; diff --git a/src/engine/core/utils/object/object_find.ts b/src/engine/core/utils/object/object_find.ts index 1d1a16f54..6fec4faf7 100644 --- a/src/engine/core/utils/object/object_find.ts +++ b/src/engine/core/utils/object/object_find.ts @@ -2,7 +2,7 @@ import { alife, level } from "xray16"; import { registry } from "@/engine/core/database"; import { LuaLogger } from "@/engine/core/utils/logging"; -import { areObjectsOnSameLevel } from "@/engine/core/utils/object/object_general"; +import { areObjectsOnSameLevel } from "@/engine/core/utils/object/object_location"; import { AlifeSimulator, AnyCallable, diff --git a/src/engine/core/utils/object/object_general.ts b/src/engine/core/utils/object/object_general.ts index 44f2cedf9..9ccddb8e4 100644 --- a/src/engine/core/utils/object/object_general.ts +++ b/src/engine/core/utils/object/object_general.ts @@ -251,32 +251,6 @@ export function getAlifeCharacterCommunity(object: ServerHumanObject | ServerGro return communities.monster; } -/** - * todo; - */ -export function getServerDistanceBetween(first: ServerObject, second: ServerObject): TDistance { - return graphDistance(first.m_game_vertex_id, second.m_game_vertex_id); -} - -/** - * todo; - */ -export function getServerDistanceBetweenSafe( - first: Optional, - second: Optional -): Optional { - return first && second && graphDistance(first.m_game_vertex_id, second.m_game_vertex_id); -} - -/** - * todo; - */ -export function areObjectsOnSameLevel(first: ServerObject, second: ServerObject): boolean { - return ( - game_graph().vertex(first.m_game_vertex_id).level_id() === game_graph().vertex(second.m_game_vertex_id).level_id() - ); -} - /** * todo; */ @@ -517,23 +491,3 @@ export function anomalyHasArtefact( return $multi(false, null); } - -/** - * todo; - */ -export function isObjectAsleep(object: ClientObject): boolean { - return registry.objects.get(object.id()).stateManager!.animstate.states.currentState === EStalkerState.SLEEP; -} - -/** - * Check whether object is in provided smart terrain (name). - * - * @param object - client object to check - * @param smartTerrainName - desired smart terrain to check - * @returns whether object is assigned to smart terrain with desired name - */ -export function isObjectInSmartTerrain(object: ClientObject, smartTerrainName: TName): boolean { - const smartTerrain: Optional = getObjectSmartTerrain(object); - - return smartTerrain ? smartTerrain.name() === smartTerrainName : false; -} diff --git a/src/engine/core/utils/object/object_location.test.ts b/src/engine/core/utils/object/object_location.test.ts index 06a803318..78137f1f8 100644 --- a/src/engine/core/utils/object/object_location.test.ts +++ b/src/engine/core/utils/object/object_location.test.ts @@ -1,11 +1,29 @@ -import { describe, expect, it } from "@jest/globals"; +import { describe, expect, it, jest } from "@jest/globals"; import { alife, game_graph } from "xray16"; -import { isObjectInZone, isObjectOnLevel } from "@/engine/core/utils/object/object_location"; +import { + areObjectsOnSameLevel, + getServerDistanceBetween, + isDistanceBetweenObjectsGreaterOrEqual, + isDistanceBetweenObjectsLessOrEqual, + isObjectInSmartTerrain, + isObjectInZone, + isObjectOnLevel, +} from "@/engine/core/utils/object/object_location"; import { ClientObject, ServerObject } from "@/engine/lib/types"; -import { mockClientGameObject, mockServerAlifeObject } from "@/fixtures/xray"; +import { mockRegisteredActor } from "@/fixtures/engine"; +import { mockClientGameObject, mockServerAlifeObject, mockServerAlifeSmartZone } from "@/fixtures/xray"; describe("object location utils", () => { + it("'isObjectInSmartTerrain' check object inside smart terrain", () => { + const smartTerrain = mockServerAlifeSmartZone({ name: () => "test-smart" as T }); + const { actorClientObject } = mockRegisteredActor({}, { m_smart_terrain_id: smartTerrain.id }); + + expect(isObjectInSmartTerrain(actorClientObject, "test-smart")).toBe(true); + expect(isObjectInSmartTerrain(actorClientObject, "test-smart-another")).toBe(false); + expect(isObjectInSmartTerrain(actorClientObject, "another")).toBe(false); + }); + it("'isObjectInZone' check object inside", () => { const object: ClientObject = mockClientGameObject(); const zone: ClientObject = mockClientGameObject(); @@ -17,13 +35,66 @@ describe("object location utils", () => { expect(isObjectInZone(null, zone)).toBe(false); }); - it("'isObjectOnLevel' check object inside", () => { + it("'isObjectOnLevel' check object on level", () => { const object: ServerObject = mockServerAlifeObject(); expect(isObjectOnLevel(null, "zaton")).toBe(false); expect(isObjectOnLevel(object, "pripyat")).toBe(true); - expect(game_graph().vertex(object.m_game_vertex_id).level_id()).toBe(1); - expect(alife().level_name).toHaveBeenCalledWith(1); + expect(game_graph().vertex(object.m_game_vertex_id).level_id()).toBe(10); + expect(alife().level_name).toHaveBeenCalledWith(10); + }); + + it("'areObjectsOnSameLevel' check objects on level", () => { + expect(areObjectsOnSameLevel(mockServerAlifeObject(), mockServerAlifeObject())).toBe(true); + expect(areObjectsOnSameLevel(mockServerAlifeObject(), mockServerAlifeObject({ m_game_vertex_id: 990 }))).toBe( + false + ); + expect( + areObjectsOnSameLevel( + mockServerAlifeObject({ m_game_vertex_id: 990 }), + mockServerAlifeObject({ m_game_vertex_id: 990 }) + ) + ).toBe(true); + }); + + it("'isDistanceBetweenObjectsGreaterOrEqual' should correctly check", () => { + const first: ClientObject = mockClientGameObject(); + const second: ClientObject = mockClientGameObject(); + + jest.spyOn(first.position(), "distance_to").mockImplementation(() => 150); + expect(isDistanceBetweenObjectsGreaterOrEqual(first, second, 100)).toBe(true); + + jest.spyOn(first.position(), "distance_to").mockImplementation(() => 25); + expect(isDistanceBetweenObjectsGreaterOrEqual(first, second, 55)).toBe(false); + + jest.spyOn(first.position(), "distance_to").mockImplementation(() => 1000); + expect(isDistanceBetweenObjectsGreaterOrEqual(first, second, 1000)).toBe(true); + }); + + it("'isDistanceBetweenObjectsLessOrEqual' should correctly check", () => { + const first: ClientObject = mockClientGameObject(); + const second: ClientObject = mockClientGameObject(); + + jest.spyOn(first.position(), "distance_to").mockImplementation(() => 150); + expect(isDistanceBetweenObjectsLessOrEqual(first, second, 100)).toBe(false); + + jest.spyOn(first.position(), "distance_to").mockImplementation(() => 25); + expect(isDistanceBetweenObjectsLessOrEqual(first, second, 55)).toBe(true); + + jest.spyOn(first.position(), "distance_to").mockImplementation(() => 1000); + expect(isDistanceBetweenObjectsLessOrEqual(first, second, 1000)).toBe(true); + }); + + it("'getServerDistanceBetween' should correctly get distance for offline objects", () => { + const first: ServerObject = mockServerAlifeObject({ m_game_vertex_id: 500 }); + + jest.spyOn(game_graph().vertex(500).game_point(), "distance_to").mockImplementation(() => 600); + expect(getServerDistanceBetween(first, mockServerAlifeObject())).toBe(600); + + const second: ServerObject = mockServerAlifeObject({ m_game_vertex_id: 501 }); + + jest.spyOn(game_graph().vertex(501).game_point(), "distance_to").mockImplementation(() => 255); + expect(getServerDistanceBetween(second, mockServerAlifeObject())).toBe(255); }); }); diff --git a/src/engine/core/utils/object/object_location.ts b/src/engine/core/utils/object/object_location.ts index 49ffaef1f..702111b5e 100644 --- a/src/engine/core/utils/object/object_location.ts +++ b/src/engine/core/utils/object/object_location.ts @@ -1,8 +1,23 @@ import { alife, game_graph } from "xray16"; -import { registry } from "@/engine/core/database"; +import { SmartTerrain } from "@/engine/core/objects"; +import { getObjectSmartTerrain } from "@/engine/core/utils/object/object_general"; +import { graphDistance } from "@/engine/core/utils/vector"; import { ClientObject, Optional, ServerObject, TDistance, TName } from "@/engine/lib/types"; +/** + * Check whether object is in provided smart terrain (name). + * + * @param object - client object to check + * @param smartTerrainName - desired smart terrain to check + * @returns whether object is assigned to smart terrain with desired name + */ +export function isObjectInSmartTerrain(object: ClientObject, smartTerrainName: TName): boolean { + const smartTerrain: Optional = getObjectSmartTerrain(object); + + return smartTerrain ? smartTerrain.name() === smartTerrainName : false; +} + /** * Check whether object is inside another zone object. * @@ -26,7 +41,12 @@ export function isObjectOnLevel(object: Optional, levelName: TName } /** - * @returns whether distance between objects greater or equal. + * Check distance between objects. + * + * @param first - object distance from + * @param second - object distance to + * @param distance - distance in meters + * @returns whether distance between objects greater or equal */ export function isDistanceBetweenObjectsGreaterOrEqual( first: ClientObject, @@ -37,7 +57,12 @@ export function isDistanceBetweenObjectsGreaterOrEqual( } /** - * @returns whether distance between objects less or equal. + * Check distance between objects. + * + * @param first - object distance from + * @param second - object distance to + * @param distance - distance in meters + * @returns whether distance between objects less or equal */ export function isDistanceBetweenObjectsLessOrEqual( first: ClientObject, @@ -48,15 +73,28 @@ export function isDistanceBetweenObjectsLessOrEqual( } /** - * @returns whether distance to actor greater or equal. + * Check whether objects are on same level. + * + * @param first - object to compare + * @param second - object to compare + * @returns whether objects are on same level */ -export function isDistanceToActorGreaterOrEqual(object: ClientObject, distance: TDistance): boolean { - return object.position().distance_to_sqr(registry.actor.position()) >= distance * distance; +export function areObjectsOnSameLevel(first: ServerObject, second: ServerObject): boolean { + return ( + game_graph().vertex(first.m_game_vertex_id).level_id() === game_graph().vertex(second.m_game_vertex_id).level_id() + ); } /** - * @returns whether distance to actor less or equal. + * Get absolute distance for objects based on game graphs. + * Approximately calculates distance for servers that are offline and may be on different levels. + * + * todo: Use table memo for storing distance between different static vertexes. + * + * @param first - object to check + * @param second - object to check + * @returns game distance between two objects */ -export function isDistanceToActorLessOrEqual(object: ClientObject, distance: TDistance): boolean { - return object.position().distance_to_sqr(registry.actor.position()) <= distance * distance; +export function getServerDistanceBetween(first: ServerObject, second: ServerObject): TDistance { + return graphDistance(first.m_game_vertex_id, second.m_game_vertex_id); } diff --git a/src/engine/core/utils/object/object_state.ts b/src/engine/core/utils/object/object_state.ts new file mode 100644 index 000000000..141c8e77e --- /dev/null +++ b/src/engine/core/utils/object/object_state.ts @@ -0,0 +1,10 @@ +import { registry } from "@/engine/core/database"; +import { EStalkerState } from "@/engine/core/objects/state"; +import { ClientObject } from "@/engine/lib/types"; + +/** + * todo; + */ +export function isObjectAsleep(object: ClientObject): boolean { + return registry.objects.get(object.id()).stateManager!.animstate.states.currentState === EStalkerState.SLEEP; +} diff --git a/src/engine/core/utils/vector.ts b/src/engine/core/utils/vector.ts index ad2ba497d..072998eee 100644 --- a/src/engine/core/utils/vector.ts +++ b/src/engine/core/utils/vector.ts @@ -113,10 +113,20 @@ export function distanceBetween(first: ClientObject, second: ClientObject): numb } /** - * + * Get graph distance between two vertexes. + */ +export function graphDistance(firstVertexId: TNumberId, secondVertexId: TNumberId): TDistance { + return game_graph().vertex(firstVertexId).game_point().distance_to(game_graph().vertex(secondVertexId).game_point()); +} + +/** + * Get graph distance between two vertexes in sqr. */ -export function graphDistance(vertexId1: TNumberId, vertexId2: TNumberId): TDistance { - return game_graph().vertex(vertexId1).game_point().distance_to(game_graph().vertex(vertexId2).game_point()); +export function graphDistanceSqr(firstVertexId: TNumberId, secondVertexId: TNumberId): TDistance { + return game_graph() + .vertex(firstVertexId) + .game_point() + .distance_to_sqr(game_graph().vertex(secondVertexId).game_point()); } /** diff --git a/src/engine/scripts/declarations/dialogs/dialogs.ts b/src/engine/scripts/declarations/dialogs/dialogs.ts index b69a055f0..c6579a851 100644 --- a/src/engine/scripts/declarations/dialogs/dialogs.ts +++ b/src/engine/scripts/declarations/dialogs/dialogs.ts @@ -16,7 +16,7 @@ import { isObjectWounded, isStalkerAlive } from "@/engine/core/utils/check/check import { createAutoSave } from "@/engine/core/utils/game_save"; import { giveInfo, hasAlifeInfo } from "@/engine/core/utils/info_portion"; import { LuaLogger } from "@/engine/core/utils/logging"; -import { getCharacterCommunity, isObjectInSmartTerrain } from "@/engine/core/utils/object/object_general"; +import { getCharacterCommunity, isObjectInSmartTerrain } from "@/engine/core/utils/object"; import { actorHasMedKit, getActorAvailableMedKit, diff --git a/src/fixtures/xray/mocks/CGameGraph.mock.ts b/src/fixtures/xray/mocks/CGameGraph.mock.ts index 87a339c0b..6fd5f8709 100644 --- a/src/fixtures/xray/mocks/CGameGraph.mock.ts +++ b/src/fixtures/xray/mocks/CGameGraph.mock.ts @@ -1,10 +1,19 @@ import { jest } from "@jest/globals"; +import { TNumberId } from "@/engine/lib/types"; import { MockCVertex } from "@/fixtures/xray/mocks/CVertex.mock"; /** * todo; */ export class MockCGameGraph { - public vertex = jest.fn(() => new MockCVertex()); + public static registry: Record = {}; + + public vertex = jest.fn((vertexId: TNumberId = 1) => { + if (!MockCGameGraph.registry[vertexId]) { + MockCGameGraph.registry[vertexId] = new MockCVertex(vertexId); + } + + return MockCGameGraph.registry[vertexId]; + }); } diff --git a/src/fixtures/xray/mocks/CVertex.mock.ts b/src/fixtures/xray/mocks/CVertex.mock.ts index d29efa35b..e333660d3 100644 --- a/src/fixtures/xray/mocks/CVertex.mock.ts +++ b/src/fixtures/xray/mocks/CVertex.mock.ts @@ -1,16 +1,22 @@ import { jest } from "@jest/globals"; +import { TNumberId } from "@/engine/lib/types"; import { MockVector } from "@/fixtures/xray/mocks/vector.mock"; /** * todo; */ export class MockCVertex { - public static DEFAULT_VERTEX_ID: number = 1; - public static DEFAULT_LEVEL_ID: number = 1; + public vertexId: TNumberId; + public gamePoint: MockVector = new MockVector(); + public levelPoint: MockVector = new MockVector(); - public level_vertex_id = jest.fn(() => MockCVertex.DEFAULT_VERTEX_ID); - public level_id = jest.fn(() => MockCVertex.DEFAULT_LEVEL_ID); - public game_point = jest.fn(() => new MockVector()); - public level_point = jest.fn(() => new MockVector()); + public constructor(vertexId: TNumberId) { + this.vertexId = vertexId; + } + + public level_vertex_id = jest.fn(() => this.vertexId); + public level_id = jest.fn(() => this.vertexId * 10); + public game_point = jest.fn(() => this.gamePoint); + public level_point = jest.fn(() => this.levelPoint); } diff --git a/src/fixtures/xray/mocks/vector.mock.ts b/src/fixtures/xray/mocks/vector.mock.ts index 2587f403e..0ea44523e 100644 --- a/src/fixtures/xray/mocks/vector.mock.ts +++ b/src/fixtures/xray/mocks/vector.mock.ts @@ -1,5 +1,3 @@ -import { jest } from "@jest/globals"; - import { Vector } from "@/engine/lib/types"; /** @@ -71,6 +69,10 @@ export class MockVector { return MockVector.DEFAULT_DISTANCE; } + public distance_to_sqr(): number { + return this.distance_to() * this.distance_to(); + } + public normalize(): void {} public getH(): number { From 8cafd99c8b7af6bad9144e5363940d7f9d254d63 Mon Sep 17 00:00:00 2001 From: Neloreck Date: Mon, 26 Jun 2023 02:41:48 +0300 Subject: [PATCH 08/12] Moved object state check methods. --- .../interaction/dialog/DialogManager.ts | 15 +- .../notifications/NotificationManager.ts | 2 +- .../state/state/EvaluatorStateIdleAlife.ts | 4 +- .../state/state/EvaluatorStateIdleItems.ts | 2 +- .../core/schemes/camper/CampStoryManager.ts | 9 +- .../camper/actions/ActionCamperPatrol.ts | 4 +- .../EvaluatorPostCombatIdleEnemy.ts | 2 +- .../CombatProcessEnemyManager.ts | 2 +- .../evaluators/EvaluatorCorpseDetect.ts | 2 +- .../danger/evaluators/EvaluatorDanger.ts | 4 +- .../evaluators/EvaluatorWoundedExist.ts | 2 +- src/engine/core/schemes/meet/MeetManager.ts | 6 +- src/engine/core/schemes/meet/SchemeMeet.ts | 8 +- .../meet/evaluators/EvaluatorContact.ts | 2 +- .../core/schemes/ph_minigun/MinigunManager.ts | 10 +- src/engine/core/utils/check/check.ts | 193 ------------------ src/engine/core/utils/object/index.ts | 1 + src/engine/core/utils/object/object_danger.ts | 180 ++++++++++++++++ src/engine/core/utils/object/object_state.ts | 48 ++++- .../scripts/declarations/conditions/object.ts | 31 ++- .../scripts/declarations/dialogs/dialogs.ts | 4 +- 21 files changed, 281 insertions(+), 250 deletions(-) create mode 100644 src/engine/core/utils/object/object_danger.ts diff --git a/src/engine/core/managers/interaction/dialog/DialogManager.ts b/src/engine/core/managers/interaction/dialog/DialogManager.ts index 9d80e75a3..83c6093ac 100644 --- a/src/engine/core/managers/interaction/dialog/DialogManager.ts +++ b/src/engine/core/managers/interaction/dialog/DialogManager.ts @@ -1,7 +1,13 @@ import { CPhraseScript, level } from "xray16"; -import { closeLoadMarker, closeSaveMarker, DIALOG_MANAGER_LTX, openSaveMarker, registry } from "@/engine/core/database"; -import { openLoadMarker } from "@/engine/core/database/save_markers"; +import { + closeLoadMarker, + closeSaveMarker, + DIALOG_MANAGER_LTX, + openLoadMarker, + openSaveMarker, + registry, +} from "@/engine/core/database"; import { AbstractCoreManager } from "@/engine/core/managers/base/AbstractCoreManager"; import { EGameEvent, EventsManager } from "@/engine/core/managers/events"; import { @@ -11,11 +17,10 @@ import { TPRTTable, } from "@/engine/core/managers/interaction/dialog/types"; import { assert } from "@/engine/core/utils/assertion"; -import { isObjectWounded } from "@/engine/core/utils/check/check"; import { hasAlifeInfo } from "@/engine/core/utils/info_portion"; -import { parseInfoPortions, parseStringsList } from "@/engine/core/utils/ini/parse"; +import { parseInfoPortions, parseStringsList } from "@/engine/core/utils/ini"; import { LuaLogger } from "@/engine/core/utils/logging"; -import { getCharacterCommunity } from "@/engine/core/utils/object/object_general"; +import { getCharacterCommunity, isObjectWounded } from "@/engine/core/utils/object"; import { FALSE, TRUE } from "@/engine/lib/constants/words"; import { ClientObject, diff --git a/src/engine/core/managers/interface/notifications/NotificationManager.ts b/src/engine/core/managers/interface/notifications/NotificationManager.ts index 837676064..00b5a94cb 100644 --- a/src/engine/core/managers/interface/notifications/NotificationManager.ts +++ b/src/engine/core/managers/interface/notifications/NotificationManager.ts @@ -28,9 +28,9 @@ import { import { GlobalSoundManager } from "@/engine/core/managers/sounds/GlobalSoundManager"; import { Stalker } from "@/engine/core/objects"; import { abort, assert } from "@/engine/core/utils/assertion"; -import { isHeavilyWounded } from "@/engine/core/utils/check/check"; import { isStalkerClassId } from "@/engine/core/utils/check/is"; import { LuaLogger } from "@/engine/core/utils/logging"; +import { isHeavilyWounded } from "@/engine/core/utils/object"; import { getInventoryNameForItemSection } from "@/engine/core/utils/spawn"; import { captions, TCaption } from "@/engine/lib/constants/captions/captions"; import { scriptSounds } from "@/engine/lib/constants/sound/script_sounds"; diff --git a/src/engine/core/objects/state/state/EvaluatorStateIdleAlife.ts b/src/engine/core/objects/state/state/EvaluatorStateIdleAlife.ts index 37e6e8244..ac54f2913 100644 --- a/src/engine/core/objects/state/state/EvaluatorStateIdleAlife.ts +++ b/src/engine/core/objects/state/state/EvaluatorStateIdleAlife.ts @@ -2,9 +2,9 @@ import { action_planner, LuabindClass, property_evaluator } from "xray16"; import { StalkerStateManager } from "@/engine/core/objects/state/StalkerStateManager"; import { EStalkerState, EStateEvaluatorId } from "@/engine/core/objects/state/types"; -import { EActionId } from "@/engine/core/schemes"; -import { isObjectMeeting } from "@/engine/core/utils/check/check"; +import { EActionId } from "@/engine/core/schemes/base"; import { LuaLogger } from "@/engine/core/utils/logging"; +import { isObjectMeeting } from "@/engine/core/utils/object"; import { Optional } from "@/engine/lib/types"; const logger: LuaLogger = new LuaLogger($filename); diff --git a/src/engine/core/objects/state/state/EvaluatorStateIdleItems.ts b/src/engine/core/objects/state/state/EvaluatorStateIdleItems.ts index afbc44589..ec05b5cb5 100644 --- a/src/engine/core/objects/state/state/EvaluatorStateIdleItems.ts +++ b/src/engine/core/objects/state/state/EvaluatorStateIdleItems.ts @@ -2,8 +2,8 @@ import { LuabindClass, property_evaluator } from "xray16"; import { StalkerStateManager } from "@/engine/core/objects/state/StalkerStateManager"; import { EStalkerState, EStateEvaluatorId } from "@/engine/core/objects/state/types"; -import { isObjectMeeting } from "@/engine/core/utils/check/check"; import { LuaLogger } from "@/engine/core/utils/logging"; +import { isObjectMeeting } from "@/engine/core/utils/object"; const logger: LuaLogger = new LuaLogger($filename); diff --git a/src/engine/core/schemes/camper/CampStoryManager.ts b/src/engine/core/schemes/camper/CampStoryManager.ts index 545e18cc9..4af33a825 100644 --- a/src/engine/core/schemes/camper/CampStoryManager.ts +++ b/src/engine/core/schemes/camper/CampStoryManager.ts @@ -2,17 +2,16 @@ import { time_global } from "xray16"; import { IRegistryObjectState, registry } from "@/engine/core/database"; import { GlobalSoundManager } from "@/engine/core/managers/sounds/GlobalSoundManager"; -import { StoryManager } from "@/engine/core/objects/sounds/stories/StoryManager"; -import { ESchemeEvent } from "@/engine/core/schemes"; +import { StoryManager } from "@/engine/core/objects/sounds/stories"; import { ISchemeAnimpointState } from "@/engine/core/schemes/animpoint/ISchemeAnimpointState"; import { IAnimpointAction } from "@/engine/core/schemes/animpoint/types"; +import { ESchemeEvent } from "@/engine/core/schemes/base"; import { ISchemeMeetState } from "@/engine/core/schemes/meet"; import { MeetManager } from "@/engine/core/schemes/meet/MeetManager"; import { abort } from "@/engine/core/utils/assertion"; -import { isObjectMeeting } from "@/engine/core/utils/check/check"; -import { parseStringsList } from "@/engine/core/utils/ini/parse"; -import { readIniString } from "@/engine/core/utils/ini/read"; +import { parseStringsList, readIniString } from "@/engine/core/utils/ini"; import { LuaLogger } from "@/engine/core/utils/logging"; +import { isObjectMeeting } from "@/engine/core/utils/object"; import { emitSchemeEvent } from "@/engine/core/utils/scheme"; import { ClientObject, diff --git a/src/engine/core/schemes/camper/actions/ActionCamperPatrol.ts b/src/engine/core/schemes/camper/actions/ActionCamperPatrol.ts index 4616ef483..e05792e3c 100644 --- a/src/engine/core/schemes/camper/actions/ActionCamperPatrol.ts +++ b/src/engine/core/schemes/camper/actions/ActionCamperPatrol.ts @@ -6,8 +6,8 @@ import { EStalkerState, ILookTargetDescriptor } from "@/engine/core/objects/stat import { StalkerMoveManager } from "@/engine/core/objects/state/StalkerMoveManager"; import { ICampPoint, ISchemeCamperState } from "@/engine/core/schemes/camper/ISchemeCamperState"; import { abort } from "@/engine/core/utils/assertion"; -import { isObjectFacingDanger } from "@/engine/core/utils/check/check"; -import { parseWaypointsData } from "@/engine/core/utils/ini/parse"; +import { parseWaypointsData } from "@/engine/core/utils/ini"; +import { isObjectFacingDanger } from "@/engine/core/utils/object"; import { isStalkerAtWaypoint } from "@/engine/core/utils/position"; import { createVector } from "@/engine/core/utils/vector"; import { ClientObject, DangerObject, Optional, Vector } from "@/engine/lib/types"; diff --git a/src/engine/core/schemes/combat_idle/evaluators/EvaluatorPostCombatIdleEnemy.ts b/src/engine/core/schemes/combat_idle/evaluators/EvaluatorPostCombatIdleEnemy.ts index c53f089d5..f3532e201 100644 --- a/src/engine/core/schemes/combat_idle/evaluators/EvaluatorPostCombatIdleEnemy.ts +++ b/src/engine/core/schemes/combat_idle/evaluators/EvaluatorPostCombatIdleEnemy.ts @@ -3,8 +3,8 @@ import { LuabindClass, property_evaluator, time_global } from "xray16"; import { registry } from "@/engine/core/database"; import { ISchemePostCombatIdleState } from "@/engine/core/schemes/combat_idle/ISchemePostCombatIdleState"; import { ISchemeCombatIgnoreState } from "@/engine/core/schemes/combat_ignore"; -import { isObjectEnemy } from "@/engine/core/utils/check/check"; import { LuaLogger } from "@/engine/core/utils/logging"; +import { isObjectEnemy } from "@/engine/core/utils/object"; import { logicsConfig } from "@/engine/lib/configs/LogicsConfig"; import { ClientObject, EScheme, Optional, TDistance, TTimestamp } from "@/engine/lib/types"; diff --git a/src/engine/core/schemes/combat_ignore/CombatProcessEnemyManager.ts b/src/engine/core/schemes/combat_ignore/CombatProcessEnemyManager.ts index e90a3c0c1..7c2f1c871 100644 --- a/src/engine/core/schemes/combat_ignore/CombatProcessEnemyManager.ts +++ b/src/engine/core/schemes/combat_ignore/CombatProcessEnemyManager.ts @@ -4,8 +4,8 @@ import { registry } from "@/engine/core/database"; import { SmartTerrain } from "@/engine/core/objects/server/smart_terrain/SmartTerrain"; import { AbstractSchemeManager } from "@/engine/core/schemes"; import { ISchemeCombatIgnoreState } from "@/engine/core/schemes/combat_ignore/index"; -import { isObjectEnemy } from "@/engine/core/utils/check/check"; import { LuaLogger } from "@/engine/core/utils/logging"; +import { isObjectEnemy } from "@/engine/core/utils/object"; import { logicsConfig } from "@/engine/lib/configs/LogicsConfig"; import { ACTOR_ID } from "@/engine/lib/constants/ids"; import { MAX_U16 } from "@/engine/lib/constants/memory"; diff --git a/src/engine/core/schemes/corpse_detection/evaluators/EvaluatorCorpseDetect.ts b/src/engine/core/schemes/corpse_detection/evaluators/EvaluatorCorpseDetect.ts index 2f1fd36aa..d217e2422 100644 --- a/src/engine/core/schemes/corpse_detection/evaluators/EvaluatorCorpseDetect.ts +++ b/src/engine/core/schemes/corpse_detection/evaluators/EvaluatorCorpseDetect.ts @@ -3,8 +3,8 @@ import { level, LuabindClass, property_evaluator } from "xray16"; import { IRegistryObjectState, registry } from "@/engine/core/database"; import { IReleaseDescriptor, ReleaseBodyManager } from "@/engine/core/managers/world/ReleaseBodyManager"; import { ISchemeCorpseDetectionState } from "@/engine/core/schemes/corpse_detection"; -import { isObjectWounded } from "@/engine/core/utils/check/check"; import { isLootableItem } from "@/engine/core/utils/check/is"; +import { isObjectWounded } from "@/engine/core/utils/object"; import { communities } from "@/engine/lib/constants/communities"; import { ClientObject, Optional, TDistance, TNumberId, Vector } from "@/engine/lib/types"; diff --git a/src/engine/core/schemes/danger/evaluators/EvaluatorDanger.ts b/src/engine/core/schemes/danger/evaluators/EvaluatorDanger.ts index 24ee4591d..c7e5fc05c 100644 --- a/src/engine/core/schemes/danger/evaluators/EvaluatorDanger.ts +++ b/src/engine/core/schemes/danger/evaluators/EvaluatorDanger.ts @@ -1,8 +1,8 @@ import { alife, danger_object, LuabindClass, property_evaluator, stalker_ids, time_global } from "xray16"; -import { SmartTerrain } from "@/engine/core/objects/server/smart_terrain/SmartTerrain"; +import { SmartTerrain } from "@/engine/core/objects/server/smart_terrain"; import { ISchemeDangerState } from "@/engine/core/schemes/danger"; -import { isObjectFacingDanger } from "@/engine/core/utils/check/check"; +import { isObjectFacingDanger } from "@/engine/core/utils/object"; import { logicsConfig } from "@/engine/lib/configs/LogicsConfig"; import { MAX_U16 } from "@/engine/lib/constants/memory"; import { ActionPlanner, DangerObject, Optional, ServerCreatureObject, TTimestamp } from "@/engine/lib/types"; diff --git a/src/engine/core/schemes/help_wounded/evaluators/EvaluatorWoundedExist.ts b/src/engine/core/schemes/help_wounded/evaluators/EvaluatorWoundedExist.ts index 48484a0c2..f464d315c 100644 --- a/src/engine/core/schemes/help_wounded/evaluators/EvaluatorWoundedExist.ts +++ b/src/engine/core/schemes/help_wounded/evaluators/EvaluatorWoundedExist.ts @@ -3,8 +3,8 @@ import { level, LuabindClass, property_evaluator } from "xray16"; import { IRegistryObjectState, registry } from "@/engine/core/database"; import { ISchemeHelpWoundedState } from "@/engine/core/schemes/help_wounded"; import { ISchemeWoundedState } from "@/engine/core/schemes/wounded"; -import { isObjectWounded } from "@/engine/core/utils/check/check"; import { LuaLogger } from "@/engine/core/utils/logging"; +import { isObjectWounded } from "@/engine/core/utils/object"; import { communities } from "@/engine/lib/constants/communities"; import { ClientObject, EScheme, TDistance, TNumberId, Vector } from "@/engine/lib/types"; diff --git a/src/engine/core/schemes/meet/MeetManager.ts b/src/engine/core/schemes/meet/MeetManager.ts index f09af5bf7..b1b816839 100644 --- a/src/engine/core/schemes/meet/MeetManager.ts +++ b/src/engine/core/schemes/meet/MeetManager.ts @@ -6,10 +6,10 @@ import { EStalkerState } from "@/engine/core/objects/state"; import { AbstractSchemeManager } from "@/engine/core/schemes"; import { SchemeAbuse } from "@/engine/core/schemes/abuse"; import { ISchemeMeetState } from "@/engine/core/schemes/meet/ISchemeMeetState"; -import { isBlackScreen, isObjectWounded } from "@/engine/core/utils/check/check"; -import { pickSectionFromCondList } from "@/engine/core/utils/ini/config"; +import { isBlackScreen } from "@/engine/core/utils/check/check"; +import { pickSectionFromCondList } from "@/engine/core/utils/ini"; import { LuaLogger } from "@/engine/core/utils/logging"; -import { isObjectInCombat } from "@/engine/core/utils/object/object_general"; +import { isObjectInCombat, isObjectWounded } from "@/engine/core/utils/object"; import { captions } from "@/engine/lib/constants/captions"; import { FALSE, NIL, TRUE } from "@/engine/lib/constants/words"; import { ClientObject, Optional, StringOptional, TDistance, TName, TSection, TStringId } from "@/engine/lib/types"; diff --git a/src/engine/core/schemes/meet/SchemeMeet.ts b/src/engine/core/schemes/meet/SchemeMeet.ts index ca569617d..544b168d8 100644 --- a/src/engine/core/schemes/meet/SchemeMeet.ts +++ b/src/engine/core/schemes/meet/SchemeMeet.ts @@ -11,12 +11,10 @@ import { EvaluatorContact } from "@/engine/core/schemes/meet/evaluators"; import { ISchemeMeetState } from "@/engine/core/schemes/meet/ISchemeMeetState"; import { MeetManager } from "@/engine/core/schemes/meet/MeetManager"; import { ISchemeWoundedState } from "@/engine/core/schemes/wounded"; -import { isObjectWounded } from "@/engine/core/utils/check/check"; -import { pickSectionFromCondList } from "@/engine/core/utils/ini/config"; -import { parseConditionsList } from "@/engine/core/utils/ini/parse"; -import { readIniString } from "@/engine/core/utils/ini/read"; +import { parseConditionsList, pickSectionFromCondList, readIniString } from "@/engine/core/utils/ini"; import { LuaLogger } from "@/engine/core/utils/logging"; -import { getObjectsRelationSafe } from "@/engine/core/utils/relation/get"; +import { isObjectWounded } from "@/engine/core/utils/object"; +import { getObjectsRelationSafe } from "@/engine/core/utils/relation"; import { logicsConfig } from "@/engine/lib/configs/LogicsConfig"; import { FALSE, NIL, TRUE } from "@/engine/lib/constants/words"; import { diff --git a/src/engine/core/schemes/meet/evaluators/EvaluatorContact.ts b/src/engine/core/schemes/meet/evaluators/EvaluatorContact.ts index c6487474b..a70c2c1b2 100644 --- a/src/engine/core/schemes/meet/evaluators/EvaluatorContact.ts +++ b/src/engine/core/schemes/meet/evaluators/EvaluatorContact.ts @@ -2,8 +2,8 @@ import { LuabindClass, property_evaluator, stalker_ids } from "xray16"; import { registry } from "@/engine/core/database"; import { ISchemeMeetState } from "@/engine/core/schemes/meet"; -import { isObjectWounded } from "@/engine/core/utils/check/check"; import { LuaLogger } from "@/engine/core/utils/logging"; +import { isObjectWounded } from "@/engine/core/utils/object"; import { FALSE } from "@/engine/lib/constants/words"; import { ActionPlanner, ClientObject, Optional } from "@/engine/lib/types"; diff --git a/src/engine/core/schemes/ph_minigun/MinigunManager.ts b/src/engine/core/schemes/ph_minigun/MinigunManager.ts index 02302ab05..268acad4b 100644 --- a/src/engine/core/schemes/ph_minigun/MinigunManager.ts +++ b/src/engine/core/schemes/ph_minigun/MinigunManager.ts @@ -4,11 +4,15 @@ import { getObjectByStoryId, registry } from "@/engine/core/database"; import { AbstractSchemeManager } from "@/engine/core/schemes/base"; import { ISchemeMinigunState } from "@/engine/core/schemes/ph_minigun/ISchemeMinigunState"; import { abort } from "@/engine/core/utils/assertion"; -import { isHeavilyWounded } from "@/engine/core/utils/check/check"; import { isActiveSection } from "@/engine/core/utils/check/is"; import { pickSectionFromCondList, TConditionList } from "@/engine/core/utils/ini"; -import { isMonsterScriptCaptured, scriptReleaseMonster } from "@/engine/core/utils/scheme"; -import { switchObjectSchemeToSection, trySwitchToAnotherSection } from "@/engine/core/utils/scheme/switch"; +import { isHeavilyWounded } from "@/engine/core/utils/object"; +import { + isMonsterScriptCaptured, + scriptReleaseMonster, + switchObjectSchemeToSection, + trySwitchToAnotherSection, +} from "@/engine/core/utils/scheme"; import { createEmptyVector, createVector, yaw } from "@/engine/core/utils/vector"; import { ACTOR, NIL } from "@/engine/lib/constants/words"; import { Car, ClientObject, Optional, TName, TSection, TStringId, TTimestamp, Vector } from "@/engine/lib/types"; diff --git a/src/engine/core/utils/check/check.ts b/src/engine/core/utils/check/check.ts index 7867fb804..f2593eb95 100644 --- a/src/engine/core/utils/check/check.ts +++ b/src/engine/core/utils/check/check.ts @@ -105,199 +105,6 @@ export function isLevelChanging(): boolean { : game_graph().vertex(simulator.actor().m_game_vertex_id).level_id() !== simulator.level_id(); } -/** - * @returns whether object is wounded. - */ -export function isObjectWounded(object: ClientObject): boolean { - const state: IRegistryObjectState = registry.objects.get(object.id()); - - if (state === null) { - return false; - } else if (state[EScheme.WOUNDED] !== null) { - return tostring((state[EScheme.WOUNDED] as ISchemeWoundedState).woundManager.woundState) !== NIL; - } else { - return false; - } -} - -/** - * @returns whether object is meeting with someone. - */ -export function isObjectMeeting(object: ClientObject): boolean { - const actionPlanner: ActionPlanner = object.motivation_action_manager(); - - return ( - actionPlanner !== null && - actionPlanner.initialized() && - actionPlanner.current_action_id() === EActionId.MEET_WAITING_ACTIVITY - ); -} - -/** - * @returns whether object is heavily wounded. - */ -export function isHeavilyWounded(objectId: TNumberId): boolean { - const state: Optional = registry.objects.get(objectId); - - return ( - (state && - state[EScheme.WOUNDED] && - tostring((state[EScheme.WOUNDED] as ISchemeWoundedState).woundManager.woundState) !== NIL) === true - ); -} - -/** - * @returns whether object is facing any danger right now - */ -export function isObjectFacingDanger(object: ClientObject): boolean { - const bestDanger: Optional = object.best_danger(); - - if (bestDanger === null) { - return false; - } - - const bestDangerType: TDangerType = bestDanger.type(); - const bestDangerObject: Optional = - bestDangerType !== danger_object.grenade && bestDanger.dependent_object() !== null - ? bestDanger.dependent_object() - : bestDanger.object(); - - if (bestDangerObject === null) { - return false; - } - - if ( - bestDangerType !== danger_object.entity_corpse && - bestDangerType !== danger_object.grenade && - object.relation(bestDangerObject) !== EClientObjectRelation.ENEMY - ) { - return false; - } - - if (bestDangerType === danger_object.grenade) { - // Zombied ignore grenades. - if (getCharacterCommunity(object) === communities.zombied) { - return false; - } - } - - // todo: Implement? - if (bestDangerType === danger_object.entity_corpse) { - return false; - /** - * --const corpse_object = best_danger:object() - * --if time_global() - corpse_object:death_time() >= DANGER_INERTION_TIME then - * -- return false - * --end - */ - } - - if ( - !isObjectEnemy( - object, - bestDangerObject, - registry.objects.get(object.id())[EScheme.COMBAT_IGNORE] as ISchemeCombatIgnoreState - ) - ) { - return false; - } - - const dangerDistanceSqrt: TDistance = bestDanger.position().distance_to_sqr(object.position()); - const ignoreDistanceByType: Optional = logicsConfig.DANGER_IGNORE_DISTANCE_BY_TYPE[bestDangerType]; - - if (ignoreDistanceByType !== null) { - if (dangerDistanceSqrt >= ignoreDistanceByType * ignoreDistanceByType) { - return false; - } - } else if ( - dangerDistanceSqrt >= - logicsConfig.DANGER_IGNORE_DISTANCE_GENERAL * logicsConfig.DANGER_IGNORE_DISTANCE_GENERAL - ) { - return false; - } - - if (isHeavilyWounded(object.id())) { - return false; - } - - // todo: Update, originally incorrect. - /** - if (active_scheme === "camper" && bd_type !== danger_object.grenade) { - return false; - } - */ - - return true; -} - -/** - * todo; - * @returns whether object os enemy of provided client entity - */ -export function isObjectEnemy(object: ClientObject, enemy: ClientObject, state: ISchemeCombatIgnoreState): boolean { - if (!object.alive()) { - return false; - } - - if (object.critically_wounded()) { - return true; - } - - if (state.enabled === false) { - return true; - } - - const overrides: Optional = state.overrides; - const objectId: TNumberId = object.id(); - const objectState: IRegistryObjectState = registry.objects.get(objectId); - - if (objectState === null) { - return true; - } - - objectState.enemy_id = enemy.id(); - - if (enemy.id() !== ACTOR_ID) { - for (const [k, v] of registry.noCombatZones) { - const zone = registry.zones.get(k); - - if (zone && (isObjectInZone(object, zone) || isObjectInZone(enemy, zone))) { - const smart: Optional = SimulationBoardManager.getInstance().getSmartTerrainByName(v); - - if ( - smart && - smart.smartTerrainActorControl !== null && - smart.smartTerrainActorControl.status !== ESmartTerrainStatus.ALARM - ) { - return false; - } - } - } - } - - const serverObject: Optional = alife().object(enemy.id()); - - if ( - serverObject !== null && - serverObject.m_smart_terrain_id !== null && - serverObject.m_smart_terrain_id !== MAX_U16 - ) { - const enemySmartTerrain: SmartTerrain = alife().object( - serverObject.m_smart_terrain_id - ) as SmartTerrain; - - if (registry.noCombatSmartTerrains.get(enemySmartTerrain.name())) { - return false; - } - } - - if (overrides && overrides.combat_ignore) { - return pickSectionFromCondList(enemy, object, overrides.combat_ignore.condlist) !== TRUE; - } - - return true; -} - /** * @returns whether actor is alive. */ diff --git a/src/engine/core/utils/object/index.ts b/src/engine/core/utils/object/index.ts index 59f460929..08d39ac66 100644 --- a/src/engine/core/utils/object/index.ts +++ b/src/engine/core/utils/object/index.ts @@ -1,3 +1,4 @@ +export * from "@/engine/core/utils/object/object_danger"; export * from "@/engine/core/utils/object/object_general"; export * from "@/engine/core/utils/object/object_location"; export * from "@/engine/core/utils/object/object_state"; diff --git a/src/engine/core/utils/object/object_danger.ts b/src/engine/core/utils/object/object_danger.ts new file mode 100644 index 000000000..b3fef0324 --- /dev/null +++ b/src/engine/core/utils/object/object_danger.ts @@ -0,0 +1,180 @@ +import { alife, danger_object } from "xray16"; + +import { IRegistryObjectState, registry } from "@/engine/core/database"; +import { SimulationBoardManager } from "@/engine/core/managers/interaction/SimulationBoardManager"; +import { SmartTerrain } from "@/engine/core/objects"; +import { ESmartTerrainStatus } from "@/engine/core/objects/server/smart_terrain/types"; +import { ISchemeCombatIgnoreState } from "@/engine/core/schemes/combat_ignore"; +import { pickSectionFromCondList } from "@/engine/core/utils/ini"; +import { getCharacterCommunity } from "@/engine/core/utils/object/object_general"; +import { isObjectInZone } from "@/engine/core/utils/object/object_location"; +import { isHeavilyWounded } from "@/engine/core/utils/object/object_state"; +import { logicsConfig } from "@/engine/lib/configs/LogicsConfig"; +import { communities } from "@/engine/lib/constants/communities"; +import { ACTOR_ID } from "@/engine/lib/constants/ids"; +import { MAX_U16 } from "@/engine/lib/constants/memory"; +import { TRUE } from "@/engine/lib/constants/words"; +import { + AnyObject, + ClientObject, + DangerObject, + EClientObjectRelation, + EScheme, + Optional, + ServerCreatureObject, + TDangerType, + TDistance, + TNumberId, +} from "@/engine/lib/types"; + +/** + * @returns whether object is facing any danger right now + */ +export function isObjectFacingDanger(object: ClientObject): boolean { + const bestDanger: Optional = object.best_danger(); + + if (bestDanger === null) { + return false; + } + + const bestDangerType: TDangerType = bestDanger.type(); + const bestDangerObject: Optional = + bestDangerType !== danger_object.grenade && bestDanger.dependent_object() !== null + ? bestDanger.dependent_object() + : bestDanger.object(); + + if (bestDangerObject === null) { + return false; + } + + if ( + bestDangerType !== danger_object.entity_corpse && + bestDangerType !== danger_object.grenade && + object.relation(bestDangerObject) !== EClientObjectRelation.ENEMY + ) { + return false; + } + + if (bestDangerType === danger_object.grenade) { + // Zombied ignore grenades. + if (getCharacterCommunity(object) === communities.zombied) { + return false; + } + } + + // todo: Implement? + if (bestDangerType === danger_object.entity_corpse) { + return false; + /** + * --const corpse_object = best_danger:object() + * --if time_global() - corpse_object:death_time() >= DANGER_INERTION_TIME then + * -- return false + * --end + */ + } + + if ( + !isObjectEnemy( + object, + bestDangerObject, + registry.objects.get(object.id())[EScheme.COMBAT_IGNORE] as ISchemeCombatIgnoreState + ) + ) { + return false; + } + + const dangerDistanceSqrt: TDistance = bestDanger.position().distance_to_sqr(object.position()); + const ignoreDistanceByType: Optional = logicsConfig.DANGER_IGNORE_DISTANCE_BY_TYPE[bestDangerType]; + + if (ignoreDistanceByType !== null) { + if (dangerDistanceSqrt >= ignoreDistanceByType * ignoreDistanceByType) { + return false; + } + } else if ( + dangerDistanceSqrt >= + logicsConfig.DANGER_IGNORE_DISTANCE_GENERAL * logicsConfig.DANGER_IGNORE_DISTANCE_GENERAL + ) { + return false; + } + + if (isHeavilyWounded(object.id())) { + return false; + } + + // todo: Update, originally incorrect. + /** + if (active_scheme === "camper" && bd_type !== danger_object.grenade) { + return false; + } + */ + + return true; +} + +/** + * todo; + * @returns whether object os enemy of provided client entity + */ +export function isObjectEnemy(object: ClientObject, enemy: ClientObject, state: ISchemeCombatIgnoreState): boolean { + if (!object.alive()) { + return false; + } + + if (object.critically_wounded()) { + return true; + } + + if (state.enabled === false) { + return true; + } + + const overrides: Optional = state.overrides; + const objectId: TNumberId = object.id(); + const objectState: IRegistryObjectState = registry.objects.get(objectId); + + if (objectState === null) { + return true; + } + + objectState.enemy_id = enemy.id(); + + if (enemy.id() !== ACTOR_ID) { + for (const [k, v] of registry.noCombatZones) { + const zone = registry.zones.get(k); + + if (zone && (isObjectInZone(object, zone) || isObjectInZone(enemy, zone))) { + const smart: Optional = SimulationBoardManager.getInstance().getSmartTerrainByName(v); + + if ( + smart && + smart.smartTerrainActorControl !== null && + smart.smartTerrainActorControl.status !== ESmartTerrainStatus.ALARM + ) { + return false; + } + } + } + } + + const serverObject: Optional = alife().object(enemy.id()); + + if ( + serverObject !== null && + serverObject.m_smart_terrain_id !== null && + serverObject.m_smart_terrain_id !== MAX_U16 + ) { + const enemySmartTerrain: SmartTerrain = alife().object( + serverObject.m_smart_terrain_id + ) as SmartTerrain; + + if (registry.noCombatSmartTerrains.get(enemySmartTerrain.name())) { + return false; + } + } + + if (overrides && overrides.combat_ignore) { + return pickSectionFromCondList(enemy, object, overrides.combat_ignore.condlist) !== TRUE; + } + + return true; +} diff --git a/src/engine/core/utils/object/object_state.ts b/src/engine/core/utils/object/object_state.ts index 141c8e77e..ff13f9c43 100644 --- a/src/engine/core/utils/object/object_state.ts +++ b/src/engine/core/utils/object/object_state.ts @@ -1,6 +1,9 @@ -import { registry } from "@/engine/core/database"; +import { IRegistryObjectState, registry } from "@/engine/core/database"; import { EStalkerState } from "@/engine/core/objects/state"; -import { ClientObject } from "@/engine/lib/types"; +import { EActionId } from "@/engine/core/schemes"; +import { ISchemeWoundedState } from "@/engine/core/schemes/wounded"; +import { NIL } from "@/engine/lib/constants/words"; +import { ActionPlanner, ClientObject, EScheme, Optional, TNumberId } from "@/engine/lib/types"; /** * todo; @@ -8,3 +11,44 @@ import { ClientObject } from "@/engine/lib/types"; export function isObjectAsleep(object: ClientObject): boolean { return registry.objects.get(object.id()).stateManager!.animstate.states.currentState === EStalkerState.SLEEP; } + +/** + * @returns whether object is wounded. + */ +export function isObjectWounded(object: ClientObject): boolean { + const state: IRegistryObjectState = registry.objects.get(object.id()); + + if (state === null) { + return false; + } else if (state[EScheme.WOUNDED] !== null) { + return tostring((state[EScheme.WOUNDED] as ISchemeWoundedState).woundManager.woundState) !== NIL; + } else { + return false; + } +} + +/** + * @returns whether object is heavily wounded. + */ +export function isHeavilyWounded(objectId: TNumberId): boolean { + const state: Optional = registry.objects.get(objectId); + + return ( + (state && + state[EScheme.WOUNDED] && + tostring((state[EScheme.WOUNDED] as ISchemeWoundedState).woundManager.woundState) !== NIL) === true + ); +} + +/** + * @returns whether object is meeting with someone. + */ +export function isObjectMeeting(object: ClientObject): boolean { + const actionPlanner: ActionPlanner = object.motivation_action_manager(); + + return ( + actionPlanner !== null && + actionPlanner.initialized() && + actionPlanner.current_action_id() === EActionId.MEET_WAITING_ACTIVITY + ); +} diff --git a/src/engine/scripts/declarations/conditions/object.ts b/src/engine/scripts/declarations/conditions/object.ts index a9d43a760..de7411262 100644 --- a/src/engine/scripts/declarations/conditions/object.ts +++ b/src/engine/scripts/declarations/conditions/object.ts @@ -18,16 +18,11 @@ import { ISchemeHitState } from "@/engine/core/schemes/hit"; import { SchemeDeimos } from "@/engine/core/schemes/sr_deimos"; import { abort } from "@/engine/core/utils/assertion"; import { extern } from "@/engine/core/utils/binding"; -import { - isHeavilyWounded, - isObjectWounded, - isPlayingSound, - isStoryObjectExisting, -} from "@/engine/core/utils/check/check"; +import { isPlayingSound, isStoryObjectExisting } from "@/engine/core/utils/check/check"; import { isMonster, isStalker } from "@/engine/core/utils/check/is"; import { hasAlifeInfo } from "@/engine/core/utils/info_portion"; import { LuaLogger } from "@/engine/core/utils/logging"; -import { getObjectSmartTerrain, getObjectSquad } from "@/engine/core/utils/object/object_general"; +import { getObjectSmartTerrain, getObjectSquad, isHeavilyWounded, isObjectWounded } from "@/engine/core/utils/object"; import { isDistanceBetweenObjectsGreaterOrEqual, isDistanceBetweenObjectsLessOrEqual, @@ -192,21 +187,19 @@ extern( /** * todo; */ -extern("xr_conditions.see_npc", (actor: ClientObject, npc: ClientObject, params: AnyArgs): boolean => { - const targetNpc: Optional = getObjectByStoryId(params[0]); +extern("xr_conditions.see_npc", (actor: ClientObject, object: ClientObject, [storyId]: [TStringId]): boolean => { + const targetObject: Optional = getObjectByStoryId(storyId); - if (npc && targetNpc) { - return npc.see(targetNpc); - } else { - return false; - } + return object && targetObject ? object.see(targetObject) : false; }); /** - * todo; + * Check whether object is wounded. + * + * @returns whether object is currently wounded and using wounded scheme */ -extern("xr_conditions.is_wounded", (actor: ClientObject, npc: ClientObject): boolean => { - return isObjectWounded(npc); +extern("xr_conditions.is_wounded", (actor: ClientObject, object: ClientObject): boolean => { + return isObjectWounded(object); }); /** @@ -597,8 +590,8 @@ extern("xr_conditions.see_enemy", (actor: ClientObject, npc: ClientObject): bool /** * todo; */ -extern("xr_conditions.heavy_wounded", (actor: ClientObject, npc: ClientObject): boolean => { - return isHeavilyWounded(npc.id()); +extern("xr_conditions.heavy_wounded", (actor: ClientObject, object: ClientObject): boolean => { + return isHeavilyWounded(object.id()); }); /** diff --git a/src/engine/scripts/declarations/dialogs/dialogs.ts b/src/engine/scripts/declarations/dialogs/dialogs.ts index c6579a851..c59678abc 100644 --- a/src/engine/scripts/declarations/dialogs/dialogs.ts +++ b/src/engine/scripts/declarations/dialogs/dialogs.ts @@ -12,11 +12,11 @@ import { ISchemeWoundedState } from "@/engine/core/schemes/wounded"; import { SchemeWounded } from "@/engine/core/schemes/wounded/SchemeWounded"; import { extern } from "@/engine/core/utils/binding"; import { isActorAbsolutelyHealthy } from "@/engine/core/utils/check"; -import { isObjectWounded, isStalkerAlive } from "@/engine/core/utils/check/check"; +import { isStalkerAlive } from "@/engine/core/utils/check/check"; import { createAutoSave } from "@/engine/core/utils/game_save"; import { giveInfo, hasAlifeInfo } from "@/engine/core/utils/info_portion"; import { LuaLogger } from "@/engine/core/utils/logging"; -import { getCharacterCommunity, isObjectInSmartTerrain } from "@/engine/core/utils/object"; +import { getCharacterCommunity, isObjectInSmartTerrain, isObjectWounded } from "@/engine/core/utils/object"; import { actorHasMedKit, getActorAvailableMedKit, From b17baa6ea2524d5c3e7fbfcfd2c50815f77b8f4c Mon Sep 17 00:00:00 2001 From: Neloreck Date: Mon, 3 Jul 2023 21:36:53 +0300 Subject: [PATCH 09/12] Extended mocks. Added more tests. --- .../interaction/dialog/DialogManager.ts | 4 +- .../notifications/NotificationManager.ts | 4 +- .../evaluators/EvaluatorCorpseDetect.ts | 2 +- .../evaluators/EvaluatorWoundedExist.ts | 4 +- src/engine/core/schemes/meet/MeetManager.ts | 2 +- src/engine/core/schemes/meet/SchemeMeet.ts | 2 +- .../meet/evaluators/EvaluatorContact.ts | 2 +- .../core/schemes/ph_minigun/MinigunManager.ts | 4 +- src/engine/core/utils/check/is.test.ts | 21 ++++- src/engine/core/utils/check/is.ts | 20 ++-- src/engine/core/utils/object/object_danger.ts | 6 +- .../core/utils/object/object_general.ts | 23 +++-- .../core/utils/object/object_state.test.ts | 92 +++++++++++++++++++ src/engine/core/utils/object/object_state.ts | 32 ++----- src/engine/core/utils/spawn.ts | 4 +- src/engine/core/utils/vector.test.ts | 16 ++++ src/engine/core/utils/vector.ts | 6 ++ .../scripts/declarations/conditions/object.ts | 6 +- .../scripts/declarations/dialogs/dialogs.ts | 10 +- src/fixtures/xray/mockXRay16.ts | 4 +- .../xray/mocks/actions/action_planner.mock.ts | 5 + .../mocks/objects/client/game_object.mock.ts | 6 ++ 22 files changed, 203 insertions(+), 72 deletions(-) create mode 100644 src/engine/core/utils/object/object_state.test.ts diff --git a/src/engine/core/managers/interaction/dialog/DialogManager.ts b/src/engine/core/managers/interaction/dialog/DialogManager.ts index 83c6093ac..974df7b50 100644 --- a/src/engine/core/managers/interaction/dialog/DialogManager.ts +++ b/src/engine/core/managers/interaction/dialog/DialogManager.ts @@ -348,10 +348,10 @@ export class DialogManager extends AbstractCoreManager { if (PTIDSubtable.wounded === TRUE) { // --if (!(ActionWoundManager.is_heavy_wounded_by_id(npc.id())) { - priority = isObjectWounded(object) ? priority + 1 : -1; + priority = isObjectWounded(object.id()) ? priority + 1 : -1; } else { // --if(ActionWoundManager.is_heavy_wounded_by_id(npc.id())) { - priority = isObjectWounded(object) ? -1 : priority + 1; + priority = isObjectWounded(object.id()) ? -1 : priority + 1; } if (fComm === false || fLevel === false) { diff --git a/src/engine/core/managers/interface/notifications/NotificationManager.ts b/src/engine/core/managers/interface/notifications/NotificationManager.ts index 00b5a94cb..13fa8c3fe 100644 --- a/src/engine/core/managers/interface/notifications/NotificationManager.ts +++ b/src/engine/core/managers/interface/notifications/NotificationManager.ts @@ -30,7 +30,7 @@ import { Stalker } from "@/engine/core/objects"; import { abort, assert } from "@/engine/core/utils/assertion"; import { isStalkerClassId } from "@/engine/core/utils/check/is"; import { LuaLogger } from "@/engine/core/utils/logging"; -import { isHeavilyWounded } from "@/engine/core/utils/object"; +import { isObjectWounded } from "@/engine/core/utils/object"; import { getInventoryNameForItemSection } from "@/engine/core/utils/spawn"; import { captions, TCaption } from "@/engine/lib/constants/captions/captions"; import { scriptSounds } from "@/engine/lib/constants/sound/script_sounds"; @@ -262,7 +262,7 @@ export class NotificationManager extends AbstractCoreManager { if (serverObject !== null) { // Check if sender is not wounded. - if (serverObject.online && isHeavilyWounded(serverObject.id)) { + if (serverObject.online && isObjectWounded(serverObject.id)) { return logger.info("Cannot send tip, npc is wounded"); } diff --git a/src/engine/core/schemes/corpse_detection/evaluators/EvaluatorCorpseDetect.ts b/src/engine/core/schemes/corpse_detection/evaluators/EvaluatorCorpseDetect.ts index d217e2422..1644af12d 100644 --- a/src/engine/core/schemes/corpse_detection/evaluators/EvaluatorCorpseDetect.ts +++ b/src/engine/core/schemes/corpse_detection/evaluators/EvaluatorCorpseDetect.ts @@ -32,7 +32,7 @@ export class EvaluatorCorpseDetect extends property_evaluator { return false; } else if (this.state.corpse_detection_enabled === false) { return false; - } else if (isObjectWounded(this.object)) { + } else if (isObjectWounded(this.object.id())) { return false; } else if (this.object.section() === "actor_visual_stalker") { return false; diff --git a/src/engine/core/schemes/help_wounded/evaluators/EvaluatorWoundedExist.ts b/src/engine/core/schemes/help_wounded/evaluators/EvaluatorWoundedExist.ts index f464d315c..8dd211246 100644 --- a/src/engine/core/schemes/help_wounded/evaluators/EvaluatorWoundedExist.ts +++ b/src/engine/core/schemes/help_wounded/evaluators/EvaluatorWoundedExist.ts @@ -43,7 +43,7 @@ export class EvaluatorWoundedExist extends property_evaluator { return false; } - if (isObjectWounded(object)) { + if (isObjectWounded(object.id())) { return false; } else if (object.section() === "actor_visual_stalker") { return false; @@ -61,7 +61,7 @@ export class EvaluatorWoundedExist extends property_evaluator { if ( object.see(visibleObject) && - isObjectWounded(visibleObject) && + isObjectWounded(visibleObject.id()) && (visibleObjectState.wounded_already_selected === null || visibleObjectState.wounded_already_selected === objectId) && visibleObject.alive() diff --git a/src/engine/core/schemes/meet/MeetManager.ts b/src/engine/core/schemes/meet/MeetManager.ts index b1b816839..d1fbaeb57 100644 --- a/src/engine/core/schemes/meet/MeetManager.ts +++ b/src/engine/core/schemes/meet/MeetManager.ts @@ -252,7 +252,7 @@ export class MeetManager extends AbstractSchemeManager { } // Handle possibility of trading - if (isObjectWounded(this.object)) { + if (isObjectWounded(this.object.id())) { this.isTradingEnabled = false; } else { const isTradingEnabled: boolean = pickSectionFromCondList(actor, this.object, this.state.trade_enable) === TRUE; diff --git a/src/engine/core/schemes/meet/SchemeMeet.ts b/src/engine/core/schemes/meet/SchemeMeet.ts index 544b168d8..965b2b565 100644 --- a/src/engine/core/schemes/meet/SchemeMeet.ts +++ b/src/engine/core/schemes/meet/SchemeMeet.ts @@ -262,7 +262,7 @@ export class SchemeMeet extends AbstractScheme { * todo: Description. */ public static updateObjectInteractionAvailability(object: ClientObject): void { - if (isObjectWounded(object)) { + if (isObjectWounded(object.id())) { if (object.relation(registry.actor) === EClientObjectRelation.ENEMY) { object.disable_talk(); } else { diff --git a/src/engine/core/schemes/meet/evaluators/EvaluatorContact.ts b/src/engine/core/schemes/meet/evaluators/EvaluatorContact.ts index a70c2c1b2..12b79cfc5 100644 --- a/src/engine/core/schemes/meet/evaluators/EvaluatorContact.ts +++ b/src/engine/core/schemes/meet/evaluators/EvaluatorContact.ts @@ -33,7 +33,7 @@ export class EvaluatorContact extends property_evaluator { } else { this.state.meetManager.update(); - if (isObjectWounded(this.object)) { + if (isObjectWounded(this.object.id())) { return false; } else if (this.object.best_enemy() !== null) { return false; diff --git a/src/engine/core/schemes/ph_minigun/MinigunManager.ts b/src/engine/core/schemes/ph_minigun/MinigunManager.ts index 268acad4b..ddc57b13d 100644 --- a/src/engine/core/schemes/ph_minigun/MinigunManager.ts +++ b/src/engine/core/schemes/ph_minigun/MinigunManager.ts @@ -6,7 +6,7 @@ import { ISchemeMinigunState } from "@/engine/core/schemes/ph_minigun/ISchemeMin import { abort } from "@/engine/core/utils/assertion"; import { isActiveSection } from "@/engine/core/utils/check/is"; import { pickSectionFromCondList, TConditionList } from "@/engine/core/utils/ini"; -import { isHeavilyWounded } from "@/engine/core/utils/object"; +import { isObjectWounded } from "@/engine/core/utils/object"; import { isMonsterScriptCaptured, scriptReleaseMonster, @@ -387,7 +387,7 @@ export class MinigunManager extends AbstractSchemeManager { if (this.targetObject!.id() !== registry.actor.id()) { if (this.targetObject!.target_body_state() === move.crouch) { this.targetFirePt.y = this.targetFirePt.y + 0.5; - } else if (!isHeavilyWounded(this.targetObject!.id())) { + } else if (!isObjectWounded(this.targetObject!.id())) { this.targetFirePt.y = this.targetFirePt.y + 1.2; } else { this.targetFirePt.y = this.targetFirePt.y + 0.1; diff --git a/src/engine/core/utils/check/is.test.ts b/src/engine/core/utils/check/is.test.ts index 135690ba7..5590dc817 100644 --- a/src/engine/core/utils/check/is.test.ts +++ b/src/engine/core/utils/check/is.test.ts @@ -1,14 +1,29 @@ import { describe, expect, it } from "@jest/globals"; import { alife, TXR_class_id } from "xray16"; -import { isGameStarted, isWeapon } from "@/engine/core/utils/check/is"; +import { isGameStarted, isObjectInjured, isWeapon } from "@/engine/core/utils/check/is"; import { classIds } from "@/engine/lib/constants/class_ids"; -import { mockClientGameObject } from "@/fixtures/xray"; +import { replaceFunctionMock } from "@/fixtures/utils"; +import { mockAlifeSimulator, mockClientGameObject } from "@/fixtures/xray"; describe("'is' utils", () => { it("'isGameStarted' should check alife", () => { + replaceFunctionMock(alife, () => null); + expect(isGameStarted()).toBe(false); + + replaceFunctionMock(alife, mockAlifeSimulator); expect(isGameStarted()).toBe(true); - expect(alife()).toBeDefined(); + }); + + it("'isObjectInjured' should correctly check objects", () => { + expect(isObjectInjured(mockClientGameObject())).toBe(false); + expect(isObjectInjured(mockClientGameObject({ radiation: -1, health: 100, bleeding: -1 }))).toBe(false); + expect(isObjectInjured(mockClientGameObject({ radiation: 0.01 }))).toBe(true); + expect(isObjectInjured(mockClientGameObject({ radiation: 0.5 }))).toBe(true); + expect(isObjectInjured(mockClientGameObject({ bleeding: 0.01 }))).toBe(true); + expect(isObjectInjured(mockClientGameObject({ bleeding: 0.5 }))).toBe(true); + expect(isObjectInjured(mockClientGameObject({ health: 0.999 }))).toBe(true); + expect(isObjectInjured(mockClientGameObject({ health: 0.5 }))).toBe(true); }); it("'isWeapon' utils should correctly check object class ids", () => { diff --git a/src/engine/core/utils/check/is.ts b/src/engine/core/utils/check/is.ts index 56bd07da7..31f5c09d4 100644 --- a/src/engine/core/utils/check/is.ts +++ b/src/engine/core/utils/check/is.ts @@ -23,24 +23,22 @@ import { } from "@/engine/lib/types"; /** - * todo; + * Check whether game started. + * + * @returns whether game is started and simulator is initialized */ export function isGameStarted(): boolean { return alife() !== null; } /** - * Check whether actor is absolutely healthy - without radiation/bleeding/damaged health. - */ -export function isActorAbsolutelyHealthy(actor: ClientObject = registry.actor): boolean { - return actor.health < 1 || actor.radiation > 0 || actor.bleeding > 0; -} - -/** - * todo; + * Check whether object is injured. + * + * @param object - target client object to check + * @returns whether object is injured/bleeding/contaminated */ -export function isCseAlifeObject(object: AnyGameObject): object is ServerObject { - return type(object.id) === "number"; +export function isObjectInjured(object: ClientObject): boolean { + return object.health < 1 || object.radiation > 0 || object.bleeding > 0; } /** diff --git a/src/engine/core/utils/object/object_danger.ts b/src/engine/core/utils/object/object_danger.ts index b3fef0324..f0b968b04 100644 --- a/src/engine/core/utils/object/object_danger.ts +++ b/src/engine/core/utils/object/object_danger.ts @@ -6,9 +6,7 @@ import { SmartTerrain } from "@/engine/core/objects"; import { ESmartTerrainStatus } from "@/engine/core/objects/server/smart_terrain/types"; import { ISchemeCombatIgnoreState } from "@/engine/core/schemes/combat_ignore"; import { pickSectionFromCondList } from "@/engine/core/utils/ini"; -import { getCharacterCommunity } from "@/engine/core/utils/object/object_general"; -import { isObjectInZone } from "@/engine/core/utils/object/object_location"; -import { isHeavilyWounded } from "@/engine/core/utils/object/object_state"; +import { getCharacterCommunity, isObjectInZone, isObjectWounded } from "@/engine/core/utils/object"; import { logicsConfig } from "@/engine/lib/configs/LogicsConfig"; import { communities } from "@/engine/lib/constants/communities"; import { ACTOR_ID } from "@/engine/lib/constants/ids"; @@ -97,7 +95,7 @@ export function isObjectFacingDanger(object: ClientObject): boolean { return false; } - if (isHeavilyWounded(object.id())) { + if (isObjectWounded(object.id())) { return false; } diff --git a/src/engine/core/utils/object/object_general.ts b/src/engine/core/utils/object/object_general.ts index 9ccddb8e4..4ad4e3e4f 100644 --- a/src/engine/core/utils/object/object_general.ts +++ b/src/engine/core/utils/object/object_general.ts @@ -1,18 +1,17 @@ -import { alife, entity_action, game, game_graph, level, stalker_ids } from "xray16"; +import { alife, entity_action, game, level, stalker_ids } from "xray16"; import { IRegistryObjectState, registry } from "@/engine/core/database"; import { AnomalyZoneBinder, SmartTerrain } from "@/engine/core/objects"; import { Squad } from "@/engine/core/objects/server/squad/Squad"; -import { EStalkerState } from "@/engine/core/objects/state"; import { assertDefined } from "@/engine/core/utils/assertion"; -import { isCseAlifeObject, isStalker } from "@/engine/core/utils/check/is"; +import { isStalker } from "@/engine/core/utils/check/is"; import { getSectionsFromConditionLists, pickSectionFromCondList } from "@/engine/core/utils/ini/config"; import { parseConditionsList } from "@/engine/core/utils/ini/parse"; import { readIniBoolean, readIniNumber, readIniString } from "@/engine/core/utils/ini/read"; import { TConditionList } from "@/engine/core/utils/ini/types"; import { LuaLogger } from "@/engine/core/utils/logging"; import { wait } from "@/engine/core/utils/time"; -import { createEmptyVector, graphDistance } from "@/engine/core/utils/vector"; +import { createEmptyVector } from "@/engine/core/utils/vector"; import { communities, TCommunity } from "@/engine/lib/constants/communities"; import { TInfoPortion } from "@/engine/lib/constants/info_portions"; import { MAX_U16 } from "@/engine/lib/constants/memory"; @@ -49,10 +48,20 @@ const logger: LuaLogger = new LuaLogger($filename); * @returns tuple of object position details: id, gvi, lvi, position. */ export function getObjectPositioning(object: AnyGameObject): LuaMultiReturn<[TNumberId, TNumberId, TNumberId, Vector]> { - if (isCseAlifeObject(object)) { - return $multi(object.id, object.m_game_vertex_id, object.m_level_vertex_id, object.position); + if (type(object.id) === "number") { + return $multi( + (object as ServerObject).id, + (object as ServerObject).m_game_vertex_id, + (object as ServerObject).m_level_vertex_id, + (object as ServerObject).position + ); } else { - return $multi(object.id(), object.game_vertex_id(), object.level_vertex_id(), object.position()); + return $multi( + (object as ClientObject).id(), + (object as ClientObject).game_vertex_id(), + (object as ClientObject).level_vertex_id(), + (object as ClientObject).position() + ); } } diff --git a/src/engine/core/utils/object/object_state.test.ts b/src/engine/core/utils/object/object_state.test.ts new file mode 100644 index 000000000..00c783c36 --- /dev/null +++ b/src/engine/core/utils/object/object_state.test.ts @@ -0,0 +1,92 @@ +import { describe, expect, it, jest } from "@jest/globals"; + +import { IRegistryObjectState, registerObject } from "@/engine/core/database"; +import { EStalkerState } from "@/engine/core/objects/state"; +import { StalkerAnimationManager } from "@/engine/core/objects/state/StalkerAnimationManager"; +import { StalkerStateManager } from "@/engine/core/objects/state/StalkerStateManager"; +import { animstates } from "@/engine/core/objects/state_lib/state_mgr_animstate_list"; +import { EActionId } from "@/engine/core/schemes"; +import { ISchemeWoundedState } from "@/engine/core/schemes/wounded"; +import { WoundManager } from "@/engine/core/schemes/wounded/WoundManager"; +import { isObjectAsleep, isObjectMeeting, isObjectWounded } from "@/engine/core/utils/object/object_state"; +import { ActionPlanner, ClientObject, EScheme } from "@/engine/lib/types"; +import { mockSchemeState } from "@/fixtures/engine"; +import { replaceFunctionMock } from "@/fixtures/utils"; +import { mockClientGameObject } from "@/fixtures/xray"; + +describe("object state utils", () => { + it("'isObjectAsleep' should check state correctly", () => { + const object: ClientObject = mockClientGameObject(); + + expect(isObjectAsleep(object.id())).toBe(false); + + const state: IRegistryObjectState = registerObject(object); + + expect(isObjectAsleep(object.id())).toBe(false); + + state.stateManager = new StalkerStateManager(object); + + state.stateManager.animstate = new StalkerAnimationManager( + object, + state.stateManager, + StalkerStateManager.name + "AnimationState", + animstates + ); + + expect(isObjectAsleep(object.id())).toBe(false); + + state.stateManager.animstate.states.currentState = EStalkerState.SLEEP; + expect(isObjectAsleep(object.id())).toBe(true); + + state.stateManager.animstate.states.currentState = EStalkerState.SALUT; + expect(isObjectAsleep(object.id())).toBe(false); + }); + + it("'isObjectWounded' should correctly check wounded state", () => { + const object: ClientObject = mockClientGameObject(); + + expect(isObjectWounded(object.id())).toBe(false); + + const state: IRegistryObjectState = registerObject(object); + + expect(isObjectWounded(object.id())).toBe(false); + + const schemeState: ISchemeWoundedState = mockSchemeState(object, EScheme.WOUNDED, {}); + const woundManager: WoundManager = new WoundManager(object, schemeState); + + schemeState.woundManager = woundManager; + state[EScheme.WOUNDED] = schemeState; + + expect(isObjectWounded(object.id())).toBe(false); + + woundManager.woundState = "test"; + expect(isObjectWounded(object.id())).toBe(true); + + woundManager.woundState = "another"; + expect(isObjectWounded(object.id())).toBe(true); + + woundManager.woundState = "nil"; + expect(isObjectWounded(object.id())).toBe(false); + }); + + it("'isObjectMeeting' should correctly check meeting state", () => { + const object: ClientObject = mockClientGameObject(); + + expect(isObjectMeeting(object)).toBe(false); + + const actionPlanner: ActionPlanner = object.motivation_action_manager(); + + expect(actionPlanner.initialized()).toBe(false); + expect(actionPlanner.current_action_id()).toBeNull(); + + jest.spyOn(actionPlanner, "initialized").mockImplementation(() => true); + jest.spyOn(actionPlanner, "current_action_id").mockImplementation(() => EActionId.ALIFE); + expect(isObjectMeeting(object)).toBe(false); + + jest.spyOn(actionPlanner, "current_action_id").mockImplementation(() => EActionId.MEET_WAITING_ACTIVITY); + expect(isObjectMeeting(object)).toBe(true); + + replaceFunctionMock(object.motivation_action_manager, () => null); + expect(isObjectMeeting(object)).toBe(false); + }); +}); diff --git a/src/engine/core/utils/object/object_state.ts b/src/engine/core/utils/object/object_state.ts index ff13f9c43..8729f3e09 100644 --- a/src/engine/core/utils/object/object_state.ts +++ b/src/engine/core/utils/object/object_state.ts @@ -6,41 +6,29 @@ import { NIL } from "@/engine/lib/constants/words"; import { ActionPlanner, ClientObject, EScheme, Optional, TNumberId } from "@/engine/lib/types"; /** - * todo; + * @param objectId - target object id to check state + * @returns whether object is currently asleep */ -export function isObjectAsleep(object: ClientObject): boolean { - return registry.objects.get(object.id()).stateManager!.animstate.states.currentState === EStalkerState.SLEEP; +export function isObjectAsleep(objectId: TNumberId): boolean { + return registry.objects.get(objectId)?.stateManager?.animstate.states.currentState === EStalkerState.SLEEP; } /** + * @param objectId - target object id to check * @returns whether object is wounded. */ -export function isObjectWounded(object: ClientObject): boolean { - const state: IRegistryObjectState = registry.objects.get(object.id()); +export function isObjectWounded(objectId: TNumberId): boolean { + const state: Optional = registry.objects.get(objectId); - if (state === null) { + if (!state || !state[EScheme.WOUNDED]) { return false; - } else if (state[EScheme.WOUNDED] !== null) { - return tostring((state[EScheme.WOUNDED] as ISchemeWoundedState).woundManager.woundState) !== NIL; } else { - return false; + return tostring((state[EScheme.WOUNDED] as ISchemeWoundedState).woundManager.woundState) !== NIL; } } /** - * @returns whether object is heavily wounded. - */ -export function isHeavilyWounded(objectId: TNumberId): boolean { - const state: Optional = registry.objects.get(objectId); - - return ( - (state && - state[EScheme.WOUNDED] && - tostring((state[EScheme.WOUNDED] as ISchemeWoundedState).woundManager.woundState) !== NIL) === true - ); -} - -/** + * @param object - target game object to check * @returns whether object is meeting with someone. */ export function isObjectMeeting(object: ClientObject): boolean { diff --git a/src/engine/core/utils/spawn.ts b/src/engine/core/utils/spawn.ts index 810623f01..789ecbd8a 100644 --- a/src/engine/core/utils/spawn.ts +++ b/src/engine/core/utils/spawn.ts @@ -1,11 +1,10 @@ import { alife, clsid, game, level, patrol, system_ini } from "xray16"; -import { IRegistryObjectState, registry, SYSTEM_INI } from "@/engine/core/database"; +import { registry, SYSTEM_INI } from "@/engine/core/database"; import { SimulationBoardManager } from "@/engine/core/managers/interaction/SimulationBoardManager"; import { SmartTerrain, Squad } from "@/engine/core/objects"; import { assertDefined } from "@/engine/core/utils/assertion"; import { isAmmoSection, isStalker } from "@/engine/core/utils/check/is"; -import { readIniString } from "@/engine/core/utils/ini/read"; import { LuaLogger } from "@/engine/core/utils/logging"; import { getObjectPositioning } from "@/engine/core/utils/object/object_general"; import { createEmptyVector } from "@/engine/core/utils/vector"; @@ -15,7 +14,6 @@ import { TAmmoItem } from "@/engine/lib/constants/items/ammo"; import { AlifeSimulator, AnyGameObject, - ClientObject, IniFile, LuaArray, Optional, diff --git a/src/engine/core/utils/vector.test.ts b/src/engine/core/utils/vector.test.ts index 9e1c9f778..08d0d9d38 100644 --- a/src/engine/core/utils/vector.test.ts +++ b/src/engine/core/utils/vector.test.ts @@ -8,7 +8,9 @@ import { copyVector, createEmptyVector, createVector, + degreeToRadian, distanceBetween2d, + radianToDegree, subVectors, vectorCross, vectorRotateY, @@ -151,4 +153,18 @@ describe("'vector' utils", () => { MockVector.create(-0.32434361820317065, 0.3, 0.39975144443876104) ); }); + + it("radianToDegree should correctly convert", () => { + expect(radianToDegree(1)).toBe(57.29577951308232); + expect(radianToDegree(1000)).toBe(57295.77951308232); + expect(radianToDegree(math.pi)).toBe(180); + expect(radianToDegree(math.pi * 5)).toBe(900); + }); + + it("degreeToRadian should correctly convert", () => { + expect(degreeToRadian(57.29577951308232)).toBe(1); + expect(degreeToRadian(57295.77951308232)).toBe(1000); + expect(degreeToRadian(180)).toBe(math.pi); + expect(degreeToRadian(900)).toBe(math.pi * 5); + }); }); diff --git a/src/engine/core/utils/vector.ts b/src/engine/core/utils/vector.ts index 072998eee..9262259c7 100644 --- a/src/engine/core/utils/vector.ts +++ b/src/engine/core/utils/vector.ts @@ -130,14 +130,20 @@ export function graphDistanceSqr(firstVertexId: TNumberId, secondVertexId: TNumb } /** + * Covert radians to degrees. * + * @param radian - value in radians + * @returns value in degrees */ export function radianToDegree(radian: number): number { return (radian * 180) / math.pi; } /** + * Covert degrees to radians. * + * @param degree - value in degrees + * @returns value in radians */ export function degreeToRadian(degree: number): number { return (degree * math.pi) / 180; diff --git a/src/engine/scripts/declarations/conditions/object.ts b/src/engine/scripts/declarations/conditions/object.ts index de7411262..12faaac30 100644 --- a/src/engine/scripts/declarations/conditions/object.ts +++ b/src/engine/scripts/declarations/conditions/object.ts @@ -22,7 +22,7 @@ import { isPlayingSound, isStoryObjectExisting } from "@/engine/core/utils/check import { isMonster, isStalker } from "@/engine/core/utils/check/is"; import { hasAlifeInfo } from "@/engine/core/utils/info_portion"; import { LuaLogger } from "@/engine/core/utils/logging"; -import { getObjectSmartTerrain, getObjectSquad, isHeavilyWounded, isObjectWounded } from "@/engine/core/utils/object"; +import { getObjectSmartTerrain, getObjectSquad, isObjectWounded } from "@/engine/core/utils/object"; import { isDistanceBetweenObjectsGreaterOrEqual, isDistanceBetweenObjectsLessOrEqual, @@ -199,7 +199,7 @@ extern("xr_conditions.see_npc", (actor: ClientObject, object: ClientObject, [sto * @returns whether object is currently wounded and using wounded scheme */ extern("xr_conditions.is_wounded", (actor: ClientObject, object: ClientObject): boolean => { - return isObjectWounded(object); + return isObjectWounded(object.id()); }); /** @@ -591,7 +591,7 @@ extern("xr_conditions.see_enemy", (actor: ClientObject, npc: ClientObject): bool * todo; */ extern("xr_conditions.heavy_wounded", (actor: ClientObject, object: ClientObject): boolean => { - return isHeavilyWounded(object.id()); + return isObjectWounded(object.id()); }); /** diff --git a/src/engine/scripts/declarations/dialogs/dialogs.ts b/src/engine/scripts/declarations/dialogs/dialogs.ts index c59678abc..0142fa828 100644 --- a/src/engine/scripts/declarations/dialogs/dialogs.ts +++ b/src/engine/scripts/declarations/dialogs/dialogs.ts @@ -11,7 +11,7 @@ import { SchemeMeet } from "@/engine/core/schemes/meet/SchemeMeet"; import { ISchemeWoundedState } from "@/engine/core/schemes/wounded"; import { SchemeWounded } from "@/engine/core/schemes/wounded/SchemeWounded"; import { extern } from "@/engine/core/utils/binding"; -import { isActorAbsolutelyHealthy } from "@/engine/core/utils/check"; +import { isObjectInjured } from "@/engine/core/utils/check"; import { isStalkerAlive } from "@/engine/core/utils/check/check"; import { createAutoSave } from "@/engine/core/utils/game_save"; import { giveInfo, hasAlifeInfo } from "@/engine/core/utils/info_portion"; @@ -58,14 +58,14 @@ extern("dialogs.update_npc_dialog", (firstSpeaker: ClientObject, secondSpeaker: * todo; */ extern("dialogs.is_wounded", (firstSpeaker: ClientObject, secondSpeaker: ClientObject): boolean => { - return isObjectWounded(getNpcSpeaker(firstSpeaker, secondSpeaker)); + return isObjectWounded(getNpcSpeaker(firstSpeaker, secondSpeaker).id()); }); /** * todo; */ extern("dialogs.is_not_wounded", (firstSpeaker: ClientObject, secondSpeaker: ClientObject): boolean => { - return !isObjectWounded(getNpcSpeaker(firstSpeaker, secondSpeaker)); + return !isObjectWounded(getNpcSpeaker(firstSpeaker, secondSpeaker).id()); }); /** @@ -752,14 +752,14 @@ extern("dialogs.medic_magic_potion", (firstSpeaker: ClientObject, secondSpeaker: * Check whether actor needs healing, radiation or bleeding help. */ extern("dialogs.actor_needs_bless", (firstSpeaker: ClientObject, secondSpeaker: ClientObject): boolean => { - return isActorAbsolutelyHealthy(); + return isObjectInjured(registry.actor); }); /** * Check whether actor is absolutely healthy, without bleeding and radiation contamination. */ extern("dialogs.actor_is_damn_healthy", (firstSpeaker: ClientObject, secondSpeaker: ClientObject): boolean => { - return !isActorAbsolutelyHealthy(); + return !isObjectInjured(registry.actor); }); /** diff --git a/src/fixtures/xray/mockXRay16.ts b/src/fixtures/xray/mockXRay16.ts index 8cb64e92b..0365595aa 100644 --- a/src/fixtures/xray/mockXRay16.ts +++ b/src/fixtures/xray/mockXRay16.ts @@ -75,7 +75,7 @@ import { MockPropertyEvaluator } from "@/fixtures/xray/mocks/PropertyEvaluator.m import { MockVector } from "@/fixtures/xray/mocks/vector.mock"; /** - * todo; + * Mock whole xray16 game libraries for testing environment and replace with testable mocks. */ export function mockXRay16({ CGameTask = MockCGameTask, @@ -89,7 +89,7 @@ export function mockXRay16({ IsImportantSave = jest.fn(() => mocksConfig.isAutoSavingEnabled), action_base = MockActionBase, action_planner = MockActionPlanner, - alife = () => mockAlifeSimulator(), + alife = jest.fn(() => mockAlifeSimulator()), anim = MockAnim, callback = mockCallbacks, clsid = mockClsid, diff --git a/src/fixtures/xray/mocks/actions/action_planner.mock.ts b/src/fixtures/xray/mocks/actions/action_planner.mock.ts index d41611631..6c9dc0b9b 100644 --- a/src/fixtures/xray/mocks/actions/action_planner.mock.ts +++ b/src/fixtures/xray/mocks/actions/action_planner.mock.ts @@ -20,6 +20,7 @@ export class MockActionPlanner extends MockLuabindClass { public evaluators: Record = {}; public actions: Record = {}; public goalWorldState: Optional = null; + public currentActionId: Optional = null; public isInitialized: boolean = false; @@ -49,6 +50,10 @@ export class MockActionPlanner extends MockLuabindClass { this.actions[id] = actionBase; } + public current_action_id(): Optional { + return this.currentActionId; + } + public set_goal_world_state(state: WorldState): void { this.goalWorldState = state; } diff --git a/src/fixtures/xray/mocks/objects/client/game_object.mock.ts b/src/fixtures/xray/mocks/objects/client/game_object.mock.ts index 680e28d1e..a9823df55 100644 --- a/src/fixtures/xray/mocks/objects/client/game_object.mock.ts +++ b/src/fixtures/xray/mocks/objects/client/game_object.mock.ts @@ -35,6 +35,7 @@ let ID_COUNTER: TNumberId = 1000; export function mockClientGameObject({ active_item = jest.fn(() => null), animation_count = jest.fn(() => 0), + bleeding = 0, character_icon = jest.fn(() => "test_character_icon") as () => T, clsid = jest.fn(() => -1 as TClassId), disable_info_portion, @@ -45,6 +46,7 @@ export function mockClientGameObject({ give_talk_message2 = jest.fn(), give_task = jest.fn((task: GameTask, time: number, shouldCheck: boolean, duration: number) => {}), has_info, + health = 1, id, idOverride = ID_COUNTER++, infoPortions = [], @@ -54,6 +56,7 @@ export function mockClientGameObject({ motivation_action_manager, name, object, + radiation = 0, section, sectionOverride = "section", special_danger_move = jest.fn(() => true), @@ -105,6 +108,7 @@ export function mockClientGameObject({ .filter(Boolean) .forEach((it) => inRestrictions.push(it)); }), + bleeding, can_select_weapon: rest.can_select_weapon || jest.fn(), change_team: rest.change_team || jest.fn(), character_icon, @@ -145,6 +149,7 @@ export function mockClientGameObject({ give_talk_message2, give_task, has_info: has_info || jest.fn((it: string) => internalInfos.includes(it)), + health, id: id || jest.fn(() => idOverride), ignore_monster_threshold: rest.ignore_monster_threshold || jest.fn(), infoPortions, @@ -184,6 +189,7 @@ export function mockClientGameObject({ } }), position: rest.position || jest.fn(() => objectPosition), + radiation, relation: rest.relation || jest.fn(() => { From 44f15180f235fff9645d58677a3f655589ae7ab7 Mon Sep 17 00:00:00 2001 From: Neloreck Date: Mon, 3 Jul 2023 22:46:00 +0300 Subject: [PATCH 10/12] Renaming utils folders / files. --- src/engine/core/database/logic.ts | 2 +- src/engine/core/database/monster.ts | 2 +- src/engine/core/database/registry.ts | 2 +- src/engine/core/database/simulation.ts | 2 +- src/engine/core/database/story_objects.ts | 2 +- .../core/managers/debug/DebugManager.ts | 2 +- .../interaction/SimulationBoardManager.ts | 4 +- .../core/managers/interaction/TradeManager.ts | 7 +- .../core/managers/interaction/dialog/types.ts | 2 +- .../interaction/tasks/TaskObject.test.ts | 2 +- .../managers/interaction/tasks/TaskObject.ts | 15 +- .../interface/ActorInventoryMenuManager.ts | 2 +- .../managers/interface/ItemUpgradesManager.ts | 9 +- .../managers/interface/MapDisplayManager.ts | 9 +- .../managers/sounds/GlobalSoundManager.ts | 14 +- src/engine/core/managers/world/DropManager.ts | 4 +- .../core/managers/world/ReleaseBodyManager.ts | 4 +- .../core/managers/world/SurgeManager.ts | 14 +- .../core/managers/world/TreasureManager.ts | 20 +- .../core/managers/world/WeatherManager.ts | 13 +- .../core/objects/binders/HelicopterBinder.ts | 4 +- .../objects/binders/creature/MonsterBinder.ts | 5 +- .../objects/binders/creature/StalkerBinder.ts | 13 +- .../objects/binders/physic/LabX8DoorBinder.ts | 21 +- .../binders/physic/PhysicObjectBinder.ts | 3 +- .../binders/physic/PhysicObjectItemBox.ts | 3 +- .../binders/physic/SignalLightBinder.ts | 2 +- .../binders/zones/AnomalyZoneBinder.ts | 15 +- .../objects/binders/zones/ArenaZoneBinder.ts | 3 +- .../core/objects/binders/zones/CampBinder.ts | 5 +- .../binders/zones/LevelChangerBinder.ts | 2 +- .../objects/binders/zones/RestrictorBinder.ts | 2 +- .../core/objects/server/creature/Actor.ts | 6 +- .../core/objects/server/creature/Monster.ts | 4 +- .../core/objects/server/creature/Stalker.ts | 4 +- .../server/smart_terrain/jobs_general.ts | 8 +- src/engine/core/objects/server/types.ts | 2 +- .../playable_sounds/AbstractPlayableSound.ts | 2 +- .../sounds/playable_sounds/ActorSound.ts | 4 +- .../sounds/playable_sounds/NpcSound.ts | 5 +- .../sounds/playable_sounds/ObjectSound.ts | 4 +- .../core/objects/sounds/stories/SoundStory.ts | 2 +- .../core/objects/state/StalkerMoveManager.ts | 6 +- .../objects/state/state/ActionStateToIdle.ts | 5 +- .../objects/state/weapon/ActionWeaponDrop.ts | 2 +- .../objects/state_lib/state_mgr_pri_a15.ts | 2 +- .../core/schemes/animpoint/SchemeAnimpoint.ts | 8 +- .../schemes/animpoint/animpoint_predicates.ts | 2 +- .../schemes/base/ObjectRestrictionsManager.ts | 4 +- src/engine/core/schemes/base/types.ts | 2 +- .../core/schemes/camper/SchemeCamper.ts | 4 +- .../core/schemes/combat/SchemeCombat.ts | 8 +- .../actions/ActionZombieGoToDanger.ts | 2 +- .../evaluators/EvaluatorCombatZombied.ts | 2 +- .../core/schemes/companion/SchemeCompanion.ts | 4 +- .../corpse_detection/SchemeCorpseDetection.ts | 2 +- .../core/schemes/cover/ISchemeCoverState.ts | 2 +- src/engine/core/schemes/cover/SchemeCover.ts | 6 +- .../core/schemes/cover/actions/ActionCover.ts | 2 +- .../cover/evaluators/EvaluatorNeedCover.ts | 2 +- src/engine/core/schemes/death/DeathManager.ts | 2 +- .../core/schemes/death/ISchemeDeathState.ts | 2 +- src/engine/core/schemes/death/SchemeDeath.ts | 4 +- .../schemes/gather_items/SchemeGatherItems.ts | 2 +- .../schemes/hear/IActionSchemeHearState.ts | 2 +- src/engine/core/schemes/hear/SchemeHear.ts | 6 +- .../core/schemes/heli_move/HeliCombat.ts | 8 +- .../heli_move/HelicopterMoveManager.ts | 4 +- .../schemes/heli_move/SchemeHelicopterMove.ts | 4 +- .../schemes/help_wounded/SchemeHelpWounded.ts | 2 +- src/engine/core/schemes/hit/HitManager.ts | 2 +- src/engine/core/schemes/hit/SchemeHit.ts | 2 +- .../core/schemes/meet/ISchemeMeetState.ts | 2 +- .../schemes/mob_combat/MobCombatManager.ts | 2 +- .../schemes/mob_combat/SchemeMobCombat.ts | 2 +- .../core/schemes/mob_death/MobDeathManager.ts | 2 +- .../core/schemes/mob_death/SchemeMobDeath.ts | 2 +- .../core/schemes/mob_home/MobHomeManager.ts | 4 +- .../schemes/mob_home/SchemeMobHome.test.ts | 2 +- .../core/schemes/mob_home/SchemeMobHome.ts | 4 +- .../core/schemes/mob_jump/MobJumpManager.ts | 2 +- .../core/schemes/mob_jump/SchemeMobJump.ts | 6 +- .../schemes/mob_remark/MobRemarkManager.ts | 8 +- .../schemes/mob_remark/SchemeMobRemark.ts | 4 +- .../mob_walker/ISchemeMobWalkerState.ts | 2 +- .../schemes/mob_walker/MobWalkerManager.ts | 7 +- .../schemes/mob_walker/SchemeMobWalker.ts | 4 +- .../core/schemes/patrol/ISchemePatrolState.ts | 2 +- .../core/schemes/patrol/SchemePatrol.ts | 7 +- .../schemes/patrol/actions/ActionCommander.ts | 2 +- .../schemes/patrol/actions/ActionPatrol.ts | 4 +- .../ph_button/ISchemePhysicalButtonState.ts | 2 +- .../ph_button/PhysicalButtonManager.ts | 4 +- .../schemes/ph_button/SchemePhysicalButton.ts | 4 +- .../core/schemes/ph_code/CodeManager.ts | 2 +- .../core/schemes/ph_code/ISchemeCodeState.ts | 2 +- src/engine/core/schemes/ph_code/SchemeCode.ts | 4 +- .../ph_door/ISchemePhysicalDoorState.ts | 2 +- .../schemes/ph_door/PhysicalDoorManager.ts | 4 +- .../schemes/ph_door/SchemePhysicalDoor.ts | 6 +- .../schemes/ph_force/PhysicalForceManager.ts | 2 +- .../schemes/ph_force/SchemePhysicalForce.ts | 4 +- .../core/schemes/ph_hit/PhysicalHitManager.ts | 2 +- .../core/schemes/ph_hit/SchemePhysicalHit.ts | 4 +- .../ph_idle/ISchemePhysicalIdleState.ts | 2 +- .../schemes/ph_idle/PhysicalIdleManager.ts | 6 +- .../schemes/ph_idle/SchemePhysicalIdle.ts | 6 +- .../core/schemes/ph_minigun/SchemeMinigun.ts | 9 +- .../ph_on_death/PhysicalDeathManager.ts | 2 +- .../ph_on_death/SchemePhysicalOnDeath.ts | 2 +- .../schemes/ph_on_hit/PhysicalOnHitManager.ts | 2 +- .../schemes/ph_on_hit/SchemePhysicalOnHit.ts | 2 +- .../schemes/ph_oscillate/SchemeOscillate.ts | 4 +- .../reach_task/ReachTaskPatrolManager.ts | 2 +- .../actions/ActionReachTaskLocation.ts | 2 +- .../EvaluatorReachedTaskLocation.ts | 2 +- .../core/schemes/remark/ISchemeRemarkState.ts | 2 +- .../core/schemes/remark/SchemeRemark.ts | 8 +- .../remark/actions/ActionRemarkActivity.ts | 2 +- .../schemes/sleeper/ISchemeSleeperState.ts | 2 +- .../core/schemes/sleeper/SchemeSleeper.ts | 6 +- .../sleeper/actions/ActionSleeperActivity.ts | 4 +- .../sleeper/evaluators/EvaluatorNeedSleep.ts | 2 +- .../schemes/smartcover/SchemeSmartCover.ts | 4 +- .../sr_crow_spawner/CrowSpawnerManager.ts | 2 +- .../sr_crow_spawner/SchemeCrowSpawner.ts | 6 +- .../schemes/sr_cutscene/CutsceneManager.ts | 2 +- .../schemes/sr_cutscene/SchemeCutscene.ts | 2 +- .../sr_cutscene/effectors/CamEffectorSet.ts | 6 +- .../core/schemes/sr_deimos/DeimosManager.ts | 2 +- .../core/schemes/sr_deimos/SchemeDeimos.ts | 4 +- .../core/schemes/sr_idle/IdleManager.ts | 2 +- src/engine/core/schemes/sr_idle/SchemeIdle.ts | 2 +- .../core/schemes/sr_light/LightManager.ts | 2 +- .../core/schemes/sr_light/SchemeLight.ts | 4 +- .../core/schemes/sr_monster/MonsterManager.ts | 4 +- .../core/schemes/sr_monster/SchemeMonster.ts | 6 +- .../schemes/sr_no_weapon/NoWeaponManager.ts | 2 +- .../schemes/sr_no_weapon/SchemeNoWeapon.ts | 2 +- .../schemes/sr_particle/ParticleManager.ts | 6 +- .../schemes/sr_particle/SchemeParticle.ts | 4 +- .../sr_postprocess/SchemePostProcess.ts | 4 +- .../SchemePostProcessManager.ts | 2 +- .../sr_psy_antenna/PsyAntennaSchemaManager.ts | 2 +- .../sr_psy_antenna/SchemePsyAntenna.ts | 4 +- .../core/schemes/sr_silence/SchemeSilence.ts | 2 +- .../sr_teleport/SchemeTeleport.test.ts | 2 +- .../schemes/sr_teleport/SchemeTeleport.ts | 4 +- .../schemes/sr_teleport/TeleportManager.ts | 2 +- .../core/schemes/sr_timer/SchemeTimer.test.ts | 2 +- .../core/schemes/sr_timer/SchemeTimer.ts | 4 +- .../core/schemes/sr_timer/TimerManager.ts | 4 +- .../core/schemes/walker/ISchemeWalkerState.ts | 2 +- .../core/schemes/walker/SchemeWalker.ts | 6 +- .../walker/actions/ActionWalkerActivity.ts | 2 +- .../walker/evaluators/EvaluatorNeedWalker.ts | 2 +- .../core/schemes/wounded/SchemeWounded.ts | 2 +- .../core/schemes/wounded/WoundManager.ts | 2 +- .../ui/debug/sections/DebugObjectSection.ts | 2 +- src/engine/core/ui/game/WeaponParams.ts | 2 +- src/engine/core/utils/check/check.ts | 35 +- src/engine/core/utils/ini/index.ts | 8 +- .../{config.test.ts => ini_config.test.ts} | 0 .../utils/ini/{config.ts => ini_config.ts} | 6 +- .../ini/{parse.test.ts => ini_parse.test.ts} | 6 +- .../core/utils/ini/{parse.ts => ini_parse.ts} | 2 +- .../ini/{read.test.ts => ini_read.test.ts} | 2 +- .../core/utils/ini/{read.ts => ini_read.ts} | 2 +- .../core/utils/ini/{types.ts => ini_types.ts} | 0 src/engine/core/utils/object/index.ts | 5 + src/engine/core/utils/object/object_action.ts | 32 ++ .../core/utils/object/object_anomaly.ts | 50 ++ src/engine/core/utils/object/object_check.ts | 60 +++ src/engine/core/utils/object/object_danger.ts | 4 +- .../core/utils/object/object_general.ts | 490 +----------------- src/engine/core/utils/object/object_get.ts | 113 ++++ .../core/utils/object/object_location.ts | 21 +- src/engine/core/utils/object/object_set.ts | 111 ++++ src/engine/core/utils/object/object_state.ts | 87 +++- src/engine/core/utils/relation/index.ts | 8 +- .../{check.test.ts => relation_check.test.ts} | 6 +- .../relation/{check.ts => relation_check.ts} | 4 +- .../{get.test.ts => relation_get.test.ts} | 4 +- .../relation/{get.ts => relation_get.ts} | 2 +- .../{set.test.ts => relation_set.test.ts} | 4 +- .../relation/{set.ts => relation_set.ts} | 2 +- .../relation/{types.ts => relation_types.ts} | 0 src/engine/core/utils/scheme/index.ts | 12 +- .../{event.test.ts => scheme_event.test.ts} | 2 +- .../scheme/{event.ts => scheme_event.ts} | 0 ....test.ts => scheme_initialization.test.ts} | 4 +- ...ialization.ts => scheme_initialization.ts} | 8 +- .../{logic.test.ts => scheme_logic.test.ts} | 4 +- .../scheme/{logic.ts => scheme_logic.ts} | 20 +- ...monster.test.ts => scheme_monster.test.ts} | 2 +- .../scheme/{monster.ts => scheme_monster.ts} | 12 +- .../{setup.test.ts => scheme_setup.test.ts} | 2 +- .../scheme/{setup.ts => scheme_setup.ts} | 4 +- .../{switch.test.ts => scheme_switch.test.ts} | 8 +- .../scheme/{switch.ts => scheme_switch.ts} | 8 +- src/engine/core/utils/sound.ts | 12 +- src/engine/core/utils/spawn.ts | 2 +- src/engine/core/utils/time.ts | 30 +- .../declarations/conditions/relation.ts | 2 +- .../scripts/declarations/conditions/world.ts | 10 +- .../declarations/dialogs/dialog_manager.ts | 2 +- .../scripts/declarations/effects/object.ts | 14 +- .../declarations/tasks/task_functors.ts | 6 +- .../scripts/register/schemes_registrator.ts | 2 +- src/fixtures/engine/mocks/scheme.mocks.ts | 2 +- 210 files changed, 958 insertions(+), 920 deletions(-) rename src/engine/core/utils/ini/{config.test.ts => ini_config.test.ts} (100%) rename src/engine/core/utils/ini/{config.ts => ini_config.ts} (98%) rename src/engine/core/utils/ini/{parse.test.ts => ini_parse.test.ts} (99%) rename src/engine/core/utils/ini/{parse.ts => ini_parse.ts} (99%) rename src/engine/core/utils/ini/{read.test.ts => ini_read.test.ts} (99%) rename src/engine/core/utils/ini/{read.ts => ini_read.ts} (99%) rename src/engine/core/utils/ini/{types.ts => ini_types.ts} (100%) create mode 100644 src/engine/core/utils/object/object_action.ts create mode 100644 src/engine/core/utils/object/object_anomaly.ts create mode 100644 src/engine/core/utils/object/object_check.ts create mode 100644 src/engine/core/utils/object/object_get.ts create mode 100644 src/engine/core/utils/object/object_set.ts rename src/engine/core/utils/relation/{check.test.ts => relation_check.test.ts} (97%) rename src/engine/core/utils/relation/{check.ts => relation_check.ts} (98%) rename src/engine/core/utils/relation/{get.test.ts => relation_get.test.ts} (98%) rename src/engine/core/utils/relation/{get.ts => relation_get.ts} (99%) rename src/engine/core/utils/relation/{set.test.ts => relation_set.test.ts} (98%) rename src/engine/core/utils/relation/{set.ts => relation_set.ts} (99%) rename src/engine/core/utils/relation/{types.ts => relation_types.ts} (100%) rename src/engine/core/utils/scheme/{event.test.ts => scheme_event.test.ts} (97%) rename src/engine/core/utils/scheme/{event.ts => scheme_event.ts} (100%) rename src/engine/core/utils/scheme/{initialization.test.ts => scheme_initialization.test.ts} (99%) rename src/engine/core/utils/scheme/{initialization.ts => scheme_initialization.ts} (97%) rename src/engine/core/utils/scheme/{logic.test.ts => scheme_logic.test.ts} (99%) rename src/engine/core/utils/scheme/{logic.ts => scheme_logic.ts} (95%) rename src/engine/core/utils/scheme/{monster.test.ts => scheme_monster.test.ts} (97%) rename src/engine/core/utils/scheme/{monster.ts => scheme_monster.ts} (85%) rename src/engine/core/utils/scheme/{setup.test.ts => scheme_setup.test.ts} (99%) rename src/engine/core/utils/scheme/{setup.ts => scheme_setup.ts} (98%) rename src/engine/core/utils/scheme/{switch.test.ts => scheme_switch.test.ts} (99%) rename src/engine/core/utils/scheme/{switch.ts => scheme_switch.ts} (98%) diff --git a/src/engine/core/database/logic.ts b/src/engine/core/database/logic.ts index 0154f1409..de872a59b 100644 --- a/src/engine/core/database/logic.ts +++ b/src/engine/core/database/logic.ts @@ -5,7 +5,7 @@ import { registry } from "@/engine/core/database/registry"; import { closeLoadMarker, closeSaveMarker, openLoadMarker, openSaveMarker } from "@/engine/core/database/save_markers"; import { IRegistryObjectState } from "@/engine/core/database/types"; import { ESchemeEvent, IBaseSchemeState } from "@/engine/core/schemes/base/types"; -import { emitSchemeEvent } from "@/engine/core/utils/scheme/event"; +import { emitSchemeEvent } from "@/engine/core/utils/scheme/scheme_event"; import { readTimeFromPacket, writeTimeToPacket } from "@/engine/core/utils/time"; import { NIL } from "@/engine/lib/constants/words"; import { diff --git a/src/engine/core/database/monster.ts b/src/engine/core/database/monster.ts index b90e7f3ac..134511ae1 100644 --- a/src/engine/core/database/monster.ts +++ b/src/engine/core/database/monster.ts @@ -1,7 +1,7 @@ import { clsid } from "xray16"; import { abort } from "@/engine/core/utils/assertion"; -import { readIniString } from "@/engine/core/utils/ini/read"; +import { readIniString } from "@/engine/core/utils/ini/ini_read"; import { LuaLogger } from "@/engine/core/utils/logging"; import { EMonsterState } from "@/engine/lib/constants/monsters"; import { ClientObject, IniFile, Optional, TSection } from "@/engine/lib/types"; diff --git a/src/engine/core/database/registry.ts b/src/engine/core/database/registry.ts index 76feb037f..e4f971dc9 100644 --- a/src/engine/core/database/registry.ts +++ b/src/engine/core/database/registry.ts @@ -20,7 +20,7 @@ import type { CampStoryManager } from "@/engine/core/schemes/camper"; import type { PatrolManager } from "@/engine/core/schemes/patrol"; import type { ReachTaskPatrolManager } from "@/engine/core/schemes/reach_task"; import type { LightManager } from "@/engine/core/schemes/sr_light"; -import type { TConditionList } from "@/engine/core/utils/ini/types"; +import type { TConditionList } from "@/engine/core/utils/ini/ini_types"; import type { ERelation } from "@/engine/core/utils/relation"; import { storyNames, TStoryName } from "@/engine/lib/constants/story_names"; import type { diff --git a/src/engine/core/database/simulation.ts b/src/engine/core/database/simulation.ts index 7122fe466..b1d241614 100644 --- a/src/engine/core/database/simulation.ts +++ b/src/engine/core/database/simulation.ts @@ -3,7 +3,7 @@ import { clsid } from "xray16"; import { SIMULATION_OBJECTS_PROPS_LTX } from "@/engine/core/database/ini_registry"; import { registry } from "@/engine/core/database/registry"; import { TSimulationObject } from "@/engine/core/objects/server/types"; -import { parseConditionsList } from "@/engine/core/utils/ini/parse"; +import { parseConditionsList } from "@/engine/core/utils/ini/ini_parse"; import { ACTOR, DEFAULT } from "@/engine/lib/constants/words"; import { TCount, TSection } from "@/engine/lib/types"; diff --git a/src/engine/core/database/story_objects.ts b/src/engine/core/database/story_objects.ts index c33ee37f2..c088ffa26 100644 --- a/src/engine/core/database/story_objects.ts +++ b/src/engine/core/database/story_objects.ts @@ -3,7 +3,7 @@ import { alife, level } from "xray16"; import { SYSTEM_INI } from "@/engine/core/database/ini_registry"; import { registry } from "@/engine/core/database/registry"; import { abort, assert } from "@/engine/core/utils/assertion"; -import { readIniString } from "@/engine/core/utils/ini/read"; +import { readIniString } from "@/engine/core/utils/ini/ini_read"; import { ClientObject, IniFile, Optional, ServerObject, TName, TNumberId, TStringId } from "@/engine/lib/types"; /** diff --git a/src/engine/core/managers/debug/DebugManager.ts b/src/engine/core/managers/debug/DebugManager.ts index 474a99772..56f3a4b60 100644 --- a/src/engine/core/managers/debug/DebugManager.ts +++ b/src/engine/core/managers/debug/DebugManager.ts @@ -6,7 +6,7 @@ import { EStateActionId } from "@/engine/core/objects/state"; import { StalkerStateManager } from "@/engine/core/objects/state/StalkerStateManager"; import { EActionId } from "@/engine/core/schemes"; import { LuaLogger } from "@/engine/core/utils/logging"; -import { getNumberRelationBetweenCommunities } from "@/engine/core/utils/relation/get"; +import { getNumberRelationBetweenCommunities } from "@/engine/core/utils/relation"; import { gameTimeToString } from "@/engine/core/utils/time"; import { toJSON } from "@/engine/core/utils/transform/json"; import { stalkerCommunities, TCommunity } from "@/engine/lib/constants/communities"; diff --git a/src/engine/core/managers/interaction/SimulationBoardManager.ts b/src/engine/core/managers/interaction/SimulationBoardManager.ts index c5cbd17e9..7b7e029f1 100644 --- a/src/engine/core/managers/interaction/SimulationBoardManager.ts +++ b/src/engine/core/managers/interaction/SimulationBoardManager.ts @@ -10,9 +10,9 @@ import { Squad } from "@/engine/core/objects/server/squad/Squad"; import { TSimulationObject } from "@/engine/core/objects/server/types"; import { evaluateSimulationPriority } from "@/engine/core/utils/alife"; import { abort } from "@/engine/core/utils/assertion"; -import { parseStringsList } from "@/engine/core/utils/ini/parse"; +import { parseStringsList } from "@/engine/core/utils/ini"; import { LuaLogger } from "@/engine/core/utils/logging"; -import { changeTeamSquadGroup } from "@/engine/core/utils/object/object_general"; +import { changeTeamSquadGroup } from "@/engine/core/utils/object/object_set"; import { setSquadRelationToActor } from "@/engine/core/utils/relation"; import { TCommunity } from "@/engine/lib/constants/communities"; import { levels, TLevel } from "@/engine/lib/constants/levels"; diff --git a/src/engine/core/managers/interaction/TradeManager.ts b/src/engine/core/managers/interaction/TradeManager.ts index 498663fb2..6015d2b73 100644 --- a/src/engine/core/managers/interaction/TradeManager.ts +++ b/src/engine/core/managers/interaction/TradeManager.ts @@ -1,12 +1,9 @@ import { ini_file, time_global } from "xray16"; -import { closeLoadMarker, closeSaveMarker, openSaveMarker, registry } from "@/engine/core/database"; -import { openLoadMarker } from "@/engine/core/database/save_markers"; +import { closeLoadMarker, closeSaveMarker, openLoadMarker, openSaveMarker, registry } from "@/engine/core/database"; import { AbstractCoreManager } from "@/engine/core/managers/base/AbstractCoreManager"; import { abort, assert } from "@/engine/core/utils/assertion"; -import { pickSectionFromCondList } from "@/engine/core/utils/ini/config"; -import { parseConditionsList } from "@/engine/core/utils/ini/parse"; -import { readIniNumber, readIniString } from "@/engine/core/utils/ini/read"; +import { parseConditionsList, pickSectionFromCondList, readIniNumber, readIniString } from "@/engine/core/utils/ini"; import { LuaLogger } from "@/engine/core/utils/logging"; import { ClientObject, diff --git a/src/engine/core/managers/interaction/dialog/types.ts b/src/engine/core/managers/interaction/dialog/types.ts index bb224bb0a..62e2263d9 100644 --- a/src/engine/core/managers/interaction/dialog/types.ts +++ b/src/engine/core/managers/interaction/dialog/types.ts @@ -1,4 +1,4 @@ -import { IConfigCondition } from "@/engine/core/utils/ini/types"; +import type { IConfigCondition } from "@/engine/core/utils/ini"; import { LuaArray, Optional, TName, TStringId } from "@/engine/lib/types"; /** diff --git a/src/engine/core/managers/interaction/tasks/TaskObject.test.ts b/src/engine/core/managers/interaction/tasks/TaskObject.test.ts index d997de464..0b215263c 100644 --- a/src/engine/core/managers/interaction/tasks/TaskObject.test.ts +++ b/src/engine/core/managers/interaction/tasks/TaskObject.test.ts @@ -5,7 +5,7 @@ import { disposeManager, registerActor, registry, TASK_MANAGER_LTX } from "@/eng import { TaskManager } from "@/engine/core/managers/interaction/tasks/TaskManager"; import { TaskObject } from "@/engine/core/managers/interaction/tasks/TaskObject"; import { ETaskStatus } from "@/engine/core/managers/interaction/tasks/types"; -import { parseConditionsList } from "@/engine/core/utils/ini/parse"; +import { parseConditionsList } from "@/engine/core/utils/ini/ini_parse"; import { NIL } from "@/engine/lib/constants/words"; import { MockLuaTable } from "@/fixtures/lua/mocks/LuaTable.mock"; import { mockClientGameObject } from "@/fixtures/xray"; diff --git a/src/engine/core/managers/interaction/tasks/TaskObject.ts b/src/engine/core/managers/interaction/tasks/TaskObject.ts index 01b900b26..2dd84d505 100644 --- a/src/engine/core/managers/interaction/tasks/TaskObject.ts +++ b/src/engine/core/managers/interaction/tasks/TaskObject.ts @@ -4,18 +4,23 @@ import { closeLoadMarker, closeSaveMarker, getObjectIdByStoryId, + openLoadMarker, openSaveMarker, registry, } from "@/engine/core/database"; -import { openLoadMarker } from "@/engine/core/database/save_markers"; import { ETaskState, ETaskStatus, POSSIBLE_STATES } from "@/engine/core/managers/interaction/tasks/types"; import { NotificationManager } from "@/engine/core/managers/interface/notifications"; import { assertDefined } from "@/engine/core/utils/assertion"; import { getExtern } from "@/engine/core/utils/binding"; -import { pickSectionFromCondList } from "@/engine/core/utils/ini/config"; -import { parseConditionsList, parseStringsList } from "@/engine/core/utils/ini/parse"; -import { readIniBoolean, readIniNumber, readIniString } from "@/engine/core/utils/ini/read"; -import { TConditionList } from "@/engine/core/utils/ini/types"; +import { + parseConditionsList, + parseStringsList, + pickSectionFromCondList, + readIniBoolean, + readIniNumber, + readIniString, + TConditionList, +} from "@/engine/core/utils/ini"; import { LuaLogger } from "@/engine/core/utils/logging"; import { giveMoneyToActor, transferItemsToActor } from "@/engine/core/utils/task_reward"; import { readTimeFromPacket, writeTimeToPacket } from "@/engine/core/utils/time"; diff --git a/src/engine/core/managers/interface/ActorInventoryMenuManager.ts b/src/engine/core/managers/interface/ActorInventoryMenuManager.ts index 023cba080..341eab53d 100644 --- a/src/engine/core/managers/interface/ActorInventoryMenuManager.ts +++ b/src/engine/core/managers/interface/ActorInventoryMenuManager.ts @@ -2,7 +2,7 @@ import { system_ini } from "xray16"; import { AbstractCoreManager } from "@/engine/core/managers/base/AbstractCoreManager"; import { executeConsoleCommand } from "@/engine/core/utils/console"; -import { readIniString } from "@/engine/core/utils/ini/read"; +import { readIniString } from "@/engine/core/utils/ini"; import { LuaLogger } from "@/engine/core/utils/logging"; import { consoleCommands } from "@/engine/lib/constants/console_commands"; import { ACTOR } from "@/engine/lib/constants/words"; diff --git a/src/engine/core/managers/interface/ItemUpgradesManager.ts b/src/engine/core/managers/interface/ItemUpgradesManager.ts index 9797167d8..ee54c2b66 100644 --- a/src/engine/core/managers/interface/ItemUpgradesManager.ts +++ b/src/engine/core/managers/interface/ItemUpgradesManager.ts @@ -2,9 +2,12 @@ import { game } from "xray16"; import { ITEM_UPGRADES, registry, STALKER_UPGRADE_INFO, SYSTEM_INI } from "@/engine/core/database"; import { AbstractCoreManager } from "@/engine/core/managers/base/AbstractCoreManager"; -import { pickSectionFromCondList } from "@/engine/core/utils/ini/config"; -import { parseConditionsList, parseStringsList } from "@/engine/core/utils/ini/parse"; -import { TConditionList } from "@/engine/core/utils/ini/types"; +import { + parseConditionsList, + parseStringsList, + pickSectionFromCondList, + TConditionList, +} from "@/engine/core/utils/ini"; import { LuaLogger } from "@/engine/core/utils/logging"; import { gameSettingConfig } from "@/engine/lib/configs/GameSettingConfig"; import { captions, TCaption } from "@/engine/lib/constants/captions/captions"; diff --git a/src/engine/core/managers/interface/MapDisplayManager.ts b/src/engine/core/managers/interface/MapDisplayManager.ts index 274d34399..b54e00d8f 100644 --- a/src/engine/core/managers/interface/MapDisplayManager.ts +++ b/src/engine/core/managers/interface/MapDisplayManager.ts @@ -10,12 +10,9 @@ import { sleepZones, } from "@/engine/core/managers/interface/MapDisplayManagerObjects"; import { hasAlifeInfo } from "@/engine/core/utils/info_portion"; -import { pickSectionFromCondList } from "@/engine/core/utils/ini/config"; -import { parseConditionsList } from "@/engine/core/utils/ini/parse"; -import { readIniString } from "@/engine/core/utils/ini/read"; -import { TConditionList } from "@/engine/core/utils/ini/types"; +import { parseConditionsList, pickSectionFromCondList, readIniString, TConditionList } from "@/engine/core/utils/ini"; import { LuaLogger } from "@/engine/core/utils/logging"; -import { anomalyHasArtefact } from "@/engine/core/utils/object/object_general"; +import { anomalyHasArtefact } from "@/engine/core/utils/object/object_anomaly"; import { captions } from "@/engine/lib/constants/captions/captions"; import { infoPortions } from "@/engine/lib/constants/info_portions/info_portions"; import { levels } from "@/engine/lib/constants/levels"; @@ -239,7 +236,7 @@ export class MapDisplayManager extends AbstractCoreManager { let hint: TLabel = game.translate_string(scanner.hint) + "\\n" + " \\n"; const actor: ClientObject = registry.actor; - const [hasArtefact, artefactTable] = anomalyHasArtefact(actor, null, [scanner.zone, null]); + const [hasArtefact, artefactTable] = anomalyHasArtefact(actor, null, scanner.zone, null); if (hasArtefact) { hint = hint + game.translate_string(captions.st_jup_b32_has_af); diff --git a/src/engine/core/managers/sounds/GlobalSoundManager.ts b/src/engine/core/managers/sounds/GlobalSoundManager.ts index e4e7be4b5..87c83ab1d 100644 --- a/src/engine/core/managers/sounds/GlobalSoundManager.ts +++ b/src/engine/core/managers/sounds/GlobalSoundManager.ts @@ -1,5 +1,11 @@ -import { closeLoadMarker, closeSaveMarker, openSaveMarker, registry, SCRIPT_SOUND_LTX } from "@/engine/core/database"; -import { openLoadMarker } from "@/engine/core/database/save_markers"; +import { + closeLoadMarker, + closeSaveMarker, + openLoadMarker, + openSaveMarker, + registry, + SCRIPT_SOUND_LTX, +} from "@/engine/core/database"; import { AbstractCoreManager } from "@/engine/core/managers/base/AbstractCoreManager"; import { EGameEvent, EventsManager } from "@/engine/core/managers/events"; import { AbstractPlayableSound } from "@/engine/core/objects/sounds/playable_sounds/AbstractPlayableSound"; @@ -9,9 +15,9 @@ import { NpcSound } from "@/engine/core/objects/sounds/playable_sounds/NpcSound" import { ObjectSound } from "@/engine/core/objects/sounds/playable_sounds/ObjectSound"; import { EPlayableSound } from "@/engine/core/objects/sounds/types"; import { abort, assert, assertDefined } from "@/engine/core/utils/assertion"; -import { readIniString } from "@/engine/core/utils/ini/read"; +import { readIniString } from "@/engine/core/utils/ini"; import { LuaLogger } from "@/engine/core/utils/logging"; -import { getCharacterCommunity } from "@/engine/core/utils/object/object_general"; +import { getCharacterCommunity } from "@/engine/core/utils/object/object_get"; import { getTableSize, resetTable } from "@/engine/core/utils/table"; import { ClientObject, diff --git a/src/engine/core/managers/world/DropManager.ts b/src/engine/core/managers/world/DropManager.ts index e98430848..42b2dfd2a 100644 --- a/src/engine/core/managers/world/DropManager.ts +++ b/src/engine/core/managers/world/DropManager.ts @@ -6,9 +6,9 @@ import { Stalker } from "@/engine/core/objects/server/creature/Stalker"; import { abort } from "@/engine/core/utils/assertion"; import { isExcludedFromLootDropItem } from "@/engine/core/utils/check/check"; import { isAmmoItem, isArtefact, isGrenade, isLootableItem, isWeapon } from "@/engine/core/utils/check/is"; -import { parseNumbersList, parseStringsList } from "@/engine/core/utils/ini/parse"; +import { parseNumbersList, parseStringsList } from "@/engine/core/utils/ini"; import { LuaLogger } from "@/engine/core/utils/logging"; -import { getCharacterCommunity, setItemCondition } from "@/engine/core/utils/object/object_general"; +import { getCharacterCommunity, setItemCondition } from "@/engine/core/utils/object"; import { spawnItemsForObject } from "@/engine/core/utils/spawn"; import { logicsConfig } from "@/engine/lib/configs/LogicsConfig"; import { communities, TCommunity } from "@/engine/lib/constants/communities"; diff --git a/src/engine/core/managers/world/ReleaseBodyManager.ts b/src/engine/core/managers/world/ReleaseBodyManager.ts index 834e09298..763f5ae12 100644 --- a/src/engine/core/managers/world/ReleaseBodyManager.ts +++ b/src/engine/core/managers/world/ReleaseBodyManager.ts @@ -7,14 +7,14 @@ import { DUMMY_LTX, getStoryIdByObjectId, IRegistryObjectState, + openLoadMarker, openSaveMarker, registry, } from "@/engine/core/database"; -import { openLoadMarker } from "@/engine/core/database/save_markers"; import { AbstractCoreManager } from "@/engine/core/managers/base/AbstractCoreManager"; import { abort } from "@/engine/core/utils/assertion"; import { isMonster, isStalker } from "@/engine/core/utils/check/is"; -import { readIniString } from "@/engine/core/utils/ini/read"; +import { readIniString } from "@/engine/core/utils/ini"; import { LuaLogger } from "@/engine/core/utils/logging"; import { roots } from "@/engine/lib/constants/roots"; import { diff --git a/src/engine/core/managers/world/SurgeManager.ts b/src/engine/core/managers/world/SurgeManager.ts index 63d7f5adf..8dc695bb5 100644 --- a/src/engine/core/managers/world/SurgeManager.ts +++ b/src/engine/core/managers/world/SurgeManager.ts @@ -1,7 +1,13 @@ import { alife, game, hit, level } from "xray16"; -import { closeLoadMarker, closeSaveMarker, openSaveMarker, registry, SURGE_MANAGER_LTX } from "@/engine/core/database"; -import { openLoadMarker } from "@/engine/core/database/save_markers"; +import { + closeLoadMarker, + closeSaveMarker, + openLoadMarker, + openSaveMarker, + registry, + SURGE_MANAGER_LTX, +} from "@/engine/core/database"; import { AbstractCoreManager } from "@/engine/core/managers/base/AbstractCoreManager"; import { EGameEvent, EventsManager } from "@/engine/core/managers/events"; import { SimulationBoardManager } from "@/engine/core/managers/interaction/SimulationBoardManager"; @@ -18,9 +24,7 @@ import { isArtefact, isStoryObject } from "@/engine/core/utils/check/is"; import { executeConsoleCommand, getConsoleFloatCommand } from "@/engine/core/utils/console"; import { createAutoSave } from "@/engine/core/utils/game_save"; import { disableInfo, giveInfo, hasAlifeInfo } from "@/engine/core/utils/info_portion"; -import { pickSectionFromCondList } from "@/engine/core/utils/ini/config"; -import { parseConditionsList } from "@/engine/core/utils/ini/parse"; -import { TConditionList } from "@/engine/core/utils/ini/types"; +import { parseConditionsList, pickSectionFromCondList, TConditionList } from "@/engine/core/utils/ini"; import { LuaLogger } from "@/engine/core/utils/logging"; import { isObjectOnLevel } from "@/engine/core/utils/object/object_location"; import { readTimeFromPacket, writeTimeToPacket } from "@/engine/core/utils/time"; diff --git a/src/engine/core/managers/world/TreasureManager.ts b/src/engine/core/managers/world/TreasureManager.ts index cc05608f7..723f1904c 100644 --- a/src/engine/core/managers/world/TreasureManager.ts +++ b/src/engine/core/managers/world/TreasureManager.ts @@ -1,15 +1,25 @@ import { alife, level, time_global } from "xray16"; -import { closeLoadMarker, closeSaveMarker, openSaveMarker, registry, SECRETS_LTX } from "@/engine/core/database"; -import { openLoadMarker } from "@/engine/core/database/save_markers"; +import { + closeLoadMarker, + closeSaveMarker, + openLoadMarker, + openSaveMarker, + registry, + SECRETS_LTX, +} from "@/engine/core/database"; import { AbstractCoreManager } from "@/engine/core/managers/base/AbstractCoreManager"; import { EGameEvent, EventsManager } from "@/engine/core/managers/events"; import { ETreasureState, NotificationManager } from "@/engine/core/managers/interface/notifications"; import { StatisticsManager } from "@/engine/core/managers/interface/StatisticsManager"; import { assert, assertDefined } from "@/engine/core/utils/assertion"; -import { pickSectionFromCondList } from "@/engine/core/utils/ini/config"; -import { parseConditionsList, parseSpawnDetails } from "@/engine/core/utils/ini/parse"; -import { ISpawnDescriptor, TConditionList } from "@/engine/core/utils/ini/types"; +import { + ISpawnDescriptor, + parseConditionsList, + parseSpawnDetails, + pickSectionFromCondList, + TConditionList, +} from "@/engine/core/utils/ini"; import { LuaLogger } from "@/engine/core/utils/logging"; import { getTableSize } from "@/engine/core/utils/table"; import { MAX_U16 } from "@/engine/lib/constants/memory"; diff --git a/src/engine/core/managers/world/WeatherManager.ts b/src/engine/core/managers/world/WeatherManager.ts index 82f01e326..28f9ace14 100644 --- a/src/engine/core/managers/world/WeatherManager.ts +++ b/src/engine/core/managers/world/WeatherManager.ts @@ -5,17 +5,20 @@ import { closeSaveMarker, DYNAMIC_WEATHER_GRAPHS, GAME_LTX, + openLoadMarker, openSaveMarker, registry, } from "@/engine/core/database"; -import { openLoadMarker } from "@/engine/core/database/save_markers"; import { AbstractCoreManager } from "@/engine/core/managers/base/AbstractCoreManager"; import { EGameEvent, EventsManager } from "@/engine/core/managers/events"; import { assert } from "@/engine/core/utils/assertion"; -import { pickSectionFromCondList } from "@/engine/core/utils/ini/config"; -import { parseAllSectionToTable, parseConditionsList } from "@/engine/core/utils/ini/parse"; -import { readIniString } from "@/engine/core/utils/ini/read"; -import { TConditionList } from "@/engine/core/utils/ini/types"; +import { + parseAllSectionToTable, + parseConditionsList, + pickSectionFromCondList, + readIniString, + TConditionList, +} from "@/engine/core/utils/ini"; import { LuaLogger } from "@/engine/core/utils/logging"; import { NIL } from "@/engine/lib/constants/words"; import { diff --git a/src/engine/core/objects/binders/HelicopterBinder.ts b/src/engine/core/objects/binders/HelicopterBinder.ts index bd9e21360..ef3cfc837 100644 --- a/src/engine/core/objects/binders/HelicopterBinder.ts +++ b/src/engine/core/objects/binders/HelicopterBinder.ts @@ -4,6 +4,7 @@ import { closeLoadMarker, closeSaveMarker, IRegistryObjectState, + openLoadMarker, openSaveMarker, registerHelicopter, registry, @@ -11,13 +12,12 @@ import { unregisterHelicopter, } from "@/engine/core/database"; import { loadObjectLogic, saveObjectLogic } from "@/engine/core/database/logic"; -import { openLoadMarker } from "@/engine/core/database/save_markers"; import { GlobalSoundManager } from "@/engine/core/managers/sounds/GlobalSoundManager"; import { ESchemeEvent, IBaseSchemeState } from "@/engine/core/schemes"; import { getHeliHealth } from "@/engine/core/schemes/heli_move/heli_utils"; import { HeliCombat } from "@/engine/core/schemes/heli_move/HeliCombat"; import { getHeliFirer, HeliFire } from "@/engine/core/schemes/heli_move/HeliFire"; -import { readIniNumber, readIniString } from "@/engine/core/utils/ini/read"; +import { readIniNumber, readIniString } from "@/engine/core/utils/ini"; import { LuaLogger } from "@/engine/core/utils/logging"; import { emitSchemeEvent, initializeObjectSchemeLogic } from "@/engine/core/utils/scheme"; import { diff --git a/src/engine/core/objects/binders/creature/MonsterBinder.ts b/src/engine/core/objects/binders/creature/MonsterBinder.ts index c860b1520..19b30da71 100644 --- a/src/engine/core/objects/binders/creature/MonsterBinder.ts +++ b/src/engine/core/objects/binders/creature/MonsterBinder.ts @@ -23,10 +23,9 @@ import { Squad } from "@/engine/core/objects/server/squad/Squad"; import { TSimulationObject } from "@/engine/core/objects/server/types"; import { ESchemeEvent, IBaseSchemeState } from "@/engine/core/schemes"; import { SchemeHear } from "@/engine/core/schemes/hear/SchemeHear"; -import { pickSectionFromCondList } from "@/engine/core/utils/ini"; -import { TConditionList } from "@/engine/core/utils/ini/types"; +import { pickSectionFromCondList, TConditionList } from "@/engine/core/utils/ini"; import { LuaLogger } from "@/engine/core/utils/logging"; -import { action, getObjectSquad } from "@/engine/core/utils/object/object_general"; +import { action, getObjectSquad } from "@/engine/core/utils/object"; import { emitSchemeEvent, isMonsterScriptCaptured, diff --git a/src/engine/core/objects/binders/creature/StalkerBinder.ts b/src/engine/core/objects/binders/creature/StalkerBinder.ts index b5af4ce9e..164edf797 100644 --- a/src/engine/core/objects/binders/creature/StalkerBinder.ts +++ b/src/engine/core/objects/binders/creature/StalkerBinder.ts @@ -20,6 +20,7 @@ import { DUMMY_LTX, getStoryIdByObjectId, IRegistryObjectState, + openLoadMarker, openSaveMarker, registerHelicopterEnemy, registry, @@ -27,7 +28,6 @@ import { unregisterHelicopterEnemy, } from "@/engine/core/database"; import { loadObjectLogic, saveObjectLogic } from "@/engine/core/database/logic"; -import { openLoadMarker } from "@/engine/core/database/save_markers"; import { registerStalker, unregisterStalker } from "@/engine/core/database/stalker"; import { EGameEvent, EventsManager } from "@/engine/core/managers/events"; import { DialogManager } from "@/engine/core/managers/interaction/dialog/DialogManager"; @@ -50,15 +50,10 @@ import { SchemeMeet } from "@/engine/core/schemes/meet/SchemeMeet"; import { SchemeReachTask } from "@/engine/core/schemes/reach_task/SchemeReachTask"; import { SchemeLight } from "@/engine/core/schemes/sr_light/SchemeLight"; import { SchemeWounded } from "@/engine/core/schemes/wounded/SchemeWounded"; -import { pickSectionFromCondList } from "@/engine/core/utils/ini/config"; -import { readIniString } from "@/engine/core/utils/ini/read"; -import { TConditionList } from "@/engine/core/utils/ini/types"; +import { pickSectionFromCondList, readIniString, TConditionList } from "@/engine/core/utils/ini"; import { LuaLogger } from "@/engine/core/utils/logging"; -import { - getCharacterCommunity, - getObjectSquad, - updateObjectInvulnerability, -} from "@/engine/core/utils/object/object_general"; +import { getCharacterCommunity, getObjectSquad } from "@/engine/core/utils/object/object_get"; +import { updateObjectInvulnerability } from "@/engine/core/utils/object/object_set"; import { ERelation, setClientObjectRelation, setObjectSympathy } from "@/engine/core/utils/relation"; import { emitSchemeEvent, trySwitchToAnotherSection } from "@/engine/core/utils/scheme"; import { createEmptyVector } from "@/engine/core/utils/vector"; diff --git a/src/engine/core/objects/binders/physic/LabX8DoorBinder.ts b/src/engine/core/objects/binders/physic/LabX8DoorBinder.ts index 09dd96eba..911cf2356 100644 --- a/src/engine/core/objects/binders/physic/LabX8DoorBinder.ts +++ b/src/engine/core/objects/binders/physic/LabX8DoorBinder.ts @@ -1,13 +1,22 @@ import { callback, ini_file, LuabindClass, object_binder, sound_object } from "xray16"; -import { closeLoadMarker, closeSaveMarker, openSaveMarker, registry, resetObject } from "@/engine/core/database"; +import { + closeLoadMarker, + closeSaveMarker, + openLoadMarker, + openSaveMarker, + registry, + resetObject, +} from "@/engine/core/database"; import { registerDoor, unregisterDoor } from "@/engine/core/database/doors"; import { loadObjectLogic, saveObjectLogic } from "@/engine/core/database/logic"; -import { openLoadMarker } from "@/engine/core/database/save_markers"; -import { pickSectionFromCondList } from "@/engine/core/utils/ini/config"; -import { parseConditionsList } from "@/engine/core/utils/ini/parse"; -import { readIniNumber, readIniString } from "@/engine/core/utils/ini/read"; -import { TConditionList } from "@/engine/core/utils/ini/types"; +import { + parseConditionsList, + pickSectionFromCondList, + readIniNumber, + readIniString, + TConditionList, +} from "@/engine/core/utils/ini"; import { LuaLogger } from "@/engine/core/utils/logging"; import { NIL, TRUE } from "@/engine/lib/constants/words"; import { diff --git a/src/engine/core/objects/binders/physic/PhysicObjectBinder.ts b/src/engine/core/objects/binders/physic/PhysicObjectBinder.ts index 2be85bece..09f89a2f4 100644 --- a/src/engine/core/objects/binders/physic/PhysicObjectBinder.ts +++ b/src/engine/core/objects/binders/physic/PhysicObjectBinder.ts @@ -15,8 +15,7 @@ import { loadObjectLogic, saveObjectLogic } from "@/engine/core/database/logic"; import { GlobalSoundManager } from "@/engine/core/managers/sounds/GlobalSoundManager"; import { PhysicObjectItemBox } from "@/engine/core/objects/binders/physic/PhysicObjectItemBox"; import { ESchemeEvent } from "@/engine/core/schemes"; -import { pickSectionFromCondList } from "@/engine/core/utils/ini/config"; -import { TConditionList } from "@/engine/core/utils/ini/types"; +import { pickSectionFromCondList, TConditionList } from "@/engine/core/utils/ini"; import { LuaLogger } from "@/engine/core/utils/logging"; import { emitSchemeEvent, initializeObjectSchemeLogic } from "@/engine/core/utils/scheme"; import { diff --git a/src/engine/core/objects/binders/physic/PhysicObjectItemBox.ts b/src/engine/core/objects/binders/physic/PhysicObjectItemBox.ts index 060dbbfc3..07862f16e 100644 --- a/src/engine/core/objects/binders/physic/PhysicObjectItemBox.ts +++ b/src/engine/core/objects/binders/physic/PhysicObjectItemBox.ts @@ -2,8 +2,7 @@ import { level } from "xray16"; import { PH_BOX_GENERIC_LTX } from "@/engine/core/database"; import { abort } from "@/engine/core/utils/assertion"; -import { parseNumbersList, parseStringsList } from "@/engine/core/utils/ini/parse"; -import { readIniString } from "@/engine/core/utils/ini/read"; +import { parseNumbersList, parseStringsList, readIniString } from "@/engine/core/utils/ini"; import { LuaLogger } from "@/engine/core/utils/logging"; import { spawnItemsForObject } from "@/engine/core/utils/spawn"; import { TInventoryItem } from "@/engine/lib/constants/items"; diff --git a/src/engine/core/objects/binders/physic/SignalLightBinder.ts b/src/engine/core/objects/binders/physic/SignalLightBinder.ts index fc9849000..193bdf73f 100644 --- a/src/engine/core/objects/binders/physic/SignalLightBinder.ts +++ b/src/engine/core/objects/binders/physic/SignalLightBinder.ts @@ -3,12 +3,12 @@ import { LuabindClass, object_binder, time_global } from "xray16"; import { closeLoadMarker, closeSaveMarker, + openLoadMarker, openSaveMarker, registry, resetObject, unregisterObject, } from "@/engine/core/database"; -import { openLoadMarker } from "@/engine/core/database/save_markers"; import { LuaLogger } from "@/engine/core/utils/logging"; import { createVector } from "@/engine/core/utils/vector"; import { MAX_U32 } from "@/engine/lib/constants/memory"; diff --git a/src/engine/core/objects/binders/zones/AnomalyZoneBinder.ts b/src/engine/core/objects/binders/zones/AnomalyZoneBinder.ts index 75d62c257..a530ee020 100644 --- a/src/engine/core/objects/binders/zones/AnomalyZoneBinder.ts +++ b/src/engine/core/objects/binders/zones/AnomalyZoneBinder.ts @@ -3,20 +3,25 @@ import { alife, ini_file, LuabindClass, object_binder, patrol } from "xray16"; import { closeLoadMarker, closeSaveMarker, + openLoadMarker, openSaveMarker, registerAnomalyZone, registry, resetObject, unregisterAnomalyZone, } from "@/engine/core/database"; -import { openLoadMarker } from "@/engine/core/database/save_markers"; import { MapDisplayManager } from "@/engine/core/managers/interface/MapDisplayManager"; import { AnomalyFieldBinder } from "@/engine/core/objects/binders/zones/AnomalyFieldBinder"; import { abort, assertDefined } from "@/engine/core/utils/assertion"; -import { pickSectionFromCondList } from "@/engine/core/utils/ini/config"; -import { parseConditionsList, parseNumbersList, parseStringsList } from "@/engine/core/utils/ini/parse"; -import { readIniNumber, readIniString } from "@/engine/core/utils/ini/read"; -import { TConditionList } from "@/engine/core/utils/ini/types"; +import { + parseConditionsList, + parseNumbersList, + parseStringsList, + pickSectionFromCondList, + readIniNumber, + readIniString, + TConditionList, +} from "@/engine/core/utils/ini"; import { LuaLogger } from "@/engine/core/utils/logging"; import { MAX_U8 } from "@/engine/lib/constants/memory"; import { diff --git a/src/engine/core/objects/binders/zones/ArenaZoneBinder.ts b/src/engine/core/objects/binders/zones/ArenaZoneBinder.ts index de86263dc..b38bdc8c1 100644 --- a/src/engine/core/objects/binders/zones/ArenaZoneBinder.ts +++ b/src/engine/core/objects/binders/zones/ArenaZoneBinder.ts @@ -1,7 +1,6 @@ import { alife, callback, clsid, LuabindClass, object_binder } from "xray16"; -import { closeLoadMarker, closeSaveMarker, openSaveMarker, registry } from "@/engine/core/database"; -import { openLoadMarker } from "@/engine/core/database/save_markers"; +import { closeLoadMarker, closeSaveMarker, openLoadMarker, openSaveMarker, registry } from "@/engine/core/database"; import { LuaLogger } from "@/engine/core/utils/logging"; import { getTableSize } from "@/engine/core/utils/table"; import { AlifeSimulator, ClientObject, NetPacket, Reader, ServerObject, TNumberId } from "@/engine/lib/types"; diff --git a/src/engine/core/objects/binders/zones/CampBinder.ts b/src/engine/core/objects/binders/zones/CampBinder.ts index cc63427db..3ffd405ef 100644 --- a/src/engine/core/objects/binders/zones/CampBinder.ts +++ b/src/engine/core/objects/binders/zones/CampBinder.ts @@ -1,9 +1,8 @@ import { ini_file, LuabindClass, object_binder } from "xray16"; -import { closeLoadMarker, closeSaveMarker, openSaveMarker, registry } from "@/engine/core/database"; -import { openLoadMarker } from "@/engine/core/database/save_markers"; +import { closeLoadMarker, closeSaveMarker, openLoadMarker, openSaveMarker, registry } from "@/engine/core/database"; import { CampStoryManager } from "@/engine/core/schemes/camper/CampStoryManager"; -import { readIniString } from "@/engine/core/utils/ini/read"; +import { readIniString } from "@/engine/core/utils/ini"; import { LuaLogger } from "@/engine/core/utils/logging"; import { IniFile, NetPacket, Optional, Reader, ServerObject, TDuration, TName } from "@/engine/lib/types"; diff --git a/src/engine/core/objects/binders/zones/LevelChangerBinder.ts b/src/engine/core/objects/binders/zones/LevelChangerBinder.ts index aeec0e89c..50ef7f4c5 100644 --- a/src/engine/core/objects/binders/zones/LevelChangerBinder.ts +++ b/src/engine/core/objects/binders/zones/LevelChangerBinder.ts @@ -3,13 +3,13 @@ import { alife, command_line, LuabindClass, object_binder } from "xray16"; import { closeLoadMarker, closeSaveMarker, + openLoadMarker, openSaveMarker, registerObject, resetObject, unregisterObject, } from "@/engine/core/database"; import { loadObjectLogic, saveObjectLogic } from "@/engine/core/database/logic"; -import { openLoadMarker } from "@/engine/core/database/save_markers"; import { LevelChanger } from "@/engine/core/objects/server/LevelChanger"; import { LuaLogger } from "@/engine/core/utils/logging"; import { NetPacket, Reader, ServerObject } from "@/engine/lib/types"; diff --git a/src/engine/core/objects/binders/zones/RestrictorBinder.ts b/src/engine/core/objects/binders/zones/RestrictorBinder.ts index 6ba857634..0b1a2a97a 100644 --- a/src/engine/core/objects/binders/zones/RestrictorBinder.ts +++ b/src/engine/core/objects/binders/zones/RestrictorBinder.ts @@ -4,6 +4,7 @@ import { closeLoadMarker, closeSaveMarker, IRegistryObjectState, + openLoadMarker, openSaveMarker, registerZone, registry, @@ -11,7 +12,6 @@ import { unregisterZone, } from "@/engine/core/database"; import { loadObjectLogic, saveObjectLogic } from "@/engine/core/database/logic"; -import { openLoadMarker } from "@/engine/core/database/save_markers"; import { GlobalSoundManager } from "@/engine/core/managers/sounds/GlobalSoundManager"; import { ESchemeEvent } from "@/engine/core/schemes"; import { LuaLogger } from "@/engine/core/utils/logging"; diff --git a/src/engine/core/objects/server/creature/Actor.ts b/src/engine/core/objects/server/creature/Actor.ts index 5a792bca7..bea066c30 100644 --- a/src/engine/core/objects/server/creature/Actor.ts +++ b/src/engine/core/objects/server/creature/Actor.ts @@ -19,9 +19,9 @@ import { ESmartTerrainStatus } from "@/engine/core/objects/server/smart_terrain/ import { simulationActivities } from "@/engine/core/objects/server/squad/simulation_activities"; import { Squad } from "@/engine/core/objects/server/squad/Squad"; import { ISimulationTarget } from "@/engine/core/objects/server/types"; -import { pickSectionFromCondList } from "@/engine/core/utils/ini/config"; -import { parseConditionsList } from "@/engine/core/utils/ini/parse"; -import { TConditionList } from "@/engine/core/utils/ini/types"; +import { pickSectionFromCondList } from "@/engine/core/utils/ini/ini_config"; +import { parseConditionsList } from "@/engine/core/utils/ini/ini_parse"; +import { TConditionList } from "@/engine/core/utils/ini/ini_types"; import { LuaLogger } from "@/engine/core/utils/logging"; import { ACTOR, TRUE } from "@/engine/lib/constants/words"; import { diff --git a/src/engine/core/objects/server/creature/Monster.ts b/src/engine/core/objects/server/creature/Monster.ts index d3a4665ff..f28745b10 100644 --- a/src/engine/core/objects/server/creature/Monster.ts +++ b/src/engine/core/objects/server/creature/Monster.ts @@ -13,8 +13,8 @@ import { SimulationBoardManager } from "@/engine/core/managers/interaction/Simul import { Squad } from "@/engine/core/objects"; import { SmartTerrain } from "@/engine/core/objects/server/smart_terrain"; import { assert } from "@/engine/core/utils/assertion"; -import { parseNumberOptional, parseStringOptional } from "@/engine/core/utils/ini/parse"; -import { readIniString } from "@/engine/core/utils/ini/read"; +import { parseNumberOptional, parseStringOptional } from "@/engine/core/utils/ini/ini_parse"; +import { readIniString } from "@/engine/core/utils/ini/ini_read"; import { LuaLogger } from "@/engine/core/utils/logging"; import { MAX_U16 } from "@/engine/lib/constants/memory"; import { IniFile, NetPacket, Optional, ServerCreatureObject, TName, TNumberId, TSection } from "@/engine/lib/types"; diff --git a/src/engine/core/objects/server/creature/Stalker.ts b/src/engine/core/objects/server/creature/Stalker.ts index a01517c52..283c7a0ab 100644 --- a/src/engine/core/objects/server/creature/Stalker.ts +++ b/src/engine/core/objects/server/creature/Stalker.ts @@ -12,8 +12,8 @@ import { SimulationBoardManager } from "@/engine/core/managers/interaction/Simul import { Squad } from "@/engine/core/objects"; import { SmartTerrain } from "@/engine/core/objects/server/smart_terrain"; import { assert } from "@/engine/core/utils/assertion"; -import { parseNumberOptional, parseStringOptional } from "@/engine/core/utils/ini/parse"; -import { readIniString } from "@/engine/core/utils/ini/read"; +import { parseNumberOptional, parseStringOptional } from "@/engine/core/utils/ini/ini_parse"; +import { readIniString } from "@/engine/core/utils/ini/ini_read"; import { LuaLogger } from "@/engine/core/utils/logging"; import { MAX_U16 } from "@/engine/lib/constants/memory"; import { IniFile, NetPacket, Optional, ServerCreatureObject, TName, TNumberId, TSection } from "@/engine/lib/types"; diff --git a/src/engine/core/objects/server/smart_terrain/jobs_general.ts b/src/engine/core/objects/server/smart_terrain/jobs_general.ts index e2e7a1554..bbeae153a 100644 --- a/src/engine/core/objects/server/smart_terrain/jobs_general.ts +++ b/src/engine/core/objects/server/smart_terrain/jobs_general.ts @@ -4,10 +4,10 @@ import { IRegistryObjectState, registry } from "@/engine/core/database"; import { SurgeManager } from "@/engine/core/managers/world/SurgeManager"; import type { SmartTerrain } from "@/engine/core/objects/server/smart_terrain/SmartTerrain"; import { IJobDescriptor, IObjectJobDescriptor, TJobDescriptor } from "@/engine/core/objects/server/smart_terrain/types"; -import { pickSectionFromCondList } from "@/engine/core/utils/ini/config"; -import { getSchemeFromSection, parseConditionsList, parseWaypointData } from "@/engine/core/utils/ini/parse"; -import { readIniBoolean, readIniNumber, readIniString } from "@/engine/core/utils/ini/read"; -import { TConditionList } from "@/engine/core/utils/ini/types"; +import { pickSectionFromCondList } from "@/engine/core/utils/ini/ini_config"; +import { getSchemeFromSection, parseConditionsList, parseWaypointData } from "@/engine/core/utils/ini/ini_parse"; +import { readIniBoolean, readIniNumber, readIniString } from "@/engine/core/utils/ini/ini_read"; +import { TConditionList } from "@/engine/core/utils/ini/ini_types"; import { LuaLogger } from "@/engine/core/utils/logging"; import { initializeObjectSchemeLogic } from "@/engine/core/utils/scheme"; import { isInTimeInterval } from "@/engine/core/utils/time"; diff --git a/src/engine/core/objects/server/types.ts b/src/engine/core/objects/server/types.ts index fa3e6486c..87a6e4c2e 100644 --- a/src/engine/core/objects/server/types.ts +++ b/src/engine/core/objects/server/types.ts @@ -1,7 +1,7 @@ import type { Actor } from "@/engine/core/objects"; import type { SmartTerrain } from "@/engine/core/objects/server/smart_terrain/SmartTerrain"; import type { Squad } from "@/engine/core/objects/server/squad/Squad"; -import type { TConditionList } from "@/engine/core/utils/ini/types"; +import type { TConditionList } from "@/engine/core/utils/ini/ini_types"; import type { TCommunity } from "@/engine/lib/constants/communities"; import type { ALifeSmartTerrainTask, diff --git a/src/engine/core/objects/sounds/playable_sounds/AbstractPlayableSound.ts b/src/engine/core/objects/sounds/playable_sounds/AbstractPlayableSound.ts index 84b4976c1..26cf6f25d 100644 --- a/src/engine/core/objects/sounds/playable_sounds/AbstractPlayableSound.ts +++ b/src/engine/core/objects/sounds/playable_sounds/AbstractPlayableSound.ts @@ -1,5 +1,5 @@ import { EPlayableSound } from "@/engine/core/objects/sounds/types"; -import { readIniString } from "@/engine/core/utils/ini/read"; +import { readIniString } from "@/engine/core/utils/ini/ini_read"; import { AnyArgs, ClientObject, diff --git a/src/engine/core/objects/sounds/playable_sounds/ActorSound.ts b/src/engine/core/objects/sounds/playable_sounds/ActorSound.ts index e63e6024c..af965c1f3 100644 --- a/src/engine/core/objects/sounds/playable_sounds/ActorSound.ts +++ b/src/engine/core/objects/sounds/playable_sounds/ActorSound.ts @@ -7,8 +7,8 @@ import { AbstractPlayableSound } from "@/engine/core/objects/sounds/playable_sou import { EPlayableSound, ESoundPlaylistType } from "@/engine/core/objects/sounds/types"; import { IBaseSchemeState } from "@/engine/core/schemes/base"; import { assert } from "@/engine/core/utils/assertion"; -import { parseStringsList } from "@/engine/core/utils/ini/parse"; -import { readIniBoolean, readIniString } from "@/engine/core/utils/ini/read"; +import { parseStringsList } from "@/engine/core/utils/ini/ini_parse"; +import { readIniBoolean, readIniString } from "@/engine/core/utils/ini/ini_read"; import { LuaLogger } from "@/engine/core/utils/logging"; import { createEmptyVector } from "@/engine/core/utils/vector"; import { roots } from "@/engine/lib/constants/roots"; diff --git a/src/engine/core/objects/sounds/playable_sounds/NpcSound.ts b/src/engine/core/objects/sounds/playable_sounds/NpcSound.ts index a0cb56b66..5a500c559 100644 --- a/src/engine/core/objects/sounds/playable_sounds/NpcSound.ts +++ b/src/engine/core/objects/sounds/playable_sounds/NpcSound.ts @@ -6,10 +6,9 @@ import { ENotificationType, ISoundNotification } from "@/engine/core/managers/in import { AbstractPlayableSound } from "@/engine/core/objects/sounds/playable_sounds/AbstractPlayableSound"; import { EPlayableSound, ESoundPlaylistType } from "@/engine/core/objects/sounds/types"; import { abort } from "@/engine/core/utils/assertion"; -import { parseStringsList } from "@/engine/core/utils/ini/parse"; -import { readIniBoolean, readIniNumber, readIniString } from "@/engine/core/utils/ini/read"; +import { parseStringsList, readIniBoolean, readIniNumber, readIniString } from "@/engine/core/utils/ini"; import { LuaLogger } from "@/engine/core/utils/logging"; -import { getCharacterCommunity } from "@/engine/core/utils/object/object_general"; +import { getCharacterCommunity } from "@/engine/core/utils/object/object_get"; import { createEmptyVector } from "@/engine/core/utils/vector"; import { communities, TCommunity } from "@/engine/lib/constants/communities"; import { roots } from "@/engine/lib/constants/roots"; diff --git a/src/engine/core/objects/sounds/playable_sounds/ObjectSound.ts b/src/engine/core/objects/sounds/playable_sounds/ObjectSound.ts index 6df24a5e3..941dc1e87 100644 --- a/src/engine/core/objects/sounds/playable_sounds/ObjectSound.ts +++ b/src/engine/core/objects/sounds/playable_sounds/ObjectSound.ts @@ -7,8 +7,8 @@ import { AbstractPlayableSound } from "@/engine/core/objects/sounds/playable_sou import { EPlayableSound, ESoundPlaylistType } from "@/engine/core/objects/sounds/types"; import { IBaseSchemeState } from "@/engine/core/schemes"; import { assert } from "@/engine/core/utils/assertion"; -import { parseStringsList } from "@/engine/core/utils/ini/parse"; -import { readIniString } from "@/engine/core/utils/ini/read"; +import { parseStringsList } from "@/engine/core/utils/ini/ini_parse"; +import { readIniString } from "@/engine/core/utils/ini/ini_read"; import { LuaLogger } from "@/engine/core/utils/logging"; import { createEmptyVector } from "@/engine/core/utils/vector"; import { roots } from "@/engine/lib/constants/roots"; diff --git a/src/engine/core/objects/sounds/stories/SoundStory.ts b/src/engine/core/objects/sounds/stories/SoundStory.ts index 6c629c919..7c67e2495 100644 --- a/src/engine/core/objects/sounds/stories/SoundStory.ts +++ b/src/engine/core/objects/sounds/stories/SoundStory.ts @@ -1,7 +1,7 @@ import { SOUND_STORIES_LTX } from "@/engine/core/database"; import { ESoundStoryParticipant, IReplicDescriptor } from "@/engine/core/objects/sounds/types"; import { abort } from "@/engine/core/utils/assertion"; -import { parseStringsList } from "@/engine/core/utils/ini/parse"; +import { parseStringsList } from "@/engine/core/utils/ini/ini_parse"; import { LuaLogger } from "@/engine/core/utils/logging"; import { LuaArray, TCount, TIndex, TStringId } from "@/engine/lib/types"; diff --git a/src/engine/core/objects/state/StalkerMoveManager.ts b/src/engine/core/objects/state/StalkerMoveManager.ts index e943a0465..e3b74befd 100644 --- a/src/engine/core/objects/state/StalkerMoveManager.ts +++ b/src/engine/core/objects/state/StalkerMoveManager.ts @@ -3,9 +3,9 @@ import { callback, level, move, patrol, time_global } from "xray16"; import { IRegistryObjectState, registry, setStalkerState } from "@/engine/core/database"; import { EStalkerState } from "@/engine/core/objects/state/types"; import { abort } from "@/engine/core/utils/assertion"; -import { pickSectionFromCondList } from "@/engine/core/utils/ini/config"; -import { parseConditionsList } from "@/engine/core/utils/ini/parse"; -import { IWaypointData, TConditionList } from "@/engine/core/utils/ini/types"; +import { pickSectionFromCondList } from "@/engine/core/utils/ini/ini_config"; +import { parseConditionsList } from "@/engine/core/utils/ini/ini_parse"; +import { IWaypointData, TConditionList } from "@/engine/core/utils/ini/ini_types"; import { LuaLogger } from "@/engine/core/utils/logging"; import { isStalkerAtWaypoint } from "@/engine/core/utils/position"; import { TRUE } from "@/engine/lib/constants/words"; diff --git a/src/engine/core/objects/state/state/ActionStateToIdle.ts b/src/engine/core/objects/state/state/ActionStateToIdle.ts index bb227eda2..a108857cc 100644 --- a/src/engine/core/objects/state/state/ActionStateToIdle.ts +++ b/src/engine/core/objects/state/state/ActionStateToIdle.ts @@ -3,7 +3,7 @@ import { action_base, LuabindClass } from "xray16"; import { EStalkerState } from "@/engine/core/objects/state"; import { StalkerStateManager } from "@/engine/core/objects/state/StalkerStateManager"; import { LuaLogger } from "@/engine/core/utils/logging"; -import { sendToNearestAccessibleVertex } from "@/engine/core/utils/object/object_general"; +import { sendToNearestAccessibleVertex } from "@/engine/core/utils/object/object_location"; import { EClientObjectPath, TName } from "@/engine/lib/types"; const logger: LuaLogger = new LuaLogger($filename); @@ -15,9 +15,6 @@ const logger: LuaLogger = new LuaLogger($filename); export class ActionStateToIdle extends action_base { private readonly stateManager: StalkerStateManager; - /** - * todo: Description. - */ public constructor(stateManager: StalkerStateManager, name?: TName) { super(null, name || ActionStateToIdle.__name); this.stateManager = stateManager; diff --git a/src/engine/core/objects/state/weapon/ActionWeaponDrop.ts b/src/engine/core/objects/state/weapon/ActionWeaponDrop.ts index b26697e96..9a3e1fc74 100644 --- a/src/engine/core/objects/state/weapon/ActionWeaponDrop.ts +++ b/src/engine/core/objects/state/weapon/ActionWeaponDrop.ts @@ -4,7 +4,7 @@ import { StalkerStateManager } from "@/engine/core/objects/state/StalkerStateMan import { getObjectAnimationWeapon } from "@/engine/core/objects/state/weapon/StateManagerWeapon"; import { isStrappableWeapon } from "@/engine/core/utils/check/is"; import { LuaLogger } from "@/engine/core/utils/logging"; -import { setItemCondition } from "@/engine/core/utils/object/object_general"; +import { setItemCondition } from "@/engine/core/utils/object"; import { logicsConfig } from "@/engine/lib/configs/LogicsConfig"; import { ClientObject, Optional } from "@/engine/lib/types"; diff --git a/src/engine/core/objects/state_lib/state_mgr_pri_a15.ts b/src/engine/core/objects/state_lib/state_mgr_pri_a15.ts index 0a9e59678..bc8c2ee38 100644 --- a/src/engine/core/objects/state_lib/state_mgr_pri_a15.ts +++ b/src/engine/core/objects/state_lib/state_mgr_pri_a15.ts @@ -3,7 +3,7 @@ import { anim, CSightParams, move } from "xray16"; import { registry } from "@/engine/core/database"; import { IStateDescriptor } from "@/engine/core/objects/state/types"; import { abort } from "@/engine/core/utils/assertion"; -import { parseStringsList } from "@/engine/core/utils/ini/parse"; +import { parseStringsList } from "@/engine/core/utils/ini/ini_parse"; import { getTableSize } from "@/engine/core/utils/table"; import { infoPortions } from "@/engine/lib/constants/info_portions"; import { storyNames } from "@/engine/lib/constants/story_names"; diff --git a/src/engine/core/schemes/animpoint/SchemeAnimpoint.ts b/src/engine/core/schemes/animpoint/SchemeAnimpoint.ts index ab66b211d..133ab7241 100644 --- a/src/engine/core/schemes/animpoint/SchemeAnimpoint.ts +++ b/src/engine/core/schemes/animpoint/SchemeAnimpoint.ts @@ -6,11 +6,11 @@ import { ActionAnimpoint, ActionReachAnimpoint } from "@/engine/core/schemes/ani import { AnimpointManager } from "@/engine/core/schemes/animpoint/AnimpointManager"; import { EvaluatorNeedAnimpoint, EvaluatorReachAnimpoint } from "@/engine/core/schemes/animpoint/evaluators"; import { ISchemeAnimpointState } from "@/engine/core/schemes/animpoint/ISchemeAnimpointState"; -import { getConfigSwitchConditions } from "@/engine/core/utils/ini/config"; -import { parseStringsList } from "@/engine/core/utils/ini/parse"; -import { readIniBoolean, readIniNumber, readIniString } from "@/engine/core/utils/ini/read"; +import { getConfigSwitchConditions } from "@/engine/core/utils/ini/ini_config"; +import { parseStringsList } from "@/engine/core/utils/ini/ini_parse"; +import { readIniBoolean, readIniNumber, readIniString } from "@/engine/core/utils/ini/ini_read"; import { LuaLogger } from "@/engine/core/utils/logging"; -import { addCommonActionPreconditions } from "@/engine/core/utils/scheme/setup"; +import { addCommonActionPreconditions } from "@/engine/core/utils/scheme/scheme_setup"; import { ActionPlanner, ClientObject, IniFile, Optional } from "@/engine/lib/types"; import { EScheme, ESchemeType, TSection } from "@/engine/lib/types/scheme"; diff --git a/src/engine/core/schemes/animpoint/animpoint_predicates.ts b/src/engine/core/schemes/animpoint/animpoint_predicates.ts index c002f6b07..5f7b50c36 100644 --- a/src/engine/core/schemes/animpoint/animpoint_predicates.ts +++ b/src/engine/core/schemes/animpoint/animpoint_predicates.ts @@ -2,7 +2,7 @@ import { registry } from "@/engine/core/database"; import { EStalkerState } from "@/engine/core/objects/state"; import { IAnimpointAction, IStoryAnimationDescriptor } from "@/engine/core/schemes/animpoint/types"; import { LuaLogger } from "@/engine/core/utils/logging"; -import { getObjectSmartTerrain } from "@/engine/core/utils/object/object_general"; +import { getObjectSmartTerrain } from "@/engine/core/utils/object/object_get"; import { food } from "@/engine/lib/constants/items/food"; import { misc } from "@/engine/lib/constants/items/misc"; import { ClientObject, LuaArray, Optional, TName, TNumberId } from "@/engine/lib/types"; diff --git a/src/engine/core/schemes/base/ObjectRestrictionsManager.ts b/src/engine/core/schemes/base/ObjectRestrictionsManager.ts index b2df53602..465762a8a 100644 --- a/src/engine/core/schemes/base/ObjectRestrictionsManager.ts +++ b/src/engine/core/schemes/base/ObjectRestrictionsManager.ts @@ -1,6 +1,6 @@ import { IRegistryObjectState, registry } from "@/engine/core/database"; -import { parseStringsList } from "@/engine/core/utils/ini/parse"; -import { readIniString } from "@/engine/core/utils/ini/read"; +import { parseStringsList } from "@/engine/core/utils/ini/ini_parse"; +import { readIniString } from "@/engine/core/utils/ini/ini_read"; import { LuaLogger } from "@/engine/core/utils/logging"; import { NIL } from "@/engine/lib/constants/words"; import { ClientObject, IniFile, LuaArray, Optional, TName, TSection } from "@/engine/lib/types"; diff --git a/src/engine/core/schemes/base/types.ts b/src/engine/core/schemes/base/types.ts index adbecd114..22f558853 100644 --- a/src/engine/core/schemes/base/types.ts +++ b/src/engine/core/schemes/base/types.ts @@ -1,5 +1,5 @@ import type { AbstractScheme } from "@/engine/core/schemes"; -import type { TConditionList } from "@/engine/core/utils/ini/types"; +import type { TConditionList } from "@/engine/core/utils/ini/ini_types"; import type { AnyObject, ClientObject, diff --git a/src/engine/core/schemes/camper/SchemeCamper.ts b/src/engine/core/schemes/camper/SchemeCamper.ts index 40aef0782..478984423 100644 --- a/src/engine/core/schemes/camper/SchemeCamper.ts +++ b/src/engine/core/schemes/camper/SchemeCamper.ts @@ -6,8 +6,8 @@ import { ActionCamperPatrol } from "@/engine/core/schemes/camper/actions"; import { EvaluatorCloseCombat, EvaluatorEnd } from "@/engine/core/schemes/camper/evaluators"; import { ISchemeCamperState } from "@/engine/core/schemes/camper/ISchemeCamperState"; import { abort } from "@/engine/core/utils/assertion"; -import { getConfigSwitchConditions } from "@/engine/core/utils/ini/config"; -import { readIniBoolean, readIniNumber, readIniString } from "@/engine/core/utils/ini/read"; +import { getConfigSwitchConditions } from "@/engine/core/utils/ini/ini_config"; +import { readIniBoolean, readIniNumber, readIniString } from "@/engine/core/utils/ini/ini_read"; import { LuaLogger } from "@/engine/core/utils/logging"; import { RADIAN } from "@/engine/lib/constants/math"; import { FALSE } from "@/engine/lib/constants/words"; diff --git a/src/engine/core/schemes/combat/SchemeCombat.ts b/src/engine/core/schemes/combat/SchemeCombat.ts index 13f79df66..56325342f 100644 --- a/src/engine/core/schemes/combat/SchemeCombat.ts +++ b/src/engine/core/schemes/combat/SchemeCombat.ts @@ -6,11 +6,11 @@ import { EvaluatorCheckCombat } from "@/engine/core/schemes/combat/evaluators/Ev import { ISchemeCombatState } from "@/engine/core/schemes/combat/ISchemeCombatState"; import { SchemeCombatCamper } from "@/engine/core/schemes/combat_camper/SchemeCombatCamper"; import { SchemeCombatZombied } from "@/engine/core/schemes/combat_zombied/SchemeCombatZombied"; -import { getConfigSwitchConditions, pickSectionFromCondList } from "@/engine/core/utils/ini/config"; -import { parseConditionsList } from "@/engine/core/utils/ini/parse"; -import { readIniConditionList } from "@/engine/core/utils/ini/read"; +import { getConfigSwitchConditions, pickSectionFromCondList } from "@/engine/core/utils/ini/ini_config"; +import { parseConditionsList } from "@/engine/core/utils/ini/ini_parse"; +import { readIniConditionList } from "@/engine/core/utils/ini/ini_read"; import { LuaLogger } from "@/engine/core/utils/logging"; -import { getCharacterCommunity } from "@/engine/core/utils/object/object_general"; +import { getCharacterCommunity } from "@/engine/core/utils/object"; import { communities } from "@/engine/lib/constants/communities"; import { NIL } from "@/engine/lib/constants/words"; import { ActionBase, ActionPlanner, AnyObject, ClientObject, IniFile, Optional, TName } from "@/engine/lib/types"; diff --git a/src/engine/core/schemes/combat_zombied/actions/ActionZombieGoToDanger.ts b/src/engine/core/schemes/combat_zombied/actions/ActionZombieGoToDanger.ts index 8f3051eda..70faa3e89 100644 --- a/src/engine/core/schemes/combat_zombied/actions/ActionZombieGoToDanger.ts +++ b/src/engine/core/schemes/combat_zombied/actions/ActionZombieGoToDanger.ts @@ -4,7 +4,7 @@ import { setStalkerState } from "@/engine/core/database"; import { EStalkerState, ILookTargetDescriptor } from "@/engine/core/objects/state"; import { EZombieCombatAction, ISchemeCombatState } from "@/engine/core/schemes/combat/ISchemeCombatState"; import { LuaLogger } from "@/engine/core/utils/logging"; -import { sendToNearestAccessibleVertex } from "@/engine/core/utils/object/object_general"; +import { sendToNearestAccessibleVertex } from "@/engine/core/utils/object/object_location"; import { ClientObject, DangerObject, diff --git a/src/engine/core/schemes/combat_zombied/evaluators/EvaluatorCombatZombied.ts b/src/engine/core/schemes/combat_zombied/evaluators/EvaluatorCombatZombied.ts index 5ca6b898c..41af7056e 100644 --- a/src/engine/core/schemes/combat_zombied/evaluators/EvaluatorCombatZombied.ts +++ b/src/engine/core/schemes/combat_zombied/evaluators/EvaluatorCombatZombied.ts @@ -2,7 +2,7 @@ import { LuabindClass, property_evaluator } from "xray16"; import { ISchemeCombatState } from "@/engine/core/schemes/combat"; import { LuaLogger } from "@/engine/core/utils/logging"; -import { getCharacterCommunity } from "@/engine/core/utils/object/object_general"; +import { getCharacterCommunity } from "@/engine/core/utils/object"; import { communities } from "@/engine/lib/constants/communities"; const logger: LuaLogger = new LuaLogger($filename); diff --git a/src/engine/core/schemes/companion/SchemeCompanion.ts b/src/engine/core/schemes/companion/SchemeCompanion.ts index 8037e8b74..8fc4c6f3e 100644 --- a/src/engine/core/schemes/companion/SchemeCompanion.ts +++ b/src/engine/core/schemes/companion/SchemeCompanion.ts @@ -4,9 +4,9 @@ import { AbstractScheme, EActionId, EEvaluatorId } from "@/engine/core/schemes"; import { ActionCompanionActivity } from "@/engine/core/schemes/companion/actions"; import { EvaluatorNeedCompanion } from "@/engine/core/schemes/companion/evaluators"; import { ISchemeCompanionState } from "@/engine/core/schemes/companion/ISchemeCompanionState"; -import { getConfigSwitchConditions } from "@/engine/core/utils/ini/config"; +import { getConfigSwitchConditions } from "@/engine/core/utils/ini/ini_config"; import { LuaLogger } from "@/engine/core/utils/logging"; -import { addCommonActionPreconditions } from "@/engine/core/utils/scheme/setup"; +import { addCommonActionPreconditions } from "@/engine/core/utils/scheme/scheme_setup"; import { ActionPlanner, ClientObject, EScheme, ESchemeType, IniFile, TSection } from "@/engine/lib/types"; const logger: LuaLogger = new LuaLogger($filename); diff --git a/src/engine/core/schemes/corpse_detection/SchemeCorpseDetection.ts b/src/engine/core/schemes/corpse_detection/SchemeCorpseDetection.ts index eca65b9c3..309b16fa8 100644 --- a/src/engine/core/schemes/corpse_detection/SchemeCorpseDetection.ts +++ b/src/engine/core/schemes/corpse_detection/SchemeCorpseDetection.ts @@ -7,7 +7,7 @@ import { ActionSearchCorpse } from "@/engine/core/schemes/corpse_detection/actio import { EvaluatorCorpseDetect } from "@/engine/core/schemes/corpse_detection/evaluators"; import { ISchemeCorpseDetectionState } from "@/engine/core/schemes/corpse_detection/ISchemeCorpseDetectionState"; import { isLootableItem } from "@/engine/core/utils/check/is"; -import { readIniBoolean } from "@/engine/core/utils/ini/read"; +import { readIniBoolean } from "@/engine/core/utils/ini/ini_read"; import { LuaLogger } from "@/engine/core/utils/logging"; import { ActionPlanner, ClientObject, IniFile, Optional, TNumberId } from "@/engine/lib/types"; import { EScheme, ESchemeType, TSection } from "@/engine/lib/types/scheme"; diff --git a/src/engine/core/schemes/cover/ISchemeCoverState.ts b/src/engine/core/schemes/cover/ISchemeCoverState.ts index 0fb0fc66a..bebbe4574 100644 --- a/src/engine/core/schemes/cover/ISchemeCoverState.ts +++ b/src/engine/core/schemes/cover/ISchemeCoverState.ts @@ -1,5 +1,5 @@ import { IBaseSchemeState } from "@/engine/core/schemes/base"; -import { TConditionList } from "@/engine/core/utils/ini/types"; +import { TConditionList } from "@/engine/core/utils/ini/ini_types"; import { TDistance, TName } from "@/engine/lib/types"; /** diff --git a/src/engine/core/schemes/cover/SchemeCover.ts b/src/engine/core/schemes/cover/SchemeCover.ts index 0a49b0de5..e9d6f8e1b 100644 --- a/src/engine/core/schemes/cover/SchemeCover.ts +++ b/src/engine/core/schemes/cover/SchemeCover.ts @@ -5,9 +5,9 @@ import { ActionCover } from "@/engine/core/schemes/cover/actions"; import { EvaluatorNeedCover } from "@/engine/core/schemes/cover/evaluators"; import { ISchemeCoverState } from "@/engine/core/schemes/cover/ISchemeCoverState"; import { assertDefined } from "@/engine/core/utils/assertion"; -import { getConfigSwitchConditions } from "@/engine/core/utils/ini/config"; -import { parseConditionsList } from "@/engine/core/utils/ini/parse"; -import { readIniBoolean, readIniNumber, readIniString } from "@/engine/core/utils/ini/read"; +import { getConfigSwitchConditions } from "@/engine/core/utils/ini/ini_config"; +import { parseConditionsList } from "@/engine/core/utils/ini/ini_parse"; +import { readIniBoolean, readIniNumber, readIniString } from "@/engine/core/utils/ini/ini_read"; import { LuaLogger } from "@/engine/core/utils/logging"; import { ActionPlanner, ClientObject, EScheme, ESchemeType, IniFile, TSection } from "@/engine/lib/types"; diff --git a/src/engine/core/schemes/cover/actions/ActionCover.ts b/src/engine/core/schemes/cover/actions/ActionCover.ts index cea63470c..3896a67f7 100644 --- a/src/engine/core/schemes/cover/actions/ActionCover.ts +++ b/src/engine/core/schemes/cover/actions/ActionCover.ts @@ -5,7 +5,7 @@ import { SimulationBoardManager } from "@/engine/core/managers/interaction/Simul import { GlobalSoundManager } from "@/engine/core/managers/sounds/GlobalSoundManager"; import { EStalkerState } from "@/engine/core/objects/state"; import { ISchemeCoverState } from "@/engine/core/schemes/cover"; -import { pickSectionFromCondList } from "@/engine/core/utils/ini/config"; +import { pickSectionFromCondList } from "@/engine/core/utils/ini/ini_config"; import { areSameVectors, createEmptyVector, createVector, subVectors } from "@/engine/core/utils/vector"; import { CoverPoint, EClientObjectPath, Optional, TDistance, TNumberId, Vector } from "@/engine/lib/types"; diff --git a/src/engine/core/schemes/cover/evaluators/EvaluatorNeedCover.ts b/src/engine/core/schemes/cover/evaluators/EvaluatorNeedCover.ts index b97e67d62..512cfdbb1 100644 --- a/src/engine/core/schemes/cover/evaluators/EvaluatorNeedCover.ts +++ b/src/engine/core/schemes/cover/evaluators/EvaluatorNeedCover.ts @@ -2,7 +2,7 @@ import { LuabindClass, property_evaluator } from "xray16"; import { ISchemeCoverState } from "@/engine/core/schemes/cover"; import { LuaLogger } from "@/engine/core/utils/logging"; -import { isSectionActive } from "@/engine/core/utils/scheme/logic"; +import { isSectionActive } from "@/engine/core/utils/scheme/scheme_logic"; const logger: LuaLogger = new LuaLogger($filename); diff --git a/src/engine/core/schemes/death/DeathManager.ts b/src/engine/core/schemes/death/DeathManager.ts index d12c4f9fa..498b66b6a 100644 --- a/src/engine/core/schemes/death/DeathManager.ts +++ b/src/engine/core/schemes/death/DeathManager.ts @@ -1,7 +1,7 @@ import { registry } from "@/engine/core/database"; import { AbstractSchemeManager } from "@/engine/core/schemes"; import { ISchemeDeathState } from "@/engine/core/schemes/death/ISchemeDeathState"; -import { pickSectionFromCondList } from "@/engine/core/utils/ini/config"; +import { pickSectionFromCondList } from "@/engine/core/utils/ini/ini_config"; import { ClientObject, EScheme, Optional } from "@/engine/lib/types"; /** diff --git a/src/engine/core/schemes/death/ISchemeDeathState.ts b/src/engine/core/schemes/death/ISchemeDeathState.ts index fc6d23c26..c154fdfc8 100644 --- a/src/engine/core/schemes/death/ISchemeDeathState.ts +++ b/src/engine/core/schemes/death/ISchemeDeathState.ts @@ -1,5 +1,5 @@ import type { IBaseSchemeState } from "@/engine/core/schemes/base"; -import type { TConditionList } from "@/engine/core/utils/ini/types"; +import type { TConditionList } from "@/engine/core/utils/ini/ini_types"; import type { Optional, TName, TNumberId } from "@/engine/lib/types"; /** diff --git a/src/engine/core/schemes/death/SchemeDeath.ts b/src/engine/core/schemes/death/SchemeDeath.ts index 9f9423cac..211659821 100644 --- a/src/engine/core/schemes/death/SchemeDeath.ts +++ b/src/engine/core/schemes/death/SchemeDeath.ts @@ -3,8 +3,8 @@ import { AbstractScheme } from "@/engine/core/schemes/base"; import { DeathManager } from "@/engine/core/schemes/death/DeathManager"; import { ISchemeDeathState } from "@/engine/core/schemes/death/ISchemeDeathState"; import { abort } from "@/engine/core/utils/assertion"; -import { parseConditionsList } from "@/engine/core/utils/ini/parse"; -import { readIniString } from "@/engine/core/utils/ini/read"; +import { parseConditionsList } from "@/engine/core/utils/ini/ini_parse"; +import { readIniString } from "@/engine/core/utils/ini/ini_read"; import { LuaLogger } from "@/engine/core/utils/logging"; import { ClientObject, EScheme, ESchemeType, IniFile, Optional, TSection } from "@/engine/lib/types"; diff --git a/src/engine/core/schemes/gather_items/SchemeGatherItems.ts b/src/engine/core/schemes/gather_items/SchemeGatherItems.ts index cb742646e..7dd72fa7d 100644 --- a/src/engine/core/schemes/gather_items/SchemeGatherItems.ts +++ b/src/engine/core/schemes/gather_items/SchemeGatherItems.ts @@ -4,7 +4,7 @@ import { IRegistryObjectState } from "@/engine/core/database"; import { AbstractScheme } from "@/engine/core/schemes/base"; import { EvaluatorGatherItems } from "@/engine/core/schemes/gather_items/evaluators"; import { ISchemeGatherItemsState } from "@/engine/core/schemes/gather_items/ISchemeGatherItemsState"; -import { readIniBoolean } from "@/engine/core/utils/ini/read"; +import { readIniBoolean } from "@/engine/core/utils/ini/ini_read"; import { LuaLogger } from "@/engine/core/utils/logging"; import { ActionPlanner, ClientObject, EScheme, ESchemeType, IniFile, TSection } from "@/engine/lib/types"; diff --git a/src/engine/core/schemes/hear/IActionSchemeHearState.ts b/src/engine/core/schemes/hear/IActionSchemeHearState.ts index 3ff65e026..8b2eee99d 100644 --- a/src/engine/core/schemes/hear/IActionSchemeHearState.ts +++ b/src/engine/core/schemes/hear/IActionSchemeHearState.ts @@ -1,4 +1,4 @@ -import type { TConditionList } from "@/engine/core/utils/ini/types"; +import type { TConditionList } from "@/engine/core/utils/ini/ini_types"; import type { Optional, TDistance, TName, TRate } from "@/engine/lib/types"; /** diff --git a/src/engine/core/schemes/hear/SchemeHear.ts b/src/engine/core/schemes/hear/SchemeHear.ts index 703ea6828..ff058883a 100644 --- a/src/engine/core/schemes/hear/SchemeHear.ts +++ b/src/engine/core/schemes/hear/SchemeHear.ts @@ -2,10 +2,10 @@ import { getStoryIdByObjectId, IRegistryObjectState, registry } from "@/engine/c import { AbstractScheme } from "@/engine/core/schemes"; import { ISchemeDangerState } from "@/engine/core/schemes/danger"; import { IActionSchemeHearState } from "@/engine/core/schemes/hear/IActionSchemeHearState"; -import { pickSectionFromCondList } from "@/engine/core/utils/ini/config"; -import { parseConditionsList, parseParameters } from "@/engine/core/utils/ini/parse"; +import { pickSectionFromCondList } from "@/engine/core/utils/ini/ini_config"; +import { parseConditionsList, parseParameters } from "@/engine/core/utils/ini/ini_parse"; import { LuaLogger } from "@/engine/core/utils/logging"; -import { switchObjectSchemeToSection } from "@/engine/core/utils/scheme/switch"; +import { switchObjectSchemeToSection } from "@/engine/core/utils/scheme/scheme_switch"; import { mapSoundMaskToSoundType } from "@/engine/core/utils/sound"; import { ESoundType } from "@/engine/lib/constants/sound/sound_type"; import { diff --git a/src/engine/core/schemes/heli_move/HeliCombat.ts b/src/engine/core/schemes/heli_move/HeliCombat.ts index 87587bf92..37110b7bb 100644 --- a/src/engine/core/schemes/heli_move/HeliCombat.ts +++ b/src/engine/core/schemes/heli_move/HeliCombat.ts @@ -12,10 +12,10 @@ import { openLoadMarker } from "@/engine/core/database/save_markers"; import { getHeliHealth } from "@/engine/core/schemes/heli_move/heli_utils"; import { isLevelChanging } from "@/engine/core/utils/check/check"; import { randomChoice } from "@/engine/core/utils/general"; -import { pickSectionFromCondList } from "@/engine/core/utils/ini/config"; -import { parseConditionsList } from "@/engine/core/utils/ini/parse"; -import { readIniBoolean, readIniNumber, readIniString } from "@/engine/core/utils/ini/read"; -import { TConditionList } from "@/engine/core/utils/ini/types"; +import { pickSectionFromCondList } from "@/engine/core/utils/ini/ini_config"; +import { parseConditionsList } from "@/engine/core/utils/ini/ini_parse"; +import { readIniBoolean, readIniNumber, readIniString } from "@/engine/core/utils/ini/ini_read"; +import { TConditionList } from "@/engine/core/utils/ini/ini_types"; import { LuaLogger } from "@/engine/core/utils/logging"; import { copyVector, createEmptyVector, createVector, distanceBetween2d } from "@/engine/core/utils/vector"; import { ACTOR, NIL } from "@/engine/lib/constants/words"; diff --git a/src/engine/core/schemes/heli_move/HelicopterMoveManager.ts b/src/engine/core/schemes/heli_move/HelicopterMoveManager.ts index f0b2258c5..d2a42e451 100644 --- a/src/engine/core/schemes/heli_move/HelicopterMoveManager.ts +++ b/src/engine/core/schemes/heli_move/HelicopterMoveManager.ts @@ -7,8 +7,8 @@ import { getHeliFlyer, HeliFly } from "@/engine/core/schemes/heli_move/HeliFly"; import { getHeliLooker, HeliLook } from "@/engine/core/schemes/heli_move/HeliLook"; import { ISchemeHelicopterMoveState } from "@/engine/core/schemes/heli_move/ISchemeHelicopterMoveState"; import { abort } from "@/engine/core/utils/assertion"; -import { parseWaypointsData } from "@/engine/core/utils/ini/parse"; -import { trySwitchToAnotherSection } from "@/engine/core/utils/scheme/switch"; +import { parseWaypointsData } from "@/engine/core/utils/ini/ini_parse"; +import { trySwitchToAnotherSection } from "@/engine/core/utils/scheme/scheme_switch"; import { ACTOR } from "@/engine/lib/constants/words"; import { ClientObject, Optional, Patrol, TIndex, TName, TRate, Vector } from "@/engine/lib/types"; diff --git a/src/engine/core/schemes/heli_move/SchemeHelicopterMove.ts b/src/engine/core/schemes/heli_move/SchemeHelicopterMove.ts index ba95cb198..c07a70aed 100644 --- a/src/engine/core/schemes/heli_move/SchemeHelicopterMove.ts +++ b/src/engine/core/schemes/heli_move/SchemeHelicopterMove.ts @@ -2,8 +2,8 @@ import { IRegistryObjectState, registry } from "@/engine/core/database"; import { AbstractScheme } from "@/engine/core/schemes/base/AbstractScheme"; import { HelicopterMoveManager } from "@/engine/core/schemes/heli_move/HelicopterMoveManager"; import { ISchemeHelicopterMoveState } from "@/engine/core/schemes/heli_move/ISchemeHelicopterMoveState"; -import { getConfigSwitchConditions } from "@/engine/core/utils/ini/config"; -import { readIniBoolean, readIniNumber, readIniString } from "@/engine/core/utils/ini/read"; +import { getConfigSwitchConditions } from "@/engine/core/utils/ini/ini_config"; +import { readIniBoolean, readIniNumber, readIniString } from "@/engine/core/utils/ini/ini_read"; import { LuaLogger } from "@/engine/core/utils/logging"; import { ClientObject, EScheme, ESchemeType, IniFile, TSection } from "@/engine/lib/types"; diff --git a/src/engine/core/schemes/help_wounded/SchemeHelpWounded.ts b/src/engine/core/schemes/help_wounded/SchemeHelpWounded.ts index f51a09b87..d5d3ff680 100644 --- a/src/engine/core/schemes/help_wounded/SchemeHelpWounded.ts +++ b/src/engine/core/schemes/help_wounded/SchemeHelpWounded.ts @@ -7,7 +7,7 @@ import { ActionHelpWounded } from "@/engine/core/schemes/help_wounded/actions"; import { EvaluatorWoundedExist } from "@/engine/core/schemes/help_wounded/evaluators"; import { ISchemeHelpWoundedState } from "@/engine/core/schemes/help_wounded/ISchemeHelpWoundedState"; import { SchemeWounded } from "@/engine/core/schemes/wounded/SchemeWounded"; -import { readIniBoolean } from "@/engine/core/utils/ini/read"; +import { readIniBoolean } from "@/engine/core/utils/ini/ini_read"; import { LuaLogger } from "@/engine/core/utils/logging"; import { scriptSounds } from "@/engine/lib/constants/sound/script_sounds"; import { ActionPlanner, ClientObject, IniFile, Optional, TNumberId } from "@/engine/lib/types"; diff --git a/src/engine/core/schemes/hit/HitManager.ts b/src/engine/core/schemes/hit/HitManager.ts index 4229cc882..f3085bded 100644 --- a/src/engine/core/schemes/hit/HitManager.ts +++ b/src/engine/core/schemes/hit/HitManager.ts @@ -2,7 +2,7 @@ import { registry } from "@/engine/core/database"; import { AbstractSchemeManager } from "@/engine/core/schemes"; import { ISchemeHitState } from "@/engine/core/schemes/hit/ISchemeHitState"; import { LuaLogger } from "@/engine/core/utils/logging"; -import { trySwitchToAnotherSection } from "@/engine/core/utils/scheme/switch"; +import { trySwitchToAnotherSection } from "@/engine/core/utils/scheme/scheme_switch"; import { ClientObject, EScheme, Optional, TCount, TIndex, Vector } from "@/engine/lib/types"; const logger: LuaLogger = new LuaLogger($filename); diff --git a/src/engine/core/schemes/hit/SchemeHit.ts b/src/engine/core/schemes/hit/SchemeHit.ts index e22f924df..79b18b00d 100644 --- a/src/engine/core/schemes/hit/SchemeHit.ts +++ b/src/engine/core/schemes/hit/SchemeHit.ts @@ -3,7 +3,7 @@ import { AbstractScheme } from "@/engine/core/schemes/base/AbstractScheme"; import { HitManager } from "@/engine/core/schemes/hit/HitManager"; import { ISchemeHitState } from "@/engine/core/schemes/hit/ISchemeHitState"; import { abort } from "@/engine/core/utils/assertion"; -import { getConfigSwitchConditions } from "@/engine/core/utils/ini/config"; +import { getConfigSwitchConditions } from "@/engine/core/utils/ini/ini_config"; import { LuaLogger } from "@/engine/core/utils/logging"; import { ClientObject, EScheme, ESchemeType, IniFile, Optional, TSection } from "@/engine/lib/types"; diff --git a/src/engine/core/schemes/meet/ISchemeMeetState.ts b/src/engine/core/schemes/meet/ISchemeMeetState.ts index 2d8db9d4c..983f1991a 100644 --- a/src/engine/core/schemes/meet/ISchemeMeetState.ts +++ b/src/engine/core/schemes/meet/ISchemeMeetState.ts @@ -1,6 +1,6 @@ import type { IBaseSchemeState } from "@/engine/core/schemes/base"; import type { MeetManager } from "@/engine/core/schemes/meet/MeetManager"; -import type { TConditionList } from "@/engine/core/utils/ini/types"; +import type { TConditionList } from "@/engine/core/utils/ini/ini_types"; import type { Optional, TDistance, TSection } from "@/engine/lib/types"; /** diff --git a/src/engine/core/schemes/mob_combat/MobCombatManager.ts b/src/engine/core/schemes/mob_combat/MobCombatManager.ts index 2f0bf2718..d3b599ab9 100644 --- a/src/engine/core/schemes/mob_combat/MobCombatManager.ts +++ b/src/engine/core/schemes/mob_combat/MobCombatManager.ts @@ -1,7 +1,7 @@ import { registry } from "@/engine/core/database"; import { AbstractSchemeManager } from "@/engine/core/schemes"; import { ISchemeMobCombatState } from "@/engine/core/schemes/mob_combat/ISchemeMobCombatState"; -import { trySwitchToAnotherSection } from "@/engine/core/utils/scheme/switch"; +import { trySwitchToAnotherSection } from "@/engine/core/utils/scheme/scheme_switch"; /** * todo; diff --git a/src/engine/core/schemes/mob_combat/SchemeMobCombat.ts b/src/engine/core/schemes/mob_combat/SchemeMobCombat.ts index 7b0e31fef..1d3937b77 100644 --- a/src/engine/core/schemes/mob_combat/SchemeMobCombat.ts +++ b/src/engine/core/schemes/mob_combat/SchemeMobCombat.ts @@ -2,7 +2,7 @@ import { registry } from "@/engine/core/database"; import { AbstractScheme } from "@/engine/core/schemes/base"; import { ISchemeMobCombatState } from "@/engine/core/schemes/mob_combat/ISchemeMobCombatState"; import { MobCombatManager } from "@/engine/core/schemes/mob_combat/MobCombatManager"; -import { getConfigSwitchConditions } from "@/engine/core/utils/ini/config"; +import { getConfigSwitchConditions } from "@/engine/core/utils/ini/ini_config"; import { LuaLogger } from "@/engine/core/utils/logging"; import { ClientObject, EScheme, ESchemeType, IniFile, Optional, TSection } from "@/engine/lib/types"; diff --git a/src/engine/core/schemes/mob_death/MobDeathManager.ts b/src/engine/core/schemes/mob_death/MobDeathManager.ts index b2c03ccad..ecfd147e3 100644 --- a/src/engine/core/schemes/mob_death/MobDeathManager.ts +++ b/src/engine/core/schemes/mob_death/MobDeathManager.ts @@ -2,7 +2,7 @@ import { registry } from "@/engine/core/database"; import { AbstractSchemeManager } from "@/engine/core/schemes/base"; import { ISchemeDeathState } from "@/engine/core/schemes/death"; import { ISchemeMobDeathState } from "@/engine/core/schemes/mob_death/ISchemeMobDeathState"; -import { trySwitchToAnotherSection } from "@/engine/core/utils/scheme/switch"; +import { trySwitchToAnotherSection } from "@/engine/core/utils/scheme/scheme_switch"; import { ClientObject, EScheme, Optional } from "@/engine/lib/types"; /** diff --git a/src/engine/core/schemes/mob_death/SchemeMobDeath.ts b/src/engine/core/schemes/mob_death/SchemeMobDeath.ts index d108fd8a3..b5fce0f61 100644 --- a/src/engine/core/schemes/mob_death/SchemeMobDeath.ts +++ b/src/engine/core/schemes/mob_death/SchemeMobDeath.ts @@ -1,7 +1,7 @@ import { AbstractScheme } from "@/engine/core/schemes/base"; import { ISchemeMobDeathState } from "@/engine/core/schemes/mob_death/ISchemeMobDeathState"; import { MobDeathManager } from "@/engine/core/schemes/mob_death/MobDeathManager"; -import { getConfigSwitchConditions } from "@/engine/core/utils/ini/config"; +import { getConfigSwitchConditions } from "@/engine/core/utils/ini/ini_config"; import { LuaLogger } from "@/engine/core/utils/logging"; import { ClientObject, EScheme, ESchemeType, IniFile, TSection } from "@/engine/lib/types"; diff --git a/src/engine/core/schemes/mob_home/MobHomeManager.ts b/src/engine/core/schemes/mob_home/MobHomeManager.ts index 29f51b501..abae4764b 100644 --- a/src/engine/core/schemes/mob_home/MobHomeManager.ts +++ b/src/engine/core/schemes/mob_home/MobHomeManager.ts @@ -5,8 +5,8 @@ import { SmartTerrain } from "@/engine/core/objects"; import { AbstractSchemeManager } from "@/engine/core/schemes"; import { ISchemeMobHomeState } from "@/engine/core/schemes/mob_home/ISchemeMobHomeState"; import { assert } from "@/engine/core/utils/assertion"; -import { parseWaypointData } from "@/engine/core/utils/ini/parse"; -import { IWaypointData } from "@/engine/core/utils/ini/types"; +import { parseWaypointData } from "@/engine/core/utils/ini/ini_parse"; +import { IWaypointData } from "@/engine/core/utils/ini/ini_types"; import { LuaLogger } from "@/engine/core/utils/logging"; import { Optional, Patrol, ServerCreatureObject, TDistance, TName, TNumberId } from "@/engine/lib/types"; diff --git a/src/engine/core/schemes/mob_home/SchemeMobHome.test.ts b/src/engine/core/schemes/mob_home/SchemeMobHome.test.ts index 71e32903b..d9336b6aa 100644 --- a/src/engine/core/schemes/mob_home/SchemeMobHome.test.ts +++ b/src/engine/core/schemes/mob_home/SchemeMobHome.test.ts @@ -3,7 +3,7 @@ import { describe, expect, it } from "@jest/globals"; import { IRegistryObjectState, registerObject, registry } from "@/engine/core/database"; import { ISchemeMobHomeState } from "@/engine/core/schemes/mob_home/ISchemeMobHomeState"; import { SchemeMobHome } from "@/engine/core/schemes/mob_home/SchemeMobHome"; -import { loadSchemeImplementation } from "@/engine/core/utils/scheme/setup"; +import { loadSchemeImplementation } from "@/engine/core/utils/scheme/scheme_setup"; import { ClientObject, EScheme, ESchemeType, IniFile } from "@/engine/lib/types"; import { mockClientGameObject, mockIniFile } from "@/fixtures/xray"; diff --git a/src/engine/core/schemes/mob_home/SchemeMobHome.ts b/src/engine/core/schemes/mob_home/SchemeMobHome.ts index c785caec5..3f5407532 100644 --- a/src/engine/core/schemes/mob_home/SchemeMobHome.ts +++ b/src/engine/core/schemes/mob_home/SchemeMobHome.ts @@ -2,8 +2,8 @@ import { getMonsterState } from "@/engine/core/database"; import { AbstractScheme } from "@/engine/core/schemes/base/AbstractScheme"; import { ISchemeMobHomeState } from "@/engine/core/schemes/mob_home/ISchemeMobHomeState"; import { MobHomeManager } from "@/engine/core/schemes/mob_home/MobHomeManager"; -import { getConfigSwitchConditions } from "@/engine/core/utils/ini/config"; -import { readIniBoolean, readIniNumber, readIniString } from "@/engine/core/utils/ini/read"; +import { getConfigSwitchConditions } from "@/engine/core/utils/ini/ini_config"; +import { readIniBoolean, readIniNumber, readIniString } from "@/engine/core/utils/ini/ini_read"; import { LuaLogger } from "@/engine/core/utils/logging"; import { ClientObject, EScheme, ESchemeType, IniFile, TName, TSection } from "@/engine/lib/types"; diff --git a/src/engine/core/schemes/mob_jump/MobJumpManager.ts b/src/engine/core/schemes/mob_jump/MobJumpManager.ts index 3eb92b9d2..6936a81c9 100644 --- a/src/engine/core/schemes/mob_jump/MobJumpManager.ts +++ b/src/engine/core/schemes/mob_jump/MobJumpManager.ts @@ -3,7 +3,7 @@ import { cond, look, patrol } from "xray16"; import { AbstractSchemeManager } from "@/engine/core/schemes"; import { ISchemeMobJumpState } from "@/engine/core/schemes/mob_jump/ISchemeMobJumpState"; import { abort } from "@/engine/core/utils/assertion"; -import { action } from "@/engine/core/utils/object/object_general"; +import { action } from "@/engine/core/utils/object/object_action"; import { scriptCaptureMonster, scriptReleaseMonster } from "@/engine/core/utils/scheme"; import { addVectors } from "@/engine/core/utils/vector"; import { Optional, Patrol, Vector } from "@/engine/lib/types"; diff --git a/src/engine/core/schemes/mob_jump/SchemeMobJump.ts b/src/engine/core/schemes/mob_jump/SchemeMobJump.ts index f85bf3d21..2d2c7c358 100644 --- a/src/engine/core/schemes/mob_jump/SchemeMobJump.ts +++ b/src/engine/core/schemes/mob_jump/SchemeMobJump.ts @@ -2,9 +2,9 @@ import { AbstractScheme } from "@/engine/core/schemes/base"; import { ISchemeMobJumpState } from "@/engine/core/schemes/mob_jump/ISchemeMobJumpState"; import { MobJumpManager } from "@/engine/core/schemes/mob_jump/MobJumpManager"; import { assert } from "@/engine/core/utils/assertion"; -import { getConfigSwitchConditions } from "@/engine/core/utils/ini/config"; -import { parseStringsList } from "@/engine/core/utils/ini/parse"; -import { readIniNumber, readIniString } from "@/engine/core/utils/ini/read"; +import { getConfigSwitchConditions } from "@/engine/core/utils/ini/ini_config"; +import { parseStringsList } from "@/engine/core/utils/ini/ini_parse"; +import { readIniNumber, readIniString } from "@/engine/core/utils/ini/ini_read"; import { LuaLogger } from "@/engine/core/utils/logging"; import { createVector } from "@/engine/core/utils/vector"; import { ClientObject, EScheme, ESchemeType, IniFile, LuaArray, TSection } from "@/engine/lib/types"; diff --git a/src/engine/core/schemes/mob_remark/MobRemarkManager.ts b/src/engine/core/schemes/mob_remark/MobRemarkManager.ts index ccf17b377..c9f2ca6e8 100644 --- a/src/engine/core/schemes/mob_remark/MobRemarkManager.ts +++ b/src/engine/core/schemes/mob_remark/MobRemarkManager.ts @@ -6,10 +6,10 @@ import { AbstractSchemeManager } from "@/engine/core/schemes"; import { ISchemeMobRemarkState } from "@/engine/core/schemes/mob_remark/ISchemeMobRemarkState"; import { abort } from "@/engine/core/utils/assertion"; import { getExtern } from "@/engine/core/utils/binding"; -import { pickSectionFromCondList } from "@/engine/core/utils/ini/config"; -import { parseStringsList } from "@/engine/core/utils/ini/parse"; -import { action } from "@/engine/core/utils/object/object_general"; -import { scriptCaptureMonster } from "@/engine/core/utils/scheme/monster"; +import { pickSectionFromCondList } from "@/engine/core/utils/ini/ini_config"; +import { parseStringsList } from "@/engine/core/utils/ini/ini_parse"; +import { action } from "@/engine/core/utils/object/object_action"; +import { scriptCaptureMonster } from "@/engine/core/utils/scheme/scheme_monster"; import { AnyCallablesModule, LuaArray, MonsterBodyStateKey, Optional, TName } from "@/engine/lib/types"; /** diff --git a/src/engine/core/schemes/mob_remark/SchemeMobRemark.ts b/src/engine/core/schemes/mob_remark/SchemeMobRemark.ts index 7bba1d8f8..4387f90f9 100644 --- a/src/engine/core/schemes/mob_remark/SchemeMobRemark.ts +++ b/src/engine/core/schemes/mob_remark/SchemeMobRemark.ts @@ -2,8 +2,8 @@ import { getMonsterState } from "@/engine/core/database"; import { AbstractScheme } from "@/engine/core/schemes/base/AbstractScheme"; import { ISchemeMobRemarkState } from "@/engine/core/schemes/mob_remark/ISchemeMobRemarkState"; import { MobRemarkManager } from "@/engine/core/schemes/mob_remark/MobRemarkManager"; -import { getConfigSwitchConditions } from "@/engine/core/utils/ini/config"; -import { readIniBoolean, readIniConditionList, readIniString } from "@/engine/core/utils/ini/read"; +import { getConfigSwitchConditions } from "@/engine/core/utils/ini/ini_config"; +import { readIniBoolean, readIniConditionList, readIniString } from "@/engine/core/utils/ini/ini_read"; import { LuaLogger } from "@/engine/core/utils/logging"; import { ClientObject, IniFile } from "@/engine/lib/types"; import { EScheme, ESchemeType, TSection } from "@/engine/lib/types/scheme"; diff --git a/src/engine/core/schemes/mob_walker/ISchemeMobWalkerState.ts b/src/engine/core/schemes/mob_walker/ISchemeMobWalkerState.ts index b6b08ae4e..28295765b 100644 --- a/src/engine/core/schemes/mob_walker/ISchemeMobWalkerState.ts +++ b/src/engine/core/schemes/mob_walker/ISchemeMobWalkerState.ts @@ -1,5 +1,5 @@ import type { IBaseSchemeState } from "@/engine/core/schemes/base"; -import type { IWaypointData } from "@/engine/core/utils/ini/types"; +import type { IWaypointData } from "@/engine/core/utils/ini/ini_types"; import type { EMonsterState } from "@/engine/lib/constants/monsters"; import type { LuaArray, Optional } from "@/engine/lib/types"; diff --git a/src/engine/core/schemes/mob_walker/MobWalkerManager.ts b/src/engine/core/schemes/mob_walker/MobWalkerManager.ts index 2c00a0e1d..88756953e 100644 --- a/src/engine/core/schemes/mob_walker/MobWalkerManager.ts +++ b/src/engine/core/schemes/mob_walker/MobWalkerManager.ts @@ -5,11 +5,10 @@ import { StalkerMoveManager } from "@/engine/core/objects/state/StalkerMoveManag import { AbstractSchemeManager } from "@/engine/core/schemes/base"; import { ISchemeMobWalkerState } from "@/engine/core/schemes/mob_walker/ISchemeMobWalkerState"; import { abort } from "@/engine/core/utils/assertion"; -import { parseWaypointsData, pickSectionFromCondList } from "@/engine/core/utils/ini"; -import { IWaypointData } from "@/engine/core/utils/ini/types"; -import { action } from "@/engine/core/utils/object/object_general"; +import { IWaypointData, parseWaypointsData, pickSectionFromCondList } from "@/engine/core/utils/ini"; +import { action } from "@/engine/core/utils/object/object_action"; import { isStalkerAtWaypoint } from "@/engine/core/utils/position"; -import { isMonsterScriptCaptured, scriptCaptureMonster } from "@/engine/core/utils/scheme/monster"; +import { isMonsterScriptCaptured, scriptCaptureMonster } from "@/engine/core/utils/scheme/scheme_monster"; import { copyVector } from "@/engine/core/utils/vector"; import { EMonsterState } from "@/engine/lib/constants/monsters"; import { NIL, TRUE } from "@/engine/lib/constants/words"; diff --git a/src/engine/core/schemes/mob_walker/SchemeMobWalker.ts b/src/engine/core/schemes/mob_walker/SchemeMobWalker.ts index 9841b51e2..452dab3af 100644 --- a/src/engine/core/schemes/mob_walker/SchemeMobWalker.ts +++ b/src/engine/core/schemes/mob_walker/SchemeMobWalker.ts @@ -3,8 +3,8 @@ import { AbstractScheme } from "@/engine/core/schemes"; import { ISchemeMobWalkerState } from "@/engine/core/schemes/mob_walker/ISchemeMobWalkerState"; import { MobWalkerManager } from "@/engine/core/schemes/mob_walker/MobWalkerManager"; import { abort } from "@/engine/core/utils/assertion"; -import { getConfigSwitchConditions } from "@/engine/core/utils/ini/config"; -import { readIniBoolean, readIniString } from "@/engine/core/utils/ini/read"; +import { getConfigSwitchConditions } from "@/engine/core/utils/ini/ini_config"; +import { readIniBoolean, readIniString } from "@/engine/core/utils/ini/ini_read"; import { LuaLogger } from "@/engine/core/utils/logging"; import { ClientObject, EScheme, ESchemeType, IniFile, TName, TSection } from "@/engine/lib/types"; diff --git a/src/engine/core/schemes/patrol/ISchemePatrolState.ts b/src/engine/core/schemes/patrol/ISchemePatrolState.ts index a9df01b1a..647403e48 100644 --- a/src/engine/core/schemes/patrol/ISchemePatrolState.ts +++ b/src/engine/core/schemes/patrol/ISchemePatrolState.ts @@ -1,5 +1,5 @@ import type { IBaseSchemeState } from "@/engine/core/schemes/base"; -import type { IWaypointData } from "@/engine/core/utils/ini/types"; +import type { IWaypointData } from "@/engine/core/utils/ini/ini_types"; import type { LuaArray, Optional } from "@/engine/lib/types"; /** diff --git a/src/engine/core/schemes/patrol/SchemePatrol.ts b/src/engine/core/schemes/patrol/SchemePatrol.ts index 6d55d95be..c12b80332 100644 --- a/src/engine/core/schemes/patrol/SchemePatrol.ts +++ b/src/engine/core/schemes/patrol/SchemePatrol.ts @@ -8,11 +8,10 @@ import { EvaluatorPatrolComm, EvaluatorPatrolEnd } from "@/engine/core/schemes/p import { ISchemePatrolState } from "@/engine/core/schemes/patrol/ISchemePatrolState"; import { PatrolManager } from "@/engine/core/schemes/patrol/PatrolManager"; import { abort } from "@/engine/core/utils/assertion"; -import { getConfigSwitchConditions } from "@/engine/core/utils/ini/config"; -import { readIniBoolean, readIniString } from "@/engine/core/utils/ini/read"; +import { getConfigSwitchConditions, readIniBoolean, readIniString } from "@/engine/core/utils/ini"; import { LuaLogger } from "@/engine/core/utils/logging"; -import { getObjectSquad } from "@/engine/core/utils/object/object_general"; -import { addCommonActionPreconditions } from "@/engine/core/utils/scheme/setup"; +import { getObjectSquad } from "@/engine/core/utils/object"; +import { addCommonActionPreconditions } from "@/engine/core/utils/scheme/scheme_setup"; import { ActionPlanner, ClientObject, IniFile, Optional, TName } from "@/engine/lib/types"; import { EScheme, ESchemeType, TSection } from "@/engine/lib/types/scheme"; diff --git a/src/engine/core/schemes/patrol/actions/ActionCommander.ts b/src/engine/core/schemes/patrol/actions/ActionCommander.ts index cc3d7c861..c948a7950 100644 --- a/src/engine/core/schemes/patrol/actions/ActionCommander.ts +++ b/src/engine/core/schemes/patrol/actions/ActionCommander.ts @@ -5,7 +5,7 @@ import { GlobalSoundManager } from "@/engine/core/managers/sounds/GlobalSoundMan import { EStalkerState } from "@/engine/core/objects/state"; import { StalkerMoveManager } from "@/engine/core/objects/state/StalkerMoveManager"; import { ISchemePatrolState } from "@/engine/core/schemes/patrol"; -import { parseWaypointsData } from "@/engine/core/utils/ini/parse"; +import { parseWaypointsData } from "@/engine/core/utils/ini/ini_parse"; import { ClientObject, Optional } from "@/engine/lib/types"; /** diff --git a/src/engine/core/schemes/patrol/actions/ActionPatrol.ts b/src/engine/core/schemes/patrol/actions/ActionPatrol.ts index 284b7a9fb..8da8e5282 100644 --- a/src/engine/core/schemes/patrol/actions/ActionPatrol.ts +++ b/src/engine/core/schemes/patrol/actions/ActionPatrol.ts @@ -4,9 +4,9 @@ import { registry, setStalkerState } from "@/engine/core/database"; import { EStalkerState } from "@/engine/core/objects/state"; import { StalkerMoveManager } from "@/engine/core/objects/state/StalkerMoveManager"; import { ISchemePatrolState } from "@/engine/core/schemes/patrol"; -import { parseWaypointsData } from "@/engine/core/utils/ini/parse"; +import { parseWaypointsData } from "@/engine/core/utils/ini"; import { LuaLogger } from "@/engine/core/utils/logging"; -import { sendToNearestAccessibleVertex } from "@/engine/core/utils/object/object_general"; +import { sendToNearestAccessibleVertex } from "@/engine/core/utils/object/object_location"; import { areSameVectors, createEmptyVector, createVector } from "@/engine/core/utils/vector"; import { ClientObject, EClientObjectPath, TDistance, TNumberId, TTimestamp, Vector } from "@/engine/lib/types"; diff --git a/src/engine/core/schemes/ph_button/ISchemePhysicalButtonState.ts b/src/engine/core/schemes/ph_button/ISchemePhysicalButtonState.ts index 8f3e5dfc3..3b393c411 100644 --- a/src/engine/core/schemes/ph_button/ISchemePhysicalButtonState.ts +++ b/src/engine/core/schemes/ph_button/ISchemePhysicalButtonState.ts @@ -1,5 +1,5 @@ import { IBaseSchemeState } from "@/engine/core/schemes/base"; -import { IConfigSwitchConditionsDescriptor } from "@/engine/core/utils/ini/types"; +import { IConfigSwitchConditionsDescriptor } from "@/engine/core/utils/ini/ini_types"; import { Optional, TLabel } from "@/engine/lib/types"; /** diff --git a/src/engine/core/schemes/ph_button/PhysicalButtonManager.ts b/src/engine/core/schemes/ph_button/PhysicalButtonManager.ts index 4a4f51142..738fe8a77 100644 --- a/src/engine/core/schemes/ph_button/PhysicalButtonManager.ts +++ b/src/engine/core/schemes/ph_button/PhysicalButtonManager.ts @@ -4,9 +4,9 @@ import { registry } from "@/engine/core/database"; import { AbstractSchemeManager } from "@/engine/core/schemes"; import { ISchemePhysicalButtonState } from "@/engine/core/schemes/ph_button/ISchemePhysicalButtonState"; import { isActiveSection } from "@/engine/core/utils/check/is"; -import { pickSectionFromCondList } from "@/engine/core/utils/ini/config"; +import { pickSectionFromCondList } from "@/engine/core/utils/ini/ini_config"; import { LuaLogger } from "@/engine/core/utils/logging"; -import { switchObjectSchemeToSection, trySwitchToAnotherSection } from "@/engine/core/utils/scheme/switch"; +import { switchObjectSchemeToSection, trySwitchToAnotherSection } from "@/engine/core/utils/scheme/scheme_switch"; import { ClientObject, Optional, TIndex, TRate, TTimestamp, Vector } from "@/engine/lib/types"; const logger: LuaLogger = new LuaLogger($filename); diff --git a/src/engine/core/schemes/ph_button/SchemePhysicalButton.ts b/src/engine/core/schemes/ph_button/SchemePhysicalButton.ts index 42f1e49ba..8f30757c3 100644 --- a/src/engine/core/schemes/ph_button/SchemePhysicalButton.ts +++ b/src/engine/core/schemes/ph_button/SchemePhysicalButton.ts @@ -1,8 +1,8 @@ import { AbstractScheme } from "@/engine/core/schemes/base/AbstractScheme"; import { ISchemePhysicalButtonState } from "@/engine/core/schemes/ph_button/ISchemePhysicalButtonState"; import { PhysicalButtonManager } from "@/engine/core/schemes/ph_button/PhysicalButtonManager"; -import { getConfigSwitchConditions } from "@/engine/core/utils/ini/config"; -import { readIniBoolean, readIniConditionList, readIniString } from "@/engine/core/utils/ini/read"; +import { getConfigSwitchConditions } from "@/engine/core/utils/ini/ini_config"; +import { readIniBoolean, readIniConditionList, readIniString } from "@/engine/core/utils/ini/ini_read"; import { LuaLogger } from "@/engine/core/utils/logging"; import { ClientObject, EScheme, ESchemeType, IniFile, TSection } from "@/engine/lib/types"; diff --git a/src/engine/core/schemes/ph_code/CodeManager.ts b/src/engine/core/schemes/ph_code/CodeManager.ts index bf998878d..dad0267f9 100644 --- a/src/engine/core/schemes/ph_code/CodeManager.ts +++ b/src/engine/core/schemes/ph_code/CodeManager.ts @@ -2,7 +2,7 @@ import { registry } from "@/engine/core/database"; import { AbstractSchemeManager } from "@/engine/core/schemes"; import { ISchemeCodeState } from "@/engine/core/schemes/ph_code/ISchemeCodeState"; import { NumPadWindow } from "@/engine/core/ui/game/NumPadWindow"; -import { pickSectionFromCondList } from "@/engine/core/utils/ini/config"; +import { pickSectionFromCondList } from "@/engine/core/utils/ini/ini_config"; import { ClientObject, TLabel } from "@/engine/lib/types"; /** diff --git a/src/engine/core/schemes/ph_code/ISchemeCodeState.ts b/src/engine/core/schemes/ph_code/ISchemeCodeState.ts index f8b28f4e8..64819d68b 100644 --- a/src/engine/core/schemes/ph_code/ISchemeCodeState.ts +++ b/src/engine/core/schemes/ph_code/ISchemeCodeState.ts @@ -1,5 +1,5 @@ import type { IBaseSchemeState } from "@/engine/core/schemes/base"; -import type { IConfigSwitchConditionsDescriptor, TConditionList } from "@/engine/core/utils/ini/types"; +import type { IConfigSwitchConditionsDescriptor, TConditionList } from "@/engine/core/utils/ini/ini_types"; import type { Optional, TLabel, TName } from "@/engine/lib/types"; /** diff --git a/src/engine/core/schemes/ph_code/SchemeCode.ts b/src/engine/core/schemes/ph_code/SchemeCode.ts index fe42fd463..5a0c321eb 100644 --- a/src/engine/core/schemes/ph_code/SchemeCode.ts +++ b/src/engine/core/schemes/ph_code/SchemeCode.ts @@ -2,13 +2,13 @@ import { IBaseSchemeLogic } from "@/engine/core/schemes"; import { AbstractScheme } from "@/engine/core/schemes/base/AbstractScheme"; import { CodeManager } from "@/engine/core/schemes/ph_code/CodeManager"; import { ISchemeCodeState } from "@/engine/core/schemes/ph_code/ISchemeCodeState"; -import { getConfigSwitchConditions } from "@/engine/core/utils/ini/config"; +import { getConfigSwitchConditions } from "@/engine/core/utils/ini/ini_config"; import { readIniConditionList, readIniNumber, readIniString, readIniStringAndCondList, -} from "@/engine/core/utils/ini/read"; +} from "@/engine/core/utils/ini/ini_read"; import { LuaLogger } from "@/engine/core/utils/logging"; import { ClientObject, EScheme, ESchemeType, IniFile, Optional, TIndex, TName, TSection } from "@/engine/lib/types"; diff --git a/src/engine/core/schemes/ph_door/ISchemePhysicalDoorState.ts b/src/engine/core/schemes/ph_door/ISchemePhysicalDoorState.ts index 9dbbb5c56..ca150f051 100644 --- a/src/engine/core/schemes/ph_door/ISchemePhysicalDoorState.ts +++ b/src/engine/core/schemes/ph_door/ISchemePhysicalDoorState.ts @@ -1,5 +1,5 @@ import type { IBaseSchemeState } from "@/engine/core/schemes/base"; -import type { IBoneStateDescriptor, IConfigSwitchConditionsDescriptor } from "@/engine/core/utils/ini/types"; +import type { IBoneStateDescriptor, IConfigSwitchConditionsDescriptor } from "@/engine/core/utils/ini/ini_types"; import type { LuaArray, Optional, TLabel } from "@/engine/lib/types"; /** diff --git a/src/engine/core/schemes/ph_door/PhysicalDoorManager.ts b/src/engine/core/schemes/ph_door/PhysicalDoorManager.ts index d867bb79b..58ec9c170 100644 --- a/src/engine/core/schemes/ph_door/PhysicalDoorManager.ts +++ b/src/engine/core/schemes/ph_door/PhysicalDoorManager.ts @@ -3,8 +3,8 @@ import { GlobalSoundManager } from "@/engine/core/managers/sounds/GlobalSoundMan import { AbstractSchemeManager } from "@/engine/core/schemes"; import { ISchemePhysicalDoorState } from "@/engine/core/schemes/ph_door/ISchemePhysicalDoorState"; import { abort } from "@/engine/core/utils/assertion"; -import { pickSectionFromCondList } from "@/engine/core/utils/ini/config"; -import { switchObjectSchemeToSection, trySwitchToAnotherSection } from "@/engine/core/utils/scheme/switch"; +import { pickSectionFromCondList } from "@/engine/core/utils/ini/ini_config"; +import { switchObjectSchemeToSection, trySwitchToAnotherSection } from "@/engine/core/utils/scheme/scheme_switch"; import { ClientObject, Optional, diff --git a/src/engine/core/schemes/ph_door/SchemePhysicalDoor.ts b/src/engine/core/schemes/ph_door/SchemePhysicalDoor.ts index eaae65284..744a09400 100644 --- a/src/engine/core/schemes/ph_door/SchemePhysicalDoor.ts +++ b/src/engine/core/schemes/ph_door/SchemePhysicalDoor.ts @@ -1,9 +1,9 @@ import { AbstractScheme } from "@/engine/core/schemes/base"; import { ISchemePhysicalDoorState } from "@/engine/core/schemes/ph_door/ISchemePhysicalDoorState"; import { PhysicalDoorManager } from "@/engine/core/schemes/ph_door/PhysicalDoorManager"; -import { getConfigSwitchConditions } from "@/engine/core/utils/ini/config"; -import { parseBoneStateDescriptors } from "@/engine/core/utils/ini/parse"; -import { readIniBoolean, readIniConditionList, readIniString } from "@/engine/core/utils/ini/read"; +import { getConfigSwitchConditions } from "@/engine/core/utils/ini/ini_config"; +import { parseBoneStateDescriptors } from "@/engine/core/utils/ini/ini_parse"; +import { readIniBoolean, readIniConditionList, readIniString } from "@/engine/core/utils/ini/ini_read"; import { LuaLogger } from "@/engine/core/utils/logging"; import { ClientObject, IniFile } from "@/engine/lib/types"; import { EScheme, ESchemeType, TSection } from "@/engine/lib/types/scheme"; diff --git a/src/engine/core/schemes/ph_force/PhysicalForceManager.ts b/src/engine/core/schemes/ph_force/PhysicalForceManager.ts index 718e9510b..5ca5fb26c 100644 --- a/src/engine/core/schemes/ph_force/PhysicalForceManager.ts +++ b/src/engine/core/schemes/ph_force/PhysicalForceManager.ts @@ -2,7 +2,7 @@ import { time_global } from "xray16"; import { AbstractSchemeManager } from "@/engine/core/schemes"; import { ISchemePhysicalForceState } from "@/engine/core/schemes/ph_force/ISchemePhysicalForceState"; -import { trySwitchToAnotherSection } from "@/engine/core/utils/scheme/switch"; +import { trySwitchToAnotherSection } from "@/engine/core/utils/scheme/scheme_switch"; import { Vector } from "@/engine/lib/types"; /** diff --git a/src/engine/core/schemes/ph_force/SchemePhysicalForce.ts b/src/engine/core/schemes/ph_force/SchemePhysicalForce.ts index beb6c9335..c0f4f2f70 100644 --- a/src/engine/core/schemes/ph_force/SchemePhysicalForce.ts +++ b/src/engine/core/schemes/ph_force/SchemePhysicalForce.ts @@ -4,8 +4,8 @@ import { AbstractScheme } from "@/engine/core/schemes/base"; import { ISchemePhysicalForceState } from "@/engine/core/schemes/ph_force/ISchemePhysicalForceState"; import { PhysicalForceManager } from "@/engine/core/schemes/ph_force/PhysicalForceManager"; import { abort } from "@/engine/core/utils/assertion"; -import { getConfigSwitchConditions } from "@/engine/core/utils/ini/config"; -import { readIniNumber, readIniString } from "@/engine/core/utils/ini/read"; +import { getConfigSwitchConditions } from "@/engine/core/utils/ini/ini_config"; +import { readIniNumber, readIniString } from "@/engine/core/utils/ini/ini_read"; import { LuaLogger } from "@/engine/core/utils/logging"; import { ClientObject, EScheme, ESchemeType, IniFile, TSection } from "@/engine/lib/types"; diff --git a/src/engine/core/schemes/ph_hit/PhysicalHitManager.ts b/src/engine/core/schemes/ph_hit/PhysicalHitManager.ts index 3f4f87434..5927c95db 100644 --- a/src/engine/core/schemes/ph_hit/PhysicalHitManager.ts +++ b/src/engine/core/schemes/ph_hit/PhysicalHitManager.ts @@ -2,7 +2,7 @@ import { hit, patrol } from "xray16"; import { AbstractSchemeManager } from "@/engine/core/schemes"; import { ISchemePhysicalHitState } from "@/engine/core/schemes/ph_hit/ISchemePhysicalHitState"; -import { trySwitchToAnotherSection } from "@/engine/core/utils/scheme/switch"; +import { trySwitchToAnotherSection } from "@/engine/core/utils/scheme/scheme_switch"; import { copyVector } from "@/engine/core/utils/vector"; import { Hit, Vector } from "@/engine/lib/types"; diff --git a/src/engine/core/schemes/ph_hit/SchemePhysicalHit.ts b/src/engine/core/schemes/ph_hit/SchemePhysicalHit.ts index 1fb751760..a53d94ab5 100644 --- a/src/engine/core/schemes/ph_hit/SchemePhysicalHit.ts +++ b/src/engine/core/schemes/ph_hit/SchemePhysicalHit.ts @@ -1,8 +1,8 @@ import { AbstractScheme } from "@/engine/core/schemes/base"; import { ISchemePhysicalHitState } from "@/engine/core/schemes/ph_hit/ISchemePhysicalHitState"; import { PhysicalHitManager } from "@/engine/core/schemes/ph_hit/PhysicalHitManager"; -import { getConfigSwitchConditions } from "@/engine/core/utils/ini/config"; -import { readIniNumber, readIniString } from "@/engine/core/utils/ini/read"; +import { getConfigSwitchConditions } from "@/engine/core/utils/ini/ini_config"; +import { readIniNumber, readIniString } from "@/engine/core/utils/ini/ini_read"; import { LuaLogger } from "@/engine/core/utils/logging"; import { ClientObject, EScheme, ESchemeType, IniFile, TSection } from "@/engine/lib/types"; diff --git a/src/engine/core/schemes/ph_idle/ISchemePhysicalIdleState.ts b/src/engine/core/schemes/ph_idle/ISchemePhysicalIdleState.ts index ad7081f3b..34babd9c3 100644 --- a/src/engine/core/schemes/ph_idle/ISchemePhysicalIdleState.ts +++ b/src/engine/core/schemes/ph_idle/ISchemePhysicalIdleState.ts @@ -1,5 +1,5 @@ import type { IBaseSchemeLogic, IBaseSchemeState } from "@/engine/core/schemes/base"; -import type { IBoneStateDescriptor } from "@/engine/core/utils/ini/types"; +import type { IBoneStateDescriptor } from "@/engine/core/utils/ini/ini_types"; import type { LuaArray, Optional } from "@/engine/lib/types"; /** diff --git a/src/engine/core/schemes/ph_idle/PhysicalIdleManager.ts b/src/engine/core/schemes/ph_idle/PhysicalIdleManager.ts index 9e46a5405..68e8fef7b 100644 --- a/src/engine/core/schemes/ph_idle/PhysicalIdleManager.ts +++ b/src/engine/core/schemes/ph_idle/PhysicalIdleManager.ts @@ -1,10 +1,10 @@ import { registry } from "@/engine/core/database"; import { AbstractSchemeManager } from "@/engine/core/schemes/base"; import { ISchemePhysicalIdleState } from "@/engine/core/schemes/ph_idle/ISchemePhysicalIdleState"; -import { pickSectionFromCondList } from "@/engine/core/utils/ini/config"; -import { TConditionList } from "@/engine/core/utils/ini/types"; +import { pickSectionFromCondList } from "@/engine/core/utils/ini/ini_config"; +import { TConditionList } from "@/engine/core/utils/ini/ini_types"; import { LuaLogger } from "@/engine/core/utils/logging"; -import { switchObjectSchemeToSection, trySwitchToAnotherSection } from "@/engine/core/utils/scheme/switch"; +import { switchObjectSchemeToSection, trySwitchToAnotherSection } from "@/engine/core/utils/scheme/scheme_switch"; import { ClientObject, Optional, TCount, TIndex, TSection, Vector } from "@/engine/lib/types"; const logger: LuaLogger = new LuaLogger($filename); diff --git a/src/engine/core/schemes/ph_idle/SchemePhysicalIdle.ts b/src/engine/core/schemes/ph_idle/SchemePhysicalIdle.ts index 05ad4cd13..eb637a6b6 100644 --- a/src/engine/core/schemes/ph_idle/SchemePhysicalIdle.ts +++ b/src/engine/core/schemes/ph_idle/SchemePhysicalIdle.ts @@ -1,9 +1,9 @@ import { AbstractScheme } from "@/engine/core/schemes/base"; import { ISchemePhysicalIdleState } from "@/engine/core/schemes/ph_idle/ISchemePhysicalIdleState"; import { PhysicalIdleManager } from "@/engine/core/schemes/ph_idle/PhysicalIdleManager"; -import { getConfigSwitchConditions } from "@/engine/core/utils/ini/config"; -import { parseBoneStateDescriptors } from "@/engine/core/utils/ini/parse"; -import { readIniBoolean, readIniConditionList, readIniString } from "@/engine/core/utils/ini/read"; +import { getConfigSwitchConditions } from "@/engine/core/utils/ini/ini_config"; +import { parseBoneStateDescriptors } from "@/engine/core/utils/ini/ini_parse"; +import { readIniBoolean, readIniConditionList, readIniString } from "@/engine/core/utils/ini/ini_read"; import { LuaLogger } from "@/engine/core/utils/logging"; import { ClientObject, EScheme, ESchemeType, IniFile, TSection } from "@/engine/lib/types"; diff --git a/src/engine/core/schemes/ph_minigun/SchemeMinigun.ts b/src/engine/core/schemes/ph_minigun/SchemeMinigun.ts index 7a38f9cf8..f5a8d0073 100644 --- a/src/engine/core/schemes/ph_minigun/SchemeMinigun.ts +++ b/src/engine/core/schemes/ph_minigun/SchemeMinigun.ts @@ -1,8 +1,13 @@ import { AbstractScheme } from "@/engine/core/schemes/base"; import { ISchemeMinigunState } from "@/engine/core/schemes/ph_minigun/ISchemeMinigunState"; import { MinigunManager } from "@/engine/core/schemes/ph_minigun/MinigunManager"; -import { getConfigSwitchConditions } from "@/engine/core/utils/ini/config"; -import { readIniBoolean, readIniNumber, readIniString, readIniStringAndCondList } from "@/engine/core/utils/ini/read"; +import { getConfigSwitchConditions } from "@/engine/core/utils/ini/ini_config"; +import { + readIniBoolean, + readIniNumber, + readIniString, + readIniStringAndCondList, +} from "@/engine/core/utils/ini/ini_read"; import { LuaLogger } from "@/engine/core/utils/logging"; import { ClientObject, EScheme, ESchemeType, IniFile, TSection } from "@/engine/lib/types"; diff --git a/src/engine/core/schemes/ph_on_death/PhysicalDeathManager.ts b/src/engine/core/schemes/ph_on_death/PhysicalDeathManager.ts index 5e5e9880d..97dbc457b 100644 --- a/src/engine/core/schemes/ph_on_death/PhysicalDeathManager.ts +++ b/src/engine/core/schemes/ph_on_death/PhysicalDeathManager.ts @@ -1,7 +1,7 @@ import { registry } from "@/engine/core/database"; import { AbstractSchemeManager } from "@/engine/core/schemes"; import { ISchemePhysicalOnDeathState } from "@/engine/core/schemes/ph_on_death/ISchemePhysicalOnDeathState"; -import { trySwitchToAnotherSection } from "@/engine/core/utils/scheme/switch"; +import { trySwitchToAnotherSection } from "@/engine/core/utils/scheme/scheme_switch"; import { ClientObject, Optional } from "@/engine/lib/types"; /** diff --git a/src/engine/core/schemes/ph_on_death/SchemePhysicalOnDeath.ts b/src/engine/core/schemes/ph_on_death/SchemePhysicalOnDeath.ts index c267e50cc..dd09bb3a0 100644 --- a/src/engine/core/schemes/ph_on_death/SchemePhysicalOnDeath.ts +++ b/src/engine/core/schemes/ph_on_death/SchemePhysicalOnDeath.ts @@ -1,7 +1,7 @@ import { AbstractScheme } from "@/engine/core/schemes/base/AbstractScheme"; import { ISchemePhysicalOnDeathState } from "@/engine/core/schemes/ph_on_death/ISchemePhysicalOnDeathState"; import { PhysicalDeathManager } from "@/engine/core/schemes/ph_on_death/PhysicalDeathManager"; -import { getConfigSwitchConditions } from "@/engine/core/utils/ini/config"; +import { getConfigSwitchConditions } from "@/engine/core/utils/ini/ini_config"; import { LuaLogger } from "@/engine/core/utils/logging"; import { ClientObject, IniFile } from "@/engine/lib/types"; import { EScheme, ESchemeType, TSection } from "@/engine/lib/types/scheme"; diff --git a/src/engine/core/schemes/ph_on_hit/PhysicalOnHitManager.ts b/src/engine/core/schemes/ph_on_hit/PhysicalOnHitManager.ts index 8a5ae8315..f6c30bdee 100644 --- a/src/engine/core/schemes/ph_on_hit/PhysicalOnHitManager.ts +++ b/src/engine/core/schemes/ph_on_hit/PhysicalOnHitManager.ts @@ -2,7 +2,7 @@ import { registry } from "@/engine/core/database"; import { AbstractSchemeManager } from "@/engine/core/schemes"; import { ISchemePhysicalOnHitState } from "@/engine/core/schemes/ph_on_hit/ISchemePhysicalOnHitState"; import { LuaLogger } from "@/engine/core/utils/logging"; -import { trySwitchToAnotherSection } from "@/engine/core/utils/scheme/switch"; +import { trySwitchToAnotherSection } from "@/engine/core/utils/scheme/scheme_switch"; import { NIL } from "@/engine/lib/constants/words"; import { ClientObject, Optional, TCount, TIndex, TName, Vector } from "@/engine/lib/types"; diff --git a/src/engine/core/schemes/ph_on_hit/SchemePhysicalOnHit.ts b/src/engine/core/schemes/ph_on_hit/SchemePhysicalOnHit.ts index 4785ba37b..9701d8439 100644 --- a/src/engine/core/schemes/ph_on_hit/SchemePhysicalOnHit.ts +++ b/src/engine/core/schemes/ph_on_hit/SchemePhysicalOnHit.ts @@ -3,7 +3,7 @@ import { AbstractScheme } from "@/engine/core/schemes/base/AbstractScheme"; import { SchemePhysicalHit } from "@/engine/core/schemes/ph_hit"; import { ISchemePhysicalOnHitState } from "@/engine/core/schemes/ph_on_hit/ISchemePhysicalOnHitState"; import { PhysicalOnHitManager } from "@/engine/core/schemes/ph_on_hit/PhysicalOnHitManager"; -import { getConfigSwitchConditions } from "@/engine/core/utils/ini/config"; +import { getConfigSwitchConditions } from "@/engine/core/utils/ini/ini_config"; import { LuaLogger } from "@/engine/core/utils/logging"; import { ClientObject, EScheme, ESchemeType, IniFile, Optional, TSection } from "@/engine/lib/types"; diff --git a/src/engine/core/schemes/ph_oscillate/SchemeOscillate.ts b/src/engine/core/schemes/ph_oscillate/SchemeOscillate.ts index bcb0ea5f1..75edc4476 100644 --- a/src/engine/core/schemes/ph_oscillate/SchemeOscillate.ts +++ b/src/engine/core/schemes/ph_oscillate/SchemeOscillate.ts @@ -2,8 +2,8 @@ import { AbstractScheme } from "@/engine/core/schemes/base/AbstractScheme"; import { ISchemeOscillateState } from "@/engine/core/schemes/ph_oscillate/ISchemeOscillateState"; import { OscillateManager } from "@/engine/core/schemes/ph_oscillate/OscillateManager"; import { abort } from "@/engine/core/utils/assertion"; -import { getConfigSwitchConditions } from "@/engine/core/utils/ini/config"; -import { readIniNumber, readIniString } from "@/engine/core/utils/ini/read"; +import { getConfigSwitchConditions } from "@/engine/core/utils/ini/ini_config"; +import { readIniNumber, readIniString } from "@/engine/core/utils/ini/ini_read"; import { LuaLogger } from "@/engine/core/utils/logging"; import { ClientObject, EScheme, ESchemeType, IniFile, TName, TSection } from "@/engine/lib/types"; diff --git a/src/engine/core/schemes/reach_task/ReachTaskPatrolManager.ts b/src/engine/core/schemes/reach_task/ReachTaskPatrolManager.ts index 5c4d593ad..825a69343 100644 --- a/src/engine/core/schemes/reach_task/ReachTaskPatrolManager.ts +++ b/src/engine/core/schemes/reach_task/ReachTaskPatrolManager.ts @@ -4,7 +4,7 @@ import { Squad } from "@/engine/core/objects"; import { EStalkerState } from "@/engine/core/objects/state"; import { abort, assertDefined } from "@/engine/core/utils/assertion"; import { LuaLogger } from "@/engine/core/utils/logging"; -import { getObjectSquad } from "@/engine/core/utils/object/object_general"; +import { getObjectSquad } from "@/engine/core/utils/object"; import { createEmptyVector, createVector, vectorCross, vectorRotateY, yawDegree } from "@/engine/core/utils/vector"; import { ClientObject, diff --git a/src/engine/core/schemes/reach_task/actions/ActionReachTaskLocation.ts b/src/engine/core/schemes/reach_task/actions/ActionReachTaskLocation.ts index 58d4a7819..77d586b6d 100644 --- a/src/engine/core/schemes/reach_task/actions/ActionReachTaskLocation.ts +++ b/src/engine/core/schemes/reach_task/actions/ActionReachTaskLocation.ts @@ -7,7 +7,7 @@ import { TSimulationObject } from "@/engine/core/objects/server/types"; import { EStalkerState } from "@/engine/core/objects/state"; import { ReachTaskPatrolManager } from "@/engine/core/schemes/reach_task/ReachTaskPatrolManager"; import { LuaLogger } from "@/engine/core/utils/logging"; -import { getObjectSquad, sendToNearestAccessibleVertex } from "@/engine/core/utils/object/object_general"; +import { getObjectSquad, sendToNearestAccessibleVertex } from "@/engine/core/utils/object"; import { areSameVectors, createEmptyVector, createVector } from "@/engine/core/utils/vector"; import { ClientObject, diff --git a/src/engine/core/schemes/reach_task/evaluators/EvaluatorReachedTaskLocation.ts b/src/engine/core/schemes/reach_task/evaluators/EvaluatorReachedTaskLocation.ts index cae831524..cf6b8b399 100644 --- a/src/engine/core/schemes/reach_task/evaluators/EvaluatorReachedTaskLocation.ts +++ b/src/engine/core/schemes/reach_task/evaluators/EvaluatorReachedTaskLocation.ts @@ -4,7 +4,7 @@ import { SquadReachTargetAction } from "@/engine/core/objects/server/squad/actio import type { Squad } from "@/engine/core/objects/server/squad/Squad"; import { TSimulationObject } from "@/engine/core/objects/server/types"; import { LuaLogger } from "@/engine/core/utils/logging"; -import { getObjectSquad } from "@/engine/core/utils/object/object_general"; +import { getObjectSquad } from "@/engine/core/utils/object"; import { Optional } from "@/engine/lib/types"; const logger: LuaLogger = new LuaLogger($filename); diff --git a/src/engine/core/schemes/remark/ISchemeRemarkState.ts b/src/engine/core/schemes/remark/ISchemeRemarkState.ts index ec5784924..bf3dd356a 100644 --- a/src/engine/core/schemes/remark/ISchemeRemarkState.ts +++ b/src/engine/core/schemes/remark/ISchemeRemarkState.ts @@ -1,5 +1,5 @@ import type { IBaseSchemeState } from "@/engine/core/schemes/base"; -import type { IConfigSwitchCondition } from "@/engine/core/utils/ini/types"; +import type { IConfigSwitchCondition } from "@/engine/core/utils/ini/ini_types"; import type { LuaArray, Optional, StringOptional, TName, TNumberId, TStringId, Vector } from "@/engine/lib/types"; /** diff --git a/src/engine/core/schemes/remark/SchemeRemark.ts b/src/engine/core/schemes/remark/SchemeRemark.ts index c5de6a487..2a2f9a097 100644 --- a/src/engine/core/schemes/remark/SchemeRemark.ts +++ b/src/engine/core/schemes/remark/SchemeRemark.ts @@ -4,11 +4,11 @@ import { AbstractScheme, EActionId, EEvaluatorId } from "@/engine/core/schemes"; import { ActionRemarkActivity } from "@/engine/core/schemes/remark/actions/ActionRemarkActivity"; import { EvaluatorNeedRemark } from "@/engine/core/schemes/remark/evaluators/EvaluatorNeedRemark"; import { ISchemeRemarkState } from "@/engine/core/schemes/remark/ISchemeRemarkState"; -import { getConfigSwitchConditions } from "@/engine/core/utils/ini/config"; -import { parseConditionsList } from "@/engine/core/utils/ini/parse"; -import { readIniBoolean, readIniString } from "@/engine/core/utils/ini/read"; +import { getConfigSwitchConditions } from "@/engine/core/utils/ini/ini_config"; +import { parseConditionsList } from "@/engine/core/utils/ini/ini_parse"; +import { readIniBoolean, readIniString } from "@/engine/core/utils/ini/ini_read"; import { LuaLogger } from "@/engine/core/utils/logging"; -import { addCommonActionPreconditions } from "@/engine/core/utils/scheme/setup"; +import { addCommonActionPreconditions } from "@/engine/core/utils/scheme/scheme_setup"; import { NIL } from "@/engine/lib/constants/words"; import { ActionPlanner, ClientObject, EScheme, ESchemeType, IniFile, TSection } from "@/engine/lib/types"; diff --git a/src/engine/core/schemes/remark/actions/ActionRemarkActivity.ts b/src/engine/core/schemes/remark/actions/ActionRemarkActivity.ts index 717f4b514..bd6e8313b 100644 --- a/src/engine/core/schemes/remark/actions/ActionRemarkActivity.ts +++ b/src/engine/core/schemes/remark/actions/ActionRemarkActivity.ts @@ -8,7 +8,7 @@ import { EStalkerState, ILookTargetDescriptor } from "@/engine/core/objects/stat import { IStateManagerCallbackDescriptor } from "@/engine/core/objects/state/StalkerStateManager"; import { ISchemeRemarkState } from "@/engine/core/schemes/remark"; import { abort } from "@/engine/core/utils/assertion"; -import { pickSectionFromCondList } from "@/engine/core/utils/ini/config"; +import { pickSectionFromCondList } from "@/engine/core/utils/ini/ini_config"; import { LuaLogger } from "@/engine/core/utils/logging"; import { NIL } from "@/engine/lib/constants/words"; import { ClientObject, Optional, SoundObject, TNumberId, Vector } from "@/engine/lib/types"; diff --git a/src/engine/core/schemes/sleeper/ISchemeSleeperState.ts b/src/engine/core/schemes/sleeper/ISchemeSleeperState.ts index f5fd2ac92..4b31191bc 100644 --- a/src/engine/core/schemes/sleeper/ISchemeSleeperState.ts +++ b/src/engine/core/schemes/sleeper/ISchemeSleeperState.ts @@ -1,5 +1,5 @@ import { IBaseSchemeState } from "@/engine/core/schemes/base"; -import { IWaypointData } from "@/engine/core/utils/ini/types"; +import { IWaypointData } from "@/engine/core/utils/ini/ini_types"; import { LuaArray, Optional } from "@/engine/lib/types"; /** diff --git a/src/engine/core/schemes/sleeper/SchemeSleeper.ts b/src/engine/core/schemes/sleeper/SchemeSleeper.ts index 1be4fe949..648fb5c4f 100644 --- a/src/engine/core/schemes/sleeper/SchemeSleeper.ts +++ b/src/engine/core/schemes/sleeper/SchemeSleeper.ts @@ -4,10 +4,10 @@ import { AbstractScheme, EActionId, EEvaluatorId } from "@/engine/core/schemes"; import { ActionSleeperActivity } from "@/engine/core/schemes/sleeper/actions/ActionSleeperActivity"; import { EvaluatorNeedSleep } from "@/engine/core/schemes/sleeper/evaluators/EvaluatorNeedSleep"; import { ISchemeSleeperState } from "@/engine/core/schemes/sleeper/ISchemeSleeperState"; -import { getConfigSwitchConditions } from "@/engine/core/utils/ini/config"; -import { readIniBoolean, readIniString } from "@/engine/core/utils/ini/read"; +import { getConfigSwitchConditions } from "@/engine/core/utils/ini/ini_config"; +import { readIniBoolean, readIniString } from "@/engine/core/utils/ini/ini_read"; import { LuaLogger } from "@/engine/core/utils/logging"; -import { addCommonActionPreconditions } from "@/engine/core/utils/scheme/setup"; +import { addCommonActionPreconditions } from "@/engine/core/utils/scheme/scheme_setup"; import { ActionPlanner, ClientObject, IniFile } from "@/engine/lib/types"; import { EScheme, ESchemeType, TSection } from "@/engine/lib/types/scheme"; diff --git a/src/engine/core/schemes/sleeper/actions/ActionSleeperActivity.ts b/src/engine/core/schemes/sleeper/actions/ActionSleeperActivity.ts index 3f5a3cdd6..aa67af183 100644 --- a/src/engine/core/schemes/sleeper/actions/ActionSleeperActivity.ts +++ b/src/engine/core/schemes/sleeper/actions/ActionSleeperActivity.ts @@ -5,8 +5,8 @@ import { EStalkerState } from "@/engine/core/objects/state"; import { StalkerMoveManager } from "@/engine/core/objects/state/StalkerMoveManager"; import { ISchemeSleeperState } from "@/engine/core/schemes/sleeper"; import { abort } from "@/engine/core/utils/assertion"; -import { parseWaypointsDataFromList } from "@/engine/core/utils/ini/parse"; -import { IWaypointData } from "@/engine/core/utils/ini/types"; +import { parseWaypointsDataFromList } from "@/engine/core/utils/ini/ini_parse"; +import { IWaypointData } from "@/engine/core/utils/ini/ini_types"; import { LuaLogger } from "@/engine/core/utils/logging"; import { AnyCallable, ClientObject, LuaArray, Optional, Patrol, TCount, Vector } from "@/engine/lib/types"; diff --git a/src/engine/core/schemes/sleeper/evaluators/EvaluatorNeedSleep.ts b/src/engine/core/schemes/sleeper/evaluators/EvaluatorNeedSleep.ts index 0d953140a..a666be9f5 100644 --- a/src/engine/core/schemes/sleeper/evaluators/EvaluatorNeedSleep.ts +++ b/src/engine/core/schemes/sleeper/evaluators/EvaluatorNeedSleep.ts @@ -2,7 +2,7 @@ import { LuabindClass, property_evaluator } from "xray16"; import { ISchemeSleeperState } from "@/engine/core/schemes/sleeper"; import { LuaLogger } from "@/engine/core/utils/logging"; -import { isSectionActive } from "@/engine/core/utils/scheme/logic"; +import { isSectionActive } from "@/engine/core/utils/scheme/scheme_logic"; const logger: LuaLogger = new LuaLogger($filename); diff --git a/src/engine/core/schemes/smartcover/SchemeSmartCover.ts b/src/engine/core/schemes/smartcover/SchemeSmartCover.ts index 5da04f999..97934e29f 100644 --- a/src/engine/core/schemes/smartcover/SchemeSmartCover.ts +++ b/src/engine/core/schemes/smartcover/SchemeSmartCover.ts @@ -5,8 +5,8 @@ import { EActionId, EEvaluatorId } from "@/engine/core/schemes/base/id"; import { ActionSmartCoverActivity } from "@/engine/core/schemes/smartcover/actions"; import { EvaluatorNeedSmartCover, EvaluatorUseSmartCoverInCombat } from "@/engine/core/schemes/smartcover/evaluators"; import { ISchemeSmartCoverState } from "@/engine/core/schemes/smartcover/ISchemeSmartCoverState"; -import { getConfigSwitchConditions } from "@/engine/core/utils/ini/config"; -import { readIniBoolean, readIniNumber, readIniString } from "@/engine/core/utils/ini/read"; +import { getConfigSwitchConditions } from "@/engine/core/utils/ini/ini_config"; +import { readIniBoolean, readIniNumber, readIniString } from "@/engine/core/utils/ini/ini_read"; import { LuaLogger } from "@/engine/core/utils/logging"; import { NIL } from "@/engine/lib/constants/words"; import { ActionPlanner, ClientObject, EScheme, ESchemeType, IniFile, TSection } from "@/engine/lib/types"; diff --git a/src/engine/core/schemes/sr_crow_spawner/CrowSpawnerManager.ts b/src/engine/core/schemes/sr_crow_spawner/CrowSpawnerManager.ts index 426e138ba..3922dd33f 100644 --- a/src/engine/core/schemes/sr_crow_spawner/CrowSpawnerManager.ts +++ b/src/engine/core/schemes/sr_crow_spawner/CrowSpawnerManager.ts @@ -4,7 +4,7 @@ import { registry } from "@/engine/core/database"; import { AbstractSchemeManager } from "@/engine/core/schemes"; import { ISchemeCrowSpawnerState } from "@/engine/core/schemes/sr_crow_spawner/ISchemeCrowSpawnerState"; import { LuaLogger } from "@/engine/core/utils/logging"; -import { trySwitchToAnotherSection } from "@/engine/core/utils/scheme/switch"; +import { trySwitchToAnotherSection } from "@/engine/core/utils/scheme/scheme_switch"; import { copyTable } from "@/engine/core/utils/table"; import { Optional, Patrol, ServerObject, TCount, TDuration, TIndex, TName } from "@/engine/lib/types"; diff --git a/src/engine/core/schemes/sr_crow_spawner/SchemeCrowSpawner.ts b/src/engine/core/schemes/sr_crow_spawner/SchemeCrowSpawner.ts index c018a94d2..91ebe4686 100644 --- a/src/engine/core/schemes/sr_crow_spawner/SchemeCrowSpawner.ts +++ b/src/engine/core/schemes/sr_crow_spawner/SchemeCrowSpawner.ts @@ -1,9 +1,9 @@ import { AbstractScheme } from "@/engine/core/schemes/base"; import { CrowSpawnerManager } from "@/engine/core/schemes/sr_crow_spawner/CrowSpawnerManager"; import { ISchemeCrowSpawnerState } from "@/engine/core/schemes/sr_crow_spawner/ISchemeCrowSpawnerState"; -import { getConfigSwitchConditions } from "@/engine/core/utils/ini/config"; -import { parseStringsList } from "@/engine/core/utils/ini/parse"; -import { readIniNumber, readIniString } from "@/engine/core/utils/ini/read"; +import { getConfigSwitchConditions } from "@/engine/core/utils/ini/ini_config"; +import { parseStringsList } from "@/engine/core/utils/ini/ini_parse"; +import { readIniNumber, readIniString } from "@/engine/core/utils/ini/ini_read"; import { LuaLogger } from "@/engine/core/utils/logging"; import { ClientObject, EScheme, ESchemeType, IniFile, Optional, TName, TSection } from "@/engine/lib/types"; diff --git a/src/engine/core/schemes/sr_cutscene/CutsceneManager.ts b/src/engine/core/schemes/sr_cutscene/CutsceneManager.ts index 57a3273ae..a996aa206 100644 --- a/src/engine/core/schemes/sr_cutscene/CutsceneManager.ts +++ b/src/engine/core/schemes/sr_cutscene/CutsceneManager.ts @@ -15,7 +15,7 @@ import { } from "@/engine/core/schemes/sr_cutscene/ISchemeCutsceneState"; import { getExtern } from "@/engine/core/utils/binding"; import { LuaLogger } from "@/engine/core/utils/logging"; -import { trySwitchToAnotherSection } from "@/engine/core/utils/scheme/switch"; +import { trySwitchToAnotherSection } from "@/engine/core/utils/scheme/scheme_switch"; import { postProcessors } from "@/engine/lib/constants/animation/post_processors"; import { AnyCallablesModule, ClientObject, Optional, TName, TNumberId } from "@/engine/lib/types"; diff --git a/src/engine/core/schemes/sr_cutscene/SchemeCutscene.ts b/src/engine/core/schemes/sr_cutscene/SchemeCutscene.ts index 2248163b7..89c0988ac 100644 --- a/src/engine/core/schemes/sr_cutscene/SchemeCutscene.ts +++ b/src/engine/core/schemes/sr_cutscene/SchemeCutscene.ts @@ -2,7 +2,7 @@ import { AbstractScheme, ESchemeEvent } from "@/engine/core/schemes"; import { CutsceneManager } from "@/engine/core/schemes/sr_cutscene/CutsceneManager"; import { ISchemeCutsceneState } from "@/engine/core/schemes/sr_cutscene/ISchemeCutsceneState"; import { getConfigSwitchConditions, parseStringsList } from "@/engine/core/utils/ini"; -import { readIniBoolean, readIniNumber, readIniString } from "@/engine/core/utils/ini/read"; +import { readIniBoolean, readIniNumber, readIniString } from "@/engine/core/utils/ini/ini_read"; import { LuaLogger } from "@/engine/core/utils/logging"; import { emitSchemeEvent } from "@/engine/core/utils/scheme"; import { NIL } from "@/engine/lib/constants/words"; diff --git a/src/engine/core/schemes/sr_cutscene/effectors/CamEffectorSet.ts b/src/engine/core/schemes/sr_cutscene/effectors/CamEffectorSet.ts index 3a5d9a2a5..1ad9de90a 100644 --- a/src/engine/core/schemes/sr_cutscene/effectors/CamEffectorSet.ts +++ b/src/engine/core/schemes/sr_cutscene/effectors/CamEffectorSet.ts @@ -6,9 +6,9 @@ import { TCamEffectorSetDescriptor, } from "@/engine/core/schemes/sr_cutscene/effectors/camera_effector_sets"; import { EEffectorState, ISchemeCutsceneState } from "@/engine/core/schemes/sr_cutscene/ISchemeCutsceneState"; -import { pickSectionFromCondList } from "@/engine/core/utils/ini/config"; -import { parseConditionsList } from "@/engine/core/utils/ini/parse"; -import { TConditionList } from "@/engine/core/utils/ini/types"; +import { pickSectionFromCondList } from "@/engine/core/utils/ini/ini_config"; +import { parseConditionsList } from "@/engine/core/utils/ini/ini_parse"; +import { TConditionList } from "@/engine/core/utils/ini/ini_types"; import { LuaLogger } from "@/engine/core/utils/logging"; import { toJSON } from "@/engine/core/utils/transform/json"; import { FALSE } from "@/engine/lib/constants/words"; diff --git a/src/engine/core/schemes/sr_deimos/DeimosManager.ts b/src/engine/core/schemes/sr_deimos/DeimosManager.ts index edaf712ea..d70ccd53f 100644 --- a/src/engine/core/schemes/sr_deimos/DeimosManager.ts +++ b/src/engine/core/schemes/sr_deimos/DeimosManager.ts @@ -6,7 +6,7 @@ import { ActorBinder } from "@/engine/core/objects/binders/creature/ActorBinder" import { AbstractSchemeManager } from "@/engine/core/schemes"; import { ISchemeDeimosState } from "@/engine/core/schemes/sr_deimos/ISchemeDeimosState"; import { clampNumber } from "@/engine/core/utils/number"; -import { trySwitchToAnotherSection } from "@/engine/core/utils/scheme/switch"; +import { trySwitchToAnotherSection } from "@/engine/core/utils/scheme/scheme_switch"; import { AnyObject, ClientObject, Optional, TIndex, TNumberId, TRate, TTimestamp, Vector } from "@/engine/lib/types"; /** diff --git a/src/engine/core/schemes/sr_deimos/SchemeDeimos.ts b/src/engine/core/schemes/sr_deimos/SchemeDeimos.ts index 14adabc0f..ac348cf8d 100644 --- a/src/engine/core/schemes/sr_deimos/SchemeDeimos.ts +++ b/src/engine/core/schemes/sr_deimos/SchemeDeimos.ts @@ -2,8 +2,8 @@ import { IRegistryObjectState, registry } from "@/engine/core/database"; import { AbstractScheme } from "@/engine/core/schemes/base"; import { DeimosManager } from "@/engine/core/schemes/sr_deimos/DeimosManager"; import { ISchemeDeimosState } from "@/engine/core/schemes/sr_deimos/ISchemeDeimosState"; -import { getConfigSwitchConditions } from "@/engine/core/utils/ini/config"; -import { readIniNumber, readIniString } from "@/engine/core/utils/ini/read"; +import { getConfigSwitchConditions } from "@/engine/core/utils/ini/ini_config"; +import { readIniNumber, readIniString } from "@/engine/core/utils/ini/ini_read"; import { LuaLogger } from "@/engine/core/utils/logging"; import { ClientObject, EScheme, ESchemeType, IniFile, TRate, TSection, Vector } from "@/engine/lib/types"; diff --git a/src/engine/core/schemes/sr_idle/IdleManager.ts b/src/engine/core/schemes/sr_idle/IdleManager.ts index b83ea8398..5a58628dc 100644 --- a/src/engine/core/schemes/sr_idle/IdleManager.ts +++ b/src/engine/core/schemes/sr_idle/IdleManager.ts @@ -1,6 +1,6 @@ import { AbstractSchemeManager } from "@/engine/core/schemes"; import { ISchemeIdleState } from "@/engine/core/schemes/sr_idle/ISchemeIdleState"; -import { trySwitchToAnotherSection } from "@/engine/core/utils/scheme/switch"; +import { trySwitchToAnotherSection } from "@/engine/core/utils/scheme/scheme_switch"; import { TCount } from "@/engine/lib/types"; /** diff --git a/src/engine/core/schemes/sr_idle/SchemeIdle.ts b/src/engine/core/schemes/sr_idle/SchemeIdle.ts index 59746e3ac..dee067fc1 100644 --- a/src/engine/core/schemes/sr_idle/SchemeIdle.ts +++ b/src/engine/core/schemes/sr_idle/SchemeIdle.ts @@ -1,7 +1,7 @@ import { AbstractScheme } from "@/engine/core/schemes/base/AbstractScheme"; import { IdleManager } from "@/engine/core/schemes/sr_idle/IdleManager"; import { ISchemeIdleState } from "@/engine/core/schemes/sr_idle/ISchemeIdleState"; -import { getConfigSwitchConditions } from "@/engine/core/utils/ini/config"; +import { getConfigSwitchConditions } from "@/engine/core/utils/ini/ini_config"; import { LuaLogger } from "@/engine/core/utils/logging"; import { ClientObject, IniFile } from "@/engine/lib/types"; import { EScheme, ESchemeType, TSection } from "@/engine/lib/types/scheme"; diff --git a/src/engine/core/schemes/sr_light/LightManager.ts b/src/engine/core/schemes/sr_light/LightManager.ts index c5953b09d..f79fabd6a 100644 --- a/src/engine/core/schemes/sr_light/LightManager.ts +++ b/src/engine/core/schemes/sr_light/LightManager.ts @@ -2,7 +2,7 @@ import { registry } from "@/engine/core/database"; import { AbstractSchemeManager } from "@/engine/core/schemes"; import { ISchemeLightState } from "@/engine/core/schemes/sr_light/ISchemeLightState"; import { LuaLogger } from "@/engine/core/utils/logging"; -import { trySwitchToAnotherSection } from "@/engine/core/utils/scheme/switch"; +import { trySwitchToAnotherSection } from "@/engine/core/utils/scheme/scheme_switch"; import { ClientObject } from "@/engine/lib/types"; const logger: LuaLogger = new LuaLogger($filename); diff --git a/src/engine/core/schemes/sr_light/SchemeLight.ts b/src/engine/core/schemes/sr_light/SchemeLight.ts index 65260d9b6..ad4fc5f87 100644 --- a/src/engine/core/schemes/sr_light/SchemeLight.ts +++ b/src/engine/core/schemes/sr_light/SchemeLight.ts @@ -5,8 +5,8 @@ import { AbstractScheme } from "@/engine/core/schemes/base/AbstractScheme"; import { ISchemeLightState } from "@/engine/core/schemes/sr_light/ISchemeLightState"; import { LightManager } from "@/engine/core/schemes/sr_light/LightManager"; import { isUndergroundLevel } from "@/engine/core/utils/check/is"; -import { getConfigSwitchConditions } from "@/engine/core/utils/ini/config"; -import { readIniBoolean } from "@/engine/core/utils/ini/read"; +import { getConfigSwitchConditions } from "@/engine/core/utils/ini/ini_config"; +import { readIniBoolean } from "@/engine/core/utils/ini/ini_read"; import { LuaLogger } from "@/engine/core/utils/logging"; import { resetTable } from "@/engine/core/utils/table"; import { misc } from "@/engine/lib/constants/items/misc"; diff --git a/src/engine/core/schemes/sr_monster/MonsterManager.ts b/src/engine/core/schemes/sr_monster/MonsterManager.ts index 271858cdc..9865112b6 100644 --- a/src/engine/core/schemes/sr_monster/MonsterManager.ts +++ b/src/engine/core/schemes/sr_monster/MonsterManager.ts @@ -4,9 +4,9 @@ import { registry } from "@/engine/core/database"; import { GlobalSoundManager } from "@/engine/core/managers/sounds/GlobalSoundManager"; import { AbstractSchemeManager } from "@/engine/core/schemes"; import { ISchemeMonsterState } from "@/engine/core/schemes/sr_monster/ISchemeMonsterState"; -import { action } from "@/engine/core/utils/object/object_general"; +import { action } from "@/engine/core/utils/object/object_action"; import { scriptCaptureMonster, scriptReleaseMonster } from "@/engine/core/utils/scheme"; -import { trySwitchToAnotherSection } from "@/engine/core/utils/scheme/switch"; +import { trySwitchToAnotherSection } from "@/engine/core/utils/scheme/scheme_switch"; import { copyVector, subVectors } from "@/engine/core/utils/vector"; import { sounds } from "@/engine/lib/constants/sound/sounds"; import { diff --git a/src/engine/core/schemes/sr_monster/SchemeMonster.ts b/src/engine/core/schemes/sr_monster/SchemeMonster.ts index 70ffd0d80..195c6a0dc 100644 --- a/src/engine/core/schemes/sr_monster/SchemeMonster.ts +++ b/src/engine/core/schemes/sr_monster/SchemeMonster.ts @@ -1,9 +1,9 @@ import { AbstractScheme } from "@/engine/core/schemes/base/AbstractScheme"; import { ISchemeMonsterState } from "@/engine/core/schemes/sr_monster/ISchemeMonsterState"; import { MonsterManager } from "@/engine/core/schemes/sr_monster/MonsterManager"; -import { getConfigSwitchConditions } from "@/engine/core/utils/ini/config"; -import { parseStringsList } from "@/engine/core/utils/ini/parse"; -import { readIniNumber, readIniString } from "@/engine/core/utils/ini/read"; +import { getConfigSwitchConditions } from "@/engine/core/utils/ini/ini_config"; +import { parseStringsList } from "@/engine/core/utils/ini/ini_parse"; +import { readIniNumber, readIniString } from "@/engine/core/utils/ini/ini_read"; import { LuaLogger } from "@/engine/core/utils/logging"; import { ClientObject, EScheme, ESchemeType, IniFile, TSection } from "@/engine/lib/types"; diff --git a/src/engine/core/schemes/sr_no_weapon/NoWeaponManager.ts b/src/engine/core/schemes/sr_no_weapon/NoWeaponManager.ts index 8ff8c6855..3c512e020 100644 --- a/src/engine/core/schemes/sr_no_weapon/NoWeaponManager.ts +++ b/src/engine/core/schemes/sr_no_weapon/NoWeaponManager.ts @@ -5,7 +5,7 @@ import { AbstractSchemeManager } from "@/engine/core/schemes"; import { EActorZoneState, ISchemeNoWeaponState } from "@/engine/core/schemes/sr_no_weapon/ISchemeNoWeaponState"; import { SchemeNoWeapon } from "@/engine/core/schemes/sr_no_weapon/SchemeNoWeapon"; import { LuaLogger } from "@/engine/core/utils/logging"; -import { trySwitchToAnotherSection } from "@/engine/core/utils/scheme/switch"; +import { trySwitchToAnotherSection } from "@/engine/core/utils/scheme/scheme_switch"; import { ClientObject, Optional, TDuration, Time } from "@/engine/lib/types"; const logger: LuaLogger = new LuaLogger($filename); diff --git a/src/engine/core/schemes/sr_no_weapon/SchemeNoWeapon.ts b/src/engine/core/schemes/sr_no_weapon/SchemeNoWeapon.ts index 3b4da85b9..d6726560e 100644 --- a/src/engine/core/schemes/sr_no_weapon/SchemeNoWeapon.ts +++ b/src/engine/core/schemes/sr_no_weapon/SchemeNoWeapon.ts @@ -1,7 +1,7 @@ import { AbstractScheme } from "@/engine/core/schemes/base"; import { ISchemeNoWeaponState } from "@/engine/core/schemes/sr_no_weapon/ISchemeNoWeaponState"; import { NoWeaponManager } from "@/engine/core/schemes/sr_no_weapon/NoWeaponManager"; -import { getConfigSwitchConditions } from "@/engine/core/utils/ini/config"; +import { getConfigSwitchConditions } from "@/engine/core/utils/ini/ini_config"; import { LuaLogger } from "@/engine/core/utils/logging"; import { ClientObject, EScheme, ESchemeType, IniFile, TNumberId, TSection } from "@/engine/lib/types"; diff --git a/src/engine/core/schemes/sr_particle/ParticleManager.ts b/src/engine/core/schemes/sr_particle/ParticleManager.ts index 53c03f38c..2a715ce14 100644 --- a/src/engine/core/schemes/sr_particle/ParticleManager.ts +++ b/src/engine/core/schemes/sr_particle/ParticleManager.ts @@ -2,9 +2,9 @@ import { particles_object, patrol, time_global } from "xray16"; import { AbstractSchemeManager } from "@/engine/core/schemes/base"; import { ISchemeParticleState } from "@/engine/core/schemes/sr_particle/ISchemeParticleState"; -import { parseWaypointsData } from "@/engine/core/utils/ini/parse"; -import { IWaypointData } from "@/engine/core/utils/ini/types"; -import { trySwitchToAnotherSection } from "@/engine/core/utils/scheme/switch"; +import { parseWaypointsData } from "@/engine/core/utils/ini/ini_parse"; +import { IWaypointData } from "@/engine/core/utils/ini/ini_types"; +import { trySwitchToAnotherSection } from "@/engine/core/utils/scheme/scheme_switch"; import { LuaArray, Optional, Patrol, TCount, TDuration, TTimestamp } from "@/engine/lib/types"; /** diff --git a/src/engine/core/schemes/sr_particle/SchemeParticle.ts b/src/engine/core/schemes/sr_particle/SchemeParticle.ts index 5c778bf0b..e91e880f2 100644 --- a/src/engine/core/schemes/sr_particle/SchemeParticle.ts +++ b/src/engine/core/schemes/sr_particle/SchemeParticle.ts @@ -2,8 +2,8 @@ import { AbstractScheme } from "@/engine/core/schemes/base"; import { ISchemeParticleState } from "@/engine/core/schemes/sr_particle/ISchemeParticleState"; import { ParticleManager } from "@/engine/core/schemes/sr_particle/ParticleManager"; import { abort } from "@/engine/core/utils/assertion"; -import { getConfigSwitchConditions } from "@/engine/core/utils/ini/config"; -import { readIniBoolean, readIniNumber, readIniString } from "@/engine/core/utils/ini/read"; +import { getConfigSwitchConditions } from "@/engine/core/utils/ini/ini_config"; +import { readIniBoolean, readIniNumber, readIniString } from "@/engine/core/utils/ini/ini_read"; import { LuaLogger } from "@/engine/core/utils/logging"; import { ClientObject, EScheme, ESchemeType, IniFile, TName, TSection } from "@/engine/lib/types"; diff --git a/src/engine/core/schemes/sr_postprocess/SchemePostProcess.ts b/src/engine/core/schemes/sr_postprocess/SchemePostProcess.ts index da3a34ce0..1332ef759 100644 --- a/src/engine/core/schemes/sr_postprocess/SchemePostProcess.ts +++ b/src/engine/core/schemes/sr_postprocess/SchemePostProcess.ts @@ -1,8 +1,8 @@ import { AbstractScheme } from "@/engine/core/schemes/base"; import { ISchemePostProcessState } from "@/engine/core/schemes/sr_postprocess/ISchemePostProcessState"; import { SchemePostProcessManager } from "@/engine/core/schemes/sr_postprocess/SchemePostProcessManager"; -import { getConfigSwitchConditions } from "@/engine/core/utils/ini/config"; -import { readIniNumber } from "@/engine/core/utils/ini/read"; +import { getConfigSwitchConditions } from "@/engine/core/utils/ini/ini_config"; +import { readIniNumber } from "@/engine/core/utils/ini/ini_read"; import { LuaLogger } from "@/engine/core/utils/logging"; import { ClientObject, EScheme, ESchemeType, IniFile, TSection } from "@/engine/lib/types"; diff --git a/src/engine/core/schemes/sr_postprocess/SchemePostProcessManager.ts b/src/engine/core/schemes/sr_postprocess/SchemePostProcessManager.ts index 017c08ab9..b41677e66 100644 --- a/src/engine/core/schemes/sr_postprocess/SchemePostProcessManager.ts +++ b/src/engine/core/schemes/sr_postprocess/SchemePostProcessManager.ts @@ -5,7 +5,7 @@ import { AbstractSchemeManager } from "@/engine/core/schemes"; import { ISchemePostProcessState } from "@/engine/core/schemes/sr_postprocess/ISchemePostProcessState"; import { PPEffector } from "@/engine/core/schemes/sr_postprocess/PPEffector"; import { abort } from "@/engine/core/utils/assertion"; -import { trySwitchToAnotherSection } from "@/engine/core/utils/scheme/switch"; +import { trySwitchToAnotherSection } from "@/engine/core/utils/scheme/scheme_switch"; import { createEmptyVector } from "@/engine/core/utils/vector"; import { ClientObject, Color, Hit, Noise, TDuration } from "@/engine/lib/types"; diff --git a/src/engine/core/schemes/sr_psy_antenna/PsyAntennaSchemaManager.ts b/src/engine/core/schemes/sr_psy_antenna/PsyAntennaSchemaManager.ts index 8a570b3ae..becb85f88 100644 --- a/src/engine/core/schemes/sr_psy_antenna/PsyAntennaSchemaManager.ts +++ b/src/engine/core/schemes/sr_psy_antenna/PsyAntennaSchemaManager.ts @@ -4,7 +4,7 @@ import { getPortableStoreValue, registry, setPortableStoreValue } from "@/engine import { PsyAntennaManager } from "@/engine/core/managers/world/PsyAntennaManager"; import { AbstractSchemeManager } from "@/engine/core/schemes"; import { EAntennaState, ISchemePsyAntennaState } from "@/engine/core/schemes/sr_psy_antenna/ISchemePsyAntennaState"; -import { trySwitchToAnotherSection } from "@/engine/core/utils/scheme/switch"; +import { trySwitchToAnotherSection } from "@/engine/core/utils/scheme/scheme_switch"; import { NIL } from "@/engine/lib/constants/words"; import { ClientObject } from "@/engine/lib/types"; diff --git a/src/engine/core/schemes/sr_psy_antenna/SchemePsyAntenna.ts b/src/engine/core/schemes/sr_psy_antenna/SchemePsyAntenna.ts index bcf21a492..12c4332f3 100644 --- a/src/engine/core/schemes/sr_psy_antenna/SchemePsyAntenna.ts +++ b/src/engine/core/schemes/sr_psy_antenna/SchemePsyAntenna.ts @@ -1,8 +1,8 @@ import { AbstractScheme } from "@/engine/core/schemes/base/AbstractScheme"; import { ISchemePsyAntennaState } from "@/engine/core/schemes/sr_psy_antenna/ISchemePsyAntennaState"; import { PsyAntennaSchemaManager } from "@/engine/core/schemes/sr_psy_antenna/PsyAntennaSchemaManager"; -import { getConfigSwitchConditions } from "@/engine/core/utils/ini/config"; -import { readIniBoolean, readIniNumber, readIniString } from "@/engine/core/utils/ini/read"; +import { getConfigSwitchConditions } from "@/engine/core/utils/ini/ini_config"; +import { readIniBoolean, readIniNumber, readIniString } from "@/engine/core/utils/ini/ini_read"; import { LuaLogger } from "@/engine/core/utils/logging"; import { postProcessors } from "@/engine/lib/constants/animation/post_processors"; import { ClientObject, EScheme, ESchemeType, IniFile, TSection } from "@/engine/lib/types"; diff --git a/src/engine/core/schemes/sr_silence/SchemeSilence.ts b/src/engine/core/schemes/sr_silence/SchemeSilence.ts index d9b23d14d..02da13dd5 100644 --- a/src/engine/core/schemes/sr_silence/SchemeSilence.ts +++ b/src/engine/core/schemes/sr_silence/SchemeSilence.ts @@ -2,7 +2,7 @@ import { registry } from "@/engine/core/database"; import { AbstractScheme } from "@/engine/core/schemes/base/AbstractScheme"; import { ISchemeSilenceState } from "@/engine/core/schemes/sr_silence/ISchemeSilenceState"; import { SilenceManager } from "@/engine/core/schemes/sr_silence/SilenceManager"; -import { getConfigSwitchConditions } from "@/engine/core/utils/ini/config"; +import { getConfigSwitchConditions } from "@/engine/core/utils/ini/ini_config"; import { LuaLogger } from "@/engine/core/utils/logging"; import { ClientObject, IniFile } from "@/engine/lib/types"; import { EScheme, ESchemeType, TSection } from "@/engine/lib/types/scheme"; diff --git a/src/engine/core/schemes/sr_teleport/SchemeTeleport.test.ts b/src/engine/core/schemes/sr_teleport/SchemeTeleport.test.ts index bca594047..b98ea546b 100644 --- a/src/engine/core/schemes/sr_teleport/SchemeTeleport.test.ts +++ b/src/engine/core/schemes/sr_teleport/SchemeTeleport.test.ts @@ -3,7 +3,7 @@ import { describe, expect, it } from "@jest/globals"; import { IRegistryObjectState, registerObject, registry } from "@/engine/core/database"; import { ISchemeTeleportState } from "@/engine/core/schemes/sr_teleport/ISchemeTeleportState"; import { SchemeTeleport } from "@/engine/core/schemes/sr_teleport/SchemeTeleport"; -import { loadSchemeImplementation } from "@/engine/core/utils/scheme/setup"; +import { loadSchemeImplementation } from "@/engine/core/utils/scheme/scheme_setup"; import { ClientObject, EScheme, ESchemeType, IniFile } from "@/engine/lib/types"; import { mockClientGameObject, mockIniFile } from "@/fixtures/xray"; diff --git a/src/engine/core/schemes/sr_teleport/SchemeTeleport.ts b/src/engine/core/schemes/sr_teleport/SchemeTeleport.ts index 5ba285d05..824f0de8d 100644 --- a/src/engine/core/schemes/sr_teleport/SchemeTeleport.ts +++ b/src/engine/core/schemes/sr_teleport/SchemeTeleport.ts @@ -2,8 +2,8 @@ import { AbstractScheme } from "@/engine/core/schemes/base/AbstractScheme"; import { ISchemeTeleportState, ITeleportPoint } from "@/engine/core/schemes/sr_teleport/ISchemeTeleportState"; import { TeleportManager } from "@/engine/core/schemes/sr_teleport/TeleportManager"; import { assert } from "@/engine/core/utils/assertion"; -import { getConfigSwitchConditions } from "@/engine/core/utils/ini/config"; -import { readIniNumber, readIniString } from "@/engine/core/utils/ini/read"; +import { getConfigSwitchConditions } from "@/engine/core/utils/ini/ini_config"; +import { readIniNumber, readIniString } from "@/engine/core/utils/ini/ini_read"; import { LuaLogger } from "@/engine/core/utils/logging"; import { ClientObject, IniFile } from "@/engine/lib/types"; import { EScheme, ESchemeType, TSection } from "@/engine/lib/types/scheme"; diff --git a/src/engine/core/schemes/sr_teleport/TeleportManager.ts b/src/engine/core/schemes/sr_teleport/TeleportManager.ts index af7156247..8951214fa 100644 --- a/src/engine/core/schemes/sr_teleport/TeleportManager.ts +++ b/src/engine/core/schemes/sr_teleport/TeleportManager.ts @@ -5,7 +5,7 @@ import { AbstractSchemeManager } from "@/engine/core/schemes"; import { ETeleportState, ISchemeTeleportState } from "@/engine/core/schemes/sr_teleport/ISchemeTeleportState"; import { LuaLogger } from "@/engine/core/utils/logging"; import { teleportActorWithEffects } from "@/engine/core/utils/position"; -import { trySwitchToAnotherSection } from "@/engine/core/utils/scheme/switch"; +import { trySwitchToAnotherSection } from "@/engine/core/utils/scheme/scheme_switch"; import { postProcessors } from "@/engine/lib/constants/animation/post_processors"; import { ClientObject, Optional, TProbability, TTimestamp, Vector } from "@/engine/lib/types"; diff --git a/src/engine/core/schemes/sr_timer/SchemeTimer.test.ts b/src/engine/core/schemes/sr_timer/SchemeTimer.test.ts index ec051c293..2d6270bc9 100644 --- a/src/engine/core/schemes/sr_timer/SchemeTimer.test.ts +++ b/src/engine/core/schemes/sr_timer/SchemeTimer.test.ts @@ -3,7 +3,7 @@ import { describe, expect, it } from "@jest/globals"; import { IRegistryObjectState, registerObject, registry } from "@/engine/core/database"; import { ETimerType, ISchemeTimerState } from "@/engine/core/schemes/sr_timer/ISchemeTimerState"; import { SchemeTimer } from "@/engine/core/schemes/sr_timer/SchemeTimer"; -import { loadSchemeImplementation } from "@/engine/core/utils/scheme/setup"; +import { loadSchemeImplementation } from "@/engine/core/utils/scheme/scheme_setup"; import { ClientObject, EScheme, ESchemeType, IniFile } from "@/engine/lib/types"; import { mockClientGameObject, mockIniFile } from "@/fixtures/xray"; diff --git a/src/engine/core/schemes/sr_timer/SchemeTimer.ts b/src/engine/core/schemes/sr_timer/SchemeTimer.ts index fbfbaa9c5..121afe2d2 100644 --- a/src/engine/core/schemes/sr_timer/SchemeTimer.ts +++ b/src/engine/core/schemes/sr_timer/SchemeTimer.ts @@ -2,8 +2,8 @@ import { AbstractScheme } from "@/engine/core/schemes/base/AbstractScheme"; import { ETimerType, ISchemeTimerState } from "@/engine/core/schemes/sr_timer/ISchemeTimerState"; import { TimerManager } from "@/engine/core/schemes/sr_timer/TimerManager"; import { assert } from "@/engine/core/utils/assertion"; -import { getConfigSwitchConditions } from "@/engine/core/utils/ini/config"; -import { readIniNumber, readIniNumberAndConditionList, readIniString } from "@/engine/core/utils/ini/read"; +import { getConfigSwitchConditions } from "@/engine/core/utils/ini/ini_config"; +import { readIniNumber, readIniNumberAndConditionList, readIniString } from "@/engine/core/utils/ini/ini_read"; import { LuaLogger } from "@/engine/core/utils/logging"; import { ClientObject, IniFile } from "@/engine/lib/types"; import { EScheme, ESchemeType, TSection } from "@/engine/lib/types/scheme"; diff --git a/src/engine/core/schemes/sr_timer/TimerManager.ts b/src/engine/core/schemes/sr_timer/TimerManager.ts index 33eb975a1..e7f0b6c1f 100644 --- a/src/engine/core/schemes/sr_timer/TimerManager.ts +++ b/src/engine/core/schemes/sr_timer/TimerManager.ts @@ -3,9 +3,9 @@ import { CUIGameCustom, get_hud, time_global } from "xray16"; import { registry } from "@/engine/core/database"; import { AbstractSchemeManager } from "@/engine/core/schemes"; import { ETimerType, ISchemeTimerState } from "@/engine/core/schemes/sr_timer/ISchemeTimerState"; -import { pickSectionFromCondList } from "@/engine/core/utils/ini/config"; +import { pickSectionFromCondList } from "@/engine/core/utils/ini/ini_config"; import { LuaLogger } from "@/engine/core/utils/logging"; -import { switchObjectSchemeToSection, trySwitchToAnotherSection } from "@/engine/core/utils/scheme/switch"; +import { switchObjectSchemeToSection, trySwitchToAnotherSection } from "@/engine/core/utils/scheme/scheme_switch"; import { globalTimeToString } from "@/engine/core/utils/time"; import { Optional, TSection, TTimestamp } from "@/engine/lib/types"; diff --git a/src/engine/core/schemes/walker/ISchemeWalkerState.ts b/src/engine/core/schemes/walker/ISchemeWalkerState.ts index addcfd327..8c3ca945a 100644 --- a/src/engine/core/schemes/walker/ISchemeWalkerState.ts +++ b/src/engine/core/schemes/walker/ISchemeWalkerState.ts @@ -1,7 +1,7 @@ import type { EStalkerState } from "@/engine/core/objects/state"; import type { IAnimpointAction } from "@/engine/core/schemes/animpoint/types"; import type { IBaseSchemeState } from "@/engine/core/schemes/base"; -import type { IWaypointData } from "@/engine/core/utils/ini/types"; +import type { IWaypointData } from "@/engine/core/utils/ini/ini_types"; import type { LuaArray, Optional, TName } from "@/engine/lib/types"; /** diff --git a/src/engine/core/schemes/walker/SchemeWalker.ts b/src/engine/core/schemes/walker/SchemeWalker.ts index 1c6e2e18b..c71abcc73 100644 --- a/src/engine/core/schemes/walker/SchemeWalker.ts +++ b/src/engine/core/schemes/walker/SchemeWalker.ts @@ -5,10 +5,10 @@ import { ActionWalkerActivity } from "@/engine/core/schemes/walker/actions"; import { EvaluatorNeedWalker } from "@/engine/core/schemes/walker/evaluators"; import { ISchemeWalkerState } from "@/engine/core/schemes/walker/ISchemeWalkerState"; import { abort, assert } from "@/engine/core/utils/assertion"; -import { getConfigSwitchConditions } from "@/engine/core/utils/ini/config"; -import { readIniBoolean, readIniString } from "@/engine/core/utils/ini/read"; +import { getConfigSwitchConditions } from "@/engine/core/utils/ini/ini_config"; +import { readIniBoolean, readIniString } from "@/engine/core/utils/ini/ini_read"; import { LuaLogger } from "@/engine/core/utils/logging"; -import { addCommonActionPreconditions } from "@/engine/core/utils/scheme/setup"; +import { addCommonActionPreconditions } from "@/engine/core/utils/scheme/scheme_setup"; import { ActionPlanner, ClientObject, IniFile, TName } from "@/engine/lib/types"; import { EScheme, ESchemeType, TSection } from "@/engine/lib/types/scheme"; diff --git a/src/engine/core/schemes/walker/actions/ActionWalkerActivity.ts b/src/engine/core/schemes/walker/actions/ActionWalkerActivity.ts index 1001d0be3..b12d22fec 100644 --- a/src/engine/core/schemes/walker/actions/ActionWalkerActivity.ts +++ b/src/engine/core/schemes/walker/actions/ActionWalkerActivity.ts @@ -9,7 +9,7 @@ import { IAnimpointAction } from "@/engine/core/schemes/animpoint/types"; import { ISchemeEventHandler } from "@/engine/core/schemes/base"; import { CampStoryManager } from "@/engine/core/schemes/camper/CampStoryManager"; import { ISchemeWalkerState } from "@/engine/core/schemes/walker"; -import { parseWaypointsData } from "@/engine/core/utils/ini/parse"; +import { parseWaypointsData } from "@/engine/core/utils/ini/ini_parse"; import { LuaLogger } from "@/engine/core/utils/logging"; import { ClientObject, Optional } from "@/engine/lib/types"; diff --git a/src/engine/core/schemes/walker/evaluators/EvaluatorNeedWalker.ts b/src/engine/core/schemes/walker/evaluators/EvaluatorNeedWalker.ts index a7e9981fc..985f86e93 100644 --- a/src/engine/core/schemes/walker/evaluators/EvaluatorNeedWalker.ts +++ b/src/engine/core/schemes/walker/evaluators/EvaluatorNeedWalker.ts @@ -2,7 +2,7 @@ import { LuabindClass, property_evaluator } from "xray16"; import { ISchemeWalkerState } from "@/engine/core/schemes/walker"; import { LuaLogger } from "@/engine/core/utils/logging"; -import { isSectionActive } from "@/engine/core/utils/scheme/logic"; +import { isSectionActive } from "@/engine/core/utils/scheme/scheme_logic"; const logger: LuaLogger = new LuaLogger($filename); diff --git a/src/engine/core/schemes/wounded/SchemeWounded.ts b/src/engine/core/schemes/wounded/SchemeWounded.ts index 998b437f9..10c3d6ce7 100644 --- a/src/engine/core/schemes/wounded/SchemeWounded.ts +++ b/src/engine/core/schemes/wounded/SchemeWounded.ts @@ -8,7 +8,7 @@ import { ISchemeWoundedState } from "@/engine/core/schemes/wounded/ISchemeWounde import { WoundManager } from "@/engine/core/schemes/wounded/WoundManager"; import { IConfigSwitchCondition, parseConditionsList, readIniBoolean, readIniString } from "@/engine/core/utils/ini"; import { LuaLogger } from "@/engine/core/utils/logging"; -import { getCharacterCommunity } from "@/engine/core/utils/object/object_general"; +import { getCharacterCommunity } from "@/engine/core/utils/object/object_get"; import { communities, TCommunity } from "@/engine/lib/constants/communities"; import { NIL } from "@/engine/lib/constants/words"; import { diff --git a/src/engine/core/schemes/wounded/WoundManager.ts b/src/engine/core/schemes/wounded/WoundManager.ts index 69c134a11..960752577 100644 --- a/src/engine/core/schemes/wounded/WoundManager.ts +++ b/src/engine/core/schemes/wounded/WoundManager.ts @@ -5,7 +5,7 @@ import { getPortableStoreValue, setPortableStoreValue } from "@/engine/core/data import { GlobalSoundManager } from "@/engine/core/managers/sounds/GlobalSoundManager"; import { AbstractSchemeManager } from "@/engine/core/schemes"; import { ISchemeWoundedState } from "@/engine/core/schemes/wounded/ISchemeWoundedState"; -import { pickSectionFromCondList } from "@/engine/core/utils/ini/config"; +import { pickSectionFromCondList } from "@/engine/core/utils/ini/ini_config"; import { drugs } from "@/engine/lib/constants/items/drugs"; import { FALSE, NIL, TRUE } from "@/engine/lib/constants/words"; import { AlifeSimulator, LuaArray, Optional, TCount, TIndex, TRate, TTimestamp } from "@/engine/lib/types"; diff --git a/src/engine/core/ui/debug/sections/DebugObjectSection.ts b/src/engine/core/ui/debug/sections/DebugObjectSection.ts index ea45768d9..750df77bf 100644 --- a/src/engine/core/ui/debug/sections/DebugObjectSection.ts +++ b/src/engine/core/ui/debug/sections/DebugObjectSection.ts @@ -6,8 +6,8 @@ import { Squad } from "@/engine/core/objects"; import { AbstractDebugSection } from "@/engine/core/ui/debug/sections/AbstractDebugSection"; import { isGameStarted } from "@/engine/core/utils/check"; import { LuaLogger } from "@/engine/core/utils/logging"; +import { getObjectSquad } from "@/engine/core/utils/object"; import { getNearestClientObject } from "@/engine/core/utils/object/object_find"; -import { getObjectSquad } from "@/engine/core/utils/object/object_general"; import { ERelation, getObjectsRelationSafe, diff --git a/src/engine/core/ui/game/WeaponParams.ts b/src/engine/core/ui/game/WeaponParams.ts index f37e1df35..faf09fb8d 100644 --- a/src/engine/core/ui/game/WeaponParams.ts +++ b/src/engine/core/ui/game/WeaponParams.ts @@ -1,5 +1,5 @@ import { SYSTEM_INI } from "@/engine/core/database"; -import { parseStringsList } from "@/engine/core/utils/ini/parse"; +import { parseStringsList } from "@/engine/core/utils/ini/ini_parse"; import { TRate, TSection } from "@/engine/lib/types"; /** diff --git a/src/engine/core/utils/check/check.ts b/src/engine/core/utils/check/check.ts index f2593eb95..f7b82b68b 100644 --- a/src/engine/core/utils/check/check.ts +++ b/src/engine/core/utils/check/check.ts @@ -1,41 +1,12 @@ -import { alife, danger_object, device, game_graph } from "xray16"; +import { alife, device, game_graph } from "xray16"; -import { getObjectIdByStoryId, getServerObjectByStoryId, IRegistryObjectState, registry } from "@/engine/core/database"; -import { SimulationBoardManager } from "@/engine/core/managers/interaction/SimulationBoardManager"; -import type { SmartTerrain } from "@/engine/core/objects"; -import { ESmartTerrainStatus } from "@/engine/core/objects/server/smart_terrain/types"; +import { getObjectIdByStoryId, getServerObjectByStoryId, registry } from "@/engine/core/database"; import type { Squad } from "@/engine/core/objects/server/squad/Squad"; -import { EActionId } from "@/engine/core/schemes/base"; -import { ISchemeCombatIgnoreState } from "@/engine/core/schemes/combat_ignore"; -import { ISchemeWoundedState } from "@/engine/core/schemes/wounded"; import { isStalker } from "@/engine/core/utils/check/is"; -import { pickSectionFromCondList } from "@/engine/core/utils/ini/config"; -import { getCharacterCommunity } from "@/engine/core/utils/object/object_general"; -import { isObjectInZone } from "@/engine/core/utils/object/object_location"; -import { logicsConfig } from "@/engine/lib/configs/LogicsConfig"; import { surgeConfig } from "@/engine/lib/configs/SurgeConfig"; -import { communities } from "@/engine/lib/constants/communities"; -import { ACTOR_ID } from "@/engine/lib/constants/ids"; import { lootableTableExclude, TLootableExcludeItem } from "@/engine/lib/constants/items/lootable_table"; import { TLevel } from "@/engine/lib/constants/levels"; -import { MAX_U16 } from "@/engine/lib/constants/memory"; -import { NIL, TRUE } from "@/engine/lib/constants/words"; -import { - ActionPlanner, - AlifeSimulator, - AnyObject, - ClientObject, - DangerObject, - EClientObjectRelation, - EScheme, - Optional, - ServerCreatureObject, - ServerHumanObject, - TDangerType, - TDistance, - TNumberId, - TStringId, -} from "@/engine/lib/types"; +import { AlifeSimulator, ClientObject, Optional, ServerHumanObject, TNumberId, TStringId } from "@/engine/lib/types"; /** * Check whether story object exists. diff --git a/src/engine/core/utils/ini/index.ts b/src/engine/core/utils/ini/index.ts index 49f64f353..a58b874e4 100644 --- a/src/engine/core/utils/ini/index.ts +++ b/src/engine/core/utils/ini/index.ts @@ -1,4 +1,4 @@ -export * from "@/engine/core/utils/ini/config"; -export * from "@/engine/core/utils/ini/parse"; -export * from "@/engine/core/utils/ini/read"; -export * from "@/engine/core/utils/ini/types"; +export * from "@/engine/core/utils/ini/ini_config"; +export * from "@/engine/core/utils/ini/ini_parse"; +export * from "@/engine/core/utils/ini/ini_read"; +export * from "@/engine/core/utils/ini/ini_types"; diff --git a/src/engine/core/utils/ini/config.test.ts b/src/engine/core/utils/ini/ini_config.test.ts similarity index 100% rename from src/engine/core/utils/ini/config.test.ts rename to src/engine/core/utils/ini/ini_config.test.ts diff --git a/src/engine/core/utils/ini/config.ts b/src/engine/core/utils/ini/ini_config.ts similarity index 98% rename from src/engine/core/utils/ini/config.ts rename to src/engine/core/utils/ini/ini_config.ts index ba007f276..875c3862a 100644 --- a/src/engine/core/utils/ini/config.ts +++ b/src/engine/core/utils/ini/ini_config.ts @@ -4,7 +4,7 @@ import { getObjectIdByStoryId, IRegistryObjectState, registry } from "@/engine/c import { IBaseSchemeLogic } from "@/engine/core/schemes"; import { abort } from "@/engine/core/utils/assertion"; import { disableInfo, giveInfo, hasAlifeInfo } from "@/engine/core/utils/info_portion"; -import { parseConditionsList } from "@/engine/core/utils/ini/parse"; +import { parseConditionsList } from "@/engine/core/utils/ini/ini_parse"; import { readIniBoolean, readIniConditionList, @@ -13,8 +13,8 @@ import { readIniStringAndCondList, readIniTwoNumbers, readIniTwoStringsAndConditionsList, -} from "@/engine/core/utils/ini/read"; -import { TConditionList } from "@/engine/core/utils/ini/types"; +} from "@/engine/core/utils/ini/ini_read"; +import { TConditionList } from "@/engine/core/utils/ini/ini_types"; import { LuaLogger } from "@/engine/core/utils/logging"; import { logicsConfig } from "@/engine/lib/configs/LogicsConfig"; import { TInfoPortion } from "@/engine/lib/constants/info_portions"; diff --git a/src/engine/core/utils/ini/parse.test.ts b/src/engine/core/utils/ini/ini_parse.test.ts similarity index 99% rename from src/engine/core/utils/ini/parse.test.ts rename to src/engine/core/utils/ini/ini_parse.test.ts index 2cb28b272..a599a6046 100644 --- a/src/engine/core/utils/ini/parse.test.ts +++ b/src/engine/core/utils/ini/ini_parse.test.ts @@ -3,7 +3,7 @@ import { describe, expect, it, jest } from "@jest/globals"; import { registerActor } from "@/engine/core/database"; import { extern } from "@/engine/core/utils/binding"; import { disableInfo, giveInfo, hasAlifeInfo } from "@/engine/core/utils/info_portion"; -import { pickSectionFromCondList } from "@/engine/core/utils/ini/config"; +import { pickSectionFromCondList } from "@/engine/core/utils/ini/ini_config"; import { getSchemeFromSection, parseAllSectionToTable, @@ -19,8 +19,8 @@ import { parseWaypointData, parseWaypointsData, parseWaypointsDataFromList, -} from "@/engine/core/utils/ini/parse"; -import { IConfigCondition } from "@/engine/core/utils/ini/types"; +} from "@/engine/core/utils/ini/ini_parse"; +import { IConfigCondition } from "@/engine/core/utils/ini/ini_types"; import { NIL } from "@/engine/lib/constants/words"; import { ClientObject, Flags32, IniFile, LuaArray } from "@/engine/lib/types"; import { mockActorClientGameObject, mockClientGameObject, MockFlags32, mockIniFile } from "@/fixtures/xray"; diff --git a/src/engine/core/utils/ini/parse.ts b/src/engine/core/utils/ini/ini_parse.ts similarity index 99% rename from src/engine/core/utils/ini/parse.ts rename to src/engine/core/utils/ini/ini_parse.ts index 9db5b1b13..829ee7464 100644 --- a/src/engine/core/utils/ini/parse.ts +++ b/src/engine/core/utils/ini/ini_parse.ts @@ -9,7 +9,7 @@ import { ISpawnDescriptor, IWaypointData, TConditionList, -} from "@/engine/core/utils/ini/types"; +} from "@/engine/core/utils/ini/ini_types"; import { LuaLogger } from "@/engine/core/utils/logging"; import { trimString } from "@/engine/core/utils/string"; import { TInfoPortion } from "@/engine/lib/constants/info_portions"; diff --git a/src/engine/core/utils/ini/read.test.ts b/src/engine/core/utils/ini/ini_read.test.ts similarity index 99% rename from src/engine/core/utils/ini/read.test.ts rename to src/engine/core/utils/ini/ini_read.test.ts index 5a4cef2ff..7043d9040 100644 --- a/src/engine/core/utils/ini/read.test.ts +++ b/src/engine/core/utils/ini/ini_read.test.ts @@ -9,7 +9,7 @@ import { readIniString, readIniStringAndCondList, readIniTwoNumbers, -} from "@/engine/core/utils/ini/read"; +} from "@/engine/core/utils/ini/ini_read"; import { IniFile, Optional } from "@/engine/lib/types"; import { mockIniFile } from "@/fixtures/xray/mocks/ini"; diff --git a/src/engine/core/utils/ini/read.ts b/src/engine/core/utils/ini/ini_read.ts similarity index 99% rename from src/engine/core/utils/ini/read.ts rename to src/engine/core/utils/ini/ini_read.ts index 31e2c8de8..d8bfd3ce8 100644 --- a/src/engine/core/utils/ini/read.ts +++ b/src/engine/core/utils/ini/ini_read.ts @@ -1,6 +1,6 @@ import { IBaseSchemeLogic } from "@/engine/core/schemes/base"; import { abort, assert, assertDefined } from "@/engine/core/utils/assertion"; -import { parseConditionsList, parseNumbersList, parseParameters } from "@/engine/core/utils/ini/parse"; +import { parseConditionsList, parseNumbersList, parseParameters } from "@/engine/core/utils/ini/ini_parse"; import { LuaLogger } from "@/engine/core/utils/logging"; import { IniFile, LuaArray, Optional, TName, TSection } from "@/engine/lib/types"; diff --git a/src/engine/core/utils/ini/types.ts b/src/engine/core/utils/ini/ini_types.ts similarity index 100% rename from src/engine/core/utils/ini/types.ts rename to src/engine/core/utils/ini/ini_types.ts diff --git a/src/engine/core/utils/object/index.ts b/src/engine/core/utils/object/index.ts index 08d39ac66..1334ff824 100644 --- a/src/engine/core/utils/object/index.ts +++ b/src/engine/core/utils/object/index.ts @@ -1,5 +1,10 @@ +export * from "@/engine/core/utils/object/object_action"; +export * from "@/engine/core/utils/object/object_anomaly"; +export * from "@/engine/core/utils/object/object_check"; export * from "@/engine/core/utils/object/object_danger"; export * from "@/engine/core/utils/object/object_general"; +export * from "@/engine/core/utils/object/object_get"; +export * from "@/engine/core/utils/object/object_set"; export * from "@/engine/core/utils/object/object_location"; export * from "@/engine/core/utils/object/object_state"; export * from "@/engine/core/utils/object/object_find"; diff --git a/src/engine/core/utils/object/object_action.ts b/src/engine/core/utils/object/object_action.ts new file mode 100644 index 000000000..a1d92523e --- /dev/null +++ b/src/engine/core/utils/object/object_action.ts @@ -0,0 +1,32 @@ +import { entity_action } from "xray16"; + +import { ClientObject, EntityAction, Optional, TEntityActionType, TIndex, TName } from "@/engine/lib/types"; + +/** + * todo; + */ +export function action(object: Optional, ...actions: Array): EntityAction { + const entityAction: EntityAction = new entity_action(); + let index: TIndex = 0; + + while (actions[index] !== null) { + entityAction.set_action(actions[index]); + index += 1; + } + + if (object !== null) { + object.command(entityAction, false); + } + + // todo: Is copy needed? + return new entity_action(entityAction); +} + +/** + * todo; + */ +export function interruptObjectAction(object: ClientObject, scriptName: TName): void { + if (object.get_script()) { + object.script(false, scriptName); + } +} diff --git a/src/engine/core/utils/object/object_anomaly.ts b/src/engine/core/utils/object/object_anomaly.ts new file mode 100644 index 000000000..dd1b75b77 --- /dev/null +++ b/src/engine/core/utils/object/object_anomaly.ts @@ -0,0 +1,50 @@ +import { alife } from "xray16"; + +import { registry } from "@/engine/core/database"; +import { AnomalyZoneBinder } from "@/engine/core/objects"; +import { ClientObject, LuaArray, Optional, ServerObject, TName } from "@/engine/lib/types"; + +/** + * todo; + */ +export function anomalyHasArtefact( + actor: ClientObject, + object: Optional, + anomalyZoneName: TName, + artefactName: Optional +): LuaMultiReturn<[boolean, Optional>]> { + const anomalyZone: AnomalyZoneBinder = registry.anomalyZones.get(anomalyZoneName); + + if (anomalyZone === null) { + return $multi(false, null); + } + + if (anomalyZone.spawnedArtefactsCount < 1) { + return $multi(false, null); + } + + if (artefactName === null) { + const artefactsList: LuaArray = new LuaTable(); + + for (const [k, v] of registry.artefacts.ways) { + const artefactObject: Optional = alife().object(tonumber(k)!); + + if (artefactObject) { + table.insert(artefactsList, artefactObject.section_name()); + } + } + + return $multi(true, artefactsList); + } + + for (const [artefactId] of registry.artefacts.ways) { + if ( + alife().object(tonumber(artefactId)!) && + artefactName === alife().object(tonumber(artefactId)!)!.section_name() + ) { + return $multi(true, null); + } + } + + return $multi(false, null); +} diff --git a/src/engine/core/utils/object/object_check.ts b/src/engine/core/utils/object/object_check.ts new file mode 100644 index 000000000..387f731be --- /dev/null +++ b/src/engine/core/utils/object/object_check.ts @@ -0,0 +1,60 @@ +import { level, stalker_ids } from "xray16"; + +import { IRegistryObjectState, registry } from "@/engine/core/database"; +import { parseConditionsList, pickSectionFromCondList, readIniString } from "@/engine/core/utils/ini"; +import { TRUE } from "@/engine/lib/constants/words"; +import { ActionPlanner, ClientObject, Optional, TNumberId } from "@/engine/lib/types"; + +/** + * Check whether provided object ID is online. + * + * @param objectId - object identifier + */ +export function isObjectOnline(objectId: TNumberId): boolean { + return level.object_by_id(objectId) !== null; +} + +/** + * todo: description + */ +export function isActorSeenByObject(object: ClientObject): boolean { + return object.alive() && object.see(registry.actor); +} + +/** + * todo; + */ +export function isObjectInvulnerabilityNeeded(object: ClientObject): boolean { + const state: IRegistryObjectState = registry.objects.get(object.id()); + const invulnerability: Optional = readIniString( + state.ini, + state.activeSection, + "invulnerable", + false, + "", + null + ); + + if (invulnerability === null) { + return false; + } + + return pickSectionFromCondList(registry.actor, object, parseConditionsList(invulnerability)) === TRUE; +} + +/** + * todo; + */ +export function isObjectInCombat(object: ClientObject): boolean { + const actionPlanner: ActionPlanner = object.motivation_action_manager(); + + if (!actionPlanner.initialized()) { + return false; + } + + const currentActionId: Optional = actionPlanner.current_action_id(); + + return ( + currentActionId === stalker_ids.action_combat_planner || currentActionId === stalker_ids.action_post_combat_wait + ); +} diff --git a/src/engine/core/utils/object/object_danger.ts b/src/engine/core/utils/object/object_danger.ts index f0b968b04..85cb25e00 100644 --- a/src/engine/core/utils/object/object_danger.ts +++ b/src/engine/core/utils/object/object_danger.ts @@ -6,7 +6,9 @@ import { SmartTerrain } from "@/engine/core/objects"; import { ESmartTerrainStatus } from "@/engine/core/objects/server/smart_terrain/types"; import { ISchemeCombatIgnoreState } from "@/engine/core/schemes/combat_ignore"; import { pickSectionFromCondList } from "@/engine/core/utils/ini"; -import { getCharacterCommunity, isObjectInZone, isObjectWounded } from "@/engine/core/utils/object"; +import { getCharacterCommunity } from "@/engine/core/utils/object/object_get"; +import { isObjectInZone } from "@/engine/core/utils/object/object_location"; +import { isObjectWounded } from "@/engine/core/utils/object/object_state"; import { logicsConfig } from "@/engine/lib/configs/LogicsConfig"; import { communities } from "@/engine/lib/constants/communities"; import { ACTOR_ID } from "@/engine/lib/constants/ids"; diff --git a/src/engine/core/utils/object/object_general.ts b/src/engine/core/utils/object/object_general.ts index 4ad4e3e4f..e5eda5fc9 100644 --- a/src/engine/core/utils/object/object_general.ts +++ b/src/engine/core/utils/object/object_general.ts @@ -1,502 +1,24 @@ -import { alife, entity_action, game, level, stalker_ids } from "xray16"; +import { alife, level } from "xray16"; import { IRegistryObjectState, registry } from "@/engine/core/database"; -import { AnomalyZoneBinder, SmartTerrain } from "@/engine/core/objects"; -import { Squad } from "@/engine/core/objects/server/squad/Squad"; -import { assertDefined } from "@/engine/core/utils/assertion"; -import { isStalker } from "@/engine/core/utils/check/is"; -import { getSectionsFromConditionLists, pickSectionFromCondList } from "@/engine/core/utils/ini/config"; -import { parseConditionsList } from "@/engine/core/utils/ini/parse"; -import { readIniBoolean, readIniNumber, readIniString } from "@/engine/core/utils/ini/read"; -import { TConditionList } from "@/engine/core/utils/ini/types"; +import { AnomalyZoneBinder } from "@/engine/core/objects"; +import { pickSectionFromCondList } from "@/engine/core/utils/ini/ini_config"; +import { parseConditionsList } from "@/engine/core/utils/ini/ini_parse"; +import { readIniBoolean, readIniNumber, readIniString } from "@/engine/core/utils/ini/ini_read"; +import { TConditionList } from "@/engine/core/utils/ini/ini_types"; import { LuaLogger } from "@/engine/core/utils/logging"; -import { wait } from "@/engine/core/utils/time"; import { createEmptyVector } from "@/engine/core/utils/vector"; -import { communities, TCommunity } from "@/engine/lib/constants/communities"; -import { TInfoPortion } from "@/engine/lib/constants/info_portions"; -import { MAX_U16 } from "@/engine/lib/constants/memory"; import { NIL, TRUE } from "@/engine/lib/constants/words"; import { - ActionPlanner, - AlifeSimulator, - AnyGameObject, ClientObject, - EntityAction, EScheme, - IniFile, LuaArray, Optional, - ServerCreatureObject, - ServerGroupObject, - ServerHumanObject, ServerObject, TDistance, - TEntityActionType, - TIndex, TName, TNumberId, - TRate, TSection, - TTimestamp, - Vector, } from "@/engine/lib/types"; const logger: LuaLogger = new LuaLogger($filename); - -/** - * @param object - any game object used by the game engine. - * @returns tuple of object position details: id, gvi, lvi, position. - */ -export function getObjectPositioning(object: AnyGameObject): LuaMultiReturn<[TNumberId, TNumberId, TNumberId, Vector]> { - if (type(object.id) === "number") { - return $multi( - (object as ServerObject).id, - (object as ServerObject).m_game_vertex_id, - (object as ServerObject).m_level_vertex_id, - (object as ServerObject).position - ); - } else { - return $multi( - (object as ClientObject).id(), - (object as ClientObject).game_vertex_id(), - (object as ClientObject).level_vertex_id(), - (object as ClientObject).position() - ); - } -} - -/** - * Get squad of provided object. - * - * @param object - server or client object - * @return object squad or null - */ -export function getObjectSquad(object: Optional): Optional { - assertDefined(object, "Attempt to get squad object from null value."); - - // Get for client object. - if (type(object.id) === "function") { - const serverObject: Optional = alife().object((object as ClientObject).id()); - - return !serverObject || serverObject.group_id === MAX_U16 ? null : alife().object(serverObject.group_id); - } else { - // Get for server object. - - return (object as ServerCreatureObject).group_id === MAX_U16 - ? null - : alife().object((object as ServerCreatureObject).group_id); - } -} - -/** - * Get smart terrain linked to object. - * - * @param object - client object to check - * @returns server representation of smart terrain or null - */ -export function getObjectSmartTerrain(object: ClientObject): Optional { - const simulator: AlifeSimulator = alife(); - const serverObject: Optional = simulator.object(object.id()); - - if (serverObject === null) { - return null; - } else { - return serverObject.m_smart_terrain_id === MAX_U16 ? null : simulator.object(serverObject.m_smart_terrain_id); - } -} - -/** - * Set item condition. - * - * @param object - client object to change condition - * @param condition - value from 0 to 100, percents - */ -export function setItemCondition(object: ClientObject, condition: TRate): void { - object.set_condition(condition / 100); -} - -/** - * Check whether provided object ID is online. - * - * @param objectId - object identifier - */ -export function isObjectOnline(objectId: TNumberId): boolean { - return level.object_by_id(objectId) !== null; -} - -/** - * Set current time in level. - * Creates idle state with multiplied time factor. - */ -export function setCurrentTime(hour: number, min: number, sec: number): void { - const currentTimeFactor: TRate = level.get_time_factor(); - const currentGameTime: TTimestamp = game.time(); - - // todo: Magic constants. - let currentDay: number = math.floor(currentGameTime / 86_400_000); - const currentTime: number = currentGameTime - currentDay * 86_400_000; - let newTime: number = (sec + min * 60 + hour * 3_600) * 1000; - - if (currentTime > newTime) { - currentDay = currentDay + 1; - } - - newTime = newTime + currentDay * 86_400_000; - - level.set_time_factor(10_000); - - while (game.time() < newTime) { - wait(); - } - - level.set_time_factor(currentTimeFactor); -} - -/** - * todo; - */ -export function stopObjectPlayingSound(object: ClientObject): void { - if (object.alive()) { - object.set_sound_mask(-1); - object.set_sound_mask(0); - } -} - -/** - * todo; - * @param serverObject - alife server object to change team parameters - * @param teamId - ? - * @param squadId - id of the parent squad, bound to spawning smart - * @param groupId - id of the level group - * - */ -export function changeTeamSquadGroup( - serverObject: ServerCreatureObject, - teamId: TNumberId, - squadId: TNumberId, - groupId: TNumberId -): void { - const clientObject: Optional = registry.objects.get(serverObject.id)?.object; - - if (clientObject === null) { - serverObject.team = teamId; - serverObject.squad = squadId; - serverObject.group = groupId; - } else { - clientObject.change_team(teamId, squadId, groupId); - } -} - -/** - * todo; - */ -export function action(object: Optional, ...actions: Array): EntityAction { - const entityAction: EntityAction = new entity_action(); - let index: TIndex = 0; - - while (actions[index] !== null) { - entityAction.set_action(actions[index]); - index += 1; - } - - if (object !== null) { - object.command(entityAction, false); - } - - // todo: Is copy needed? - return new entity_action(entityAction); -} - -/** - * todo; - */ -export function resetMonsterAction(object: ClientObject, scriptName: TName): void { - if (object.get_script()) { - object.script(false, object.get_script_name()); - } - - object.script(true, scriptName); -} - -/** - * todo; - */ -export function interruptObjectAction(object: ClientObject, scriptName: TName): void { - if (object.get_script()) { - object.script(false, scriptName); - } -} - -/** - * todo; - */ -export function getObjectCommunity(object: AnyGameObject): TCommunity { - if (type(object.id) === "function") { - return getCharacterCommunity(object as ClientObject); - } else { - return getAlifeCharacterCommunity(object as ServerHumanObject); - } -} - -/** - * todo; - */ -export function getCharacterCommunity(object: ClientObject): TCommunity { - if (isStalker(object)) { - return object.character_community() as TCommunity; - } - - return communities.monster; -} - -/** - * todo; - */ -export function getAlifeCharacterCommunity(object: ServerHumanObject | ServerGroupObject): TCommunity { - if (isStalker(object)) { - return object.community() as TCommunity; - } - - return communities.monster; -} - -/** - * todo; - */ -export function setObjectInfo(object: ClientObject, ini: IniFile, section: TSection): void { - const inInfosList: LuaArray = getSectionsFromConditionLists( - object, - readIniString(ini, section, "in", false, "") - ); - const outInfosList: LuaArray = getSectionsFromConditionLists( - object, - readIniString(ini, section, "out", false, "") - ); - - for (const [index, infoPortion] of inInfosList) { - object.give_info_portion(infoPortion); - } - - for (const [index, infoPortion] of outInfosList) { - object.disable_info_portion(infoPortion); - } -} - -/** - * todo: rename, update - */ -export function resetObjectGroup(object: ClientObject, ini: IniFile, section: TSection): void { - const group: TNumberId = readIniNumber(ini, section, "group", false, -1); - - if (group !== -1) { - object.change_team(object.team(), object.squad(), group); - } -} - -/** - * todo: rename, update - */ -export function initializeObjectTakeItemsEnabledState( - object: ClientObject, - scheme: EScheme, - state: IRegistryObjectState, - section: TSection -): void { - const isTakeItemsEnabled: boolean = state.ini.line_exist(section, "take_items") - ? readIniBoolean(state.ini, section, "take_items", false, true) - : readIniBoolean(state.ini, state.sectionLogic, "take_items", false, true); - - object.take_items_enabled(isTakeItemsEnabled); -} - -/** - * todo: rename, update - */ -export function initializeObjectCanSelectWeaponState( - object: ClientObject, - scheme: EScheme, - state: IRegistryObjectState, - section: TSection -): void { - let data: string = readIniString(state.ini, section, "can_select_weapon", false, "", ""); - - if (data === "") { - data = readIniString(state.ini, state.sectionLogic, "can_select_weapon", false, "", TRUE); - } - - const conditionsList: TConditionList = parseConditionsList(data); - const canSelectSection: TSection = pickSectionFromCondList(registry.actor, object, conditionsList)!; - - object.can_select_weapon(canSelectSection === TRUE); -} - -/** - * todo; - */ -export function isObjectInvulnerabilityNeeded(object: ClientObject): boolean { - const state: IRegistryObjectState = registry.objects.get(object.id()); - const invulnerability: Optional = readIniString( - state.ini, - state.activeSection, - "invulnerable", - false, - "", - null - ); - - if (invulnerability === null) { - return false; - } - - return pickSectionFromCondList(registry.actor, object, parseConditionsList(invulnerability)) === TRUE; -} - -/** - * todo; - */ -export function resetObjectInvulnerability(object: ClientObject): void { - const nextInvulnerabilityState: boolean = isObjectInvulnerabilityNeeded(object); - - if (object.invulnerable() !== nextInvulnerabilityState) { - object.invulnerable(nextInvulnerabilityState); - } -} - -/** - * todo; - */ -export function disableObjectInvulnerability(object: ClientObject): void { - object.invulnerable(false); -} - -/** - * todo; - */ -export function updateObjectInvulnerability(object: ClientObject): void { - const isInvulnerabilityNeeded: boolean = isObjectInvulnerabilityNeeded(object); - - if (object.invulnerable() !== isInvulnerabilityNeeded) { - object.invulnerable(isInvulnerabilityNeeded); - } -} - -/** - * todo - */ -export function resetObjectIgnoreThreshold( - object: ClientObject, - scheme: Optional, - state: IRegistryObjectState, - section: TSection -): void { - const thresholdSection: Optional = - scheme === null || scheme === NIL - ? readIniString(state.ini, state.sectionLogic, "threshold", false, "") - : readIniString(state.ini, section, "threshold", false, ""); - - if (thresholdSection) { - const maxIgnoreDistance: Optional = readIniNumber( - state.ini, - thresholdSection, - "max_ignore_distance", - false - ); - - if (maxIgnoreDistance === null) { - object.restore_max_ignore_monster_distance(); - } else { - object.max_ignore_monster_distance(maxIgnoreDistance); - } - - const ignoreMonster: Optional = readIniNumber(state.ini, thresholdSection, "ignore_monster", false); - - if (ignoreMonster === null) { - object.restore_ignore_monster_threshold(); - } else { - object.ignore_monster_threshold(ignoreMonster); - } - } -} - -/** - * todo; - */ -export function isObjectInCombat(object: ClientObject): boolean { - const actionPlanner: ActionPlanner = object.motivation_action_manager(); - - if (!actionPlanner.initialized()) { - return false; - } - - const currentActionId: Optional = actionPlanner.current_action_id(); - - return ( - currentActionId === stalker_ids.action_combat_planner || currentActionId === stalker_ids.action_post_combat_wait - ); -} - -/** - * todo: description - */ -export function isActorSeenByObject(object: ClientObject): boolean { - return object.alive() && object.see(registry.actor); -} - -/** - * todo: description - */ -export function sendToNearestAccessibleVertex(object: ClientObject, vertexId: TNumberId): TNumberId { - if (!object.accessible(vertexId)) { - vertexId = object.accessible_nearest(level.vertex_position(vertexId), createEmptyVector()); - } - - object.set_dest_level_vertex_id(vertexId); - - return vertexId; -} - -/** - * todo; - */ -export function anomalyHasArtefact( - actor: ClientObject, - object: Optional, - params: [TName, Optional] -): LuaMultiReturn<[boolean, Optional>]> { - const anomalyZoneName: TName = params && params[0]; - const artefactName: Optional = params && params[1]; - const anomalyZone: AnomalyZoneBinder = registry.anomalyZones.get(anomalyZoneName); - - if (anomalyZone === null) { - return $multi(false, null); - } - - if (anomalyZone.spawnedArtefactsCount < 1) { - return $multi(false, null); - } - - if (artefactName === null) { - const artefactsList: LuaArray = new LuaTable(); - - for (const [k, v] of registry.artefacts.ways) { - const artefactObject: Optional = alife().object(tonumber(k)!); - - if (artefactObject) { - table.insert(artefactsList, artefactObject.section_name()); - } - } - - return $multi(true, artefactsList); - } - - for (const [artefactId] of registry.artefacts.ways) { - if ( - alife().object(tonumber(artefactId)!) && - artefactName === alife().object(tonumber(artefactId)!)!.section_name() - ) { - return $multi(true, null); - } - } - - return $multi(false, null); -} diff --git a/src/engine/core/utils/object/object_get.ts b/src/engine/core/utils/object/object_get.ts new file mode 100644 index 000000000..167a0a097 --- /dev/null +++ b/src/engine/core/utils/object/object_get.ts @@ -0,0 +1,113 @@ +import { alife } from "xray16"; + +import { SmartTerrain, Squad } from "@/engine/core/objects"; +import { assertDefined } from "@/engine/core/utils/assertion"; +import { isStalker } from "@/engine/core/utils/check"; +import { communities, TCommunity } from "@/engine/lib/constants/communities"; +import { MAX_U16 } from "@/engine/lib/constants/memory"; +import { + AlifeSimulator, + AnyGameObject, + ClientObject, + Optional, + ServerCreatureObject, + ServerGroupObject, + ServerHumanObject, + ServerObject, + TNumberId, + Vector, +} from "@/engine/lib/types"; + +/** + * @param object - any game object used by the game engine. + * @returns tuple of object position details: id, gvi, lvi, position. + */ +export function getObjectPositioning(object: AnyGameObject): LuaMultiReturn<[TNumberId, TNumberId, TNumberId, Vector]> { + if (type(object.id) === "number") { + return $multi( + (object as ServerObject).id, + (object as ServerObject).m_game_vertex_id, + (object as ServerObject).m_level_vertex_id, + (object as ServerObject).position + ); + } else { + return $multi( + (object as ClientObject).id(), + (object as ClientObject).game_vertex_id(), + (object as ClientObject).level_vertex_id(), + (object as ClientObject).position() + ); + } +} + +/** + * Get squad of provided object. + * + * @param object - server or client object + * @return object squad or null + */ +export function getObjectSquad(object: Optional): Optional { + assertDefined(object, "Attempt to get squad object from null value."); + + // Get for client object. + if (type(object.id) === "function") { + const serverObject: Optional = alife().object((object as ClientObject).id()); + + return !serverObject || serverObject.group_id === MAX_U16 ? null : alife().object(serverObject.group_id); + } else { + // Get for server object. + return (object as ServerCreatureObject).group_id === MAX_U16 + ? null + : alife().object((object as ServerCreatureObject).group_id); + } +} + +/** + * Get smart terrain linked to object. + * + * @param object - client object to check + * @returns server representation of smart terrain or null + */ +export function getObjectSmartTerrain(object: ClientObject): Optional { + const simulator: AlifeSimulator = alife(); + const serverObject: Optional = simulator.object(object.id()); + + if (serverObject === null) { + return null; + } else { + return serverObject.m_smart_terrain_id === MAX_U16 ? null : simulator.object(serverObject.m_smart_terrain_id); + } +} + +/** + * todo; + */ +export function getObjectCommunity(object: AnyGameObject): TCommunity { + if (type(object.id) === "function") { + return getCharacterCommunity(object as ClientObject); + } else { + return getAlifeCharacterCommunity(object as ServerHumanObject); + } +} + +/** + * todo; + */ +export function getCharacterCommunity(object: ClientObject): TCommunity { + if (isStalker(object)) { + return object.character_community() as TCommunity; + } + + return communities.monster; +} + +/** + * todo; + */ +export function getAlifeCharacterCommunity(object: ServerHumanObject | ServerGroupObject): TCommunity { + if (isStalker(object)) { + return object.community() as TCommunity; + } + + return communities.monster; +} diff --git a/src/engine/core/utils/object/object_location.ts b/src/engine/core/utils/object/object_location.ts index 702111b5e..17066d735 100644 --- a/src/engine/core/utils/object/object_location.ts +++ b/src/engine/core/utils/object/object_location.ts @@ -1,9 +1,9 @@ -import { alife, game_graph } from "xray16"; +import { alife, game_graph, level } from "xray16"; import { SmartTerrain } from "@/engine/core/objects"; -import { getObjectSmartTerrain } from "@/engine/core/utils/object/object_general"; -import { graphDistance } from "@/engine/core/utils/vector"; -import { ClientObject, Optional, ServerObject, TDistance, TName } from "@/engine/lib/types"; +import { getObjectSmartTerrain } from "@/engine/core/utils/object/object_get"; +import { createEmptyVector, graphDistance } from "@/engine/core/utils/vector"; +import { ClientObject, Optional, ServerObject, TDistance, TName, TNumberId } from "@/engine/lib/types"; /** * Check whether object is in provided smart terrain (name). @@ -98,3 +98,16 @@ export function areObjectsOnSameLevel(first: ServerObject, second: ServerObject) export function getServerDistanceBetween(first: ServerObject, second: ServerObject): TDistance { return graphDistance(first.m_game_vertex_id, second.m_game_vertex_id); } + +/** + * todo: description + */ +export function sendToNearestAccessibleVertex(object: ClientObject, vertexId: TNumberId): TNumberId { + if (!object.accessible(vertexId)) { + vertexId = object.accessible_nearest(level.vertex_position(vertexId), createEmptyVector()); + } + + object.set_dest_level_vertex_id(vertexId); + + return vertexId; +} diff --git a/src/engine/core/utils/object/object_set.ts b/src/engine/core/utils/object/object_set.ts new file mode 100644 index 000000000..834213793 --- /dev/null +++ b/src/engine/core/utils/object/object_set.ts @@ -0,0 +1,111 @@ +import { registry } from "@/engine/core/database"; +import { getSectionsFromConditionLists, readIniNumber, readIniString } from "@/engine/core/utils/ini"; +import { isObjectInvulnerabilityNeeded } from "@/engine/core/utils/object/object_check"; +import { TInfoPortion } from "@/engine/lib/constants/info_portions"; +import { + ClientObject, + IniFile, + LuaArray, + Optional, + ServerCreatureObject, + TNumberId, + TRate, + TSection, +} from "@/engine/lib/types"; + +/** + * Set item condition. + * + * @param object - client object to change condition + * @param condition - value from 0 to 100, percents + */ +export function setItemCondition(object: ClientObject, condition: TRate): void { + object.set_condition(condition / 100); +} + +/** + * todo; + */ +export function disableObjectInvulnerability(object: ClientObject): void { + object.invulnerable(false); +} + +/** + * todo; + */ +export function updateObjectInvulnerability(object: ClientObject): void { + const isInvulnerabilityNeeded: boolean = isObjectInvulnerabilityNeeded(object); + + if (object.invulnerable() !== isInvulnerabilityNeeded) { + object.invulnerable(isInvulnerabilityNeeded); + } +} + +/** + * todo; + */ +export function resetObjectInvulnerability(object: ClientObject): void { + const nextInvulnerabilityState: boolean = isObjectInvulnerabilityNeeded(object); + + if (object.invulnerable() !== nextInvulnerabilityState) { + object.invulnerable(nextInvulnerabilityState); + } +} + +/** + * todo; + * @param serverObject - alife server object to change team parameters + * @param teamId - ? + * @param squadId - id of the parent squad, bound to spawning smart + * @param groupId - id of the level group + * + */ +export function changeTeamSquadGroup( + serverObject: ServerCreatureObject, + teamId: TNumberId, + squadId: TNumberId, + groupId: TNumberId +): void { + const clientObject: Optional = registry.objects.get(serverObject.id)?.object; + + if (clientObject === null) { + serverObject.team = teamId; + serverObject.squad = squadId; + serverObject.group = groupId; + } else { + clientObject.change_team(teamId, squadId, groupId); + } +} + +/** + * todo: rename, update + */ +export function resetObjectGroup(object: ClientObject, ini: IniFile, section: TSection): void { + const group: TNumberId = readIniNumber(ini, section, "group", false, -1); + + if (group !== -1) { + object.change_team(object.team(), object.squad(), group); + } +} + +/** + * todo; + */ +export function setObjectInfo(object: ClientObject, ini: IniFile, section: TSection): void { + const inInfosList: LuaArray = getSectionsFromConditionLists( + object, + readIniString(ini, section, "in", false, "") + ); + const outInfosList: LuaArray = getSectionsFromConditionLists( + object, + readIniString(ini, section, "out", false, "") + ); + + for (const [, infoPortion] of inInfosList) { + object.give_info_portion(infoPortion); + } + + for (const [, infoPortion] of outInfosList) { + object.disable_info_portion(infoPortion); + } +} diff --git a/src/engine/core/utils/object/object_state.ts b/src/engine/core/utils/object/object_state.ts index 8729f3e09..45ac1fa9c 100644 --- a/src/engine/core/utils/object/object_state.ts +++ b/src/engine/core/utils/object/object_state.ts @@ -2,8 +2,16 @@ import { IRegistryObjectState, registry } from "@/engine/core/database"; import { EStalkerState } from "@/engine/core/objects/state"; import { EActionId } from "@/engine/core/schemes"; import { ISchemeWoundedState } from "@/engine/core/schemes/wounded"; -import { NIL } from "@/engine/lib/constants/words"; -import { ActionPlanner, ClientObject, EScheme, Optional, TNumberId } from "@/engine/lib/types"; +import { + parseConditionsList, + pickSectionFromCondList, + readIniBoolean, + readIniNumber, + readIniString, + TConditionList, +} from "@/engine/core/utils/ini"; +import { NIL, TRUE } from "@/engine/lib/constants/words"; +import { ActionPlanner, ClientObject, EScheme, Optional, TDistance, TNumberId, TSection } from "@/engine/lib/types"; /** * @param objectId - target object id to check state @@ -40,3 +48,78 @@ export function isObjectMeeting(object: ClientObject): boolean { actionPlanner.current_action_id() === EActionId.MEET_WAITING_ACTIVITY ); } + +/** + * todo: rename, update + */ +export function initializeObjectCanSelectWeaponState( + object: ClientObject, + scheme: EScheme, + state: IRegistryObjectState, + section: TSection +): void { + let data: string = readIniString(state.ini, section, "can_select_weapon", false, "", ""); + + if (data === "") { + data = readIniString(state.ini, state.sectionLogic, "can_select_weapon", false, "", TRUE); + } + + const conditionsList: TConditionList = parseConditionsList(data); + const canSelectSection: TSection = pickSectionFromCondList(registry.actor, object, conditionsList)!; + + object.can_select_weapon(canSelectSection === TRUE); +} + +/** + * todo + */ +export function resetObjectIgnoreThreshold( + object: ClientObject, + scheme: Optional, + state: IRegistryObjectState, + section: TSection +): void { + const thresholdSection: Optional = + scheme === null || scheme === NIL + ? readIniString(state.ini, state.sectionLogic, "threshold", false, "") + : readIniString(state.ini, section, "threshold", false, ""); + + if (thresholdSection) { + const maxIgnoreDistance: Optional = readIniNumber( + state.ini, + thresholdSection, + "max_ignore_distance", + false + ); + + if (maxIgnoreDistance === null) { + object.restore_max_ignore_monster_distance(); + } else { + object.max_ignore_monster_distance(maxIgnoreDistance); + } + + const ignoreMonster: Optional = readIniNumber(state.ini, thresholdSection, "ignore_monster", false); + + if (ignoreMonster === null) { + object.restore_ignore_monster_threshold(); + } else { + object.ignore_monster_threshold(ignoreMonster); + } + } +} + +/** + * todo: rename, update + */ +export function initializeObjectTakeItemsEnabledState( + object: ClientObject, + scheme: EScheme, + state: IRegistryObjectState, + section: TSection +): void { + const isTakeItemsEnabled: boolean = state.ini.line_exist(section, "take_items") + ? readIniBoolean(state.ini, section, "take_items", false, true) + : readIniBoolean(state.ini, state.sectionLogic, "take_items", false, true); + + object.take_items_enabled(isTakeItemsEnabled); +} diff --git a/src/engine/core/utils/relation/index.ts b/src/engine/core/utils/relation/index.ts index aa9e25326..1d375be21 100644 --- a/src/engine/core/utils/relation/index.ts +++ b/src/engine/core/utils/relation/index.ts @@ -1,4 +1,4 @@ -export * from "@/engine/core/utils/relation/check"; -export * from "@/engine/core/utils/relation/get"; -export * from "@/engine/core/utils/relation/set"; -export * from "@/engine/core/utils/relation/types"; +export * from "@/engine/core/utils/relation/relation_check"; +export * from "@/engine/core/utils/relation/relation_get"; +export * from "@/engine/core/utils/relation/relation_set"; +export * from "@/engine/core/utils/relation/relation_types"; diff --git a/src/engine/core/utils/relation/check.test.ts b/src/engine/core/utils/relation/relation_check.test.ts similarity index 97% rename from src/engine/core/utils/relation/check.test.ts rename to src/engine/core/utils/relation/relation_check.test.ts index 44ce6a07e..189a56ebb 100644 --- a/src/engine/core/utils/relation/check.test.ts +++ b/src/engine/core/utils/relation/relation_check.test.ts @@ -10,9 +10,9 @@ import { isActorNeutralWithFaction, isAnySquadMemberEnemyToActor, isAnySquadMemberFriendToActor, -} from "@/engine/core/utils/relation/check"; -import { getSquadCommunityRelationToActor } from "@/engine/core/utils/relation/get"; -import { ERelation } from "@/engine/core/utils/relation/types"; +} from "@/engine/core/utils/relation/relation_check"; +import { getSquadCommunityRelationToActor } from "@/engine/core/utils/relation/relation_get"; +import { ERelation } from "@/engine/core/utils/relation/relation_types"; import { communities } from "@/engine/lib/constants/communities"; import { ACTOR_ID } from "@/engine/lib/constants/ids"; import { ServerGroupObject } from "@/engine/lib/types"; diff --git a/src/engine/core/utils/relation/check.ts b/src/engine/core/utils/relation/relation_check.ts similarity index 98% rename from src/engine/core/utils/relation/check.ts rename to src/engine/core/utils/relation/relation_check.ts index f97021317..833beef08 100644 --- a/src/engine/core/utils/relation/check.ts +++ b/src/engine/core/utils/relation/relation_check.ts @@ -2,8 +2,8 @@ import { relation_registry } from "xray16"; import { registry } from "@/engine/core/database/registry"; import { Squad } from "@/engine/core/objects"; -import { getSquadCommunityRelationToActor } from "@/engine/core/utils/relation/get"; -import { EGoodwill, ERelation } from "@/engine/core/utils/relation/types"; +import { getSquadCommunityRelationToActor } from "@/engine/core/utils/relation/relation_get"; +import { EGoodwill, ERelation } from "@/engine/core/utils/relation/relation_types"; import { communities, TCommunity } from "@/engine/lib/constants/communities"; import { ACTOR_ID } from "@/engine/lib/constants/ids"; import { ClientObject, Optional, TCount, TStringId } from "@/engine/lib/types"; diff --git a/src/engine/core/utils/relation/get.test.ts b/src/engine/core/utils/relation/relation_get.test.ts similarity index 98% rename from src/engine/core/utils/relation/get.test.ts rename to src/engine/core/utils/relation/relation_get.test.ts index 4d7e28bd7..ec4faf9f8 100644 --- a/src/engine/core/utils/relation/get.test.ts +++ b/src/engine/core/utils/relation/relation_get.test.ts @@ -9,8 +9,8 @@ import { getSquadMembersRelationToActor, getSquadMembersRelationToActorSafe, getSquadRelationToActorById, -} from "@/engine/core/utils/relation/get"; -import { ERelation } from "@/engine/core/utils/relation/types"; +} from "@/engine/core/utils/relation/relation_get"; +import { ERelation } from "@/engine/core/utils/relation/relation_types"; import { communities } from "@/engine/lib/constants/communities"; import { ACTOR_ID } from "@/engine/lib/constants/ids"; import { ClientObject, ServerGroupObject } from "@/engine/lib/types"; diff --git a/src/engine/core/utils/relation/get.ts b/src/engine/core/utils/relation/relation_get.ts similarity index 99% rename from src/engine/core/utils/relation/get.ts rename to src/engine/core/utils/relation/relation_get.ts index d2476bfc9..f3a9ce16d 100644 --- a/src/engine/core/utils/relation/get.ts +++ b/src/engine/core/utils/relation/relation_get.ts @@ -4,7 +4,7 @@ import { getServerObjectByStoryId, registry } from "@/engine/core/database"; import type { Squad } from "@/engine/core/objects/server/squad/Squad"; import { assert } from "@/engine/core/utils/assertion"; import { LuaLogger } from "@/engine/core/utils/logging"; -import { EGoodwill, ERelation } from "@/engine/core/utils/relation/types"; +import { EGoodwill, ERelation } from "@/engine/core/utils/relation/relation_types"; import { communities, TCommunity } from "@/engine/lib/constants/communities"; import { ClientObject, Optional, TCount, TNumberId, TRelationType, TStringId } from "@/engine/lib/types"; diff --git a/src/engine/core/utils/relation/set.test.ts b/src/engine/core/utils/relation/relation_set.test.ts similarity index 98% rename from src/engine/core/utils/relation/set.test.ts rename to src/engine/core/utils/relation/relation_set.test.ts index 7172189d8..05ea38ad3 100644 --- a/src/engine/core/utils/relation/set.test.ts +++ b/src/engine/core/utils/relation/relation_set.test.ts @@ -13,8 +13,8 @@ import { setSquadRelationToCommunity, setSquadRelationWithObject, updateSquadIdRelationToActor, -} from "@/engine/core/utils/relation/set"; -import { ERelation } from "@/engine/core/utils/relation/types"; +} from "@/engine/core/utils/relation/relation_set"; +import { ERelation } from "@/engine/core/utils/relation/relation_types"; import { communities } from "@/engine/lib/constants/communities"; import { ClientObject, ServerActorObject, ServerCreatureObject, ServerHumanObject, TIndex } from "@/engine/lib/types"; import { mockRelationsSquads } from "@/fixtures/engine"; diff --git a/src/engine/core/utils/relation/set.ts b/src/engine/core/utils/relation/relation_set.ts similarity index 99% rename from src/engine/core/utils/relation/set.ts rename to src/engine/core/utils/relation/relation_set.ts index c41f70d1c..f22a09d72 100644 --- a/src/engine/core/utils/relation/set.ts +++ b/src/engine/core/utils/relation/relation_set.ts @@ -5,7 +5,7 @@ import type { Squad } from "@/engine/core/objects/server/squad/Squad"; import { assert } from "@/engine/core/utils/assertion"; import { LuaLogger } from "@/engine/core/utils/logging"; import { clampNumber } from "@/engine/core/utils/number"; -import { EGoodwill, ERelation, mapRelationToGoodwill } from "@/engine/core/utils/relation/types"; +import { EGoodwill, ERelation, mapRelationToGoodwill } from "@/engine/core/utils/relation/relation_types"; import { communities, TCommunity } from "@/engine/lib/constants/communities"; import { ACTOR_ID } from "@/engine/lib/constants/ids"; import { diff --git a/src/engine/core/utils/relation/types.ts b/src/engine/core/utils/relation/relation_types.ts similarity index 100% rename from src/engine/core/utils/relation/types.ts rename to src/engine/core/utils/relation/relation_types.ts diff --git a/src/engine/core/utils/scheme/index.ts b/src/engine/core/utils/scheme/index.ts index bf0b2349e..e297d3599 100644 --- a/src/engine/core/utils/scheme/index.ts +++ b/src/engine/core/utils/scheme/index.ts @@ -1,6 +1,6 @@ -export * from "@/engine/core/utils/scheme/event"; -export * from "@/engine/core/utils/scheme/initialization"; -export * from "@/engine/core/utils/scheme/logic"; -export * from "@/engine/core/utils/scheme/monster"; -export * from "@/engine/core/utils/scheme/setup"; -export * from "@/engine/core/utils/scheme/switch"; +export * from "@/engine/core/utils/scheme/scheme_event"; +export * from "@/engine/core/utils/scheme/scheme_initialization"; +export * from "@/engine/core/utils/scheme/scheme_logic"; +export * from "@/engine/core/utils/scheme/scheme_monster"; +export * from "@/engine/core/utils/scheme/scheme_setup"; +export * from "@/engine/core/utils/scheme/scheme_switch"; diff --git a/src/engine/core/utils/scheme/event.test.ts b/src/engine/core/utils/scheme/scheme_event.test.ts similarity index 97% rename from src/engine/core/utils/scheme/event.test.ts rename to src/engine/core/utils/scheme/scheme_event.test.ts index b6408c9bc..59f7861d3 100644 --- a/src/engine/core/utils/scheme/event.test.ts +++ b/src/engine/core/utils/scheme/scheme_event.test.ts @@ -2,7 +2,7 @@ import { beforeEach, describe, expect, it, jest } from "@jest/globals"; import { registry } from "@/engine/core/database"; import { ESchemeEvent, IBaseSchemeState } from "@/engine/core/schemes"; -import { emitSchemeEvent } from "@/engine/core/utils/scheme/event"; +import { emitSchemeEvent } from "@/engine/core/utils/scheme/scheme_event"; import { ClientObject, EScheme } from "@/engine/lib/types"; import { mockSchemeState } from "@/fixtures/engine/mocks"; import { mockClientGameObject } from "@/fixtures/xray"; diff --git a/src/engine/core/utils/scheme/event.ts b/src/engine/core/utils/scheme/scheme_event.ts similarity index 100% rename from src/engine/core/utils/scheme/event.ts rename to src/engine/core/utils/scheme/scheme_event.ts diff --git a/src/engine/core/utils/scheme/initialization.test.ts b/src/engine/core/utils/scheme/scheme_initialization.test.ts similarity index 99% rename from src/engine/core/utils/scheme/initialization.test.ts rename to src/engine/core/utils/scheme/scheme_initialization.test.ts index 43ba2cb7f..4af38b40c 100644 --- a/src/engine/core/utils/scheme/initialization.test.ts +++ b/src/engine/core/utils/scheme/scheme_initialization.test.ts @@ -23,8 +23,8 @@ import { configureObjectSchemes, initializeObjectSchemeLogic, initializeObjectSectionItems, -} from "@/engine/core/utils/scheme/initialization"; -import { loadSchemeImplementation, loadSchemeImplementations } from "@/engine/core/utils/scheme/setup"; +} from "@/engine/core/utils/scheme/scheme_initialization"; +import { loadSchemeImplementation, loadSchemeImplementations } from "@/engine/core/utils/scheme/scheme_setup"; import { AnyObject, ClientObject, EClientObjectRelation, EScheme, ESchemeType, IniFile } from "@/engine/lib/types"; import { resetFunctionMock } from "@/fixtures/utils"; import { FILES_MOCKS, mockClientGameObject, mockIniFile, mockServerAlifeHumanStalker } from "@/fixtures/xray"; diff --git a/src/engine/core/utils/scheme/initialization.ts b/src/engine/core/utils/scheme/scheme_initialization.ts similarity index 97% rename from src/engine/core/utils/scheme/initialization.ts rename to src/engine/core/utils/scheme/scheme_initialization.ts index 7b9dbac06..a159506d2 100644 --- a/src/engine/core/utils/scheme/initialization.ts +++ b/src/engine/core/utils/scheme/scheme_initialization.ts @@ -8,15 +8,15 @@ import { ESchemeEvent, IBaseSchemeState } from "@/engine/core/schemes"; import { assert } from "@/engine/core/utils/assertion"; import { readIniNumber, readIniString } from "@/engine/core/utils/ini"; import { LuaLogger } from "@/engine/core/utils/logging"; -import { getObjectSmartTerrain } from "@/engine/core/utils/object/object_general"; +import { getObjectSmartTerrain } from "@/engine/core/utils/object/object_get"; import { ERelation } from "@/engine/core/utils/relation"; -import { emitSchemeEvent } from "@/engine/core/utils/scheme/event"; +import { emitSchemeEvent } from "@/engine/core/utils/scheme/scheme_event"; import { activateSchemeBySection, enableObjectBaseSchemes, getSectionToActivate, -} from "@/engine/core/utils/scheme/logic"; -import { disableObjectBaseSchemes } from "@/engine/core/utils/scheme/setup"; +} from "@/engine/core/utils/scheme/scheme_logic"; +import { disableObjectBaseSchemes } from "@/engine/core/utils/scheme/scheme_setup"; import { spawnItemsForObject } from "@/engine/core/utils/spawn"; import { logicsConfig } from "@/engine/lib/configs/LogicsConfig"; import { TInventoryItem } from "@/engine/lib/constants/items"; diff --git a/src/engine/core/utils/scheme/logic.test.ts b/src/engine/core/utils/scheme/scheme_logic.test.ts similarity index 99% rename from src/engine/core/utils/scheme/logic.test.ts rename to src/engine/core/utils/scheme/scheme_logic.test.ts index 79679b3b3..46ef255f9 100644 --- a/src/engine/core/utils/scheme/logic.test.ts +++ b/src/engine/core/utils/scheme/scheme_logic.test.ts @@ -40,8 +40,8 @@ import { getSectionToActivate, isSectionActive, resetObjectGenericSchemesOnSectionSwitch, -} from "@/engine/core/utils/scheme/logic"; -import { loadSchemeImplementation, loadSchemeImplementations } from "@/engine/core/utils/scheme/setup"; +} from "@/engine/core/utils/scheme/scheme_logic"; +import { loadSchemeImplementation, loadSchemeImplementations } from "@/engine/core/utils/scheme/scheme_setup"; import { NIL } from "@/engine/lib/constants/words"; import { ClientObject, EScheme, ESchemeType, IniFile, ServerHumanObject } from "@/engine/lib/types"; import { getSchemeAction, mockSchemeState } from "@/fixtures/engine/mocks"; diff --git a/src/engine/core/utils/scheme/logic.ts b/src/engine/core/utils/scheme/scheme_logic.ts similarity index 95% rename from src/engine/core/utils/scheme/logic.ts rename to src/engine/core/utils/scheme/scheme_logic.ts index d7e810a5b..e15c2b7ec 100644 --- a/src/engine/core/utils/scheme/logic.ts +++ b/src/engine/core/utils/scheme/scheme_logic.ts @@ -12,22 +12,20 @@ import { TAbstractSchemeConstructor, } from "@/engine/core/schemes"; import { assert, assertDefined } from "@/engine/core/utils/assertion"; -import { getObjectConfigOverrides, pickSectionFromCondList } from "@/engine/core/utils/ini/config"; -import { getSchemeFromSection } from "@/engine/core/utils/ini/parse"; -import { readIniConditionList, readIniString } from "@/engine/core/utils/ini/read"; +import { getObjectConfigOverrides, pickSectionFromCondList } from "@/engine/core/utils/ini/ini_config"; +import { getSchemeFromSection } from "@/engine/core/utils/ini/ini_parse"; +import { readIniConditionList, readIniString } from "@/engine/core/utils/ini/ini_read"; import { LuaLogger } from "@/engine/core/utils/logging"; +import { getObjectSmartTerrain } from "@/engine/core/utils/object/object_get"; +import { sendToNearestAccessibleVertex } from "@/engine/core/utils/object/object_location"; +import { resetObjectGroup, resetObjectInvulnerability, setObjectInfo } from "@/engine/core/utils/object/object_set"; import { - getObjectSmartTerrain, initializeObjectCanSelectWeaponState, initializeObjectTakeItemsEnabledState, - resetObjectGroup, resetObjectIgnoreThreshold, - resetObjectInvulnerability, - sendToNearestAccessibleVertex, - setObjectInfo, -} from "@/engine/core/utils/object/object_general"; -import { emitSchemeEvent } from "@/engine/core/utils/scheme/event"; -import { scriptReleaseMonster } from "@/engine/core/utils/scheme/monster"; +} from "@/engine/core/utils/object/object_state"; +import { emitSchemeEvent } from "@/engine/core/utils/scheme/scheme_event"; +import { scriptReleaseMonster } from "@/engine/core/utils/scheme/scheme_monster"; import { NIL } from "@/engine/lib/constants/words"; import { ClientObject, EScheme, ESchemeType, IniFile, Optional, TSection } from "@/engine/lib/types"; diff --git a/src/engine/core/utils/scheme/monster.test.ts b/src/engine/core/utils/scheme/scheme_monster.test.ts similarity index 97% rename from src/engine/core/utils/scheme/monster.test.ts rename to src/engine/core/utils/scheme/scheme_monster.test.ts index 0d0873bee..ae92024eb 100644 --- a/src/engine/core/utils/scheme/monster.test.ts +++ b/src/engine/core/utils/scheme/scheme_monster.test.ts @@ -4,7 +4,7 @@ import { isMonsterScriptCaptured, scriptCaptureMonster, scriptReleaseMonster, -} from "@/engine/core/utils/scheme/monster"; +} from "@/engine/core/utils/scheme/scheme_monster"; import { ClientObject } from "@/engine/lib/types"; import { replaceFunctionMock, resetFunctionMock } from "@/fixtures/utils"; import { mockClientGameObject } from "@/fixtures/xray"; diff --git a/src/engine/core/utils/scheme/monster.ts b/src/engine/core/utils/scheme/scheme_monster.ts similarity index 85% rename from src/engine/core/utils/scheme/monster.ts rename to src/engine/core/utils/scheme/scheme_monster.ts index 5ed5af449..c5188f0db 100644 --- a/src/engine/core/utils/scheme/monster.ts +++ b/src/engine/core/utils/scheme/scheme_monster.ts @@ -1,7 +1,17 @@ -import { resetMonsterAction } from "@/engine/core/utils/object/object_general"; import { logicsConfig } from "@/engine/lib/configs/LogicsConfig"; import { ClientObject, TName } from "@/engine/lib/types"; +/** + * todo; + */ +export function resetMonsterAction(object: ClientObject, scriptName: TName): void { + if (object.get_script()) { + object.script(false, object.get_script_name()); + } + + object.script(true, scriptName); +} + /** * Check whether monster is currently captured by script logic. * diff --git a/src/engine/core/utils/scheme/setup.test.ts b/src/engine/core/utils/scheme/scheme_setup.test.ts similarity index 99% rename from src/engine/core/utils/scheme/setup.test.ts rename to src/engine/core/utils/scheme/scheme_setup.test.ts index 152653635..3ff60c503 100644 --- a/src/engine/core/utils/scheme/setup.test.ts +++ b/src/engine/core/utils/scheme/scheme_setup.test.ts @@ -14,7 +14,7 @@ import { disableObjectBaseSchemes, loadSchemeImplementation, loadSchemeImplementations, -} from "@/engine/core/utils/scheme/setup"; +} from "@/engine/core/utils/scheme/scheme_setup"; import { ActionBase, EScheme, ESchemeType } from "@/engine/lib/types"; import { MockActionBase, mockClientGameObject } from "@/fixtures/xray"; diff --git a/src/engine/core/utils/scheme/setup.ts b/src/engine/core/utils/scheme/scheme_setup.ts similarity index 98% rename from src/engine/core/utils/scheme/setup.ts rename to src/engine/core/utils/scheme/scheme_setup.ts index 8c9541a20..981296238 100644 --- a/src/engine/core/utils/scheme/setup.ts +++ b/src/engine/core/utils/scheme/scheme_setup.ts @@ -4,8 +4,8 @@ import { registry } from "@/engine/core/database"; import { EEvaluatorId, TAbstractSchemeConstructor } from "@/engine/core/schemes"; import { assert } from "@/engine/core/utils/assertion"; import { LuaLogger } from "@/engine/core/utils/logging"; -import { disableObjectInvulnerability } from "@/engine/core/utils/object/object_general"; -import { ActionBase, ClientObject, EScheme, ESchemeType, LuaArray, Optional, TSection } from "@/engine/lib/types"; +import { disableObjectInvulnerability } from "@/engine/core/utils/object/object_set"; +import { ActionBase, ClientObject, EScheme, ESchemeType, LuaArray } from "@/engine/lib/types"; const logger: LuaLogger = new LuaLogger($filename); diff --git a/src/engine/core/utils/scheme/switch.test.ts b/src/engine/core/utils/scheme/scheme_switch.test.ts similarity index 99% rename from src/engine/core/utils/scheme/switch.test.ts rename to src/engine/core/utils/scheme/scheme_switch.test.ts index 285b4f0c9..8517dca76 100644 --- a/src/engine/core/utils/scheme/switch.test.ts +++ b/src/engine/core/utils/scheme/scheme_switch.test.ts @@ -7,10 +7,10 @@ import { SchemeIdle } from "@/engine/core/schemes/sr_idle"; import { SchemeTimer } from "@/engine/core/schemes/sr_timer"; import { TimerManager } from "@/engine/core/schemes/sr_timer/TimerManager"; import { giveInfo } from "@/engine/core/utils/info_portion"; -import { addConditionToList } from "@/engine/core/utils/ini/config"; -import { parseConditionsList } from "@/engine/core/utils/ini/parse"; -import { loadSchemeImplementation } from "@/engine/core/utils/scheme/setup"; -import { switchObjectSchemeToSection, trySwitchToAnotherSection } from "@/engine/core/utils/scheme/switch"; +import { addConditionToList } from "@/engine/core/utils/ini/ini_config"; +import { parseConditionsList } from "@/engine/core/utils/ini/ini_parse"; +import { loadSchemeImplementation } from "@/engine/core/utils/scheme/scheme_setup"; +import { switchObjectSchemeToSection, trySwitchToAnotherSection } from "@/engine/core/utils/scheme/scheme_switch"; import { NIL } from "@/engine/lib/constants/words"; import { ClientObject, EScheme, ESchemeCondition, IniFile, LuaArray } from "@/engine/lib/types"; import { getSchemeAction, mockBaseSchemeLogic, mockSchemeState } from "@/fixtures/engine"; diff --git a/src/engine/core/utils/scheme/switch.ts b/src/engine/core/utils/scheme/scheme_switch.ts similarity index 98% rename from src/engine/core/utils/scheme/switch.ts rename to src/engine/core/utils/scheme/scheme_switch.ts index d68f2a7f8..f186f487b 100644 --- a/src/engine/core/utils/scheme/switch.ts +++ b/src/engine/core/utils/scheme/scheme_switch.ts @@ -3,12 +3,12 @@ import { game, level, time_global } from "xray16"; import { IRegistryObjectState, registry } from "@/engine/core/database"; import { ESchemeEvent, IBaseSchemeLogic, IBaseSchemeState } from "@/engine/core/schemes"; import { abort, assert } from "@/engine/core/utils/assertion"; -import { pickSectionFromCondList } from "@/engine/core/utils/ini/config"; +import { pickSectionFromCondList } from "@/engine/core/utils/ini/ini_config"; import { LuaLogger } from "@/engine/core/utils/logging"; -import { isActorSeenByObject } from "@/engine/core/utils/object/object_general"; +import { isActorSeenByObject } from "@/engine/core/utils/object/object_check"; import { isObjectInZone } from "@/engine/core/utils/object/object_location"; -import { emitSchemeEvent } from "@/engine/core/utils/scheme/event"; -import { activateSchemeBySection } from "@/engine/core/utils/scheme/logic"; +import { emitSchemeEvent } from "@/engine/core/utils/scheme/scheme_event"; +import { activateSchemeBySection } from "@/engine/core/utils/scheme/scheme_logic"; import { getDistanceBetween } from "@/engine/core/utils/vector"; import { NIL } from "@/engine/lib/constants/words"; import { diff --git a/src/engine/core/utils/sound.ts b/src/engine/core/utils/sound.ts index 05339ebb6..e127b7b47 100644 --- a/src/engine/core/utils/sound.ts +++ b/src/engine/core/utils/sound.ts @@ -2,7 +2,7 @@ import { bit_and, snd_type } from "xray16"; import { LuaLogger } from "@/engine/core/utils/logging"; import { ESoundType } from "@/engine/lib/constants/sound/sound_type"; -import { TSoundType } from "@/engine/lib/types"; +import { ClientObject, TSoundType } from "@/engine/lib/types"; const logger: LuaLogger = new LuaLogger($filename); @@ -63,3 +63,13 @@ export function mapSoundMaskToSoundType(soundMask: TSoundType): ESoundType { export function isSoundType(heard: TSoundType, expected: TSoundType): boolean { return bit_and(heard, expected) === expected; } + +/** + * todo; + */ +export function stopPlayingObjectSound(object: ClientObject): void { + if (object.alive()) { + object.set_sound_mask(-1); + object.set_sound_mask(0); + } +} diff --git a/src/engine/core/utils/spawn.ts b/src/engine/core/utils/spawn.ts index 789ecbd8a..a2be0b083 100644 --- a/src/engine/core/utils/spawn.ts +++ b/src/engine/core/utils/spawn.ts @@ -6,7 +6,7 @@ import { SmartTerrain, Squad } from "@/engine/core/objects"; import { assertDefined } from "@/engine/core/utils/assertion"; import { isAmmoSection, isStalker } from "@/engine/core/utils/check/is"; import { LuaLogger } from "@/engine/core/utils/logging"; -import { getObjectPositioning } from "@/engine/core/utils/object/object_general"; +import { getObjectPositioning } from "@/engine/core/utils/object/object_get"; import { createEmptyVector } from "@/engine/core/utils/vector"; import { TCaption } from "@/engine/lib/constants/captions"; import { TInventoryItem } from "@/engine/lib/constants/items"; diff --git a/src/engine/core/utils/time.ts b/src/engine/core/utils/time.ts index f94eb8e03..d0e40c04e 100644 --- a/src/engine/core/utils/time.ts +++ b/src/engine/core/utils/time.ts @@ -2,7 +2,7 @@ import { game, level, time_global, verify_if_thread_is_running } from "xray16"; import { LuaLogger } from "@/engine/core/utils/logging"; import { MAX_U8 } from "@/engine/lib/constants/memory"; -import { NetPacket, NetProcessor, Optional, TDuration, Time, TLabel, TTimestamp } from "@/engine/lib/types"; +import { NetPacket, NetProcessor, Optional, TDuration, Time, TLabel, TRate, TTimestamp } from "@/engine/lib/types"; const logger: LuaLogger = new LuaLogger($filename); @@ -140,3 +140,31 @@ export function readTimeFromPacket(reader: NetProcessor): Optional