diff --git a/AUTHORS b/AUTHORS index ca4fff8d0..17937d8a1 100644 --- a/AUTHORS +++ b/AUTHORS @@ -12,8 +12,12 @@ veteran29 # CONTRIBUTORS AkiKay +ArtOfWar arc Badger 2-3 +Caleb +denispol +dr_ext Fedora12 Glowbal gnif @@ -21,6 +25,7 @@ Jonpas Khaos KingDaddyBoyz / Price LorenLuke +Mad [Hk] Martian OverlordZorn Psycool diff --git a/addons/all_in_one/addon.gproj b/addons/all_in_one/addon.gproj index 623e32e2d..f01a44421 100755 --- a/addons/all_in_one/addon.gproj +++ b/addons/all_in_one/addon.gproj @@ -3,7 +3,7 @@ GameProject { GUID "60C4E0B49618CC62" TITLE "ACE All in One" Dependencies { - "58D0FB3206B6F859" "60C4CE4888FF4621" "60E573C9B04CC408" "5DBD560C5148E1DA" "5EB744C5F42E0800" "60C53A9372ED3964" "606C369BAC3F6CC3" "60C4C12DAE90727B" "65860252A17554C7" "60EAEA0389DB3CC2" "611CB1D409001EB0" "61B7763A8AEB53B7" "646D52AF8BB3FF15" "61226BB18D360BDD" "64475DC102F2BDA4" "62F802951CC8A37E" "68EAA4976497C46A" + "58D0FB3206B6F859" "60C4CE4888FF4621" "60E573C9B04CC408" "5DBD560C5148E1DA" "5EB744C5F42E0800" "60C53A9372ED3964" "606C369BAC3F6CC3" "60C4C12DAE90727B" "65860252A17554C7" "6214CEA5DA92BFF3" "60EAEA0389DB3CC2" "611CB1D409001EB0" "61B7763A8AEB53B7" "646D52AF8BB3FF15" "61226BB18D360BDD" "64475DC102F2BDA4" "62F802951CC8A37E" "68EAA4976497C46A" } Configurations { GameProjectConfig PC { diff --git a/addons/all_in_one/dev.gproj b/addons/all_in_one/dev.gproj index ab6555320..8aba89395 100644 --- a/addons/all_in_one/dev.gproj +++ b/addons/all_in_one/dev.gproj @@ -3,7 +3,7 @@ GameProject { GUID "65AD7BE594439A52" TITLE "ACE All in One Dev" Dependencies { - "58D0FB3206B6F859" "65AD7D0D9941A380" "65AD7C139EB4C1A1" "65AD7C379CBD394D" "65AD7BCC9F6B3B4E" "65AD7CF69FAF1FDD" "65AD7D2E9866FA6E" "6586079789278413" "65B343F799FB521B" "65AD7CE59E8DB349" "65AD7D4099944EBD" "65AD7D1E9EEAFA53" "65AD7C249E4ECDFB" "65AD7CB89F219E38" "65AD7C75826B46C6" "65AD7CD09CAEC4E2" "68EAA4B96976D557" + "58D0FB3206B6F859" "65AD7D0D9941A380" "65AD7C139EB4C1A1" "65AD7C379CBD394D" "65AD7BCC9F6B3B4E" "65AD7CF69FAF1FDD" "65AD7D2E9866FA6E" "6586079789278413" "65B343F799FB521B" "65AD7D4F994EA327" "65AD7CE59E8DB349" "65AD7D4099944EBD" "65AD7D1E9EEAFA53" "65AD7C249E4ECDFB" "65AD7CB89F219E38" "65AD7C75826B46C6" "65AD7CD09CAEC4E2" "68EAA4B96976D557" } Configurations { GameProjectConfig PC { diff --git a/addons/captives/Configs/EntityCatalog/ACE_InventoryItems_EntityCatalog_Equipment.conf b/addons/captives/Configs/EntityCatalog/ACE_InventoryItems_EntityCatalog_Equipment.conf new file mode 100644 index 000000000..1186cc782 --- /dev/null +++ b/addons/captives/Configs/EntityCatalog/ACE_InventoryItems_EntityCatalog_Equipment.conf @@ -0,0 +1,14 @@ +ACE_EntityCatalogMultiListEntry { + m_aEntities { + SCR_EntityCatalogInventoryItem "{64FC20C065CA64F5}" { + m_sEntityPrefab "{CBF9B9942E07B6B8}Prefabs/Items/Equipment/Accessories/ZipCuffs/ACE_Captives_ZipCuffs.et" + m_aEntityDataList { + SCR_ArsenalItem "{64FC20C19D482C89}" { + m_eItemType EQUIPMENT + m_eItemMode CONSUMABLE + m_iSupplyCost 0 + } + } + } + } +} \ No newline at end of file diff --git a/addons/tactical_periscope/Configs/EntityCatalog/FIA/FIA_InventoryItems.conf.meta b/addons/captives/Configs/EntityCatalog/ACE_InventoryItems_EntityCatalog_Equipment.conf.meta similarity index 77% rename from addons/tactical_periscope/Configs/EntityCatalog/FIA/FIA_InventoryItems.conf.meta rename to addons/captives/Configs/EntityCatalog/ACE_InventoryItems_EntityCatalog_Equipment.conf.meta index ca1cb77ce..28b784c60 100644 --- a/addons/tactical_periscope/Configs/EntityCatalog/FIA/FIA_InventoryItems.conf.meta +++ b/addons/captives/Configs/EntityCatalog/ACE_InventoryItems_EntityCatalog_Equipment.conf.meta @@ -1,5 +1,5 @@ MetaFileClass { - Name "{E908001749419691}Configs/EntityCatalog/FIA/FIA_InventoryItems.conf" + Name "{0AFC873567388CDE}Configs/EntityCatalog/ACE_InventoryItemsBase.conf" Configurations { CONFResourceClass PC { } diff --git a/addons/captives/Configs/EntityCatalog/FIA/FIA_InventoryItems.conf b/addons/captives/Configs/EntityCatalog/FIA/FIA_InventoryItems.conf deleted file mode 100644 index ac6929e87..000000000 --- a/addons/captives/Configs/EntityCatalog/FIA/FIA_InventoryItems.conf +++ /dev/null @@ -1,18 +0,0 @@ -SCR_EntityCatalogMultiList { - m_aMultiLists { - SCR_EntityCatalogMultiListEntry "{5C630E453BCB39DC}" { - m_aEntities { - SCR_EntityCatalogInventoryItem "{64FC20C065CA64F5}" { - m_sEntityPrefab "{CBF9B9942E07B6B8}Prefabs/Items/Equipment/Accessories/ZipCuffs/ACE_Captives_ZipCuffs.et" - m_aEntityDataList { - SCR_ArsenalItem "{64FC20C19D482C89}" { - m_eItemType EQUIPMENT - m_eItemMode CONSUMABLE - m_iSupplyCost 0 - } - } - } - } - } - } -} \ No newline at end of file diff --git a/addons/captives/Configs/EntityCatalog/US/US_InventoryItems.conf b/addons/captives/Configs/EntityCatalog/US/US_InventoryItems.conf deleted file mode 100644 index 18144b2d1..000000000 --- a/addons/captives/Configs/EntityCatalog/US/US_InventoryItems.conf +++ /dev/null @@ -1,18 +0,0 @@ -SCR_EntityCatalogMultiList { - m_aMultiLists { - SCR_EntityCatalogMultiListEntry "{5C68AD59F0753ABE}" { - m_aEntities { - SCR_EntityCatalogInventoryItem "{64FC20C065CA64F5}" { - m_sEntityPrefab "{CBF9B9942E07B6B8}Prefabs/Items/Equipment/Accessories/ZipCuffs/ACE_Captives_ZipCuffs.et" - m_aEntityDataList { - SCR_ArsenalItem "{64FC20C19D482C89}" { - m_eItemType EQUIPMENT - m_eItemMode CONSUMABLE - m_iSupplyCost 0 - } - } - } - } - } - } -} \ No newline at end of file diff --git a/addons/captives/Configs/EntityCatalog/USSR/USSR_InventoryItems.conf b/addons/captives/Configs/EntityCatalog/USSR/USSR_InventoryItems.conf deleted file mode 100644 index bcb41f324..000000000 --- a/addons/captives/Configs/EntityCatalog/USSR/USSR_InventoryItems.conf +++ /dev/null @@ -1,18 +0,0 @@ -SCR_EntityCatalogMultiList { - m_aMultiLists { - SCR_EntityCatalogMultiListEntry "{5C68AD5F7414CA4A}" { - m_aEntities { - SCR_EntityCatalogInventoryItem "{64FC20C065CA64F5}" { - m_sEntityPrefab "{CBF9B9942E07B6B8}Prefabs/Items/Equipment/Accessories/ZipCuffs/ACE_Captives_ZipCuffs.et" - m_aEntityDataList { - SCR_ArsenalItem "{64FC20C19D482C89}" { - m_eItemType EQUIPMENT - m_eItemMode CONSUMABLE - m_iSupplyCost 0 - } - } - } - } - } - } -} \ No newline at end of file diff --git a/addons/core/Configs/EntityCatalog/ACE_InventoryItems_EntityCatalog_Equipment.conf b/addons/core/Configs/EntityCatalog/ACE_InventoryItems_EntityCatalog_Equipment.conf new file mode 100644 index 000000000..bdc38f217 --- /dev/null +++ b/addons/core/Configs/EntityCatalog/ACE_InventoryItems_EntityCatalog_Equipment.conf @@ -0,0 +1,24 @@ +ACE_EntityCatalogMultiListEntry { + m_sIdentifier "ACE Equipment" + m_aEntities { + SCR_EntityCatalogInventoryItem "{60FD565F7DFBE6A4}" { + m_sEntityPrefab "{181B4ADA65725D59}Prefabs/Items/Core/ACE_Banana.et" + m_aEntityDataList { + SCR_ArsenalItem "{60FD565F75061ED6}" { + m_eItemType NON_LETHAL_THROWABLE + m_iSupplyCost 0 + } + } + } + SCR_EntityCatalogInventoryItem "{60FD565F20A453B3}" { + m_sEntityPrefab "{9310D03C4A62286F}Prefabs/Weapons/Grenades/ACE_FragBanana.et" + m_aEntityDataList { + SCR_ArsenalItem "{60FD565F5B120DC6}" { + m_eItemType LETHAL_THROWABLE + m_iSupplyCost 3 + } + } + } + } + m_iACE_Priority -25 +} \ No newline at end of file diff --git a/addons/tactical_ladder/Configs/EntityCatalog/FIA/FIA_InventoryItems.conf.meta b/addons/core/Configs/EntityCatalog/ACE_InventoryItems_EntityCatalog_Equipment.conf.meta similarity index 77% rename from addons/tactical_ladder/Configs/EntityCatalog/FIA/FIA_InventoryItems.conf.meta rename to addons/core/Configs/EntityCatalog/ACE_InventoryItems_EntityCatalog_Equipment.conf.meta index ca1cb77ce..28b784c60 100644 --- a/addons/tactical_ladder/Configs/EntityCatalog/FIA/FIA_InventoryItems.conf.meta +++ b/addons/core/Configs/EntityCatalog/ACE_InventoryItems_EntityCatalog_Equipment.conf.meta @@ -1,5 +1,5 @@ MetaFileClass { - Name "{E908001749419691}Configs/EntityCatalog/FIA/FIA_InventoryItems.conf" + Name "{0AFC873567388CDE}Configs/EntityCatalog/ACE_InventoryItemsBase.conf" Configurations { CONFResourceClass PC { } diff --git a/addons/core/Configs/EntityCatalog/ACE_InventoryItems_EntityCatalog_Medical.conf b/addons/core/Configs/EntityCatalog/ACE_InventoryItems_EntityCatalog_Medical.conf new file mode 100644 index 000000000..a0b3ea597 --- /dev/null +++ b/addons/core/Configs/EntityCatalog/ACE_InventoryItems_EntityCatalog_Medical.conf @@ -0,0 +1,4 @@ +ACE_EntityCatalogMultiListEntry { + m_sIdentifier "ACE Medical" + m_iACE_Priority -35 +} \ No newline at end of file diff --git a/addons/core/Configs/EntityCatalog/ACE_InventoryItems_EntityCatalog_Medical.conf.meta b/addons/core/Configs/EntityCatalog/ACE_InventoryItems_EntityCatalog_Medical.conf.meta new file mode 100644 index 000000000..a7d63222d --- /dev/null +++ b/addons/core/Configs/EntityCatalog/ACE_InventoryItems_EntityCatalog_Medical.conf.meta @@ -0,0 +1,17 @@ +MetaFileClass { + Name "{A5E3827C546B8210}Configs/EntityCatalog/ACE_InventoryItems_EntityCatalog_Medical.conf" + Configurations { + CONFResourceClass PC { + } + CONFResourceClass XBOX_ONE : PC { + } + CONFResourceClass XBOX_SERIES : PC { + } + CONFResourceClass PS4 : PC { + } + CONFResourceClass PS5 : PC { + } + CONFResourceClass HEADLESS : PC { + } + } +} \ No newline at end of file diff --git a/addons/core/Configs/EntityCatalog/FIA/FIA_InventoryItems.conf b/addons/core/Configs/EntityCatalog/FIA/FIA_InventoryItems.conf deleted file mode 100644 index d631a6652..000000000 --- a/addons/core/Configs/EntityCatalog/FIA/FIA_InventoryItems.conf +++ /dev/null @@ -1,26 +0,0 @@ -SCR_EntityCatalogMultiList { - m_aMultiLists { - SCR_EntityCatalogMultiListEntry "{5C68AD58703CABF4}" { - m_aEntities { - SCR_EntityCatalogInventoryItem "{60FD565F7DFBE6A4}" { - m_sEntityPrefab "{181B4ADA65725D59}Prefabs/Items/Core/ACE_Banana.et" - m_aEntityDataList { - SCR_ArsenalItem "{60FD565F75061ED6}" { - m_eItemType NON_LETHAL_THROWABLE - m_iSupplyCost 0 - } - } - } - SCR_EntityCatalogInventoryItem "{60FD565F20A453B3}" { - m_sEntityPrefab "{9310D03C4A62286F}Prefabs/Weapons/Grenades/ACE_FragBanana.et" - m_aEntityDataList { - SCR_ArsenalItem "{60FD565F5B120DC6}" { - m_eItemType LETHAL_THROWABLE - m_iSupplyCost 3 - } - } - } - } - } - } -} \ No newline at end of file diff --git a/addons/core/Configs/EntityCatalog/FIA/InventoryItems_EntityCatalog_FIA.conf b/addons/core/Configs/EntityCatalog/FIA/InventoryItems_EntityCatalog_FIA.conf new file mode 100644 index 000000000..2d3098ef3 --- /dev/null +++ b/addons/core/Configs/EntityCatalog/FIA/InventoryItems_EntityCatalog_FIA.conf @@ -0,0 +1,29 @@ +SCR_EntityCatalogMultiList { + m_aMultiLists { + SCR_EntityCatalogMultiListEntry "{5C630E453CE20F8F}" { + m_iACE_Priority -70 + } + SCR_EntityCatalogMultiListEntry "{5C630E4538D3163D}" { + m_iACE_Priority -60 + } + SCR_EntityCatalogMultiListEntry "{5C630E453CA0B981}" { + m_iACE_Priority -50 + } + SCR_EntityCatalogMultiListEntry "{5C68AD58703CABF4}" { + m_iACE_Priority -40 + } + SCR_EntityCatalogMultiListEntry "{5C630E453BCB39DC}" { + m_iACE_Priority -30 + } + SCR_EntityCatalogMultiListEntry "{5C630E453B60C320}" { + m_iACE_Priority -20 + } + SCR_EntityCatalogMultiListEntry "{5C630E453B27FB86}" { + m_iACE_Priority -10 + } + ACE_EntityCatalogMultiListEntry "{69D210804C2BFE9E}" : "{A5E3827C546B8210}Configs/EntityCatalog/ACE_InventoryItems_EntityCatalog_Medical.conf" { + } + ACE_EntityCatalogMultiListEntry "{69D102AC05BFC4DC}" : "{382ACD2D23811DDE}Configs/EntityCatalog/USSR/ACE_InventoryItems_EntityCatalog_Equipment_USSR.conf" { + } + } +} \ No newline at end of file diff --git a/addons/captives/Configs/EntityCatalog/FIA/FIA_InventoryItems.conf.meta b/addons/core/Configs/EntityCatalog/FIA/InventoryItems_EntityCatalog_FIA.conf.meta similarity index 100% rename from addons/captives/Configs/EntityCatalog/FIA/FIA_InventoryItems.conf.meta rename to addons/core/Configs/EntityCatalog/FIA/InventoryItems_EntityCatalog_FIA.conf.meta diff --git a/addons/core/Configs/EntityCatalog/UK/ACE_InventoryItems_EntityCatalog_Equipment_UK.conf b/addons/core/Configs/EntityCatalog/UK/ACE_InventoryItems_EntityCatalog_Equipment_UK.conf new file mode 100644 index 000000000..c41933b32 --- /dev/null +++ b/addons/core/Configs/EntityCatalog/UK/ACE_InventoryItems_EntityCatalog_Equipment_UK.conf @@ -0,0 +1,2 @@ +ACE_EntityCatalogMultiListEntry : "{0AFC873567388CDE}Configs/EntityCatalog/ACE_InventoryItems_EntityCatalog_Equipment.conf" { +} \ No newline at end of file diff --git a/addons/core/Configs/EntityCatalog/FIA/FIA_InventoryItems.conf.meta b/addons/core/Configs/EntityCatalog/UK/ACE_InventoryItems_EntityCatalog_Equipment_UK.conf.meta similarity index 77% rename from addons/core/Configs/EntityCatalog/FIA/FIA_InventoryItems.conf.meta rename to addons/core/Configs/EntityCatalog/UK/ACE_InventoryItems_EntityCatalog_Equipment_UK.conf.meta index ca1cb77ce..59be24be2 100644 --- a/addons/core/Configs/EntityCatalog/FIA/FIA_InventoryItems.conf.meta +++ b/addons/core/Configs/EntityCatalog/UK/ACE_InventoryItems_EntityCatalog_Equipment_UK.conf.meta @@ -1,5 +1,5 @@ MetaFileClass { - Name "{E908001749419691}Configs/EntityCatalog/FIA/FIA_InventoryItems.conf" + Name "{E7D9069BE26B7A4C}Configs/EntityCatalog/ACE_UK_InventoryItems.conf" Configurations { CONFResourceClass PC { } diff --git a/addons/core/Configs/EntityCatalog/UK/Arsenal Lists/UK_Ammunition_All.conf b/addons/core/Configs/EntityCatalog/UK/Arsenal Lists/UK_Ammunition_All.conf new file mode 100644 index 000000000..043707a49 --- /dev/null +++ b/addons/core/Configs/EntityCatalog/UK/Arsenal Lists/UK_Ammunition_All.conf @@ -0,0 +1,3 @@ +SCR_EntityCatalogMultiListEntry { + m_iACE_Priority -60 +} \ No newline at end of file diff --git a/addons/medical_core/Configs/EntityCatalog/US/InventoryItems_EntityCatalog_US.conf.meta b/addons/core/Configs/EntityCatalog/UK/Arsenal Lists/UK_Ammunition_All.conf.meta similarity index 74% rename from addons/medical_core/Configs/EntityCatalog/US/InventoryItems_EntityCatalog_US.conf.meta rename to addons/core/Configs/EntityCatalog/UK/Arsenal Lists/UK_Ammunition_All.conf.meta index e60da21c0..765355db8 100644 --- a/addons/medical_core/Configs/EntityCatalog/US/InventoryItems_EntityCatalog_US.conf.meta +++ b/addons/core/Configs/EntityCatalog/UK/Arsenal Lists/UK_Ammunition_All.conf.meta @@ -1,5 +1,5 @@ MetaFileClass { - Name "{5F7EC52FC40A03E2}Configs/EntityCatalog/US/InventoryItems_EntityCatalog_US.conf" + Name "{9B8732534F2FCDAE}Configs/EntityCatalog/UK/Arsenal Lists/UK_Ammunition_All.conf" Configurations { CONFResourceClass PC { } @@ -9,9 +9,9 @@ MetaFileClass { } CONFResourceClass PS4 : PC { } - CONFResourceClass HEADLESS : PC { - } CONFResourceClass PS5 : PC { } + CONFResourceClass HEADLESS : PC { + } } } \ No newline at end of file diff --git a/addons/core/Configs/EntityCatalog/UK/Arsenal Lists/UK_BackpacksVests_All.conf b/addons/core/Configs/EntityCatalog/UK/Arsenal Lists/UK_BackpacksVests_All.conf new file mode 100644 index 000000000..b0d41ef9e --- /dev/null +++ b/addons/core/Configs/EntityCatalog/UK/Arsenal Lists/UK_BackpacksVests_All.conf @@ -0,0 +1,3 @@ +SCR_EntityCatalogMultiListEntry { + m_iACE_Priority -20 +} \ No newline at end of file diff --git a/addons/medical_core/Configs/EntityCatalog/FIA/InventoryItems_EntityCatalog_FIA.conf.meta b/addons/core/Configs/EntityCatalog/UK/Arsenal Lists/UK_BackpacksVests_All.conf.meta similarity index 73% rename from addons/medical_core/Configs/EntityCatalog/FIA/InventoryItems_EntityCatalog_FIA.conf.meta rename to addons/core/Configs/EntityCatalog/UK/Arsenal Lists/UK_BackpacksVests_All.conf.meta index 49381bb91..636707ef3 100644 --- a/addons/medical_core/Configs/EntityCatalog/FIA/InventoryItems_EntityCatalog_FIA.conf.meta +++ b/addons/core/Configs/EntityCatalog/UK/Arsenal Lists/UK_BackpacksVests_All.conf.meta @@ -1,5 +1,5 @@ MetaFileClass { - Name "{E908001749419691}Configs/EntityCatalog/FIA/InventoryItems_EntityCatalog_FIA.conf" + Name "{89C89802F8B15EF0}Configs/EntityCatalog/UK/Arsenal Lists/UK_BackpacksVests_All.conf" Configurations { CONFResourceClass PC { } @@ -9,9 +9,9 @@ MetaFileClass { } CONFResourceClass PS4 : PC { } - CONFResourceClass HEADLESS : PC { - } CONFResourceClass PS5 : PC { } + CONFResourceClass HEADLESS : PC { + } } } \ No newline at end of file diff --git a/addons/core/Configs/EntityCatalog/UK/Arsenal Lists/UK_Clothing_All.conf b/addons/core/Configs/EntityCatalog/UK/Arsenal Lists/UK_Clothing_All.conf new file mode 100644 index 000000000..d13f2664e --- /dev/null +++ b/addons/core/Configs/EntityCatalog/UK/Arsenal Lists/UK_Clothing_All.conf @@ -0,0 +1,3 @@ +SCR_EntityCatalogMultiListEntry { + m_iACE_Priority -10 +} \ No newline at end of file diff --git a/addons/core/Configs/EntityCatalog/UK/Arsenal Lists/UK_Clothing_All.conf.meta b/addons/core/Configs/EntityCatalog/UK/Arsenal Lists/UK_Clothing_All.conf.meta new file mode 100644 index 000000000..dd8741a2d --- /dev/null +++ b/addons/core/Configs/EntityCatalog/UK/Arsenal Lists/UK_Clothing_All.conf.meta @@ -0,0 +1,17 @@ +MetaFileClass { + Name "{2A937B904F3FA670}Configs/EntityCatalog/UK/Arsenal Lists/UK_Clothing_All.conf" + Configurations { + CONFResourceClass PC { + } + CONFResourceClass XBOX_ONE : PC { + } + CONFResourceClass XBOX_SERIES : PC { + } + CONFResourceClass PS4 : PC { + } + CONFResourceClass PS5 : PC { + } + CONFResourceClass HEADLESS : PC { + } + } +} \ No newline at end of file diff --git a/addons/core/Configs/EntityCatalog/UK/Arsenal Lists/UK_Equipment_All.conf b/addons/core/Configs/EntityCatalog/UK/Arsenal Lists/UK_Equipment_All.conf new file mode 100644 index 000000000..9f5d327ac --- /dev/null +++ b/addons/core/Configs/EntityCatalog/UK/Arsenal Lists/UK_Equipment_All.conf @@ -0,0 +1,3 @@ +SCR_EntityCatalogMultiListEntry { + m_iACE_Priority -30 +} \ No newline at end of file diff --git a/addons/core/Configs/EntityCatalog/UK/Arsenal Lists/UK_Equipment_All.conf.meta b/addons/core/Configs/EntityCatalog/UK/Arsenal Lists/UK_Equipment_All.conf.meta new file mode 100644 index 000000000..faf27f22f --- /dev/null +++ b/addons/core/Configs/EntityCatalog/UK/Arsenal Lists/UK_Equipment_All.conf.meta @@ -0,0 +1,17 @@ +MetaFileClass { + Name "{92B601BD2DC5A55F}Configs/EntityCatalog/UK/Arsenal Lists/UK_Equipment_All.conf" + Configurations { + CONFResourceClass PC { + } + CONFResourceClass XBOX_ONE : PC { + } + CONFResourceClass XBOX_SERIES : PC { + } + CONFResourceClass PS4 : PC { + } + CONFResourceClass PS5 : PC { + } + CONFResourceClass HEADLESS : PC { + } + } +} \ No newline at end of file diff --git a/addons/core/Configs/EntityCatalog/UK/Arsenal Lists/UK_Explosives_All.conf b/addons/core/Configs/EntityCatalog/UK/Arsenal Lists/UK_Explosives_All.conf new file mode 100644 index 000000000..e001fab76 --- /dev/null +++ b/addons/core/Configs/EntityCatalog/UK/Arsenal Lists/UK_Explosives_All.conf @@ -0,0 +1,3 @@ +SCR_EntityCatalogMultiListEntry { + m_iACE_Priority -40 +} \ No newline at end of file diff --git a/addons/core/Configs/EntityCatalog/UK/Arsenal Lists/UK_Explosives_All.conf.meta b/addons/core/Configs/EntityCatalog/UK/Arsenal Lists/UK_Explosives_All.conf.meta new file mode 100644 index 000000000..ab28dc1c8 --- /dev/null +++ b/addons/core/Configs/EntityCatalog/UK/Arsenal Lists/UK_Explosives_All.conf.meta @@ -0,0 +1,17 @@ +MetaFileClass { + Name "{0F0D0C941E412EE7}Configs/EntityCatalog/UK/Arsenal Lists/UK_Explosives_All.conf" + Configurations { + CONFResourceClass PC { + } + CONFResourceClass XBOX_ONE : PC { + } + CONFResourceClass XBOX_SERIES : PC { + } + CONFResourceClass PS4 : PC { + } + CONFResourceClass PS5 : PC { + } + CONFResourceClass HEADLESS : PC { + } + } +} \ No newline at end of file diff --git a/addons/core/Configs/EntityCatalog/UK/Arsenal Lists/UK_WeaponAttachments_All.conf b/addons/core/Configs/EntityCatalog/UK/Arsenal Lists/UK_WeaponAttachments_All.conf new file mode 100644 index 000000000..854beddfc --- /dev/null +++ b/addons/core/Configs/EntityCatalog/UK/Arsenal Lists/UK_WeaponAttachments_All.conf @@ -0,0 +1,3 @@ +SCR_EntityCatalogMultiListEntry { + m_iACE_Priority -50 +} \ No newline at end of file diff --git a/addons/core/Configs/EntityCatalog/UK/Arsenal Lists/UK_WeaponAttachments_All.conf.meta b/addons/core/Configs/EntityCatalog/UK/Arsenal Lists/UK_WeaponAttachments_All.conf.meta new file mode 100644 index 000000000..21650723d --- /dev/null +++ b/addons/core/Configs/EntityCatalog/UK/Arsenal Lists/UK_WeaponAttachments_All.conf.meta @@ -0,0 +1,17 @@ +MetaFileClass { + Name "{37FBA7E7466F4CB9}Configs/EntityCatalog/UK/Arsenal Lists/UK_WeaponAttachments_All.conf" + Configurations { + CONFResourceClass PC { + } + CONFResourceClass XBOX_ONE : PC { + } + CONFResourceClass XBOX_SERIES : PC { + } + CONFResourceClass PS4 : PC { + } + CONFResourceClass PS5 : PC { + } + CONFResourceClass HEADLESS : PC { + } + } +} \ No newline at end of file diff --git a/addons/core/Configs/EntityCatalog/UK/Arsenal Lists/UK_Weapons_All.conf b/addons/core/Configs/EntityCatalog/UK/Arsenal Lists/UK_Weapons_All.conf new file mode 100644 index 000000000..23d083d1d --- /dev/null +++ b/addons/core/Configs/EntityCatalog/UK/Arsenal Lists/UK_Weapons_All.conf @@ -0,0 +1,3 @@ +SCR_EntityCatalogMultiListEntry { + m_iACE_Priority -70 +} \ No newline at end of file diff --git a/addons/core/Configs/EntityCatalog/UK/Arsenal Lists/UK_Weapons_All.conf.meta b/addons/core/Configs/EntityCatalog/UK/Arsenal Lists/UK_Weapons_All.conf.meta new file mode 100644 index 000000000..083d66647 --- /dev/null +++ b/addons/core/Configs/EntityCatalog/UK/Arsenal Lists/UK_Weapons_All.conf.meta @@ -0,0 +1,17 @@ +MetaFileClass { + Name "{C2EE8603146E36CB}Configs/EntityCatalog/UK/Arsenal Lists/UK_Weapons_All.conf" + Configurations { + CONFResourceClass PC { + } + CONFResourceClass XBOX_ONE : PC { + } + CONFResourceClass XBOX_SERIES : PC { + } + CONFResourceClass PS4 : PC { + } + CONFResourceClass PS5 : PC { + } + CONFResourceClass HEADLESS : PC { + } + } +} \ No newline at end of file diff --git a/addons/core/Configs/EntityCatalog/UK/UK_InventoryItems.conf b/addons/core/Configs/EntityCatalog/UK/UK_InventoryItems.conf new file mode 100644 index 000000000..e315d7a65 --- /dev/null +++ b/addons/core/Configs/EntityCatalog/UK/UK_InventoryItems.conf @@ -0,0 +1,8 @@ +SCR_EntityCatalogMultiList { + m_aMultiLists { + ACE_EntityCatalogMultiListEntry "{69D247D5F3DF316A}" : "{A5E3827C546B8210}Configs/EntityCatalog/ACE_InventoryItems_EntityCatalog_Medical.conf" { + } + ACE_EntityCatalogMultiListEntry "{69D247D5F0D5014E}" : "{E7D9069BE26B7A4C}Configs/EntityCatalog/UK/ACE_InventoryItems_EntityCatalog_Equipment_UK.conf" { + } + } +} \ No newline at end of file diff --git a/addons/facepaint/Configs/EntityCatalog/UK/UK_InventoryItems.conf.meta b/addons/core/Configs/EntityCatalog/UK/UK_InventoryItems.conf.meta similarity index 100% rename from addons/facepaint/Configs/EntityCatalog/UK/UK_InventoryItems.conf.meta rename to addons/core/Configs/EntityCatalog/UK/UK_InventoryItems.conf.meta diff --git a/addons/core/Configs/EntityCatalog/US/ACE_InventoryItems_EntityCatalog_Equipment_US.conf b/addons/core/Configs/EntityCatalog/US/ACE_InventoryItems_EntityCatalog_Equipment_US.conf new file mode 100644 index 000000000..c41933b32 --- /dev/null +++ b/addons/core/Configs/EntityCatalog/US/ACE_InventoryItems_EntityCatalog_Equipment_US.conf @@ -0,0 +1,2 @@ +ACE_EntityCatalogMultiListEntry : "{0AFC873567388CDE}Configs/EntityCatalog/ACE_InventoryItems_EntityCatalog_Equipment.conf" { +} \ No newline at end of file diff --git a/addons/tactical_ladder/Configs/EntityCatalog/USSR/USSR_InventoryItems.conf.meta b/addons/core/Configs/EntityCatalog/US/ACE_InventoryItems_EntityCatalog_Equipment_US.conf.meta similarity index 81% rename from addons/tactical_ladder/Configs/EntityCatalog/USSR/USSR_InventoryItems.conf.meta rename to addons/core/Configs/EntityCatalog/US/ACE_InventoryItems_EntityCatalog_Equipment_US.conf.meta index e300bbe36..9ff7b4525 100644 --- a/addons/tactical_ladder/Configs/EntityCatalog/USSR/USSR_InventoryItems.conf.meta +++ b/addons/core/Configs/EntityCatalog/US/ACE_InventoryItems_EntityCatalog_Equipment_US.conf.meta @@ -1,5 +1,5 @@ MetaFileClass { - Name "{C53421647C3D0D2E}Configs/EntityCatalog/USSR/USSR_InventoryItems.conf" + Name "{12790B4E7D42F952}Configs/EntityCatalog/US/ACE_US_InventoryItems.conf" Configurations { CONFResourceClass PC { } diff --git a/addons/core/Configs/EntityCatalog/US/InventoryItems_EntityCatalog_US.conf b/addons/core/Configs/EntityCatalog/US/InventoryItems_EntityCatalog_US.conf new file mode 100644 index 000000000..30be64e2e --- /dev/null +++ b/addons/core/Configs/EntityCatalog/US/InventoryItems_EntityCatalog_US.conf @@ -0,0 +1,29 @@ +SCR_EntityCatalogMultiList { + m_aMultiLists { + SCR_EntityCatalogMultiListEntry "{5C68AD59AB9FBDDC}" { + m_iACE_Priority -70 + } + SCR_EntityCatalogMultiListEntry "{5C68AD59AA6FA1B8}" { + m_iACE_Priority -60 + } + SCR_EntityCatalogMultiListEntry "{5C68AD59AA315A22}" { + m_iACE_Priority -50 + } + SCR_EntityCatalogMultiListEntry "{5CA0A9E60B892D2A}" { + m_iACE_Priority -40 + } + SCR_EntityCatalogMultiListEntry "{5C68AD59F0753ABE}" { + m_iACE_Priority -30 + } + SCR_EntityCatalogMultiListEntry "{5C68AD59AA2B2FF4}" { + m_iACE_Priority -20 + } + SCR_EntityCatalogMultiListEntry "{5C68AD59AA1A6D59}" { + m_iACE_Priority -10 + } + ACE_EntityCatalogMultiListEntry "{69D102AC212B4389}" : "{A5E3827C546B8210}Configs/EntityCatalog/ACE_InventoryItems_EntityCatalog_Medical.conf" { + } + ACE_EntityCatalogMultiListEntry "{69D2108069E4B053}" : "{12790B4E7D42F952}Configs/EntityCatalog/US/ACE_InventoryItems_EntityCatalog_Equipment_US.conf" { + } + } +} \ No newline at end of file diff --git a/addons/captives/Configs/EntityCatalog/US/US_InventoryItems.conf.meta b/addons/core/Configs/EntityCatalog/US/InventoryItems_EntityCatalog_US.conf.meta similarity index 100% rename from addons/captives/Configs/EntityCatalog/US/US_InventoryItems.conf.meta rename to addons/core/Configs/EntityCatalog/US/InventoryItems_EntityCatalog_US.conf.meta diff --git a/addons/core/Configs/EntityCatalog/US/US_InventoryItems.conf b/addons/core/Configs/EntityCatalog/US/US_InventoryItems.conf deleted file mode 100644 index 8435bbfce..000000000 --- a/addons/core/Configs/EntityCatalog/US/US_InventoryItems.conf +++ /dev/null @@ -1,26 +0,0 @@ -SCR_EntityCatalogMultiList { - m_aMultiLists { - SCR_EntityCatalogMultiListEntry "{5CA0A9E60B892D2A}" { - m_aEntities { - SCR_EntityCatalogInventoryItem "{60FD565F7DFBE6A4}" { - m_sEntityPrefab "{181B4ADA65725D59}Prefabs/Items/Core/ACE_Banana.et" - m_aEntityDataList { - SCR_ArsenalItem "{60FD565F75061ED6}" { - m_eItemType NON_LETHAL_THROWABLE - m_iSupplyCost 0 - } - } - } - SCR_EntityCatalogInventoryItem "{60FD565F20A453B3}" { - m_sEntityPrefab "{9310D03C4A62286F}Prefabs/Weapons/Grenades/ACE_FragBanana.et" - m_aEntityDataList { - SCR_ArsenalItem "{60FD565F5B120DC6}" { - m_eItemType LETHAL_THROWABLE - m_iSupplyCost 3 - } - } - } - } - } - } -} \ No newline at end of file diff --git a/addons/core/Configs/EntityCatalog/USSR/ACE_InventoryItems_EntityCatalog_Equipment_USSR.conf b/addons/core/Configs/EntityCatalog/USSR/ACE_InventoryItems_EntityCatalog_Equipment_USSR.conf new file mode 100644 index 000000000..c41933b32 --- /dev/null +++ b/addons/core/Configs/EntityCatalog/USSR/ACE_InventoryItems_EntityCatalog_Equipment_USSR.conf @@ -0,0 +1,2 @@ +ACE_EntityCatalogMultiListEntry : "{0AFC873567388CDE}Configs/EntityCatalog/ACE_InventoryItems_EntityCatalog_Equipment.conf" { +} \ No newline at end of file diff --git a/addons/core/Configs/EntityCatalog/USSR/ACE_InventoryItems_EntityCatalog_Equipment_USSR.conf.meta b/addons/core/Configs/EntityCatalog/USSR/ACE_InventoryItems_EntityCatalog_Equipment_USSR.conf.meta new file mode 100644 index 000000000..3fba1bccb --- /dev/null +++ b/addons/core/Configs/EntityCatalog/USSR/ACE_InventoryItems_EntityCatalog_Equipment_USSR.conf.meta @@ -0,0 +1,17 @@ +MetaFileClass { + Name "{382ACD2D23811DDE}Configs/EntityCatalog/USSR/ACE_USSR_InventoryItems.conf" + Configurations { + CONFResourceClass PC { + } + CONFResourceClass XBOX_ONE : PC { + } + CONFResourceClass XBOX_SERIES : PC { + } + CONFResourceClass PS4 : PC { + } + CONFResourceClass PS5 : PC { + } + CONFResourceClass HEADLESS : PC { + } + } +} \ No newline at end of file diff --git a/addons/core/Configs/EntityCatalog/USSR/InventoryItems_EntityCatalog_USSR.conf b/addons/core/Configs/EntityCatalog/USSR/InventoryItems_EntityCatalog_USSR.conf new file mode 100644 index 000000000..e67b1973b --- /dev/null +++ b/addons/core/Configs/EntityCatalog/USSR/InventoryItems_EntityCatalog_USSR.conf @@ -0,0 +1,29 @@ +SCR_EntityCatalogMultiList { + m_aMultiLists { + SCR_EntityCatalogMultiListEntry "{5C68AD5F14BDB1A7}" { + m_iACE_Priority -70 + } + SCR_EntityCatalogMultiListEntry "{5C68AD5F148714C4}" { + m_iACE_Priority -60 + } + SCR_EntityCatalogMultiListEntry "{5C68AD5F137C9AFF}" { + m_iACE_Priority -50 + } + SCR_EntityCatalogMultiListEntry "{5C68AD5F1351A624}" { + m_iACE_Priority -40 + } + SCR_EntityCatalogMultiListEntry "{5C68AD5F7414CA4A}" { + m_iACE_Priority -30 + } + SCR_EntityCatalogMultiListEntry "{5C68AD5F13464B23}" { + m_iACE_Priority -20 + } + SCR_EntityCatalogMultiListEntry "{5C68AD5F13240031}" { + m_iACE_Priority -10 + } + ACE_EntityCatalogMultiListEntry "{69D102AC4014161D}" : "{A5E3827C546B8210}Configs/EntityCatalog/ACE_InventoryItems_EntityCatalog_Medical.conf" { + } + ACE_EntityCatalogMultiListEntry "{69D2108063218CBD}" : "{382ACD2D23811DDE}Configs/EntityCatalog/USSR/ACE_InventoryItems_EntityCatalog_Equipment_USSR.conf" { + } + } +} \ No newline at end of file diff --git a/addons/captives/Configs/EntityCatalog/USSR/USSR_InventoryItems.conf.meta b/addons/core/Configs/EntityCatalog/USSR/InventoryItems_EntityCatalog_USSR.conf.meta similarity index 100% rename from addons/captives/Configs/EntityCatalog/USSR/USSR_InventoryItems.conf.meta rename to addons/core/Configs/EntityCatalog/USSR/InventoryItems_EntityCatalog_USSR.conf.meta diff --git a/addons/core/Configs/EntityCatalog/USSR/USSR_InventoryItems.conf b/addons/core/Configs/EntityCatalog/USSR/USSR_InventoryItems.conf deleted file mode 100644 index 820562a90..000000000 --- a/addons/core/Configs/EntityCatalog/USSR/USSR_InventoryItems.conf +++ /dev/null @@ -1,26 +0,0 @@ -SCR_EntityCatalogMultiList { - m_aMultiLists { - SCR_EntityCatalogMultiListEntry "{5C68AD5F1351A624}" { - m_aEntities { - SCR_EntityCatalogInventoryItem "{60FD565F7DFBE6A4}" { - m_sEntityPrefab "{181B4ADA65725D59}Prefabs/Items/Core/ACE_Banana.et" - m_aEntityDataList { - SCR_ArsenalItem "{60FD565F75061ED6}" { - m_eItemType NON_LETHAL_THROWABLE - m_iSupplyCost 0 - } - } - } - SCR_EntityCatalogInventoryItem "{60FD565F20A453B3}" { - m_sEntityPrefab "{9310D03C4A62286F}Prefabs/Weapons/Grenades/ACE_FragBanana.et" - m_aEntityDataList { - SCR_ArsenalItem "{60FD565F5B120DC6}" { - m_eItemType LETHAL_THROWABLE - m_iSupplyCost 3 - } - } - } - } - } - } -} \ No newline at end of file diff --git a/addons/core/Configs/Systems/ChimeraSystemsConfig.conf b/addons/core/Configs/Systems/ChimeraSystemsConfig.conf index 1f49f1dcd..cf5566474 100644 --- a/addons/core/Configs/Systems/ChimeraSystemsConfig.conf +++ b/addons/core/Configs/Systems/ChimeraSystemsConfig.conf @@ -1,5 +1,8 @@ SystemSettings : "{45C53F06BA17238D}configs/Systems/SystemsConfig.conf" { Systems { + ACE_FrameJobSystem "{65BD626A0110EC75}" { + SystemPoints 0x2014 0 + } ACE_LoadtimeEntityManager "{66ACC8B1AE46C9A6}" { SystemPoints 0 0x10 } diff --git a/addons/core/scripts/Game/ACE_Core/EntityCatalog/ACE_EntityCatalogMultiListEntry.c b/addons/core/scripts/Game/ACE_Core/EntityCatalog/ACE_EntityCatalogMultiListEntry.c new file mode 100644 index 000000000..98d6e0bf3 --- /dev/null +++ b/addons/core/scripts/Game/ACE_Core/EntityCatalog/ACE_EntityCatalogMultiListEntry.c @@ -0,0 +1,6 @@ +//---------------------------------------------------------------------------- +//! Same as vanilla, but can be a standalone conf file +[BaseContainerProps(configRoot: true), SCR_BaseContainerCustomEntityCatalogMultiListEntry("m_sIdentifier", "m_aEntities")] +class ACE_EntityCatalogMultiListEntry : SCR_EntityCatalogMultiListEntry +{ +} diff --git a/addons/core/scripts/Game/ACE_Core/EntityCatalog/SCR_EntityCatalogMultiList.c b/addons/core/scripts/Game/ACE_Core/EntityCatalog/SCR_EntityCatalogMultiList.c new file mode 100644 index 000000000..991550c20 --- /dev/null +++ b/addons/core/scripts/Game/ACE_Core/EntityCatalog/SCR_EntityCatalogMultiList.c @@ -0,0 +1,11 @@ +//------------------------------------------------------------------------------------------------ +[BaseContainerProps(configRoot: true), SCR_BaseContainerCustomEntityCatalogCatalog(EEntityCatalogType, "m_eEntityCatalogType", "m_aEntityEntryList", "m_aMultiLists")] +modded class SCR_EntityCatalogMultiList: SCR_EntityCatalog +{ + //------------------------------------------------------------------------------------------------ + protected override void InitCatalog() + { + ACE_Sorting, ACE_CompateEntityCatalogMultiListEntryPriority>.InsertionSort(m_aMultiLists); + super.InitCatalog(); + } +} diff --git a/addons/core/scripts/Game/ACE_Core/EntityCatalog/SCR_EntityCatalogMultiListEntry.c b/addons/core/scripts/Game/ACE_Core/EntityCatalog/SCR_EntityCatalogMultiListEntry.c new file mode 100644 index 000000000..de89fb368 --- /dev/null +++ b/addons/core/scripts/Game/ACE_Core/EntityCatalog/SCR_EntityCatalogMultiListEntry.c @@ -0,0 +1,17 @@ +//------------------------------------------------------------------------------------------------ +[BaseContainerProps(), SCR_BaseContainerCustomEntityCatalogMultiListEntry("m_sIdentifier", "m_aEntities")] +modded class SCR_EntityCatalogMultiListEntry +{ + [SortAttribute(), Attribute(desc: "Sort priority of the entry. Lower value means higher priority.")] + int m_iACE_Priority; +} + +//------------------------------------------------------------------------------------------------ +class ACE_CompateEntityCatalogMultiListEntryPriority : SCR_SortCompare +{ + //------------------------------------------------------------------------------------------------ + override static int Compare(SCR_EntityCatalogMultiListEntry left, SCR_EntityCatalogMultiListEntry right) + { + return left.m_iACE_Priority < right.m_iACE_Priority; + } +} diff --git a/addons/core/scripts/Game/ACE_Core/FSM/ACE_FSM_EStateID.c b/addons/core/scripts/Game/ACE_Core/FSM/ACE_FSM_EStateID.c new file mode 100644 index 000000000..ddad964c7 --- /dev/null +++ b/addons/core/scripts/Game/ACE_Core/FSM/ACE_FSM_EStateID.c @@ -0,0 +1,8 @@ +//------------------------------------------------------------------------------------------------ +//! Subclass from this enum for concrete FSM implementations +//! States IDs should be implemented as bit flags +enum ACE_FSM_EStateID +{ + ANY = -1, + STOP = 0 +} diff --git a/addons/core/scripts/Game/ACE_Core/FSM/ACE_FSM_IState.c b/addons/core/scripts/Game/ACE_Core/FSM/ACE_FSM_IState.c new file mode 100644 index 000000000..b2405993e --- /dev/null +++ b/addons/core/scripts/Game/ACE_Core/FSM/ACE_FSM_IState.c @@ -0,0 +1,29 @@ +//------------------------------------------------------------------------------------------------ +//! Interface of FSM state +//! This object should be stateless if you want to share instances between machines (e.g. shallow copies) +//! Data should be implemented in TContext instead +class ACE_FSM_IState : Managed +{ + protected ACE_FSM_EStateID m_eID; + + //------------------------------------------------------------------------------------------------ + void ACE_FSM_IState(ACE_FSM_EStateID id) + { + m_eID = id; + } + + //------------------------------------------------------------------------------------------------ + void OnUpdate(TContext context, float timeSlice); + + //------------------------------------------------------------------------------------------------ + void OnEnter(TContext context); + + //------------------------------------------------------------------------------------------------ + void OnExit(TContext context); + + //------------------------------------------------------------------------------------------------ + ACE_FSM_EStateID GetID() + { + return m_eID; + } +} diff --git a/addons/core/scripts/Game/ACE_Core/FSM/ACE_FSM_ITransition.c b/addons/core/scripts/Game/ACE_Core/FSM/ACE_FSM_ITransition.c new file mode 100644 index 000000000..7838c4368 --- /dev/null +++ b/addons/core/scripts/Game/ACE_Core/FSM/ACE_FSM_ITransition.c @@ -0,0 +1,36 @@ +//------------------------------------------------------------------------------------------------ +//! Interface of FSM transition +//! This object should be stateless if you want to share instances between machines (e.g. shallow copies) +//! Data should be implemented in TContext instead +class ACE_FSM_ITransition : Managed +{ + protected ACE_FSM_EStateID m_eFromStateIDs; + protected ACE_FSM_EStateID m_eToStateID; + + //------------------------------------------------------------------------------------------------ + //! Multiple `from` states are possible by combining ACE_FSM_EStateID bit flags + void ACE_FSM_ITransition(ACE_FSM_EStateID fromStateIDs, ACE_FSM_EStateID toStateID) + { + m_eFromStateIDs = fromStateIDs; + m_eToStateID = toStateID; + } + + //------------------------------------------------------------------------------------------------ + void OnPerform(TContext context); + + //------------------------------------------------------------------------------------------------ + //! Add condition for the transition here + bool ShouldBePerformed(TContext context, float timeSlice); + + //------------------------------------------------------------------------------------------------ + ACE_FSM_EStateID GetFromStateIDs() + { + return m_eFromStateIDs; + } + + //------------------------------------------------------------------------------------------------ + ACE_FSM_EStateID GetToStateID() + { + return m_eToStateID; + } +} diff --git a/addons/core/scripts/Game/ACE_Core/FSM/ACE_FSM_Machine.c b/addons/core/scripts/Game/ACE_Core/FSM/ACE_FSM_Machine.c new file mode 100644 index 000000000..3e11619fb --- /dev/null +++ b/addons/core/scripts/Game/ACE_Core/FSM/ACE_FSM_Machine.c @@ -0,0 +1,187 @@ +//------------------------------------------------------------------------------------------------ +//! Implementation of a finite state machine +//! Data to be passed to states should be defined in TContext +class ACE_FSM_Machine : ACE_IFrameJob +{ + // Unique data + protected ref TContext m_pContext = null; + protected int m_iCurrentStateIdx = -1; + + // Shared data (Can be shared between instances through ACE_FSM_Machine::CopyFrom) + protected ref array> m_aStates = {}; + protected ref array> m_aTransitions = {}; + protected ref array>> m_aTransitionTable; + + //------------------------------------------------------------------------------------------------ + //! Adds a state + //! If a state with the same ID already exists, it will replace it + void AddState(ACE_FSM_IState newState) + { + ACE_FSM_EStateID newID = newState.GetID(); + + foreach (int i, ACE_FSM_IState state : m_aStates) + { + if (state.GetID() == newID) + { + m_aStates[i] = newState; + return; + } + } + + m_aStates.Insert(newState); + + if (IsRunning()) + UpdateTransitionTable(); + else + m_aTransitionTable = null; + } + + //------------------------------------------------------------------------------------------------ + //! Adds a transition + //! If a transition between the same states already exists, it will replace it + void AddTransition(ACE_FSM_ITransition newTransition) + { + ACE_FSM_EStateID newToIDs = newTransition.GetToStateID(); + ACE_FSM_EStateID newFromID = newTransition.GetFromStateIDs(); + + foreach (int i, ACE_FSM_ITransition transition : m_aTransitions) + { + if ((transition.GetToStateID() == newToIDs) && (transition.GetFromStateIDs() == newFromID)) + { + m_aTransitions[i] = newTransition; + return; + } + } + + m_aTransitions.Insert(newTransition); + + if (IsRunning()) + UpdateTransitionTable(); + } + + //------------------------------------------------------------------------------------------------ + //! Updates current state and handles transitions + //! Reason for the order: + //! As the current state's OnUpdate often integrates context variables over timeSlice, the + //! evaulation of transition conditions should be done afterwards + override void OnUpdate(float timeSlice) + { + super.OnUpdate(); + m_aStates[m_iCurrentStateIdx].OnUpdate(m_pContext, timeSlice); + HandleTransitions(timeSlice); + } + + //------------------------------------------------------------------------------------------------ + //! Initializes elements and transition table + override void OnStart() + { + super.OnStart(); + + if (!m_aTransitionTable) + UpdateTransitionTable(); + + ChangeStateByIdx(0); + } + + //------------------------------------------------------------------------------------------------ + //! Clean up current state + override void OnStop() + { + super.OnStop(); + ChangeStateByIdx(-1); + } + + //------------------------------------------------------------------------------------------------ + void UpdateTransitionTable() + { + m_aTransitionTable = {}; + m_aTransitionTable.Reserve(m_aStates.Count()); + + foreach (ACE_FSM_IState state : m_aStates) + { + ACE_FSM_EStateID id = state.GetID(); + array> availableTransitions = {}; + + foreach (ACE_FSM_ITransition transition : m_aTransitions) + { + if (transition.GetFromStateIDs() & id) + availableTransitions.Insert(transition); + } + + m_aTransitionTable.Insert(availableTransitions); + } + } + + //------------------------------------------------------------------------------------------------ + //! Checks transition conditions and performs the first eligible transition + protected void HandleTransitions(float timeSlice) + { + foreach (ACE_FSM_ITransition transition : m_aTransitionTable[m_iCurrentStateIdx]) + { + if (transition.ShouldBePerformed(m_pContext, timeSlice)) + { + transition.OnPerform(m_pContext); + ChangeState(transition.GetToStateID()); + return; + } + } + } + + //------------------------------------------------------------------------------------------------ + void ChangeState(ACE_FSM_EStateID newStateID) + { + foreach (int idx, ACE_FSM_IState state : m_aStates) + { + if (newStateID == state.GetID()) + return ChangeStateByIdx(idx); + } + + if (!newStateID) + Stop(); + } + + //------------------------------------------------------------------------------------------------ + protected void ChangeStateByIdx(int newStateIdx) + { + if (m_iCurrentStateIdx >= 0) + m_aStates[m_iCurrentStateIdx].OnExit(m_pContext); + + m_iCurrentStateIdx = newStateIdx; + + if (m_iCurrentStateIdx >= 0) + m_aStates[m_iCurrentStateIdx].OnEnter(m_pContext); + } + + //------------------------------------------------------------------------------------------------ + void SetContext(TContext context) + { + m_pContext = context; + } + + //------------------------------------------------------------------------------------------------ + TContext GetContext() + { + return m_pContext; + } + + //------------------------------------------------------------------------------------------------ + ACE_FSM_EStateID GetCurrentStateID() + { + return m_aStates[m_iCurrentStateIdx]; + } + + //------------------------------------------------------------------------------------------------ + //! Makes a shallow copy of states and transitions of the based FSM + override void CopyFrom(ACE_IFrameJob from) + { + super.CopyFrom(from); + + ACE_FSM_Machine castedFrom = ACE_FSM_Machine.Cast(from); + if (!castedFrom) + return; + + m_aStates = castedFrom.m_aStates; + m_aTransitions = castedFrom.m_aTransitions; + m_aTransitionTable = castedFrom.m_aTransitionTable; + } +} diff --git a/addons/core/scripts/Game/ACE_Core/Global/ACE_DiagTools.c b/addons/core/scripts/Game/ACE_Core/Global/ACE_DiagTools.c index 7d4b17cff..53c40159e 100644 --- a/addons/core/scripts/Game/ACE_Core/Global/ACE_DiagTools.c +++ b/addons/core/scripts/Game/ACE_Core/Global/ACE_DiagTools.c @@ -7,7 +7,11 @@ class ACE_DiagTools //! Return true if a target was found static bool GetDiagTargetCharacter(out IEntity target, out string targetType) { - CameraBase camera = GetGame().GetCameraManager().CurrentCamera(); + CameraManager cameraManager = GetGame().GetCameraManager(); + if (!cameraManager) + return false; + + CameraBase camera = cameraManager.CurrentCamera(); if (!camera) return false; diff --git a/addons/core/scripts/Game/ACE_Core/Global/ACE_Math.c b/addons/core/scripts/Game/ACE_Core/Global/ACE_Math.c new file mode 100644 index 000000000..ae838f10a --- /dev/null +++ b/addons/core/scripts/Game/ACE_Core/Global/ACE_Math.c @@ -0,0 +1,28 @@ +//------------------------------------------------------------------------------------------------ +class ACE_Math +{ + //------------------------------------------------------------------------------------------------ + //! Return Euler's constant raised to the power of x + static float Exp(float x) + { + return Math.Pow(Math.E, x); + } + + //------------------------------------------------------------------------------------------------ + //! Evaluate normalized Hill equation at x + static float Hill(float x) + { + return x / (1 + x); + } + + //------------------------------------------------------------------------------------------------ + //! Round float to a given precision in decimal digits + //! \param[in] value value to be rounded + //! \param[in] precision number of decimal places to round to + //! \return rounded float + static float Round(float value, int precision) + { + float scale = Math.Pow(10, precision); + return Math.Round(value * scale) / scale; + } +} diff --git a/addons/core/scripts/Game/ACE_Core/Global/ACE_MathTools.c b/addons/core/scripts/Game/ACE_Core/Global/ACE_MathTools.c new file mode 100644 index 000000000..cc91efa28 --- /dev/null +++ b/addons/core/scripts/Game/ACE_Core/Global/ACE_MathTools.c @@ -0,0 +1,150 @@ +//------------------------------------------------------------------------------------------------ +//! Collection of numerical tools +class ACE_MathTools +{ + //------------------------------------------------------------------------------------------------ + //! Compute root of scalar function f(x) with bisection method + //! Convergence is met when either xtol or ftol is converged + //! \param[in] fn scalar function f + //! \param[in] x0 first starting point + //! \param[in] x1 second starting point + //! \param[in] xtol maximum absolute step in x for convergence + //! \param[in] ftol minimum absolute value of f for convergence + //! \param[in] maxIter maximum number of iterations + //! \return result object with solution + static ACE_MathTools_RootResult Bisect(ACE_MathTools_FunctionBase fn, float x0, float x1, float xtol = 1.48e-8, float ftol = -1.0, int maxIter = 100) + { + ACE_MathTools_RootResult result = new ACE_MathTools_RootResult(); + float f0 = fn.Eval(x0); + float f1 = fn.Eval(x1); + float x2 = 0.5 * (x0 + x1); + + if (Math.AbsFloat(f0) <= ftol) + { + result.m_fRoot = x0; + result.m_bConverged = true; + return result; + } + + if (Math.AbsFloat(f1) <= ftol) + { + result.m_fRoot = x1; + result.m_bConverged = true; + return result; + } + + if (f0.Sign() == f1.Sign()) + { + result.m_fRoot = x2; + result.m_bConverged = false; + return result; + } + + for (int i = 1; i <= maxIter; ++i) + { + float f2 = fn.Eval(x2); + float dx = 0.5 * (x1 - x0); + + if ((Math.AbsFloat(dx) <= xtol) || (Math.AbsFloat(f2) <= ftol)) + { + result.m_bConverged = true; + break; + } + + int newSign = f2.Sign(); + + if (newSign != f0.Sign()) + { + x1 = x2; + f1 = f2; + } + else if (newSign != f1.Sign()) + { + x0 = x2; + f0 = f2; + } + else + { + result.m_bConverged = false; + break; + } + + x2 = 0.5 * (x0 + x1); + } + + result.m_fRoot = x2; + return result; + } + + //------------------------------------------------------------------------------------------------ + //! Compute root of scalar function f(x) with secant method + //! Convergence is met when either xtol or ftol is converged + //! \param[in] fn scalar function f + //! \param[in] x0 first starting point + //! \param[in] x1 second starting point + //! \param[in] xtol maximum absolute step in x for convergence + //! \param[in] ftol minimum absolute value of f for convergence + //! \param[in] maxIter maximum number of iterations + //! \return result object with solution + static ACE_MathTools_RootResult Secant(ACE_MathTools_FunctionBase fn, float x0, float x1, float xtol = 1.48e-8, float ftol = -1.0, int maxIter = 50) + { + ACE_MathTools_RootResult result = new ACE_MathTools_RootResult(); + float f0 = fn.Eval(x0); + float f1 = fn.Eval(x1); + + if (Math.AbsFloat(f0) <= ftol) + { + result.m_fRoot = x0; + result.m_bConverged = true; + return result; + } + + if (Math.AbsFloat(f1) <= ftol) + { + result.m_fRoot = x1; + result.m_bConverged = true; + return result; + } + + for (int i = 1; i <= maxIter; ++i) + { + if (f0 == f1) + { + result.m_bConverged = false; + break; + } + + float dx = -f1 * (x1 - x0) / (f1 - f0); + x0 = x1; + x1 += dx; + f0 = f1; + f1 = fn.Eval(x1); + + if ((Math.AbsFloat(dx) <= xtol) || (Math.AbsFloat(f1) <= ftol)) + { + result.m_bConverged = true; + break; + } + } + + result.m_fRoot = x1; + return result; + } +} + +//------------------------------------------------------------------------------------------------ +//! Derive from this class for passing functions to methods in ACE_MathTools +class ACE_MathTools_FunctionBase : Managed +{ + //------------------------------------------------------------------------------------------------ + //! Evaluate function value at x + TY Eval(TX x); +} + +//------------------------------------------------------------------------------------------------ +//! Result of a root optimization +class ACE_MathTools_RootResult : Managed +{ + TX m_fRoot; + bool m_bConverged; +} diff --git a/addons/core/scripts/Game/ACE_Core/Global/ACE_PhysicalConstants.c b/addons/core/scripts/Game/ACE_Core/Global/ACE_PhysicalConstants.c new file mode 100644 index 000000000..44df9d31e --- /dev/null +++ b/addons/core/scripts/Game/ACE_Core/Global/ACE_PhysicalConstants.c @@ -0,0 +1,9 @@ +//------------------------------------------------------------------------------------------------ +class ACE_PhysicalConstants +{ + // Constants + static const float R = 8.3144626; // Universal gas constant [J / (K * mol)] + + // Conversions + static const float KPA2MMHG = 7.5006168; // kPa to mmHg +} diff --git a/addons/core/scripts/Game/ACE_Core/Global/Sorting/ACE_Sorting.c b/addons/core/scripts/Game/ACE_Core/Global/Sorting/ACE_Sorting.c new file mode 100644 index 000000000..94defbf65 --- /dev/null +++ b/addons/core/scripts/Game/ACE_Core/Global/Sorting/ACE_Sorting.c @@ -0,0 +1,31 @@ +//--------------------------------------------------------------------------------------------------- +class ACE_Sorting +{ + //--------------------------------------------------------------------------------------------------- + //! Sorts container inplace with insertion sort, a stable and adpative sorting algorithm + //! \param[in] a Container to sort + //! \param[in] inverse Sort in ascending order when false + static void InsertionSort(TContainer a, bool inverse = false) + { + for (int i = 1, count = a.Count(); i < count; i++) + { + T tmp = a[i]; + + for (int j = i; j > 0; j--) + { + if (!inverse) + { + if (!TCompare.Compare(tmp, a[j - 1])) + break; + } + else + { + if (!TCompare.Compare(a[j - 1], tmp)) + break; + } + + a.SwapItems(j - 1, j); + } + } + } +} diff --git a/addons/core/scripts/Game/ACE_Core/Jobs/ACE_FrameJobScheduler_EState.c b/addons/core/scripts/Game/ACE_Core/Jobs/ACE_FrameJobScheduler_EState.c new file mode 100644 index 000000000..773036715 --- /dev/null +++ b/addons/core/scripts/Game/ACE_Core/Jobs/ACE_FrameJobScheduler_EState.c @@ -0,0 +1,7 @@ +//------------------------------------------------------------------------------------------------ +enum ACE_FrameJobScheduler_EState +{ + UPDATE_QUEUE, + UPDATE_OBJECTS, + TIMEOUT +} diff --git a/addons/core/scripts/Game/ACE_Core/Jobs/ACE_FrameJobScheduler_IObjectContext.c b/addons/core/scripts/Game/ACE_Core/Jobs/ACE_FrameJobScheduler_IObjectContext.c new file mode 100644 index 000000000..fb48aab39 --- /dev/null +++ b/addons/core/scripts/Game/ACE_Core/Jobs/ACE_FrameJobScheduler_IObjectContext.c @@ -0,0 +1,20 @@ +//------------------------------------------------------------------------------------------------ +class ACE_FrameJobScheduler_IObjectContext +{ + TObject m_pObject; + float m_fLastUpdateTime; + + //------------------------------------------------------------------------------------------------ + void ACE_FrameJobScheduler_IObjectContext(TObject object) + { + m_pObject = object; + m_fLastUpdateTime = GetGame().GetWorld().GetWorldTime(); + } + + //------------------------------------------------------------------------------------------------ + //! Used for validating the context + bool IsValid() + { + return m_pObject; + } +} diff --git a/addons/core/scripts/Game/ACE_Core/Jobs/ACE_IContextFrameJob.c b/addons/core/scripts/Game/ACE_Core/Jobs/ACE_IContextFrameJob.c new file mode 100644 index 000000000..34f9074dc --- /dev/null +++ b/addons/core/scripts/Game/ACE_Core/Jobs/ACE_IContextFrameJob.c @@ -0,0 +1,19 @@ +//------------------------------------------------------------------------------------------------ +//! Same as ACE_IFrameJob, but adds a context for storing data +//! TO DO: Move to ACE_IFrameJob once templates can be properly subclassed +class ACE_IContextFrameJob : ACE_IFrameJob +{ + protected ref TContext m_pContext = null; + + //------------------------------------------------------------------------------------------------ + void SetContext(TContext context) + { + m_pContext = context; + } + + //------------------------------------------------------------------------------------------------ + TContext GetContext() + { + return m_pContext; + } +} diff --git a/addons/core/scripts/Game/ACE_Core/Jobs/ACE_IFrameJob.c b/addons/core/scripts/Game/ACE_Core/Jobs/ACE_IFrameJob.c new file mode 100644 index 000000000..1e0e8c7d2 --- /dev/null +++ b/addons/core/scripts/Game/ACE_Core/Jobs/ACE_IFrameJob.c @@ -0,0 +1,65 @@ +//------------------------------------------------------------------------------------------------ +//! Interface for frame jobs +//! Can be registered as standalone jobs to ACE_FrameJobSystem or used in custom systems +//! To Do: Implement templated context once you can inherit from primary templates +class ACE_IFrameJob : Managed +{ + private bool m_bShouldBeStopped = false; + private bool m_bShouldBeUpdated = true; + private bool m_bIsRunning = false; + + //------------------------------------------------------------------------------------------------ + void OnStart() + { + m_bIsRunning = true; + } + + //------------------------------------------------------------------------------------------------ + void OnUpdate(float timeSlice); + + //------------------------------------------------------------------------------------------------ + void OnStop() + { + m_bIsRunning = false; + m_bShouldBeStopped = false; + } + + //------------------------------------------------------------------------------------------------ + //! To turn on/off OnUpdate + void ToggleUpdate(bool enable) + { + m_bShouldBeUpdated = enable; + } + + //------------------------------------------------------------------------------------------------ + //! Method for job manager to check whether it should call OnUpdate + bool ShouldBeUpdated() + { + return m_bShouldBeUpdated; + } + + //------------------------------------------------------------------------------------------------ + //! Returns true when the job is running. Is independent of `ShouldBeUpdated`. + bool IsRunning() + { + return m_bIsRunning; + } + + //------------------------------------------------------------------------------------------------ + //! Forces termination of job + void Stop() + { + m_bShouldBeStopped = true; + } + + //------------------------------------------------------------------------------------------------ + //! Method for job manager to check whether it should terminate the job + bool ShouldBeStopped() + { + return m_bShouldBeStopped; + } + + //------------------------------------------------------------------------------------------------ + //! Copies contents of `from` job to this job + void CopyFrom(ACE_IFrameJob from); +} diff --git a/addons/core/scripts/Game/ACE_Core/Jobs/ACE_TemplateFrameJobScheduler.c b/addons/core/scripts/Game/ACE_Core/Jobs/ACE_TemplateFrameJobScheduler.c new file mode 100644 index 000000000..c658abd18 --- /dev/null +++ b/addons/core/scripts/Game/ACE_Core/Jobs/ACE_TemplateFrameJobScheduler.c @@ -0,0 +1,159 @@ +//------------------------------------------------------------------------------------------------ +//! Composite job that manages jobs based on a template for a set of objects +[BaseContainerProps()] +class ACE_TemplateFrameJobScheduler : ACE_IFrameJob +{ + [Attribute(defvalue: "1000", desc: "Approximate update timeout for a particular object [ms]")] + protected int m_fObjectUpdateTimeoutMS; + + [Attribute(defvalue: "10", desc: "Maximum number of entities to be updated per frame")] + protected int m_iMaxIterationsPerFrame; + + protected ref TJob m_pTemplateJob; + protected ref array m_aJobs = {}; + protected ref array m_aInitialObjectsToRegister = {}; + protected ACE_FrameJobScheduler_EState m_eState = ACE_FrameJobScheduler_EState.UPDATE_QUEUE; + protected float m_fNextUpdateStartTime = 0; + protected int m_iCurrentJobIdx = 0; + protected int m_iNumMachines = 0; + + //------------------------------------------------------------------------------------------------ + //! Template is passed here rather than in ctor for usage of ACE_TemplateFrameJobScheduler in attributes + void OnInit(TJob templateJob) + { + m_pTemplateJob = templateJob; + + foreach (TObject object : m_aInitialObjectsToRegister) + { + Register(object); + } + + m_aInitialObjectsToRegister.Clear(); + } + + //------------------------------------------------------------------------------------------------ + override void OnUpdate(float timeSlice) + { + super.OnUpdate(timeSlice); + float currentTime = GetGame().GetWorld().GetWorldTime(); + + switch (m_eState) + { + case ACE_FrameJobScheduler_EState.UPDATE_QUEUE: return UpdateQueueStep(currentTime); + case ACE_FrameJobScheduler_EState.UPDATE_OBJECTS: return UpdateObjectsStep(currentTime); + case ACE_FrameJobScheduler_EState.TIMEOUT: return TimeoutStep(currentTime); + } + } + + //------------------------------------------------------------------------------------------------ + protected void UpdateQueueStep(float currentTime) + { + m_iNumMachines = m_aJobs.Count(); + + for (int i = m_iNumMachines - 1; i >= 0; --i) + { + TJob job = m_aJobs[i]; + if (job.ShouldBeStopped()) + UnregisterNow(i); + } + + m_iCurrentJobIdx = 0; + m_iNumMachines = m_aJobs.Count(); + + if (m_iNumMachines == 0) + return ToggleUpdate(false); + + m_fNextUpdateStartTime = currentTime + m_fObjectUpdateTimeoutMS; + ChangeState(ACE_FrameJobScheduler_EState.UPDATE_OBJECTS); + } + + //------------------------------------------------------------------------------------------------ + protected void UpdateObjectsStep(float currentTime) + { + for (int i = 0; i < m_iMaxIterationsPerFrame; ++i) + { + TJob job = m_aJobs[m_iCurrentJobIdx]; + TContext context = job.GetContext(); + + if (context.IsValid()) + job.OnUpdate((currentTime - context.m_fLastUpdateTime) / 1000); + else + job.Stop(); + + context.m_fLastUpdateTime = currentTime; + ++m_iCurrentJobIdx; + + if (m_iCurrentJobIdx >= m_iNumMachines) + return ChangeState(ACE_FrameJobScheduler_EState.TIMEOUT); + } + } + + //------------------------------------------------------------------------------------------------ + protected void TimeoutStep(float currentTime) + { + if (currentTime >= m_fNextUpdateStartTime) + ChangeState(ACE_FrameJobScheduler_EState.UPDATE_QUEUE); + } + + //------------------------------------------------------------------------------------------------ + protected void ChangeState(ACE_FrameJobScheduler_EState newState) + { + m_eState = newState; + } + + //------------------------------------------------------------------------------------------------ + void Register(TObject object) + { + if (!m_pTemplateJob) + { + m_aInitialObjectsToRegister.Insert(object); + return; + } + + TContext context = new TContext(object); + if (!context.IsValid()) + return; + + TJob job = CreateJob(); + job.SetContext(context); + job.OnStart(); + m_aJobs.Insert(job); + + if (!ShouldBeUpdated()) + ToggleUpdate(true); + } + + //------------------------------------------------------------------------------------------------ + void Unregister(TObject object) + { + foreach (int i, TJob job : m_aJobs) + { + if (job.GetContext().m_pObject == object) + { + // Delay unregistration, unless the queue isn't touched (e.g. during timeout) + if (m_eState == ACE_FrameJobScheduler_EState.TIMEOUT) + UnregisterNow(i); + else + job.Stop(); + + return; + } + } + } + + //------------------------------------------------------------------------------------------------ + protected void UnregisterNow(int machineIdx) + { + TJob job = m_aJobs[machineIdx]; + m_aJobs.Remove(machineIdx); + job.OnStop(); + } + + //------------------------------------------------------------------------------------------------ + protected TJob CreateJob() + { + TJob instance = new TJob(); + instance.CopyFrom(m_pTemplateJob); + return instance; + } +} diff --git a/addons/core/scripts/Game/ACE_Core/Settings/ACE_ModSettings.c b/addons/core/scripts/Game/ACE_Core/Settings/ACE_ModSettings.c index ca7a6bde3..098245c5a 100755 --- a/addons/core/scripts/Game/ACE_Core/Settings/ACE_ModSettings.c +++ b/addons/core/scripts/Game/ACE_Core/Settings/ACE_ModSettings.c @@ -3,4 +3,7 @@ [BaseContainerProps()] class ACE_ModSettings { + //------------------------------------------------------------------------------------------------ + //! Override for calculating derived values + void Init(); } \ No newline at end of file diff --git a/addons/core/scripts/Game/ACE_Core/Settings/ACE_SettingsConfig.c b/addons/core/scripts/Game/ACE_Core/Settings/ACE_SettingsConfig.c index b19b2d1a5..f2233735b 100755 --- a/addons/core/scripts/Game/ACE_Core/Settings/ACE_SettingsConfig.c +++ b/addons/core/scripts/Game/ACE_Core/Settings/ACE_SettingsConfig.c @@ -8,7 +8,7 @@ class ACE_SettingsConfig protected ref map m_mModSettingsMap; //------------------------------------------------------------------------------------------------ - //! Construct map for faster look-up of settings + //! Init settings and construct map //! We can't use maps as attribute, so we initialize the settings with an array protected void InitMap() { @@ -16,6 +16,7 @@ class ACE_SettingsConfig foreach (ACE_ModSettings settings : m_aInitialModSettings) { + settings.Init(); m_mModSettingsMap[settings.Type()] = settings; } @@ -58,6 +59,7 @@ class ACE_SettingsConfig if (!m_mModSettingsMap) InitMap(); + settings.Init(); m_mModSettingsMap[settings.Type()] = settings; } } diff --git a/addons/core/scripts/Game/ACE_Core/Systems/ACE_FrameJobSystem.c b/addons/core/scripts/Game/ACE_Core/Systems/ACE_FrameJobSystem.c new file mode 100644 index 000000000..a41896204 --- /dev/null +++ b/addons/core/scripts/Game/ACE_Core/Systems/ACE_FrameJobSystem.c @@ -0,0 +1,198 @@ +//------------------------------------------------------------------------------------------------ +//! System that manages system frame jobs (ACE_IFrameJob) +class ACE_FrameJobSystem : GameSystem +{ + protected ref array m_aSystemPointContexts = {}; + + //------------------------------------------------------------------------------------------------ + static ACE_FrameJobSystem GetInstance() + { + ChimeraWorld world = GetGame().GetWorld(); + return ACE_FrameJobSystem.Cast(world.FindSystem(ACE_FrameJobSystem)); + } + + //------------------------------------------------------------------------------------------------ + override static void InitInfo(WorldSystemInfo outInfo) + { + super.InitInfo(outInfo); + outInfo.SetAbstract(false) + .SetUnique(true) + .SetLocation(WorldSystemLocation.Both) + .AddPoint(WorldSystemPoint.Frame) + .AddPoint(WorldSystemPoint.FixedFrame) + .AddPoint(WorldSystemPoint.PostFixedFrame); + } + + //------------------------------------------------------------------------------------------------ + //! Should be paused when the world is not running + override bool ShouldBePaused() + { + return true; + } + + //------------------------------------------------------------------------------------------------ + void ACE_FrameJobSystem() + { + int min, max; + SCR_Enum.GetRange(ESystemPoint, min, max); + m_aSystemPointContexts.Resize(max + 1); + + // Frame events + m_aSystemPointContexts[ESystemPoint.Frame] = new ACE_FrameJobSystem_FramePointContext(this); + + // Fixed frame events + m_aSystemPointContexts[ESystemPoint.FixedFrame] = new ACE_FrameJobSystem_FixedFramePointContext(this); + m_aSystemPointContexts[ESystemPoint.PostFixedFrame] = new ACE_FrameJobSystem_FixedFramePointContext(this); + } + + //------------------------------------------------------------------------------------------------ + override protected void OnInit() + { + CheckTermination(); + } + + //------------------------------------------------------------------------------------------------ + //! Starts a system point job + void Register(notnull ACE_IFrameJob job, ESystemPoint point) + { + m_aSystemPointContexts[point].Register(job); + Enable(true); + } + + //------------------------------------------------------------------------------------------------ + //! Terminates a system point job + void Unregister(notnull ACE_IFrameJob job, ESystemPoint point) + { + m_aSystemPointContexts[point].Unregister(job); + } + + //------------------------------------------------------------------------------------------------ + override protected void OnUpdate(ESystemPoint point) + { + m_aSystemPointContexts[point].OnUpdate(); + } + + //------------------------------------------------------------------------------------------------ + //! Check and execute termination of system if needed + void CheckTermination() + { + foreach (ACE_FrameJobSystem_IPointContext context : m_aSystemPointContexts) + { + if (context && context.IsEnable()) + return; + } + + Enable(false); + } +} + +//------------------------------------------------------------------------------------------------ +class ACE_FrameJobSystem_IPointContext : Managed +{ + protected ACE_FrameJobSystem m_pSystem; + protected ref array m_aJobs = {}; + protected bool m_bIsUpdating = false; + protected bool m_bIsEnabled = false; + + //------------------------------------------------------------------------------------------------ + void ACE_FrameJobSystem_IPointContext(ACE_FrameJobSystem system) + { + m_pSystem = system; + } + + //------------------------------------------------------------------------------------------------ + float GetTimeSlice(); + + //------------------------------------------------------------------------------------------------ + void OnUpdate() + { + float timeSlice = GetTimeSlice(); + m_bIsUpdating = true; + + foreach (ACE_IFrameJob job : m_aJobs) + { + if (job.ShouldBeUpdated()) + job.OnUpdate(timeSlice); + } + + m_bIsUpdating = false; + + // Unregister jobs that should be terminated + for (int i = m_aJobs.Count() - 1; i >= 0; --i) + { + ACE_IFrameJob job = m_aJobs[i]; + if (job.ShouldBeStopped()) + Unregister(job); + } + } + + //------------------------------------------------------------------------------------------------ + void Register(ACE_IFrameJob job) + { + job.OnStart(); + m_aJobs.Insert(job); + Enable(true); + } + + //------------------------------------------------------------------------------------------------ + void Unregister(ACE_IFrameJob job) + { + if (m_bIsUpdating) + { + job.Stop(); + } + else + { + m_aJobs.RemoveItem(job); + job.OnStop(); + + if (m_aJobs.IsEmpty()) + { + Enable(false); + m_pSystem.CheckTermination(); + } + } + } + + //------------------------------------------------------------------------------------------------ + protected void Enable(bool enable) + { + m_bIsEnabled = enable; + } + + //------------------------------------------------------------------------------------------------ + bool IsEnable() + { + return m_bIsEnabled; + } +} + +//------------------------------------------------------------------------------------------------ +class ACE_FrameJobSystem_FramePointContext : ACE_FrameJobSystem_IPointContext +{ + //------------------------------------------------------------------------------------------------ + override float GetTimeSlice() + { + return GetGame().GetWorld().GetTimeSlice(); + } +} + +//------------------------------------------------------------------------------------------------ +class ACE_FrameJobSystem_FixedFramePointContext : ACE_FrameJobSystem_IPointContext +{ + //------------------------------------------------------------------------------------------------ + override float GetTimeSlice() + { + return GetGame().GetWorld().GetFixedTimeSlice(); + } +} + +//------------------------------------------------------------------------------------------------ +class ACE_FrameJobSystem_PhysicsPointContext : ACE_FrameJobSystem_IPointContext +{ + //------------------------------------------------------------------------------------------------ + override float GetTimeSlice() + { + return GetGame().GetWorld().GetPhysicsTimeSlice(); + } +} diff --git a/addons/facepaint/Configs/EntityCatalog/FIA/InventoryItems_EntityCatalog_FIA.conf b/addons/facepaint/Configs/EntityCatalog/FIA/InventoryItems_EntityCatalog_FIA.conf deleted file mode 100644 index b919c388e..000000000 --- a/addons/facepaint/Configs/EntityCatalog/FIA/InventoryItems_EntityCatalog_FIA.conf +++ /dev/null @@ -1,17 +0,0 @@ -SCR_EntityCatalogMultiList { - m_aMultiLists { - SCR_EntityCatalogMultiListEntry "{5C630E453BCB39DC}" { - m_aEntities { - SCR_EntityCatalogInventoryItem "{65270736038395D9}" { - m_sEntityPrefab "{28FA34E692783ACB}Prefabs/Items/ACE_Facepaint_01_USSR.et" - m_aEntityDataList { - SCR_ArsenalItem "{62F30440549B386D}" { - m_eItemType EQUIPMENT - m_iSupplyCost 0 - } - } - } - } - } - } -} diff --git a/addons/facepaint/Configs/EntityCatalog/FIA/InventoryItems_EntityCatalog_FIA.conf.meta b/addons/facepaint/Configs/EntityCatalog/FIA/InventoryItems_EntityCatalog_FIA.conf.meta deleted file mode 100644 index 7d8f7d436..000000000 --- a/addons/facepaint/Configs/EntityCatalog/FIA/InventoryItems_EntityCatalog_FIA.conf.meta +++ /dev/null @@ -1,19 +0,0 @@ -MetaFileClass { - Name "{E908001749419691}Configs/EntityCatalog/FIA/InventoryItems_EntityCatalog_FIA.conf" - Configurations { - CONFResourceClass PC { - } - CONFResourceClass XBOX_ONE : PC { - } - CONFResourceClass XBOX_SERIES : PC { - } - CONFResourceClass PS4 : PC { - } - CONFResourceClass PS5 : PC { - } - CONFResourceClass HEADLESS : PC { - } - CONFResourceClass Xbox : PC { - } - } -} \ No newline at end of file diff --git a/addons/facepaint/Configs/EntityCatalog/UK/ACE_InventoryItems_EntityCatalog_Equipment_UK.conf b/addons/facepaint/Configs/EntityCatalog/UK/ACE_InventoryItems_EntityCatalog_Equipment_UK.conf new file mode 100644 index 000000000..fb372e95f --- /dev/null +++ b/addons/facepaint/Configs/EntityCatalog/UK/ACE_InventoryItems_EntityCatalog_Equipment_UK.conf @@ -0,0 +1,13 @@ +ACE_EntityCatalogMultiListEntry : "{0AFC873567388CDE}Configs/EntityCatalog/ACE_InventoryItems_EntityCatalog_Equipment.conf" { + m_aEntities { + SCR_EntityCatalogInventoryItem "{68EB10F5497121E7}" { + m_sEntityPrefab "{1642314A5C9B5C13}Prefabs/Items/ACE_Facepaint_01_UK.et" + m_aEntityDataList { + SCR_ArsenalItem "{62F30440549B386D}" { + m_eItemType EQUIPMENT + m_iSupplyCost 0 + } + } + } + } +} \ No newline at end of file diff --git a/addons/core/Configs/EntityCatalog/USSR/USSR_InventoryItems.conf.meta b/addons/facepaint/Configs/EntityCatalog/UK/ACE_InventoryItems_EntityCatalog_Equipment_UK.conf.meta similarity index 81% rename from addons/core/Configs/EntityCatalog/USSR/USSR_InventoryItems.conf.meta rename to addons/facepaint/Configs/EntityCatalog/UK/ACE_InventoryItems_EntityCatalog_Equipment_UK.conf.meta index e300bbe36..26fdded58 100644 --- a/addons/core/Configs/EntityCatalog/USSR/USSR_InventoryItems.conf.meta +++ b/addons/facepaint/Configs/EntityCatalog/UK/ACE_InventoryItems_EntityCatalog_Equipment_UK.conf.meta @@ -1,5 +1,5 @@ MetaFileClass { - Name "{C53421647C3D0D2E}Configs/EntityCatalog/USSR/USSR_InventoryItems.conf" + Name "{E7D9069BE26B7A4C}Configs/EntityCatalog/UK/ACE_UK_InventoryItems.conf" Configurations { CONFResourceClass PC { } diff --git a/addons/facepaint/Configs/EntityCatalog/UK/UK_InventoryItems.conf b/addons/facepaint/Configs/EntityCatalog/UK/UK_InventoryItems.conf deleted file mode 100644 index 25783af62..000000000 --- a/addons/facepaint/Configs/EntityCatalog/UK/UK_InventoryItems.conf +++ /dev/null @@ -1,17 +0,0 @@ -SCR_EntityCatalogMultiList { - m_aMultiLists { - SCR_EntityCatalogMultiListEntry "{62DD3B2896AEA994}" { - m_aEntities { - SCR_EntityCatalogInventoryItem "{68EB10F5497121E7}" { - m_sEntityPrefab "{1642314A5C9B5C13}Prefabs/Items/ACE_Facepaint_01_UK.et" - m_aEntityDataList { - SCR_ArsenalItem "{62F30440549B386D}" { - m_eItemType EQUIPMENT - m_iSupplyCost 0 - } - } - } - } - } - } -} \ No newline at end of file diff --git a/addons/facepaint/Configs/EntityCatalog/US/ACE_InventoryItems_EntityCatalog_Equipment_US.conf b/addons/facepaint/Configs/EntityCatalog/US/ACE_InventoryItems_EntityCatalog_Equipment_US.conf new file mode 100644 index 000000000..5cadcecdf --- /dev/null +++ b/addons/facepaint/Configs/EntityCatalog/US/ACE_InventoryItems_EntityCatalog_Equipment_US.conf @@ -0,0 +1,13 @@ +ACE_EntityCatalogMultiListEntry : "{0AFC873567388CDE}Configs/EntityCatalog/ACE_InventoryItems_EntityCatalog_Equipment.conf" { + m_aEntities { + SCR_EntityCatalogInventoryItem "{65270736F5B33C47}" { + m_sEntityPrefab "{B3F2B47340817ED6}Prefabs/Items/ACE_Facepaint_01_US.et" + m_aEntityDataList { + SCR_ArsenalItem "{62F30440549B386D}" { + m_eItemType EQUIPMENT + m_iSupplyCost 0 + } + } + } + } +} \ No newline at end of file diff --git a/addons/facepaint/Configs/EntityCatalog/US/ACE_InventoryItems_EntityCatalog_Equipment_US.conf.meta b/addons/facepaint/Configs/EntityCatalog/US/ACE_InventoryItems_EntityCatalog_Equipment_US.conf.meta new file mode 100644 index 000000000..9ff7b4525 --- /dev/null +++ b/addons/facepaint/Configs/EntityCatalog/US/ACE_InventoryItems_EntityCatalog_Equipment_US.conf.meta @@ -0,0 +1,17 @@ +MetaFileClass { + Name "{12790B4E7D42F952}Configs/EntityCatalog/US/ACE_US_InventoryItems.conf" + Configurations { + CONFResourceClass PC { + } + CONFResourceClass XBOX_ONE : PC { + } + CONFResourceClass XBOX_SERIES : PC { + } + CONFResourceClass PS4 : PC { + } + CONFResourceClass PS5 : PC { + } + CONFResourceClass HEADLESS : PC { + } + } +} \ No newline at end of file diff --git a/addons/facepaint/Configs/EntityCatalog/US/InventoryItems_EntityCatalog_US.conf b/addons/facepaint/Configs/EntityCatalog/US/InventoryItems_EntityCatalog_US.conf deleted file mode 100644 index 03b82074f..000000000 --- a/addons/facepaint/Configs/EntityCatalog/US/InventoryItems_EntityCatalog_US.conf +++ /dev/null @@ -1,17 +0,0 @@ -SCR_EntityCatalogMultiList { - m_aMultiLists { - SCR_EntityCatalogMultiListEntry "{5C68AD59F0753ABE}" { - m_aEntities { - SCR_EntityCatalogInventoryItem "{65270736F5B33C47}" { - m_sEntityPrefab "{B3F2B47340817ED6}Prefabs/Items/ACE_Facepaint_01_US.et" - m_aEntityDataList { - SCR_ArsenalItem "{62F30440549B386D}" { - m_eItemType EQUIPMENT - m_iSupplyCost 0 - } - } - } - } - } - } -} diff --git a/addons/facepaint/Configs/EntityCatalog/US/InventoryItems_EntityCatalog_US.conf.meta b/addons/facepaint/Configs/EntityCatalog/US/InventoryItems_EntityCatalog_US.conf.meta deleted file mode 100644 index 7c752023a..000000000 --- a/addons/facepaint/Configs/EntityCatalog/US/InventoryItems_EntityCatalog_US.conf.meta +++ /dev/null @@ -1,19 +0,0 @@ -MetaFileClass { - Name "{5F7EC52FC40A03E2}Configs/EntityCatalog/US/InventoryItems_EntityCatalog_US.conf" - Configurations { - CONFResourceClass PC { - } - CONFResourceClass XBOX_ONE : PC { - } - CONFResourceClass XBOX_SERIES : PC { - } - CONFResourceClass PS4 : PC { - } - CONFResourceClass PS5 : PC { - } - CONFResourceClass HEADLESS : PC { - } - CONFResourceClass Xbox : PC { - } - } -} \ No newline at end of file diff --git a/addons/facepaint/Configs/EntityCatalog/USSR/ACE_InventoryItems_EntityCatalog_Equipment_USSR.conf b/addons/facepaint/Configs/EntityCatalog/USSR/ACE_InventoryItems_EntityCatalog_Equipment_USSR.conf new file mode 100644 index 000000000..37f2d931c --- /dev/null +++ b/addons/facepaint/Configs/EntityCatalog/USSR/ACE_InventoryItems_EntityCatalog_Equipment_USSR.conf @@ -0,0 +1,13 @@ +ACE_EntityCatalogMultiListEntry : "{0AFC873567388CDE}Configs/EntityCatalog/ACE_InventoryItems_EntityCatalog_Equipment.conf" { + m_aEntities { + SCR_EntityCatalogInventoryItem "{65270736CC1B1935}" { + m_sEntityPrefab "{28FA34E692783ACB}Prefabs/Items/ACE_Facepaint_01_USSR.et" + m_aEntityDataList { + SCR_ArsenalItem "{62F30440549B386D}" { + m_eItemType EQUIPMENT + m_iSupplyCost 0 + } + } + } + } +} \ No newline at end of file diff --git a/addons/facepaint/Configs/EntityCatalog/USSR/ACE_InventoryItems_EntityCatalog_Equipment_USSR.conf.meta b/addons/facepaint/Configs/EntityCatalog/USSR/ACE_InventoryItems_EntityCatalog_Equipment_USSR.conf.meta new file mode 100644 index 000000000..3fba1bccb --- /dev/null +++ b/addons/facepaint/Configs/EntityCatalog/USSR/ACE_InventoryItems_EntityCatalog_Equipment_USSR.conf.meta @@ -0,0 +1,17 @@ +MetaFileClass { + Name "{382ACD2D23811DDE}Configs/EntityCatalog/USSR/ACE_USSR_InventoryItems.conf" + Configurations { + CONFResourceClass PC { + } + CONFResourceClass XBOX_ONE : PC { + } + CONFResourceClass XBOX_SERIES : PC { + } + CONFResourceClass PS4 : PC { + } + CONFResourceClass PS5 : PC { + } + CONFResourceClass HEADLESS : PC { + } + } +} \ No newline at end of file diff --git a/addons/facepaint/Configs/EntityCatalog/USSR/InventoryItems_EntityCatalog_USSR.conf b/addons/facepaint/Configs/EntityCatalog/USSR/InventoryItems_EntityCatalog_USSR.conf deleted file mode 100644 index a75392eb4..000000000 --- a/addons/facepaint/Configs/EntityCatalog/USSR/InventoryItems_EntityCatalog_USSR.conf +++ /dev/null @@ -1,17 +0,0 @@ -SCR_EntityCatalogMultiList { - m_aMultiLists { - SCR_EntityCatalogMultiListEntry "{5C68AD5F7414CA4A}" { - m_aEntities { - SCR_EntityCatalogInventoryItem "{65270736CC1B1935}" { - m_sEntityPrefab "{28FA34E692783ACB}Prefabs/Items/ACE_Facepaint_01_USSR.et" - m_aEntityDataList { - SCR_ArsenalItem "{62F30440549B386D}" { - m_eItemType EQUIPMENT - m_iSupplyCost 0 - } - } - } - } - } - } -} diff --git a/addons/facepaint/Configs/EntityCatalog/USSR/InventoryItems_EntityCatalog_USSR.conf.meta b/addons/facepaint/Configs/EntityCatalog/USSR/InventoryItems_EntityCatalog_USSR.conf.meta deleted file mode 100644 index b243b658d..000000000 --- a/addons/facepaint/Configs/EntityCatalog/USSR/InventoryItems_EntityCatalog_USSR.conf.meta +++ /dev/null @@ -1,19 +0,0 @@ -MetaFileClass { - Name "{C53421647C3D0D2E}Configs/EntityCatalog/USSR/InventoryItems_EntityCatalog_USSR.conf" - Configurations { - CONFResourceClass PC { - } - CONFResourceClass XBOX_ONE : PC { - } - CONFResourceClass XBOX_SERIES : PC { - } - CONFResourceClass PS4 : PC { - } - CONFResourceClass PS5 : PC { - } - CONFResourceClass HEADLESS : PC { - } - CONFResourceClass Xbox : PC { - } - } -} \ No newline at end of file diff --git a/addons/medical_circulation/Assets/Helpers/Workspace/ACE_AnimationHelperCompartment.aw b/addons/medical_circulation/Assets/Helpers/Workspace/ACE_AnimationHelperCompartment.aw new file mode 100644 index 000000000..bc6885da7 --- /dev/null +++ b/addons/medical_circulation/Assets/Helpers/Workspace/ACE_AnimationHelperCompartment.aw @@ -0,0 +1,18 @@ +BaseSource { + AnimSetTemplate "{2255EA04D2FD8565}Assets/Helpers/Workspace/ACE_AnimationHelperCompartment.ast" + AnimSetInstances { + "{9591A985FDD73C7B}Assets/Helpers/Workspace/ACE_Medical_CPR.asi" + } + AnimGraph "{30A78C04E5385196}Assets/Helpers/Workspace/ACE_AnimationHelperCompartment.agr" + PreviewModels { + AnimSrcWorkspacePreviewModel "{622AE496C2CA9A82}" { + Model "{7297BDBDE223627F}Assets/Characters/Animation/AnimTestChar_USSR_01.xob" + } + } + AudioTesting AnimSrcWorkspaceAudioTesting "{61D1397096266D07}" { + } + AttachmentTesting AnimSrcWorkspaceAttachmentTesting "{61D1397096266D18}" { + } + IkTesting AnimSrcWorkspaceIkTesting "{61D1397096266D09}" { + } +} \ No newline at end of file diff --git a/addons/medical_circulation/Assets/Helpers/Workspace/ACE_AnimationHelperCompartment.aw.meta b/addons/medical_circulation/Assets/Helpers/Workspace/ACE_AnimationHelperCompartment.aw.meta new file mode 100644 index 000000000..1d3d9eeea --- /dev/null +++ b/addons/medical_circulation/Assets/Helpers/Workspace/ACE_AnimationHelperCompartment.aw.meta @@ -0,0 +1,17 @@ +MetaFileClass { + Name "{A10C278F23804320}Assets/Helpers/Workspace/ACE_AnimationHelperCompartment.aw" + Configurations { + AnimWorkspaceResourceClass PC { + } + AnimWorkspaceResourceClass XBOX_ONE : PC { + } + AnimWorkspaceResourceClass XBOX_SERIES : PC { + } + AnimWorkspaceResourceClass PS4 : PC { + } + AnimWorkspaceResourceClass PS5 : PC { + } + AnimWorkspaceResourceClass HEADLESS : PC { + } + } +} \ No newline at end of file diff --git a/addons/medical_circulation/Assets/Helpers/Workspace/ACE_Medical_CPR.asi b/addons/medical_circulation/Assets/Helpers/Workspace/ACE_Medical_CPR.asi new file mode 100644 index 000000000..489409e8e --- /dev/null +++ b/addons/medical_circulation/Assets/Helpers/Workspace/ACE_Medical_CPR.asi @@ -0,0 +1,14 @@ +AnimSetInstanceSource "{F60AB4D2CE8917ED}" { + Template "{2255EA04D2FD8565}Assets/Helpers/Workspace/ACE_AnimationHelperCompartment.ast" + Lines { + AnimSetInstanceSource_Line "Animation.Default.In" { + Resource "{53DD1932ED812D70}anims/anm/player/injury/p_cro_revive_CPR_in.anm" + } + AnimSetInstanceSource_Line "Animation.Default.Loop" { + Resource "{0CCED80870DD8150}anims/anm/player/injury/p_cro_revive_CPR_loop.anm" + } + AnimSetInstanceSource_Line "Animation.Default.Out" { + Resource "{226002617FC7B0AB}anims/anm/player/injury/p_cro_revive_CPR_out.anm" + } + } +} \ No newline at end of file diff --git a/addons/medical_circulation/Assets/Helpers/Workspace/ACE_Medical_CPR.asi.meta b/addons/medical_circulation/Assets/Helpers/Workspace/ACE_Medical_CPR.asi.meta new file mode 100644 index 000000000..1a09630cb --- /dev/null +++ b/addons/medical_circulation/Assets/Helpers/Workspace/ACE_Medical_CPR.asi.meta @@ -0,0 +1,17 @@ +MetaFileClass { + Name "{9591A985FDD73C7B}Assets/Helpers/Workspace/ACE_Medical_CPR.asi" + Configurations { + AnimSetInstanceResourceClass PC { + } + AnimSetInstanceResourceClass XBOX_ONE : PC { + } + AnimSetInstanceResourceClass XBOX_SERIES : PC { + } + AnimSetInstanceResourceClass PS4 : PC { + } + AnimSetInstanceResourceClass PS5 : PC { + } + AnimSetInstanceResourceClass HEADLESS : PC { + } + } +} \ No newline at end of file diff --git a/addons/medical_circulation/Assets/Items/Medicine/AmmoniumCarbonate/Data/ACE_Medical_AmmoniumCarbonatePackage.blend b/addons/medical_circulation/Assets/Items/Medicine/AmmoniumCarbonate/Data/ACE_Medical_AmmoniumCarbonatePackage.blend new file mode 100644 index 000000000..d2fa27e54 Binary files /dev/null and b/addons/medical_circulation/Assets/Items/Medicine/AmmoniumCarbonate/Data/ACE_Medical_AmmoniumCarbonatePackage.blend differ diff --git a/addons/medical_circulation/Assets/Items/Medicine/AmmoniumCarbonate/Data/ACE_Medical_AmmoniumCarbonatePackage.blend1 b/addons/medical_circulation/Assets/Items/Medicine/AmmoniumCarbonate/Data/ACE_Medical_AmmoniumCarbonatePackage.blend1 new file mode 100644 index 000000000..b445b65e6 Binary files /dev/null and b/addons/medical_circulation/Assets/Items/Medicine/AmmoniumCarbonate/Data/ACE_Medical_AmmoniumCarbonatePackage.blend1 differ diff --git a/addons/medical_circulation/Assets/Items/Medicine/AmmoniumCarbonate/Data/ACE_Medical_AmmoniumCarbonatePackage.fbx b/addons/medical_circulation/Assets/Items/Medicine/AmmoniumCarbonate/Data/ACE_Medical_AmmoniumCarbonatePackage.fbx new file mode 100644 index 000000000..49c348000 Binary files /dev/null and b/addons/medical_circulation/Assets/Items/Medicine/AmmoniumCarbonate/Data/ACE_Medical_AmmoniumCarbonatePackage.fbx differ diff --git a/addons/medical_circulation/Assets/Items/Medicine/AmmoniumCarbonate/Data/ACE_Medical_AmmoniumCarbonatePackage.txo b/addons/medical_circulation/Assets/Items/Medicine/AmmoniumCarbonate/Data/ACE_Medical_AmmoniumCarbonatePackage.txo new file mode 100644 index 000000000..a93520844 --- /dev/null +++ b/addons/medical_circulation/Assets/Items/Medicine/AmmoniumCarbonate/Data/ACE_Medical_AmmoniumCarbonatePackage.txo @@ -0,0 +1,6222 @@ +$object "" { + #version 1.0 + #tag MergeMeshes "1" + #tag Coords "XZY" + #tag Scale "1.000000" + $materials { + $material "DefaultGeneratedMaterial" { + #UVset 0 + } + } + $lod 0 { + #lodFactor 0.5 + $mesh "AmmoniumCarbonatePackage" { + #texCoords 1 + $faces { + 0 4 0 1 2 3 + 0 4 4 5 6 7 + 0 4 8 9 10 11 + 0 4 12 13 14 15 + 0 4 16 17 18 19 + 0 3 20 21 22 + 0 4 23 24 25 26 + 0 4 27 28 29 30 + 0 4 31 32 33 34 + 0 4 35 36 37 38 + 0 4 39 40 41 42 + 0 4 43 44 45 46 + 0 4 47 48 49 50 + 0 4 51 52 53 54 + 0 4 55 56 57 58 + 0 4 59 60 61 62 + 0 4 63 64 65 66 + 0 4 67 68 69 70 + 0 4 71 72 73 74 + 0 4 75 76 77 78 + 0 4 79 80 81 82 + 0 4 83 84 85 86 + 0 4 87 88 89 90 + 0 4 91 92 93 94 + 0 4 95 96 97 98 + 0 4 99 100 101 102 + 0 4 103 104 105 106 + 0 4 107 108 109 110 + 0 4 111 112 113 114 + 0 4 115 116 117 118 + 0 4 119 120 121 122 + 0 3 123 124 125 + 0 3 126 127 128 + 0 4 129 130 131 132 + 0 4 133 134 135 136 + 0 4 137 138 139 140 + 0 4 141 142 143 144 + 0 4 145 146 147 148 + 0 4 149 150 151 152 + 0 4 153 154 155 156 + 0 4 157 158 159 160 + 0 4 161 162 163 164 + 0 4 165 166 167 168 + 0 4 169 170 171 172 + 0 4 173 174 175 176 + 0 4 177 178 179 180 + 0 4 181 182 183 184 + 0 4 185 186 187 188 + 0 4 189 190 191 192 + 0 4 193 194 195 196 + 0 4 197 198 199 200 + 0 4 201 202 203 204 + 0 4 205 206 207 208 + 0 4 209 210 211 212 + 0 4 213 214 215 216 + 0 4 217 218 219 220 + 0 4 221 222 223 224 + 0 4 225 226 227 228 + 0 4 229 230 231 232 + 0 4 233 234 235 236 + 0 4 237 238 239 240 + 0 4 241 242 243 244 + 0 4 245 246 247 248 + 0 4 249 250 251 252 + 0 4 253 254 255 256 + 0 4 257 258 259 260 + 0 4 261 262 263 264 + 0 4 265 266 267 268 + 0 4 269 270 271 272 + 0 4 273 274 275 276 + 0 4 277 278 279 280 + 0 3 281 282 283 + 0 4 284 285 286 287 + 0 4 288 289 290 291 + 0 4 292 293 294 295 + 0 4 296 297 298 299 + 0 4 300 301 302 303 + 0 4 304 305 306 307 + 0 4 308 309 310 311 + 0 4 312 313 314 315 + 0 4 316 317 318 319 + 0 4 320 321 322 323 + 0 4 324 325 326 327 + 0 4 328 329 330 331 + 0 4 332 333 334 335 + 0 3 336 337 338 + 0 4 339 340 341 342 + 0 4 343 344 345 346 + 0 4 347 348 349 350 + 0 4 351 352 353 354 + 0 3 355 356 357 + 0 4 358 359 360 361 + 0 4 362 363 364 365 + 0 4 366 367 368 369 + 0 4 370 371 372 373 + 0 4 374 375 376 377 + 0 4 378 379 380 381 + 0 4 382 383 384 385 + 0 4 386 387 388 389 + 0 4 390 391 392 393 + 0 4 394 395 396 397 + 0 4 398 399 400 401 + 0 4 402 403 404 405 + 0 4 406 407 408 409 + 0 4 410 411 412 413 + 0 4 414 415 416 417 + 0 4 418 419 420 421 + 0 4 422 423 424 425 + 0 4 426 427 428 429 + 0 4 430 431 432 433 + 0 4 434 435 436 437 + 0 4 438 439 440 441 + 0 4 442 443 444 445 + 0 4 446 447 448 449 + 0 4 450 451 452 453 + 0 4 454 455 456 457 + 0 4 458 459 460 461 + 0 4 462 463 464 465 + 0 4 466 467 468 469 + 0 4 470 471 472 473 + 0 4 474 475 476 477 + 0 4 478 479 480 481 + 0 4 482 483 484 485 + 0 4 486 487 488 489 + 0 4 490 491 492 493 + 0 4 494 495 496 497 + 0 4 498 499 500 501 + 0 4 502 503 504 505 + 0 4 506 507 508 509 + 0 4 510 511 512 513 + 0 4 514 515 516 517 + 0 4 518 519 520 521 + 0 4 522 523 524 525 + 0 4 526 527 528 529 + 0 4 530 531 532 533 + 0 4 534 535 536 537 + 0 4 538 539 540 541 + 0 4 542 543 544 545 + 0 4 546 547 548 549 + 0 4 550 551 552 553 + 0 4 554 555 556 557 + 0 4 558 559 560 561 + 0 4 562 563 564 565 + 0 4 566 567 568 569 + 0 4 570 571 572 573 + 0 4 574 575 576 577 + 0 4 578 579 580 581 + 0 4 582 583 584 585 + 0 4 586 587 588 589 + 0 4 590 591 592 593 + 0 4 594 595 596 597 + 0 4 598 599 600 601 + 0 4 602 603 604 605 + 0 4 606 607 608 609 + 0 4 610 611 612 613 + 0 4 614 615 616 617 + 0 4 618 619 620 621 + 0 3 622 623 624 + 0 4 625 626 627 628 + 0 4 629 630 631 632 + 0 4 633 634 635 636 + 0 4 637 638 639 640 + 0 4 641 642 643 644 + 0 4 645 646 647 648 + 0 3 649 650 651 + 0 4 652 653 654 655 + 0 4 656 657 658 659 + 0 4 660 661 662 663 + 0 4 664 665 666 667 + 0 4 668 669 670 671 + 0 4 672 673 674 675 + 0 4 676 677 678 679 + 0 3 680 681 682 + 0 4 683 684 685 686 + 0 4 687 688 689 690 + 0 4 691 692 693 694 + 0 4 695 696 697 698 + 0 4 699 700 701 702 + 0 4 703 704 705 706 + 0 4 707 708 709 710 + 0 4 711 712 713 714 + 0 4 715 716 717 718 + 0 4 719 720 721 722 + 0 4 723 724 725 726 + 0 4 727 728 729 730 + 0 4 731 732 733 734 + 0 4 735 736 737 738 + 0 3 739 740 741 + 0 4 742 743 744 745 + 0 4 746 747 748 749 + 0 3 750 751 752 + 0 3 753 754 755 + 0 4 756 757 758 759 + 0 4 760 761 762 763 + 0 4 764 765 766 767 + 0 4 768 769 770 771 + 0 4 772 773 774 775 + 0 4 776 777 778 779 + 0 4 780 781 782 783 + 0 4 784 785 786 787 + 0 4 788 789 790 791 + 0 4 792 793 794 795 + 0 4 796 797 798 799 + 0 4 800 801 802 803 + 0 4 804 805 806 807 + 0 4 808 809 810 811 + 0 4 812 813 814 815 + 0 4 816 817 818 819 + 0 4 820 821 822 823 + 0 4 824 825 826 827 + 0 4 828 829 830 831 + 0 4 832 833 834 835 + 0 4 836 837 838 839 + 0 4 840 841 842 843 + 0 4 844 845 846 847 + 0 4 848 849 850 851 + 0 4 852 853 854 855 + 0 4 856 857 858 859 + 0 4 860 861 862 863 + 0 4 864 865 866 867 + 0 4 868 869 870 871 + 0 4 872 873 874 875 + 0 4 876 877 878 879 + 0 4 880 881 882 883 + 0 4 884 885 886 887 + 0 4 888 889 890 891 + 0 4 892 893 894 895 + 0 4 896 897 898 899 + 0 4 900 901 902 903 + 0 4 904 905 906 907 + 0 4 908 909 910 911 + 0 4 912 913 914 915 + 0 4 916 917 918 919 + 0 4 920 921 922 923 + 0 4 924 925 926 927 + 0 4 928 929 930 931 + 0 4 932 933 934 935 + 0 4 936 937 938 939 + 0 4 940 941 942 943 + 0 4 944 945 946 947 + 0 4 948 949 950 951 + 0 4 952 953 954 955 + 0 4 956 957 958 959 + 0 4 960 961 962 963 + 0 3 964 965 966 + 0 4 967 968 969 970 + 0 4 971 972 973 974 + 0 3 975 976 977 + 0 3 978 979 980 + 0 4 981 982 983 984 + 0 4 985 986 987 988 + 0 4 989 990 991 992 + 0 4 993 994 995 996 + 0 4 997 998 999 1000 + 0 4 1001 1002 1003 1004 + 0 4 1005 1006 1007 1008 + 0 4 1009 1010 1011 1012 + 0 4 1013 1014 1015 1016 + 0 4 1017 1018 1019 1020 + 0 4 1021 1022 1023 1024 + 0 4 1025 1026 1027 1028 + 0 4 1029 1030 1031 1032 + 0 4 1033 1034 1035 1036 + 0 4 1037 1038 1039 1040 + 0 4 1041 1042 1043 1044 + 0 4 1045 1046 1047 1048 + 0 4 1049 1050 1051 1052 + 0 4 1053 1054 1055 1056 + 0 4 1057 1058 1059 1060 + 0 4 1061 1062 1063 1064 + 0 4 1065 1066 1067 1068 + 0 4 1069 1070 1071 1072 + 0 4 1073 1074 1075 1076 + 0 4 1077 1078 1079 1080 + 0 4 1081 1082 1083 1084 + 0 4 1085 1086 1087 1088 + 0 4 1089 1090 1091 1092 + 0 4 1093 1094 1095 1096 + 0 4 1097 1098 1099 1100 + 0 4 1101 1102 1103 1104 + 0 4 1105 1106 1107 1108 + 0 4 1109 1110 1111 1112 + 0 4 1113 1114 1115 1116 + 0 4 1117 1118 1119 1120 + 0 4 1121 1122 1123 1124 + 0 3 1125 1126 1127 + 0 4 1128 1129 1130 1131 + 0 4 1132 1133 1134 1135 + 0 4 1136 1137 1138 1139 + 0 4 1140 1141 1142 1143 + 0 4 1144 1145 1146 1147 + 0 4 1148 1149 1150 1151 + 0 4 1152 1153 1154 1155 + 0 4 1156 1157 1158 1159 + 0 4 1160 1161 1162 1163 + 0 4 1164 1165 1166 1167 + 0 4 1168 1169 1170 1171 + 0 4 1172 1173 1174 1175 + 0 4 1176 1177 1178 1179 + 0 4 1180 1181 1182 1183 + 0 4 1184 1185 1186 1187 + 0 4 1188 1189 1190 1191 + 0 4 1192 1193 1194 1195 + 0 4 1196 1197 1198 1199 + 0 4 1200 1201 1202 1203 + 0 4 1204 1205 1206 1207 + 0 4 1208 1209 1210 1211 + 0 4 1212 1213 1214 1215 + 0 4 1216 1217 1218 1219 + 0 4 1220 1221 1222 1223 + 0 4 1224 1225 1226 1227 + 0 4 1228 1229 1230 1231 + 0 4 1232 1233 1234 1235 + 0 4 1236 1237 1238 1239 + 0 4 1240 1241 1242 1243 + 0 4 1244 1245 1246 1247 + 0 4 1248 1249 1250 1251 + 0 4 1252 1253 1254 1255 + 0 4 1256 1257 1258 1259 + 0 4 1260 1261 1262 1263 + 0 4 1264 1265 1266 1267 + 0 4 1268 1269 1270 1271 + 0 4 1272 1273 1274 1275 + 0 4 1276 1277 1278 1279 + 0 4 1280 1281 1282 1283 + 0 4 1284 1285 1286 1287 + 0 4 1288 1289 1290 1291 + 0 4 1292 1293 1294 1295 + 0 4 1296 1297 1298 1299 + 0 4 1300 1301 1302 1303 + 0 4 1304 1305 1306 1307 + 0 4 1308 1309 1310 1311 + 0 4 1312 1313 1314 1315 + 0 4 1316 1317 1318 1319 + 0 4 1320 1321 1322 1323 + 0 4 1324 1325 1326 1327 + 0 4 1328 1329 1330 1331 + 0 4 1332 1333 1334 1335 + 0 4 1336 1337 1338 1339 + 0 4 1340 1341 1342 1343 + 0 4 1344 1345 1346 1347 + 0 4 1348 1349 1350 1351 + 0 4 1352 1353 1354 1355 + 0 4 1356 1357 1358 1359 + 0 4 1360 1361 1362 1363 + 0 4 1364 1365 1366 1367 + 0 4 1368 1369 1370 1371 + 0 4 1372 1373 1374 1375 + 0 4 1376 1377 1378 1379 + 0 4 1380 1381 1382 1383 + 0 4 1384 1385 1386 1387 + 0 4 1388 1389 1390 1391 + 0 4 1392 1393 1394 1395 + 0 4 1396 1397 1398 1399 + 0 4 1400 1401 1402 1403 + 0 4 1404 1405 1406 1407 + 0 4 1408 1409 1410 1411 + 0 4 1412 1413 1414 1415 + 0 4 1416 1417 1418 1419 + 0 4 1420 1421 1422 1423 + 0 4 1424 1425 1426 1427 + 0 4 1428 1429 1430 1431 + 0 4 1432 1433 1434 1435 + 0 4 1436 1437 1438 1439 + 0 4 1440 1441 1442 1443 + 0 4 1444 1445 1446 1447 + 0 4 1448 1449 1450 1451 + 0 4 1452 1453 1454 1455 + 0 4 1456 1457 1458 1459 + 0 3 1460 1461 1462 + 0 4 1463 1464 1465 1466 + 0 4 1467 1468 1469 1470 + 0 4 1471 1472 1473 1474 + 0 4 1475 1476 1477 1478 + 0 4 1479 1480 1481 1482 + 0 4 1483 1484 1485 1486 + 0 4 1487 1488 1489 1490 + 0 4 1491 1492 1493 1494 + 0 4 1495 1496 1497 1498 + 0 4 1499 1500 1501 1502 + 0 4 1503 1504 1505 1506 + 0 4 1507 1508 1509 1510 + 0 4 1511 1512 1513 1514 + 0 4 1515 1516 1517 1518 + 0 4 1519 1520 1521 1522 + 0 4 1523 1524 1525 1526 + 0 3 1527 1528 1529 + 0 4 1530 1531 1532 1533 + 0 4 1534 1535 1536 1537 + 0 4 1538 1539 1540 1541 + 0 4 1542 1543 1544 1545 + 0 4 1546 1547 1548 1549 + 0 4 1550 1551 1552 1553 + 0 4 1554 1555 1556 1557 + 0 4 1558 1559 1560 1561 + 0 4 1562 1563 1564 1565 + 0 4 1566 1567 1568 1569 + 0 4 1570 1571 1572 1573 + 0 4 1574 1575 1576 1577 + 0 4 1578 1579 1580 1581 + 0 4 1582 1583 1584 1585 + 0 4 1586 1587 1588 1589 + 0 4 1590 1591 1592 1593 + 0 4 1594 1595 1596 1597 + 0 4 1598 1599 1600 1601 + 0 4 1602 1603 1604 1605 + 0 4 1606 1607 1608 1609 + 0 4 1610 1611 1612 1613 + 0 4 1614 1615 1616 1617 + 0 4 1618 1619 1620 1621 + 0 4 1622 1623 1624 1625 + 0 4 1626 1627 1628 1629 + 0 4 1630 1631 1632 1633 + 0 4 1634 1635 1636 1637 + 0 4 1638 1639 1640 1641 + 0 4 1642 1643 1644 1645 + 0 4 1646 1647 1648 1649 + 0 4 1650 1651 1652 1653 + 0 4 1654 1655 1656 1657 + 0 4 1658 1659 1660 1661 + 0 4 1662 1663 1664 1665 + 0 4 1666 1667 1668 1669 + 0 4 1670 1671 1672 1673 + 0 4 1674 1675 1676 1677 + 0 4 1678 1679 1680 1681 + 0 4 1682 1683 1684 1685 + 0 4 1686 1687 1688 1689 + 0 4 1690 1691 1692 1693 + 0 4 1694 1695 1696 1697 + 0 3 1698 1699 1700 + 0 4 1701 1702 1703 1704 + 0 4 1705 1706 1707 1708 + 0 4 1709 1710 1711 1712 + 0 4 1713 1714 1715 1716 + 0 4 1717 1718 1719 1720 + 0 4 1721 1722 1723 1724 + 0 4 1725 1726 1727 1728 + 0 4 1729 1730 1731 1732 + 0 4 1733 1734 1735 1736 + 0 4 1737 1738 1739 1740 + 0 4 1741 1742 1743 1744 + 0 4 1745 1746 1747 1748 + 0 4 1749 1750 1751 1752 + 0 4 1753 1754 1755 1756 + 0 4 1757 1758 1759 1760 + 0 4 1761 1762 1763 1764 + 0 4 1765 1766 1767 1768 + 0 4 1769 1770 1771 1772 + 0 4 1773 1774 1775 1776 + 0 4 1777 1778 1779 1780 + 0 4 1781 1782 1783 1784 + 0 4 1785 1786 1787 1788 + 0 4 1789 1790 1791 1792 + 0 4 1793 1794 1795 1796 + 0 4 1797 1798 1799 1800 + 0 4 1801 1802 1803 1804 + 0 4 1805 1806 1807 1808 + 0 4 1809 1810 1811 1812 + 0 4 1813 1814 1815 1816 + 0 4 1817 1818 1819 1820 + 0 4 1821 1822 1823 1824 + 0 4 1825 1826 1827 1828 + 0 3 1829 1830 1831 + 0 4 1832 1833 1834 1835 + 0 4 1836 1837 1838 1839 + 0 4 1840 1841 1842 1843 + 0 4 1844 1845 1846 1847 + 0 4 1848 1849 1850 1851 + 0 4 1852 1853 1854 1855 + 0 4 1856 1857 1858 1859 + 0 4 1860 1861 1862 1863 + 0 4 1864 1865 1866 1867 + 0 4 1868 1869 1870 1871 + 0 4 1872 1873 1874 1875 + 0 4 1876 1877 1878 1879 + 0 4 1880 1881 1882 1883 + 0 4 1884 1885 1886 1887 + 0 4 1888 1889 1890 1891 + 0 4 1892 1893 1894 1895 + 0 4 1896 1897 1898 1899 + 0 4 1900 1901 1902 1903 + 0 4 1904 1905 1906 1907 + 0 4 1908 1909 1910 1911 + 0 4 1912 1913 1914 1915 + 0 4 1916 1917 1918 1919 + 0 4 1920 1921 1922 1923 + 0 4 1924 1925 1926 1927 + 0 4 1928 1929 1930 1931 + 0 4 1932 1933 1934 1935 + 0 3 1936 1937 1938 + 0 4 1939 1940 1941 1942 + 0 4 1943 1944 1945 1946 + 0 4 1947 1948 1949 1950 + 0 4 1951 1952 1953 1954 + 0 4 1955 1956 1957 1958 + 0 4 1959 1960 1961 1962 + 0 4 1963 1964 1965 1966 + 0 4 1967 1968 1969 1970 + 0 3 1971 1972 1973 + 0 4 1974 1975 1976 1977 + 0 3 1978 1979 1980 + 0 4 1981 1982 1983 1984 + 0 4 1985 1986 1987 1988 + 0 4 1989 1990 1991 1992 + 0 4 1993 1994 1995 1996 + 0 4 1997 1998 1999 2000 + 0 4 2001 2002 2003 2004 + 0 4 2005 2006 2007 2008 + 0 4 2009 2010 2011 2012 + 0 4 2013 2014 2015 2016 + 0 4 2017 2018 2019 2020 + 0 4 2021 2022 2023 2024 + 0 4 2025 2026 2027 2028 + 0 4 2029 2030 2031 2032 + 0 4 2033 2034 2035 2036 + 0 4 2037 2038 2039 2040 + 0 4 2041 2042 2043 2044 + 0 4 2045 2046 2047 2048 + 0 4 2049 2050 2051 2052 + 0 3 2053 2054 2055 + 0 4 2056 2057 2058 2059 + 0 4 2060 2061 2062 2063 + 0 4 2064 2065 2066 2067 + 0 4 2068 2069 2070 2071 + 0 4 2072 2073 2074 2075 + 0 4 2076 2077 2078 2079 + 0 4 2080 2081 2082 2083 + 0 3 2084 2085 2086 + 0 4 2087 2088 2089 2090 + 0 4 2091 2092 2093 2094 + 0 4 2095 2096 2097 2098 + 0 4 2099 2100 2101 2102 + 0 4 2103 2104 2105 2106 + 0 4 2107 2108 2109 2110 + 0 4 2111 2112 2113 2114 + 0 4 2115 2116 2117 2118 + 0 4 2119 2120 2121 2122 + 0 4 2123 2124 2125 2126 + 0 4 2127 2128 2129 2130 + 0 4 2131 2132 2133 2134 + 0 4 2135 2136 2137 2138 + 0 4 2139 2140 2141 2142 + 0 4 2143 2144 2145 2146 + 0 4 2147 2148 2149 2150 + 0 4 2151 2152 2153 2154 + 0 4 2155 2156 2157 2158 + 0 4 2159 2160 2161 2162 + 0 4 2163 2164 2165 2166 + 0 4 2167 2168 2169 2170 + 0 3 2171 2172 2173 + 0 3 2174 2175 2176 + 0 4 2177 2178 2179 2180 + 0 4 2181 2182 2183 2184 + 0 4 2185 2186 2187 2188 + 0 4 2189 2190 2191 2192 + 0 4 2193 2194 2195 2196 + 0 4 2197 2198 2199 2200 + 0 4 2201 2202 2203 2204 + 0 4 2205 2206 2207 2208 + 0 4 2209 2210 2211 2212 + 0 4 2213 2214 2215 2216 + 0 4 2217 2218 2219 2220 + 0 4 2221 2222 2223 2224 + 0 4 2225 2226 2227 2228 + 0 4 2229 2230 2231 2232 + 0 4 2233 2234 2235 2236 + 0 4 2237 2238 2239 2240 + 0 4 2241 2242 2243 2244 + 0 4 2245 2246 2247 2248 + 0 4 2249 2250 2251 2252 + 0 4 2253 2254 2255 2256 + 0 4 2257 2258 2259 2260 + 0 4 2261 2262 2263 2264 + 0 4 2265 2266 2267 2268 + 0 4 2269 2270 2271 2272 + 0 4 2273 2274 2275 2276 + 0 4 2277 2278 2279 2280 + 0 4 2281 2282 2283 2284 + 0 4 2285 2286 2287 2288 + 0 4 2289 2290 2291 2292 + 0 4 2293 2294 2295 2296 + 0 3 2297 2298 2299 + 0 4 2300 2301 2302 2303 + 0 4 2304 2305 2306 2307 + 0 4 2308 2309 2310 2311 + 0 4 2312 2313 2314 2315 + 0 4 2316 2317 2318 2319 + 0 4 2320 2321 2322 2323 + 0 4 2324 2325 2326 2327 + 0 4 2328 2329 2330 2331 + 0 4 2332 2333 2334 2335 + 0 4 2336 2337 2338 2339 + 0 4 2340 2341 2342 2343 + 0 3 2344 2345 2346 + 0 4 2347 2348 2349 2350 + 0 4 2351 2352 2353 2354 + 0 4 2355 2356 2357 2358 + 0 4 2359 2360 2361 2362 + 0 4 2363 2364 2365 2366 + 0 4 2367 2368 2369 2370 + 0 4 2371 2372 2373 2374 + 0 4 2375 2376 2377 2378 + 0 4 2379 2380 2381 2382 + 0 4 2383 2384 2385 2386 + 0 4 2387 2388 2389 2390 + 0 4 2391 2392 2393 2394 + 0 4 2395 2396 2397 2398 + 0 4 2399 2400 2401 2402 + 0 4 2403 2404 2405 2406 + 0 4 2407 2408 2409 2410 + 0 3 2411 2412 2413 + 0 4 2414 2415 2416 2417 + 0 4 2418 2419 2420 2421 + 0 4 2422 2423 2424 2425 + 0 4 2426 2427 2428 2429 + 0 4 2430 2431 2432 2433 + 0 4 2434 2435 2436 2437 + 0 4 2438 2439 2440 2441 + 0 4 2442 2443 2444 2445 + 0 4 2446 2447 2448 2449 + 0 4 2450 2451 2452 2453 + 0 4 2454 2455 2456 2457 + 0 4 2458 2459 2460 2461 + 0 4 2462 2463 2464 2465 + 0 4 2466 2467 2468 2469 + 0 4 2470 2471 2472 2473 + 0 4 2474 2475 2476 2477 + 0 4 2478 2479 2480 2481 + 0 4 2482 2483 2484 2485 + 0 3 2486 2487 2488 + 0 3 2489 2490 2491 + 0 4 2492 2493 2494 2495 + 0 4 2496 2497 2498 2499 + 0 4 2500 2501 2502 2503 + 0 4 2504 2505 2506 2507 + 0 4 2508 2509 2510 2511 + 0 4 2512 2513 2514 2515 + 0 4 2516 2517 2518 2519 + 0 4 2520 2521 2522 2523 + 0 4 2524 2525 2526 2527 + 0 4 2528 2529 2530 2531 + 0 4 2532 2533 2534 2535 + 0 4 2536 2537 2538 2539 + 0 4 2540 2541 2542 2543 + 0 4 2544 2545 2546 2547 + 0 4 2548 2549 2550 2551 + 0 4 2552 2553 2554 2555 + 0 4 2556 2557 2558 2559 + 0 4 2560 2561 2562 2563 + 0 4 2564 2565 2566 2567 + 0 4 2568 2569 2570 2571 + 0 4 2572 2573 2574 2575 + 0 4 2576 2577 2578 2579 + 0 4 2580 2581 2582 2583 + 0 4 2584 2585 2586 2587 + 0 4 2588 2589 2590 2591 + 0 4 2592 2593 2594 2595 + 0 3 2596 2597 2598 + 0 4 2599 2600 2601 2602 + 0 4 2603 2604 2605 2606 + 0 4 2607 2608 2609 2610 + 0 4 2611 2612 2613 2614 + 0 4 2615 2616 2617 2618 + 0 4 2619 2620 2621 2622 + 0 4 2623 2624 2625 2626 + 0 3 2627 2628 2629 + 0 4 2630 2631 2632 2633 + 0 4 2634 2635 2636 2637 + 0 4 2638 2639 2640 2641 + 0 4 2642 2643 2644 2645 + 0 4 2646 2647 2648 2649 + 0 4 2650 2651 2652 2653 + 0 3 2654 2655 2656 + 0 4 2657 2658 2659 2660 + 0 3 2661 2662 2663 + 0 4 2664 2665 2666 2667 + 0 4 2668 2669 2670 2671 + 0 3 2672 2673 2674 + 0 4 2675 2676 2677 2678 + 0 4 2679 2680 2681 2682 + 0 4 2683 2684 2685 2686 + 0 4 2687 2688 2689 2690 + 0 4 2691 2692 2693 2694 + 0 4 2695 2696 2697 2698 + 0 4 2699 2700 2701 2702 + 0 3 2703 2704 2705 + 0 4 2706 2707 2708 2709 + 0 4 2710 2711 2712 2713 + 0 4 2714 2715 2716 2717 + 0 4 2718 2719 2720 2721 + 0 4 2722 2723 2724 2725 + 0 4 2726 2727 2728 2729 + 0 4 2730 2731 2732 2733 + 0 3 2734 2735 2736 + 0 4 2737 2738 2739 2740 + 0 4 2741 2742 2743 2744 + 0 4 2745 2746 2747 2748 + 0 4 2749 2750 2751 2752 + 0 4 2753 2754 2755 2756 + 0 4 2757 2758 2759 2760 + 0 4 2761 2762 2763 2764 + 0 4 2765 2766 2767 2768 + 0 4 2769 2770 2771 2772 + 0 4 2773 2774 2775 2776 + 0 4 2777 2778 2779 2780 + 0 4 2781 2782 2783 2784 + 0 4 2785 2786 2787 2788 + 0 4 2789 2790 2791 2792 + 0 3 2793 2794 2795 + 0 4 2796 2797 2798 2799 + 0 4 2800 2801 2802 2803 + 0 4 2804 2805 2806 2807 + 0 4 2808 2809 2810 2811 + 0 4 2812 2813 2814 2815 + 0 4 2816 2817 2818 2819 + 0 4 2820 2821 2822 2823 + 0 3 2824 2825 2826 + 0 4 2827 2828 2829 2830 + 0 4 2831 2832 2833 2834 + 0 4 2835 2836 2837 2838 + 0 4 2839 2840 2841 2842 + 0 4 2843 2844 2845 2846 + 0 4 2847 2848 2849 2850 + 0 4 2851 2852 2853 2854 + 0 4 2855 2856 2857 2858 + 0 4 2859 2860 2861 2862 + 0 4 2863 2864 2865 2866 + 0 4 2867 2868 2869 2870 + 0 4 2871 2872 2873 2874 + 0 4 2875 2876 2877 2878 + 0 4 2879 2880 2881 2882 + 0 3 2883 2884 2885 + 0 4 2886 2887 2888 2889 + 0 4 2890 2891 2892 2893 + 0 4 2894 2895 2896 2897 + 0 4 2898 2899 2900 2901 + 0 4 2902 2903 2904 2905 + 0 4 2906 2907 2908 2909 + 0 4 2910 2911 2912 2913 + 0 4 2914 2915 2916 2917 + 0 4 2918 2919 2920 2921 + 0 4 2922 2923 2924 2925 + 0 4 2926 2927 2928 2929 + 0 4 2930 2931 2932 2933 + 0 4 2934 2935 2936 2937 + 0 4 2938 2939 2940 2941 + 0 4 2942 2943 2944 2945 + 0 4 2946 2947 2948 2949 + 0 4 2950 2951 2952 2953 + 0 3 2954 2955 2956 + 0 4 2957 2958 2959 2960 + 0 4 2961 2962 2963 2964 + 0 3 2965 2966 2967 + 0 3 2968 2969 2970 + 0 3 2971 2972 2973 + 0 4 2974 2975 2976 2977 + 0 4 2978 2979 2980 2981 + 0 4 2982 2983 2984 2985 + 0 4 2986 2987 2988 2989 + 0 4 2990 2991 2992 2993 + 0 4 2994 2995 2996 2997 + 0 4 2998 2999 3000 3001 + 0 4 3002 3003 3004 3005 + 0 4 3006 3007 3008 3009 + 0 4 3010 3011 3012 3013 + 0 4 3014 3015 3016 3017 + 0 4 3018 3019 3020 3021 + 0 4 3022 3023 3024 3025 + 0 4 3026 3027 3028 3029 + 0 4 3030 3031 3032 3033 + 0 4 3034 3035 3036 3037 + 0 4 3038 3039 3040 3041 + 0 3 3042 3043 3044 + 0 4 3045 3046 3047 3048 + 0 3 3049 3050 3051 + 0 4 3052 3053 3054 3055 + } + $faceVerts { + 157 0 0 + 158 1 1 + 685 2 2 + 688 3 3 + 343 4 4 + 347 5 5 + 163 6 6 + 164 7 7 + 392 8 8 + 395 9 9 + 394 10 10 + 391 11 11 + 534 12 12 + 535 13 13 + 513 14 14 + 512 15 15 + 292 16 16 + 403 17 17 + 402 18 18 + 401 19 19 + 20 20 20 + 413 21 21 + 300 22 22 + 678 23 23 + 610 24 24 + 676 25 25 + 675 26 26 + 285 27 27 + 197 28 28 + 198 29 29 + 286 30 30 + 608 31 31 + 622 32 32 + 621 33 33 + 607 34 34 + 707 35 35 + 708 36 36 + 212 37 37 + 211 38 38 + 254 39 39 + 255 40 40 + 252 41 41 + 251 42 42 + 31 43 43 + 336 44 44 + 514 45 45 + 272 46 46 + 80 47 47 + 2 48 48 + 234 49 49 + 532 50 50 + 525 51 51 + 82 52 52 + 81 53 53 + 533 54 54 + 464 55 55 + 143 56 56 + 142 57 57 + 467 58 58 + 552 59 59 + 633 60 60 + 550 61 61 + 549 62 62 + 301 63 63 + 416 64 64 + 430 65 65 + 304 66 66 + 223 67 67 + 222 68 68 + 664 69 69 + 663 70 70 + 537 71 71 + 614 72 72 + 529 73 73 + 528 74 74 + 136 75 75 + 243 76 76 + 244 77 77 + 135 78 78 + 680 79 79 + 681 80 80 + 153 81 81 + 154 82 82 + 490 83 83 + 501 84 84 + 500 85 85 + 489 86 86 + 31 43 43 + 160 87 87 + 393 88 88 + 336 44 44 + 659 89 89 + 122 90 90 + 39 91 91 + 139 92 92 + 515 93 93 + 518 94 94 + 517 95 95 + 514 45 45 + 630 96 96 + 186 97 97 + 185 98 98 + 527 99 99 + 309 100 100 + 502 101 101 + 499 102 102 + 310 103 103 + 721 104 104 + 75 105 105 + 71 106 106 + 727 107 107 + 743 108 108 + 746 109 109 + 745 110 110 + 742 111 111 + 492 112 112 + 495 113 113 + 494 114 114 + 436 115 115 + 147 116 116 + 146 117 117 + 315 118 118 + 316 119 119 + 448 120 120 + 452 121 121 + 582 122 122 + 38 123 123 + 116 124 124 + 613 125 125 + 549 62 62 + 202 126 126 + 42 127 127 + 104 128 128 + 123 129 129 + 483 130 130 + 489 86 86 + 124 131 131 + 57 132 132 + 28 133 133 + 61 134 134 + 611 135 135 + 37 136 136 + 176 137 137 + 581 138 138 + 312 139 139 + 255 40 40 + 256 140 140 + 253 141 141 + 252 41 41 + 195 142 142 + 196 143 143 + 419 144 144 + 420 145 145 + 692 146 146 + 693 147 147 + 690 148 148 + 689 149 149 + 422 150 150 + 423 151 151 + 420 145 145 + 419 144 144 + 5 152 152 + 384 153 153 + 483 130 130 + 123 129 129 + 446 154 154 + 206 155 155 + 209 156 156 + 449 157 157 + 251 42 42 + 252 41 41 + 249 158 158 + 248 159 159 + 149 160 160 + 49 161 161 + 168 162 162 + 697 163 163 + 338 164 164 + 343 4 4 + 330 165 165 + 329 166 166 + 616 167 167 + 537 71 71 + 162 168 168 + 166 169 169 + 53 170 170 + 54 171 171 + 421 172 172 + 424 173 173 + 248 159 159 + 197 28 28 + 2 48 48 + 80 47 47 + 248 159 159 + 249 158 158 + 198 29 29 + 197 28 28 + 249 158 158 + 250 174 174 + 199 175 175 + 198 29 29 + 81 53 53 + 80 47 47 + 532 50 50 + 533 54 54 + 250 174 174 + 215 176 176 + 21 177 177 + 199 175 175 + 233 178 178 + 306 179 179 + 440 180 180 + 359 181 181 + 250 174 174 + 253 141 141 + 214 182 182 + 215 176 176 + 364 183 183 + 367 184 184 + 366 185 185 + 363 186 186 + 253 141 141 + 256 140 140 + 213 187 187 + 214 182 182 + 360 188 188 + 363 186 186 + 362 189 189 + 356 190 190 + 213 187 187 + 256 140 140 + 194 191 191 + 27 192 192 + 256 140 140 + 255 40 40 + 195 142 142 + 194 191 191 + 255 40 40 + 254 39 39 + 196 143 143 + 195 142 142 + 627 193 193 + 246 194 194 + 247 195 195 + 626 196 196 + 254 39 39 + 82 52 52 + 30 197 197 + 196 143 143 + 254 39 39 + 251 42 42 + 81 53 53 + 82 52 52 + 425 198 198 + 426 199 199 + 423 151 151 + 422 150 150 + 251 42 42 + 248 159 159 + 80 47 47 + 81 53 53 + 540 200 200 + 543 201 201 + 542 202 202 + 539 203 203 + 217 204 204 + 594 205 205 + 593 206 206 + 212 207 207 + 450 208 208 + 447 209 209 + 191 210 210 + 201 211 211 + 52 212 212 + 53 170 170 + 424 173 173 + 427 213 213 + 485 214 214 + 499 102 102 + 490 83 83 + 484 215 215 + 64 216 216 + 324 217 217 + 9 218 218 + 21 177 219 + 215 176 220 + 361 219 221 + 293 220 222 + 670 221 223 + 720 222 224 + 679 223 225 + 669 224 226 + 700 225 227 + 260 226 228 + 50 227 229 + 434 228 230 + 347 5 5 + 345 229 231 + 189 230 232 + 188 231 233 + 726 232 234 + 725 233 235 + 724 234 236 + 716 235 237 + 509 236 238 + 227 237 239 + 48 238 240 + 459 239 241 + 232 240 242 + 245 241 243 + 732 242 244 + 735 243 245 + 39 244 246 + 170 245 247 + 743 108 108 + 139 246 248 + 635 247 249 + 636 248 250 + 633 60 60 + 552 59 59 + 705 249 251 + 706 250 252 + 703 251 253 + 702 252 254 + 539 203 203 + 281 253 255 + 280 254 256 + 540 200 200 + 698 255 257 + 699 256 258 + 435 257 259 + 445 258 260 + 232 240 242 + 679 223 225 + 722 259 261 + 245 241 243 + 156 260 262 + 51 261 263 + 719 262 264 + 114 263 265 + 559 264 266 + 558 265 267 + 115 266 268 + 74 267 269 + 42 127 127 + 70 268 270 + 717 269 271 + 641 270 272 + 642 271 273 + 639 272 274 + 638 273 275 + 537 71 71 + 528 74 74 + 161 274 276 + 162 168 168 + 292 16 16 + 296 275 277 + 403 17 17 + 702 252 254 + 703 251 253 + 700 225 227 + 699 256 258 + 219 276 278 + 401 19 19 + 402 18 18 + 220 277 279 + 344 278 280 + 70 268 270 + 42 127 127 + 202 126 126 + 603 279 281 + 259 280 282 + 258 281 283 + 606 282 284 + 231 283 285 + 669 224 226 + 679 223 225 + 232 240 242 + 246 194 194 + 585 284 286 + 584 285 287 + 247 195 195 + 121 286 288 + 122 90 90 + 659 89 89 + 662 287 289 + 330 165 165 + 343 4 4 + 164 7 7 + 165 288 290 + 245 241 243 + 722 259 261 + 299 289 291 + 33 290 292 + 56 291 293 + 57 132 132 + 611 135 135 + 620 292 294 + 50 227 229 + 260 226 228 + 585 284 286 + 246 194 194 + 713 293 295 + 714 294 296 + 711 295 297 + 710 296 298 + 359 181 181 + 3 297 299 + 155 298 300 + 631 299 301 + 158 1 1 + 167 300 302 + 682 301 303 + 685 2 2 + 497 302 304 + 555 303 305 + 488 304 306 + 1 305 307 + 85 306 308 + 436 115 115 + 494 114 114 + 86 307 309 + 531 308 310 + 233 178 178 + 359 181 181 + 631 299 301 + 388 309 311 + 391 11 11 + 390 310 312 + 387 311 313 + 507 312 314 + 508 313 315 + 505 314 316 + 504 315 317 + 199 175 175 + 21 177 177 + 238 316 318 + 287 317 319 + 168 162 162 + 169 318 320 + 694 319 321 + 697 163 163 + 701 320 322 + 702 252 254 + 699 256 258 + 698 255 257 + 159 321 323 + 160 87 87 + 629 322 324 + 632 323 325 + 441 324 326 + 276 325 327 + 277 326 328 + 442 327 329 + 649 328 330 + 650 329 331 + 221 330 332 + 222 68 68 + 588 331 333 + 175 332 334 + 174 333 335 + 591 334 336 + 588 331 333 + 591 334 336 + 590 335 337 + 587 336 338 + 602 337 339 + 605 338 340 + 604 339 341 + 601 340 342 + 693 147 147 + 694 319 321 + 691 341 343 + 690 148 148 + 239 342 344 + 240 343 345 + 302 344 346 + 303 345 347 + 497 302 304 + 1 305 307 + 460 346 348 + 534 12 12 + 750 347 349 + 181 348 350 + 180 349 351 + 751 350 352 + 354 351 353 + 355 352 354 + 297 353 355 + 277 326 328 + 678 23 23 + 677 354 356 + 618 355 357 + 610 24 24 + 313 356 358 + 580 357 359 + 579 358 360 + 314 359 361 + 273 360 362 + 275 361 363 + 579 358 360 + 586 362 364 + 348 363 365 + 511 364 366 + 457 365 367 + 26 366 368 + 633 60 60 + 634 367 369 + 551 368 370 + 550 61 61 + 726 232 234 + 716 235 237 + 718 369 371 + 717 269 271 + 380 370 372 + 379 371 373 + 270 372 374 + 269 373 375 + 193 374 376 + 437 375 377 + 438 376 378 + 200 377 379 + 619 378 380 + 55 379 381 + 56 291 293 + 620 292 294 + 127 380 382 + 29 381 383 + 103 382 384 + 675 26 26 + 454 383 385 + 318 384 386 + 125 385 387 + 132 386 388 + 63 387 389 + 64 216 216 + 567 388 390 + 570 389 391 + 159 321 323 + 390 310 312 + 393 88 88 + 160 87 87 + 146 117 117 + 6 390 392 + 224 391 393 + 315 118 118 + 328 392 394 + 329 166 166 + 209 156 156 + 206 155 155 + 448 120 120 + 582 122 122 + 578 393 395 + 577 394 396 + 683 395 397 + 684 396 398 + 681 80 80 + 680 79 79 + 609 397 399 + 263 398 400 + 262 399 401 + 623 400 402 + 514 45 45 + 336 44 44 + 335 401 403 + 515 93 93 + 334 402 404 + 395 9 9 + 348 403 405 + 26 404 406 + 286 30 30 + 287 317 319 + 284 405 407 + 283 406 408 + 695 407 409 + 696 408 410 + 693 147 147 + 692 146 146 + 28 133 133 + 137 409 411 + 431 410 412 + 84 411 413 + 22 412 414 + 43 413 415 + 637 414 416 + 125 385 387 + 737 415 417 + 740 416 418 + 739 417 419 + 736 418 420 + 152 419 421 + 151 420 422 + 426 199 199 + 425 198 198 + 544 421 423 + 53 170 424 + 52 212 425 + 547 422 426 + 145 423 427 + 46 424 428 + 181 348 350 + 750 347 349 + 61 134 134 + 564 425 429 + 565 426 430 + 60 427 431 + 473 428 432 + 101 429 433 + 100 430 434 + 476 431 435 + 655 432 436 + 654 433 437 + 127 380 382 + 126 434 438 + 187 435 439 + 589 436 440 + 590 335 337 + 186 97 97 + 107 437 441 + 11 438 442 + 101 429 433 + 473 428 432 + 667 439 443 + 668 440 444 + 647 441 445 + 285 27 27 + 286 30 30 + 283 406 408 + 282 442 446 + 734 443 447 + 167 300 302 + 158 1 1 + 737 415 417 + 203 444 448 + 204 445 449 + 601 340 342 + 604 339 341 + 208 446 450 + 6 390 392 + 55 379 381 + 619 378 380 + 563 447 451 + 118 448 452 + 117 449 453 + 566 450 454 + 189 230 232 + 202 126 126 + 549 62 62 + 550 61 61 + 452 451 455 + 448 452 456 + 451 453 457 + 284 405 407 + 287 317 319 + 238 316 318 + 237 454 458 + 688 3 3 + 687 455 459 + 73 456 460 + 72 457 461 + 533 54 54 + 532 50 50 + 531 308 310 + 524 458 462 + 285 27 27 + 282 442 446 + 240 343 345 + 239 342 344 + 241 459 463 + 244 77 77 + 243 76 76 + 236 460 464 + 46 424 428 + 145 423 427 + 500 85 85 + 370 461 465 + 99 462 466 + 14 463 467 + 173 464 468 + 479 465 469 + 719 262 264 + 718 369 371 + 716 235 237 + 349 466 470 + 392 8 8 + 389 467 471 + 350 468 472 + 686 469 473 + 104 128 128 + 42 127 127 + 74 267 269 + 480 470 474 + 481 471 475 + 478 472 476 + 477 473 477 + 476 431 435 + 477 473 477 + 474 474 478 + 473 428 432 + 84 411 413 + 431 410 412 + 436 115 115 + 85 306 308 + 216 475 479 + 317 476 480 + 284 405 407 + 237 454 458 + 62 477 481 + 12 478 482 + 102 479 483 + 322 480 484 + 751 350 352 + 716 235 237 + 753 481 485 + 750 347 349 + 294 482 486 + 295 483 487 + 292 16 488 + 291 484 489 + 47 485 490 + 89 486 491 + 365 487 492 + 281 253 255 + 258 281 283 + 706 250 252 + 264 488 493 + 58 489 494 + 87 490 495 + 356 190 190 + 362 189 189 + 88 491 496 + 151 420 422 + 150 492 497 + 427 213 213 + 426 199 199 + 543 201 201 + 546 493 498 + 545 494 499 + 542 202 202 + 444 495 500 + 18 496 501 + 190 497 502 + 268 498 503 + 577 394 396 + 578 393 395 + 299 289 291 + 708 36 36 + 709 499 504 + 217 500 505 + 212 37 37 + 612 501 506 + 613 125 125 + 610 24 24 + 296 502 507 + 101 429 433 + 11 438 442 + 325 503 508 + 733 504 509 + 732 242 244 + 326 505 510 + 296 502 507 + 295 483 487 + 100 430 434 + 101 429 433 + 295 483 487 + 294 482 486 + 99 462 466 + 100 430 434 + 152 419 421 + 14 463 467 + 99 462 466 + 294 482 486 + 476 431 435 + 100 430 434 + 99 462 466 + 479 465 469 + 294 482 486 + 291 484 489 + 151 420 422 + 152 419 421 + 55 379 381 + 228 506 511 + 235 507 512 + 56 291 293 + 291 484 489 + 288 508 513 + 150 492 497 + 151 420 422 + 631 299 301 + 155 298 300 + 159 321 323 + 632 323 325 + 603 279 281 + 606 282 284 + 605 338 340 + 602 337 339 + 663 70 70 + 664 69 69 + 661 509 514 + 660 510 515 + 560 511 516 + 119 512 517 + 118 448 452 + 563 447 451 + 223 67 67 + 13 513 518 + 166 169 169 + 648 514 519 + 516 515 520 + 94 516 521 + 93 517 522 + 519 518 523 + 336 44 44 + 393 88 88 + 394 10 10 + 335 401 403 + 335 401 403 + 394 10 10 + 395 9 9 + 334 402 404 + 310 103 103 + 499 102 102 + 485 214 214 + 311 519 524 + 314 359 361 + 15 520 525 + 192 521 526 + 598 522 527 + 201 211 211 + 616 167 167 + 166 169 169 + 13 513 518 + 689 149 149 + 690 148 148 + 66 523 528 + 65 524 529 + 3 297 299 + 337 525 530 + 387 311 313 + 155 298 300 + 341 526 531 + 389 467 471 + 388 309 311 + 340 527 532 + 348 403 405 + 395 9 9 + 392 8 8 + 349 466 470 + 378 528 533 + 379 371 373 + 372 529 534 + 371 530 535 + 510 531 536 + 509 236 238 + 459 239 241 + 458 532 537 + 305 533 538 + 306 179 179 + 303 345 347 + 302 344 346 + 503 534 539 + 460 346 348 + 1 305 307 + 225 535 540 + 72 457 461 + 73 456 460 + 718 369 371 + 719 262 264 + 541 536 541 + 54 171 542 + 53 170 424 + 544 421 423 + 593 206 206 + 596 537 543 + 595 538 544 + 592 539 545 + 746 109 109 + 169 318 320 + 168 162 162 + 749 540 546 + 265 541 547 + 266 542 548 + 728 543 549 + 729 544 550 + 340 527 532 + 388 309 311 + 387 311 313 + 337 525 530 + 534 12 12 + 460 346 348 + 461 545 551 + 535 13 13 + 245 241 243 + 33 290 292 + 326 505 510 + 732 242 244 + 644 546 552 + 641 270 272 + 382 547 553 + 383 548 554 + 36 549 555 + 119 512 517 + 560 511 516 + 113 550 556 + 690 148 148 + 691 341 343 + 67 551 557 + 66 523 528 + 548 552 558 + 553 553 559 + 417 554 560 + 538 555 561 + 239 342 344 + 303 345 347 + 234 49 49 + 2 48 48 + 303 345 347 + 306 179 179 + 233 178 178 + 234 49 49 + 234 49 49 + 233 178 178 + 531 308 310 + 532 50 50 + 324 217 562 + 456 556 563 + 78 557 564 + 79 558 565 + 505 314 316 + 350 559 566 + 17 560 567 + 462 561 568 + 16 562 569 + 311 519 524 + 485 214 214 + 404 563 570 + 273 360 362 + 517 95 95 + 520 564 571 + 275 361 363 + 192 521 526 + 430 65 65 + 437 375 377 + 193 374 376 + 374 565 572 + 17 560 573 + 341 526 531 + 412 566 574 + 523 567 575 + 536 568 576 + 374 565 577 + 373 569 578 + 326 505 510 + 33 290 292 + 182 570 579 + 747 571 580 + 594 205 205 + 179 572 581 + 178 573 582 + 597 574 583 + 300 22 22 + 413 21 21 + 416 64 64 + 301 63 63 + 320 575 584 + 324 217 217 + 323 576 585 + 77 577 586 + 32 578 587 + 154 82 82 + 695 407 409 + 745 110 110 + 748 579 588 + 747 571 580 + 744 580 589 + 417 554 560 + 413 21 590 + 538 555 561 + 417 581 591 + 438 376 378 + 437 375 377 + 406 582 592 + 405 583 593 + 646 584 594 + 645 585 595 + 457 365 367 + 458 532 537 + 639 272 274 + 640 586 596 + 193 374 376 + 200 377 379 + 592 539 545 + 595 538 544 + 327 587 597 + 342 588 598 + 414 589 599 + 486 590 600 + 519 518 523 + 93 517 522 + 83 591 601 + 522 592 602 + 623 400 402 + 627 193 193 + 626 196 196 + 622 32 32 + 689 149 149 + 79 558 565 + 78 557 564 + 692 146 146 + 701 320 322 + 382 547 553 + 381 593 603 + 704 594 604 + 23 595 605 + 52 212 212 + 427 213 213 + 150 492 497 + 555 303 305 + 429 596 606 + 331 597 607 + 488 304 306 + 59 598 608 + 566 450 454 + 117 449 453 + 38 123 123 + 216 475 479 + 19 599 609 + 148 600 610 + 317 476 480 + 120 601 611 + 36 549 555 + 113 550 556 + 575 602 612 + 488 304 306 + 331 597 607 + 672 603 613 + 730 604 614 + 280 254 256 + 366 185 185 + 367 184 184 + 279 605 615 + 19 599 609 + 165 288 616 + 230 606 617 + 148 600 610 + 521 607 618 + 301 63 63 + 304 66 66 + 520 564 571 + 667 439 443 + 647 441 445 + 674 608 619 + 666 609 620 + 135 78 78 + 25 610 621 + 45 611 622 + 433 612 623 + 352 613 624 + 7 614 625 + 276 325 327 + 441 324 326 + 134 615 626 + 140 616 627 + 607 34 34 + 621 33 33 + 207 617 628 + 358 618 629 + 357 619 630 + 208 446 450 + 371 530 535 + 353 620 631 + 95 621 632 + 96 622 633 + 571 623 634 + 574 624 635 + 573 625 636 + 570 389 391 + 261 626 637 + 262 399 401 + 712 627 638 + 715 628 639 + 163 6 640 + 244 77 77 + 241 459 463 + 164 629 641 + 269 373 375 + 270 372 374 + 529 73 73 + 530 630 642 + 418 631 643 + 406 582 592 + 645 585 595 + 644 546 552 + 749 540 546 + 321 632 644 + 325 503 508 + 748 579 588 + 451 453 457 + 450 208 208 + 128 633 645 + 129 634 646 + 218 635 647 + 288 508 648 + 401 19 19 + 219 276 278 + 267 636 649 + 444 495 650 + 577 394 396 + 268 498 503 + 109 637 651 + 609 397 399 + 608 31 31 + 108 638 652 + 534 12 12 + 512 15 15 + 498 639 653 + 497 302 304 + 182 570 579 + 183 640 654 + 744 580 589 + 747 571 580 + 65 524 529 + 9 218 655 + 79 558 565 + 689 149 149 + 452 451 455 + 130 641 656 + 8 642 657 + 327 587 597 + 486 590 600 + 308 643 658 + 4 644 659 + 656 645 660 + 655 432 436 + 126 434 438 + 116 124 124 + 148 600 610 + 230 606 617 + 229 646 661 + 147 116 116 + 247 195 195 + 584 285 287 + 583 647 662 + 257 648 663 + 351 649 664 + 16 562 569 + 404 563 570 + 576 650 665 + 293 220 222 + 361 219 221 + 360 188 188 + 290 651 666 + 378 528 533 + 371 530 535 + 96 622 633 + 103 382 384 + 433 612 623 + 45 611 622 + 44 652 667 + 493 653 668 + 211 38 38 + 10 654 669 + 298 655 670 + 707 35 35 + 559 264 266 + 562 656 671 + 561 657 672 + 558 265 267 + 147 116 116 + 229 646 661 + 228 506 511 + 146 117 117 + 154 82 82 + 32 578 587 + 106 658 673 + 680 79 79 + 743 108 108 + 170 245 247 + 169 318 320 + 746 109 109 + 642 271 273 + 643 659 674 + 640 586 596 + 639 272 274 + 164 629 641 + 241 459 463 + 230 606 617 + 165 288 616 + 499 102 102 + 502 101 101 + 501 84 84 + 490 83 83 + 587 336 338 + 590 335 337 + 589 436 440 + 586 362 364 + 186 97 97 + 590 335 337 + 591 334 336 + 185 98 98 + 687 455 459 + 688 3 3 + 685 2 2 + 684 396 398 + 641 270 272 + 638 273 275 + 381 593 603 + 382 547 553 + 191 210 210 + 190 497 502 + 624 660 675 + 617 661 676 + 148 600 610 + 147 116 116 + 316 119 119 + 317 476 480 + 182 570 579 + 578 393 395 + 582 122 122 + 183 640 654 + 137 409 411 + 242 662 677 + 243 76 76 + 136 75 75 + 86 307 309 + 12 478 482 + 115 266 268 + 558 265 267 + 369 663 678 + 501 84 84 + 502 101 101 + 368 664 679 + 54 171 171 + 27 192 192 + 194 191 191 + 421 172 172 + 279 605 615 + 27 192 680 + 54 171 542 + 541 536 541 + 462 561 568 + 17 560 567 + 374 565 577 + 536 568 576 + 672 603 613 + 673 665 681 + 674 608 619 + 647 441 445 + 575 602 612 + 113 550 556 + 114 263 265 + 574 624 635 + 597 574 583 + 178 573 582 + 177 666 682 + 600 667 683 + 68 668 684 + 4 644 659 + 308 643 658 + 725 233 235 + 98 669 685 + 319 670 686 + 322 480 484 + 102 479 483 + 618 355 357 + 619 378 380 + 620 292 294 + 610 24 24 + 496 671 687 + 43 413 688 + 22 412 689 + 97 672 690 + 221 330 332 + 36 549 555 + 120 601 611 + 665 673 691 + 240 343 345 + 282 442 446 + 315 118 118 + 224 391 393 + 531 308 310 + 631 299 301 + 632 323 325 + 524 458 462 + 344 278 280 + 333 674 692 + 69 675 693 + 70 268 270 + 117 449 453 + 656 645 660 + 116 124 124 + 38 123 123 + 111 676 694 + 605 338 340 + 606 282 284 + 110 677 695 + 41 678 696 + 179 572 581 + 594 205 205 + 217 204 204 + 226 679 697 + 225 535 540 + 730 604 614 + 731 680 698 + 504 315 317 + 505 314 316 + 462 561 568 + 461 545 551 + 155 298 300 + 387 311 313 + 390 310 312 + 159 321 323 + 192 521 526 + 15 520 525 + 304 66 66 + 430 65 65 + 270 372 374 + 271 681 699 + 528 74 74 + 529 73 73 + 309 100 700 + 380 370 372 + 269 373 375 + 24 682 701 + 331 597 607 + 429 596 606 + 415 683 702 + 332 684 703 + 174 333 335 + 175 332 334 + 469 685 704 + 472 686 705 + 484 215 215 + 490 83 83 + 489 86 86 + 483 130 130 + 728 543 549 + 227 237 239 + 226 679 697 + 731 680 698 + 385 687 706 + 384 153 153 + 556 688 707 + 557 689 708 + 418 631 643 + 35 690 709 + 274 691 710 + 548 552 558 + 258 281 283 + 259 280 282 + 703 251 253 + 706 250 252 + 455 692 711 + 456 556 563 + 320 575 712 + 454 383 385 + 274 691 710 + 35 690 709 + 445 258 260 + 713 293 295 + 321 632 644 + 734 443 447 + 733 504 509 + 325 503 508 + 185 98 98 + 591 334 336 + 174 333 335 + 40 693 713 + 69 675 693 + 68 668 684 + 725 233 235 + 726 232 234 + 509 236 238 + 506 694 714 + 226 679 697 + 227 237 239 + 438 695 715 + 553 553 559 + 278 696 716 + 298 655 670 + 650 329 331 + 119 512 517 + 36 549 555 + 221 330 332 + 698 255 257 + 383 548 554 + 382 547 553 + 701 320 322 + 333 674 692 + 328 392 394 + 68 668 684 + 69 675 693 + 580 357 359 + 587 336 338 + 586 362 364 + 579 358 360 + 89 486 491 + 47 485 490 + 112 697 717 + 666 609 620 + 344 278 280 + 345 229 231 + 338 164 164 + 333 674 692 + 699 256 258 + 700 225 227 + 434 228 230 + 435 257 259 + 675 26 26 + 103 382 384 + 96 622 633 + 678 23 23 + 201 211 211 + 13 513 518 + 128 633 645 + 450 208 208 + 371 530 535 + 372 529 534 + 354 351 353 + 353 620 631 + 727 107 107 + 71 106 106 + 18 496 718 + 267 636 649 + 320 575 584 + 323 576 585 + 322 480 484 + 319 670 686 + 124 131 131 + 145 423 427 + 750 347 349 + 753 481 485 + 714 294 296 + 715 628 639 + 712 627 638 + 711 295 297 + 511 364 366 + 510 531 536 + 458 532 537 + 457 365 367 + 134 615 626 + 403 17 17 + 296 275 277 + 140 616 627 + 175 332 334 + 176 137 137 + 466 698 719 + 469 685 704 + 509 236 238 + 510 531 536 + 507 312 314 + 506 694 714 + 441 324 326 + 407 699 720 + 376 700 721 + 352 613 624 + 133 701 722 + 402 18 18 + 403 17 17 + 134 615 626 + 444 495 650 + 448 120 120 + 577 394 396 + 671 702 723 + 721 104 104 + 720 222 224 + 670 221 223 + 644 546 552 + 645 585 595 + 642 271 273 + 641 270 272 + 384 153 153 + 5 152 152 + 482 703 724 + 556 688 707 + 264 488 493 + 265 541 547 + 729 544 550 + 668 440 444 + 648 514 519 + 649 328 330 + 222 68 68 + 223 67 67 + 370 461 465 + 500 85 85 + 501 84 84 + 369 663 678 + 682 301 303 + 167 300 302 + 49 161 161 + 149 160 160 + 183 640 654 + 582 122 122 + 452 121 121 + 184 704 725 + 707 35 35 + 298 655 670 + 278 696 716 + 710 296 298 + 397 705 726 + 453 706 727 + 216 475 728 + 237 454 729 + 458 532 537 + 459 239 241 + 638 273 275 + 639 272 274 + 327 587 597 + 4 644 659 + 206 155 155 + 446 154 154 + 706 250 252 + 705 249 251 + 265 541 547 + 264 488 493 + 352 613 624 + 491 707 730 + 346 708 731 + 7 614 625 + 397 705 726 + 400 709 732 + 399 710 733 + 396 711 734 + 463 712 735 + 5 152 152 + 123 129 129 + 752 713 736 + 51 261 263 + 72 457 461 + 719 262 264 + 283 406 408 + 316 119 119 + 315 118 118 + 282 442 446 + 181 348 350 + 738 714 737 + 739 417 419 + 180 349 351 + 721 104 104 + 727 107 107 + 723 715 738 + 720 222 224 + 86 307 309 + 494 114 114 + 102 479 483 + 12 478 482 + 503 534 539 + 504 315 317 + 461 545 551 + 460 346 348 + 508 313 315 + 511 364 366 + 348 363 365 + 349 716 739 + 169 318 320 + 170 245 247 + 691 341 343 + 694 319 321 + 404 563 570 + 485 214 214 + 484 215 215 + 385 687 706 + 396 711 734 + 399 710 733 + 398 717 740 + 386 718 741 + 238 316 742 + 400 709 732 + 397 705 726 + 237 454 729 + 333 674 692 + 338 164 164 + 329 166 166 + 328 392 394 + 581 138 138 + 588 331 333 + 587 336 338 + 580 357 359 + 691 341 343 + 170 245 247 + 39 244 246 + 67 551 557 + 290 651 666 + 360 188 188 + 356 190 190 + 289 719 743 + 522 592 602 + 300 22 22 + 301 63 63 + 521 607 618 + 680 79 79 + 106 658 673 + 105 720 744 + 683 395 397 + 496 671 687 + 97 672 690 + 98 669 685 + 495 113 113 + 657 721 745 + 130 641 656 + 129 634 646 + 660 510 515 + 63 387 389 + 323 576 585 + 324 217 217 + 64 216 216 + 194 191 191 + 195 142 142 + 420 145 145 + 421 172 172 + 518 94 94 + 521 607 618 + 520 564 571 + 517 95 95 + 204 445 449 + 542 202 202 + 545 494 499 + 205 722 746 + 628 723 747 + 487 724 748 + 428 725 749 + 554 726 750 + 88 491 496 + 362 189 189 + 365 487 492 + 89 486 491 + 94 727 751 + 26 366 368 + 457 365 367 + 640 586 596 + 635 247 249 + 552 59 59 + 105 720 744 + 106 658 673 + 204 445 449 + 205 722 746 + 583 647 662 + 601 340 342 + 548 552 558 + 538 555 561 + 406 582 592 + 418 631 643 + 572 728 752 + 575 602 612 + 574 624 635 + 571 623 634 + 345 229 231 + 347 5 5 + 343 4 4 + 338 164 164 + 192 521 526 + 193 374 376 + 595 538 544 + 598 522 527 + 213 187 753 + 367 184 184 + 364 183 183 + 214 182 754 + 704 594 604 + 381 593 603 + 48 238 240 + 266 542 548 + 687 455 459 + 686 469 473 + 74 267 269 + 73 456 460 + 746 109 109 + 749 540 546 + 748 579 588 + 745 110 110 + 560 511 516 + 563 447 451 + 562 656 671 + 559 264 266 + 289 719 743 + 0 729 755 + 339 730 756 + 398 717 740 + 734 443 447 + 737 415 417 + 736 418 420 + 733 504 509 + 41 731 757 + 263 398 400 + 609 397 399 + 109 637 651 + 667 439 443 + 111 676 694 + 110 677 695 + 668 440 444 + 230 606 617 + 241 459 463 + 236 460 464 + 229 646 661 + 523 567 575 + 576 650 665 + 557 689 708 + 513 14 14 + 22 412 689 + 318 384 758 + 97 672 690 + 447 209 209 + 444 495 500 + 190 497 502 + 191 210 210 + 655 432 436 + 656 645 660 + 653 732 759 + 652 733 760 + 239 342 344 + 2 48 48 + 197 28 28 + 285 27 27 + 495 113 113 + 98 669 685 + 102 479 483 + 494 114 114 + 117 449 453 + 118 448 452 + 653 732 759 + 656 645 660 + 297 353 355 + 16 562 761 + 351 649 762 + 443 734 763 + 0 729 755 + 289 719 743 + 356 190 190 + 87 490 495 + 670 221 223 + 369 663 678 + 368 664 679 + 671 702 723 + 200 377 379 + 10 735 764 + 211 736 765 + 592 539 545 + 340 527 532 + 337 525 530 + 410 737 766 + 411 738 767 + 731 680 698 + 730 604 614 + 672 603 613 + 647 441 445 + 594 205 205 + 597 574 583 + 596 537 543 + 593 206 206 + 173 464 468 + 172 739 768 + 480 470 474 + 479 465 469 + 28 133 133 + 57 132 132 + 242 662 677 + 137 409 411 + 95 621 632 + 7 614 625 + 346 708 731 + 677 354 356 + 341 526 531 + 340 527 532 + 411 738 767 + 412 566 574 + 623 400 402 + 262 399 401 + 261 626 637 + 627 193 193 + 704 594 604 + 705 249 251 + 702 252 254 + 701 320 322 + 272 46 46 + 273 360 362 + 586 362 364 + 589 436 440 + 506 694 714 + 507 312 314 + 504 315 317 + 503 534 539 + 177 666 682 + 37 136 136 + 312 139 139 + 600 667 683 + 445 258 260 + 435 257 259 + 714 294 296 + 713 293 295 + 535 13 13 + 536 568 576 + 523 567 575 + 513 14 14 + 711 295 297 + 712 627 638 + 709 499 504 + 708 36 36 + 630 96 96 + 524 458 462 + 632 323 325 + 629 322 324 + 671 702 723 + 76 740 769 + 75 105 105 + 721 104 104 + 83 591 770 + 93 517 771 + 643 659 674 + 646 584 594 + 585 284 286 + 260 226 228 + 259 280 282 + 603 279 281 + 120 601 611 + 121 286 288 + 662 287 289 + 665 673 691 + 432 741 772 + 136 75 75 + 135 78 78 + 433 612 623 + 538 555 561 + 413 21 590 + 405 583 593 + 406 582 592 + 710 296 298 + 711 295 297 + 708 36 36 + 707 35 35 + 413 21 21 + 417 581 591 + 416 64 64 + 332 684 703 + 0 729 755 + 87 490 495 + 673 665 681 + 574 624 635 + 114 263 265 + 115 266 268 + 573 625 636 + 450 208 208 + 451 453 457 + 448 452 456 + 447 209 209 + 546 493 498 + 219 276 278 + 220 277 279 + 545 494 499 + 441 324 326 + 442 327 329 + 408 742 773 + 407 699 720 + 435 257 259 + 434 228 230 + 715 628 639 + 714 294 296 + 97 672 690 + 318 384 758 + 319 670 686 + 98 669 685 + 614 72 72 + 615 743 774 + 530 630 642 + 529 73 73 + 446 154 154 + 449 157 157 + 396 711 734 + 386 718 741 + 442 327 329 + 277 326 328 + 297 353 355 + 443 734 763 + 116 124 124 + 126 434 438 + 676 25 25 + 613 125 125 + 391 11 11 + 394 10 10 + 393 88 88 + 390 310 312 + 658 744 775 + 659 89 89 + 139 92 92 + 138 745 776 + 153 81 81 + 149 160 160 + 697 163 163 + 696 408 410 + 409 746 777 + 412 566 574 + 411 738 767 + 408 742 773 + 184 704 725 + 8 747 778 + 131 748 779 + 741 749 780 + 177 666 682 + 178 573 582 + 478 472 476 + 481 471 475 + 568 750 781 + 571 623 634 + 570 389 391 + 567 388 390 + 652 733 760 + 653 732 759 + 650 329 331 + 649 328 330 + 686 469 473 + 687 455 459 + 684 396 398 + 683 395 397 + 66 751 782 + 568 750 781 + 567 388 390 + 65 752 783 + 408 742 773 + 411 738 767 + 410 737 766 + 407 699 720 + 684 396 398 + 685 2 2 + 682 301 303 + 681 80 80 + 553 553 559 + 548 552 558 + 274 691 710 + 278 696 716 + 417 581 591 + 437 375 377 + 430 65 65 + 416 64 64 + 173 464 468 + 14 463 467 + 143 56 56 + 464 55 55 + 324 217 562 + 320 575 712 + 456 556 563 + 428 725 749 + 487 724 748 + 486 590 600 + 414 589 599 + 178 573 582 + 179 572 581 + 475 753 784 + 478 472 476 + 597 574 583 + 600 667 683 + 599 754 785 + 596 537 543 + 379 371 373 + 380 370 372 + 377 755 786 + 372 529 534 + 423 151 151 + 424 173 173 + 421 172 172 + 420 145 145 + 62 477 481 + 63 387 389 + 570 389 391 + 573 625 636 + 180 349 351 + 739 417 419 + 740 416 418 + 156 260 262 + 96 622 633 + 95 621 632 + 677 354 356 + 678 23 23 + 751 350 352 + 719 262 264 + 716 235 237 + 692 146 146 + 78 557 564 + 77 577 586 + 695 407 409 + 200 377 379 + 438 376 378 + 10 735 764 + 562 656 671 + 565 426 430 + 564 425 429 + 561 657 672 + 409 746 777 + 443 734 763 + 351 649 762 + 373 569 787 + 404 563 570 + 385 687 706 + 557 689 708 + 576 650 665 + 275 361 363 + 15 520 525 + 314 359 361 + 579 358 360 + 212 207 207 + 593 206 206 + 592 539 545 + 211 736 765 + 257 648 663 + 34 756 788 + 133 701 722 + 625 757 789 + 214 182 754 + 364 183 183 + 361 219 221 + 215 176 220 + 584 285 287 + 602 337 339 + 601 340 342 + 583 647 662 + 660 510 515 + 129 634 646 + 128 633 645 + 663 70 70 + 302 344 346 + 240 343 345 + 224 391 393 + 357 619 630 + 645 585 595 + 646 584 594 + 643 659 674 + 642 271 273 + 75 105 790 + 76 740 791 + 530 630 642 + 615 743 774 + 491 707 730 + 358 618 629 + 207 617 628 + 346 708 731 + 76 740 791 + 24 682 701 + 269 373 375 + 530 630 642 + 47 485 490 + 203 444 448 + 604 339 341 + 112 697 717 + 493 653 668 + 44 652 667 + 43 413 688 + 496 671 687 + 717 269 271 + 70 268 270 + 69 675 693 + 726 232 234 + 456 556 563 + 455 692 711 + 77 577 586 + 78 557 564 + 23 595 792 + 288 508 648 + 218 635 647 + 156 260 262 + 740 416 418 + 157 0 0 + 51 261 263 + 46 424 428 + 231 283 285 + 738 714 737 + 181 348 350 + 113 550 556 + 560 511 516 + 559 264 266 + 114 263 265 + 20 20 793 + 83 591 770 + 646 584 594 + 405 583 593 + 44 652 794 + 45 611 795 + 551 368 370 + 634 367 369 + 415 683 702 + 429 596 606 + 428 725 749 + 414 589 599 + 353 620 631 + 276 325 327 + 7 614 625 + 95 621 632 + 630 96 96 + 527 99 99 + 524 458 462 + 617 661 676 + 624 660 675 + 615 743 774 + 614 72 72 + 60 427 431 + 565 426 430 + 566 450 454 + 59 598 608 + 626 196 196 + 247 195 195 + 257 648 663 + 625 757 789 + 124 131 131 + 489 86 86 + 500 85 85 + 145 423 427 + 648 514 519 + 166 169 169 + 162 168 168 + 651 758 796 + 238 316 742 + 21 177 219 + 293 220 222 + 400 709 732 + 622 32 32 + 626 196 196 + 625 757 789 + 621 33 33 + 49 161 161 + 167 300 302 + 734 443 447 + 321 632 644 + 18 496 501 + 71 106 797 + 624 660 675 + 190 497 502 + 345 229 231 + 344 278 280 + 202 126 126 + 189 230 232 + 660 510 515 + 661 509 514 + 658 744 775 + 657 721 745 + 710 296 298 + 278 696 716 + 274 691 710 + 713 293 295 + 431 410 412 + 137 409 411 + 136 75 75 + 432 741 772 + 599 754 785 + 313 356 358 + 314 359 361 + 598 522 527 + 737 415 417 + 158 1 1 + 157 0 0 + 740 416 418 + 28 133 133 + 84 411 413 + 564 425 429 + 61 134 134 + 547 422 426 + 218 635 647 + 219 276 278 + 546 493 498 + 376 700 721 + 407 699 720 + 410 737 766 + 375 759 798 + 377 755 786 + 380 370 372 + 309 100 700 + 310 760 799 + 661 509 514 + 662 287 289 + 659 89 89 + 658 744 775 + 664 69 69 + 665 673 691 + 662 287 289 + 661 509 514 + 438 695 715 + 298 655 670 + 10 654 669 + 318 384 386 + 22 412 414 + 125 385 387 + 449 157 157 + 209 156 156 + 210 761 800 + 453 706 727 + 183 640 654 + 184 704 725 + 741 749 780 + 744 580 589 + 139 246 248 + 743 108 108 + 742 111 111 + 138 762 801 + 334 402 404 + 26 404 406 + 94 516 521 + 516 515 520 + 118 448 452 + 119 512 517 + 650 329 331 + 653 732 759 + 657 721 745 + 658 744 775 + 138 745 776 + 131 763 802 + 64 216 216 + 9 218 218 + 65 752 783 + 567 388 390 + 261 626 637 + 50 227 229 + 246 194 194 + 627 193 193 + 201 211 211 + 191 210 210 + 617 661 676 + 616 167 167 + 208 446 450 + 357 619 630 + 224 391 393 + 6 390 392 + 188 231 233 + 189 230 232 + 550 61 61 + 551 368 370 + 563 447 451 + 566 450 454 + 565 426 430 + 562 656 671 + 357 619 630 + 358 618 629 + 305 533 538 + 302 344 346 + 231 283 285 + 232 240 242 + 735 243 245 + 738 714 737 + 596 537 543 + 599 754 785 + 598 522 527 + 595 538 544 + 62 477 481 + 322 480 484 + 323 576 585 + 63 387 389 + 154 82 82 + 153 81 81 + 696 408 410 + 695 407 409 + 731 680 698 + 647 441 445 + 729 544 550 + 728 543 549 + 720 222 224 + 723 715 738 + 722 259 261 + 679 223 225 + 115 266 268 + 12 478 482 + 62 477 481 + 573 625 636 + 742 111 111 + 745 110 110 + 744 580 589 + 741 749 780 + 305 533 538 + 358 618 629 + 491 707 730 + 439 764 803 + 112 697 717 + 604 339 341 + 605 338 340 + 111 676 694 + 569 765 804 + 572 728 752 + 571 623 634 + 568 750 781 + 91 766 805 + 92 767 806 + 525 51 51 + 526 768 807 + 442 327 329 + 443 734 763 + 409 746 777 + 408 742 773 + 611 135 135 + 61 134 134 + 60 427 431 + 612 501 506 + 372 529 534 + 377 755 786 + 355 352 354 + 354 351 353 + 433 612 623 + 493 653 668 + 492 112 112 + 432 741 772 + 46 424 428 + 370 461 465 + 669 224 226 + 231 283 285 + 40 693 713 + 90 769 808 + 527 99 99 + 471 770 809 + 472 686 705 + 469 685 704 + 468 771 810 + 222 68 68 + 221 330 332 + 665 673 691 + 664 69 69 + 39 91 91 + 122 90 90 + 569 765 804 + 67 772 811 + 467 58 58 + 468 771 810 + 465 773 812 + 464 55 55 + 419 144 144 + 196 143 143 + 30 197 197 + 141 774 813 + 312 139 139 + 581 138 138 + 580 357 359 + 313 356 358 + 152 419 421 + 425 198 198 + 143 56 56 + 14 463 467 + 172 739 768 + 171 775 814 + 481 471 475 + 480 470 474 + 425 198 198 + 422 150 150 + 142 57 57 + 143 56 56 + 90 769 808 + 91 766 805 + 526 768 807 + 527 99 99 + 422 150 150 + 419 144 144 + 141 774 813 + 142 57 57 + 318 384 758 + 320 575 584 + 319 670 686 + 128 633 645 + 13 513 518 + 223 67 67 + 663 70 70 + 547 422 426 + 52 212 425 + 23 595 792 + 218 635 647 + 727 107 107 + 267 636 649 + 268 498 503 + 723 715 738 + 210 761 800 + 19 599 815 + 216 475 728 + 453 706 727 + 330 165 165 + 165 288 290 + 19 599 815 + 210 761 800 + 135 78 78 + 244 77 77 + 163 6 640 + 25 610 621 + 205 722 746 + 34 756 788 + 257 648 663 + 583 647 662 + 581 138 138 + 176 137 137 + 175 332 334 + 588 331 333 + 418 631 643 + 644 546 552 + 383 548 554 + 35 690 709 + 540 200 200 + 280 254 256 + 279 605 615 + 541 536 541 + 426 199 199 + 427 213 213 + 424 173 173 + 423 151 151 + 131 763 802 + 8 642 657 + 130 641 656 + 657 721 745 + 290 651 666 + 289 719 743 + 398 717 740 + 399 710 733 + 144 776 816 + 635 247 249 + 106 658 673 + 32 578 587 + 205 722 746 + 545 494 499 + 220 277 279 + 34 756 788 + 585 284 286 + 603 279 281 + 602 337 339 + 584 285 287 + 448 452 456 + 444 495 500 + 447 209 209 + 463 712 735 + 628 723 747 + 482 703 724 + 5 152 152 + 452 451 455 + 451 453 457 + 129 634 646 + 130 641 656 + 389 467 471 + 392 8 8 + 391 11 11 + 388 309 311 + 133 701 722 + 134 615 626 + 621 33 33 + 625 757 789 + 497 302 304 + 498 639 653 + 554 726 750 + 555 303 305 + 71 106 797 + 75 105 790 + 615 743 774 + 624 660 675 + 572 728 752 + 121 286 288 + 120 601 611 + 575 602 612 + 352 613 624 + 376 700 721 + 439 764 803 + 491 707 730 + 368 664 679 + 502 101 101 + 309 100 100 + 24 682 817 + 355 352 354 + 311 519 818 + 16 562 761 + 297 353 355 + 468 771 810 + 469 685 704 + 466 698 719 + 465 773 812 + 182 570 579 + 33 290 292 + 299 289 291 + 578 393 395 + 446 154 154 + 386 718 741 + 342 588 598 + 327 587 597 + 709 499 504 + 263 398 400 + 41 731 757 + 217 500 505 + 168 162 162 + 49 161 161 + 321 632 644 + 749 540 546 + 455 692 711 + 454 383 385 + 132 386 388 + 144 776 816 + 470 777 819 + 471 770 809 + 468 771 810 + 467 58 58 + 477 473 477 + 478 472 476 + 475 753 784 + 474 474 478 + 140 616 627 + 296 275 277 + 11 778 820 + 527 99 99 + 526 768 807 + 524 458 462 + 479 465 469 + 480 470 474 + 477 473 477 + 476 431 435 + 533 54 54 + 524 458 462 + 526 768 807 + 525 51 51 + 464 55 55 + 465 773 812 + 172 739 768 + 173 464 468 + 465 773 812 + 466 698 719 + 171 775 814 + 172 739 768 + 466 698 719 + 176 137 137 + 37 136 136 + 171 775 814 + 171 775 814 + 37 136 136 + 177 666 682 + 481 471 475 + 174 333 335 + 472 686 705 + 90 769 808 + 40 693 713 + 472 686 705 + 471 770 809 + 91 766 805 + 90 769 808 + 471 770 809 + 470 777 819 + 92 767 806 + 91 766 805 + 470 777 819 + 141 774 813 + 30 197 197 + 92 767 806 + 473 428 432 + 474 474 478 + 108 779 821 + 107 437 441 + 498 639 653 + 512 15 15 + 556 688 707 + 482 703 724 + 474 474 478 + 475 753 784 + 109 780 822 + 108 779 821 + 475 753 784 + 179 572 581 + 41 678 696 + 109 780 822 + 355 352 354 + 377 755 786 + 310 760 799 + 311 519 818 + 544 421 423 + 547 422 426 + 546 493 498 + 543 201 201 + 654 433 437 + 655 432 436 + 652 733 760 + 651 758 796 + 203 444 448 + 539 203 203 + 542 202 202 + 204 445 449 + 359 181 181 + 440 180 180 + 375 759 798 + 3 297 299 + 379 371 373 + 378 528 533 + 271 681 699 + 270 372 374 + 616 167 167 + 617 661 676 + 614 72 72 + 537 71 71 + 275 361 363 + 520 564 571 + 304 66 66 + 15 520 525 + 618 355 357 + 207 617 628 + 208 446 450 + 619 378 380 + 440 180 180 + 306 179 179 + 305 533 538 + 439 764 803 + 163 6 6 + 347 5 5 + 188 231 233 + 25 610 823 + 516 515 520 + 519 518 523 + 518 94 94 + 515 93 93 + 58 489 494 + 264 488 493 + 668 440 444 + 329 166 166 + 330 165 165 + 210 761 800 + 209 156 156 + 554 726 750 + 498 639 653 + 482 703 724 + 628 723 747 + 600 667 683 + 312 139 139 + 313 356 358 + 599 754 785 + 307 781 824 + 487 724 748 + 628 723 747 + 463 712 735 + 522 592 602 + 83 591 601 + 20 20 20 + 300 22 22 + 638 273 275 + 459 239 241 + 48 238 240 + 381 593 603 + 45 611 795 + 25 610 823 + 188 231 233 + 551 368 370 + 18 496 718 + 444 495 650 + 267 636 649 + 47 485 490 + 281 253 255 + 539 203 203 + 203 444 448 + 308 643 658 + 307 781 824 + 724 234 236 + 725 233 235 + 752 713 736 + 123 129 129 + 124 131 131 + 753 481 485 + 293 220 222 + 290 651 666 + 399 710 733 + 400 709 732 + 342 588 598 + 386 718 741 + 398 717 740 + 339 730 756 + 368 664 679 + 24 682 817 + 76 740 769 + 671 702 723 + 185 98 98 + 40 693 713 + 527 99 99 + 612 501 506 + 610 24 24 + 620 292 294 + 611 135 135 + 438 695 715 + 417 554 560 + 553 553 559 + 236 460 464 + 243 76 76 + 242 662 677 + 235 507 512 + 332 684 703 + 415 683 702 + 339 730 756 + 0 729 755 + 59 598 608 + 38 123 123 + 613 125 125 + 535 13 13 + 461 545 551 + 462 561 568 + 536 568 576 + 31 43 43 + 272 46 46 + 589 436 440 + 187 435 439 + 281 253 255 + 365 487 492 + 366 185 185 + 280 254 256 + 133 701 722 + 34 756 788 + 220 277 279 + 402 18 18 + 493 653 668 + 496 671 687 + 495 113 113 + 492 112 112 + 140 616 627 + 11 778 820 + 107 782 825 + 607 34 34 + 262 399 401 + 263 398 400 + 709 499 504 + 712 627 638 + 413 21 590 + 20 20 793 + 405 583 593 + 449 157 157 + 453 706 727 + 397 705 726 + 396 711 734 + 723 715 738 + 268 498 503 + 299 289 291 + 722 259 261 + 414 589 599 + 342 588 598 + 339 730 756 + 415 683 702 + 144 776 816 + 32 578 587 + 77 577 586 + 455 692 711 + 669 224 226 + 370 461 465 + 369 663 678 + 670 221 223 + 751 350 352 + 180 349 351 + 156 260 262 + 719 262 264 + 439 764 803 + 376 700 721 + 375 759 798 + 440 180 180 + 324 217 562 + 79 558 565 + 9 218 655 + 609 397 399 + 623 400 402 + 622 32 32 + 608 31 31 + 346 708 731 + 207 617 628 + 618 355 357 + 677 354 356 + 683 395 397 + 105 720 744 + 104 128 128 + 686 469 473 + 666 609 620 + 112 697 717 + 111 676 694 + 667 439 443 + 736 418 420 + 739 417 419 + 738 714 737 + 735 243 245 + 353 620 631 + 354 351 353 + 277 326 328 + 276 325 327 + 528 74 74 + 271 681 699 + 29 381 383 + 161 274 276 + 337 525 530 + 3 297 299 + 375 759 798 + 410 737 766 + 73 456 460 + 74 267 269 + 717 269 271 + 718 369 371 + 126 434 438 + 127 380 382 + 675 26 26 + 676 25 25 + 361 219 221 + 364 183 183 + 363 186 186 + 360 188 188 + 110 677 695 + 606 282 284 + 258 281 283 + 58 489 494 + 519 518 523 + 522 592 602 + 521 607 618 + 518 94 94 + 229 646 661 + 236 460 464 + 235 507 512 + 228 506 511 + 184 704 725 + 452 121 121 + 8 747 778 + 84 411 413 + 85 306 308 + 561 657 672 + 564 425 429 + 378 528 533 + 103 382 384 + 29 381 383 + 271 681 699 + 651 758 796 + 162 168 168 + 161 274 276 + 654 433 437 + 432 741 772 + 492 112 112 + 436 115 115 + 431 410 412 + 569 765 804 + 122 90 90 + 121 286 288 + 572 728 752 + 681 80 80 + 682 301 303 + 149 160 160 + 153 81 81 + 733 504 509 + 736 418 420 + 735 243 245 + 732 242 244 + 668 440 444 + 729 544 550 + 647 441 445 + 428 725 749 + 429 596 606 + 555 303 305 + 554 726 750 + 724 234 236 + 307 781 824 + 463 712 735 + 752 713 736 + 486 590 600 + 487 724 748 + 307 781 824 + 308 643 658 + 144 776 816 + 132 386 388 + 636 248 250 + 635 247 249 + 374 565 572 + 412 566 574 + 409 746 777 + 373 569 787 + 445 258 260 + 35 690 709 + 383 548 554 + 698 255 257 + 85 306 308 + 86 307 309 + 558 265 267 + 561 657 672 + 138 762 801 + 742 111 111 + 741 749 780 + 131 748 779 + 705 249 251 + 704 594 604 + 266 542 548 + 265 541 547 + 67 772 811 + 569 765 804 + 568 750 781 + 66 751 782 + 286 30 30 + 198 29 29 + 199 175 175 + 287 317 319 + 654 433 437 + 161 274 276 + 29 381 383 + 127 380 382 + 6 390 392 + 146 117 117 + 228 506 511 + 55 379 381 + 515 93 93 + 335 401 403 + 334 402 404 + 516 515 520 + 288 508 648 + 292 16 16 + 401 19 19 + 513 14 14 + 557 689 708 + 556 688 707 + 512 15 15 + 259 280 282 + 260 226 228 + 700 225 227 + 703 251 253 + 467 58 58 + 142 57 57 + 141 774 813 + 470 777 819 + 506 694 714 + 503 534 539 + 225 535 540 + 226 679 697 + 434 228 230 + 50 227 229 + 261 626 637 + 715 628 639 + 724 234 236 + 752 713 736 + 753 481 485 + 716 235 237 + 108 638 652 + 608 31 31 + 607 34 34 + 107 782 825 + 541 536 541 + 544 421 423 + 543 201 201 + 540 200 200 + 672 603 613 + 331 597 607 + 332 684 703 + 673 665 681 + 252 41 41 + 253 141 141 + 250 174 174 + 249 158 158 + 17 560 573 + 350 468 472 + 389 467 471 + 341 526 531 + 351 649 664 + 576 650 665 + 523 567 575 + 373 569 578 + 629 322 324 + 187 435 439 + 186 97 97 + 630 96 96 + 43 413 415 + 44 652 794 + 634 367 369 + 637 414 416 + 272 46 46 + 514 45 45 + 517 95 95 + 273 360 362 + 56 291 293 + 235 507 512 + 242 662 677 + 57 132 132 + 132 386 388 + 125 385 387 + 637 414 416 + 636 248 250 + 110 677 695 + 58 489 494 + 668 440 444 + 92 767 806 + 30 197 197 + 82 52 52 + 525 51 51 + 552 59 59 + 549 62 62 + 104 128 128 + 105 720 744 + 288 508 513 + 23 595 605 + 150 492 497 + 292 16 488 + 288 508 513 + 291 484 489 + 296 502 507 + 292 16 488 + 295 483 487 + 363 186 186 + 366 185 185 + 365 487 492 + 362 189 189 + 510 531 536 + 511 364 366 + 508 313 315 + 507 312 314 + 385 687 706 + 484 215 215 + 483 130 130 + 384 153 153 + 157 0 0 + 688 3 3 + 72 457 461 + 51 261 263 + 284 405 407 + 317 476 480 + 316 119 119 + 283 406 408 + 160 87 87 + 31 43 43 + 187 435 439 + 629 322 324 + 93 517 771 + 94 727 751 + 640 586 596 + 643 659 674 + 651 758 796 + 652 733 760 + 649 328 330 + 648 514 519 + 505 314 316 + 508 313 315 + 349 716 739 + 350 559 566 + 266 542 548 + 48 238 240 + 227 237 239 + 728 543 549 + 612 501 506 + 60 427 431 + 59 598 608 + 613 125 125 + 636 248 250 + 637 414 416 + 634 367 369 + 633 60 60 + 328 392 394 + 206 155 155 + 4 644 659 + 68 668 684 + 279 605 615 + 367 184 184 + 213 187 753 + 27 192 680 + 88 491 496 + 89 486 491 + 666 609 620 + 674 608 619 + 748 579 588 + 325 503 508 + 326 505 510 + 747 571 580 + 673 665 681 + 87 490 495 + 88 491 496 + 674 608 619 + 320 575 712 + 318 384 386 + 454 383 385 + 225 535 540 + 1 305 307 + 488 304 306 + 730 604 614 + 613 125 125 + 676 25 25 + 610 24 24 + 696 408 410 + 697 163 163 + 694 319 321 + 693 147 147 + } + $verts { + -0.013231 -0.003469 0.004601 0 + -0.013231 -0.003469 -0.004601 0 + -0.013231 0.003469 0.004601 0 + -0.013231 0.003469 -0.004601 0 + 0.013231 -0.003469 0.004601 0 + 0.013231 -0.003469 -0.004601 0 + 0.013231 0.003469 0.004601 0 + 0.013231 0.003469 -0.004601 0 + 0.029359 0 -0.008634 0 + 0.029359 -0 0.008634 0 + -0.029359 0 -0.008634 0 + -0.029359 -0 0.008634 0 + 0.028243 0.00026 0.008709 0 + 0.028243 0.00026 -0.008709 0 + -0.028243 0.00026 0.008709 0 + -0.028243 0.00026 -0.008709 0 + 0.013327 0 -0.007605 0 + -0.013327 0 -0.007605 0 + 0.028054 0 -0.009411 0 + 0.013327 -0 0.007605 0 + -0.028054 0 -0.009411 0 + -0.013327 -0 0.007605 0 + 0.028054 -0 0.009411 0 + -0.028054 -0 0.009411 0 + 0.022946 0 -0.009307 0 + 0.022946 -0 0.009307 0 + -0.022946 0 -0.009307 0 + -0.022946 -0 0.009307 0 + 0.022344 0.000748 0.006855 0 + 0.022344 0.000748 -0.006855 0 + -0.022344 0.000748 0.006855 0 + -0.022344 0.000748 -0.006855 0 + 0.028243 -0.00026 0.008709 0 + 0.028243 -0.00026 -0.008709 0 + -0.028243 -0.00026 0.008709 0 + -0.028243 -0.00026 -0.008709 0 + 0.027587 0.000376 0 0 + -0.027587 0.000376 0 0 + 0.022617 0.000622 0 0 + 0.029394 0 0 0 + -0.022617 0.000622 0 0 + -0.029394 0 0 0 + 0.022344 -0.000748 0.006855 0 + 0.027051 -0 0.009433 0 + 0.025642 -0 0.00946 0 + 0.024231 -0 0.009458 0 + 0.022344 -0.000748 -0.006855 0 + -0.022344 -0.000748 0.006855 0 + -0.022344 -0.000748 -0.006855 0 + 0.027587 -0.000376 -0 0 + -0.027587 -0.000376 -0 0 + 0.022617 -0.000622 -0 0 + -0.027051 -0 0.009433 0 + -0.025642 -0 0.00946 0 + -0.024231 -0 0.009458 0 + 0.017381 0.002865 0.004851 0 + 0.019872 0.002117 0.005335 0 + 0.021278 0.001346 0.006105 0 + -0.022617 -0.000622 -0 0 + 0.022336 0.000703 0.001435 0 + 0.02223 0.000793 0.00336 0 + 0.022244 0.00081 0.005248 0 + 0.028795 0.00021 0.008877 0 + 0.029059 0.000148 0.008889 0 + 0.029265 0.00007 0.008869 0 + 0.02939 -0 0.007005 0 + 0.029394 -0 0.0047 0 + 0.029394 -0 0.00235 0 + 0.017381 -0.002865 0.004851 0 + 0.019872 -0.002117 0.005335 0 + 0.021278 -0.001346 0.006105 0 + 0.027051 0 -0.009433 0 + 0.022336 -0.000703 0.001435 0 + 0.02223 -0.000793 0.00336 0 + 0.022244 -0.00081 0.005248 0 + 0.025642 0 -0.00946 0 + 0.024231 0 -0.009458 0 + 0.028795 -0.00021 0.008877 0 + 0.029059 -0.000148 0.008889 0 + 0.029265 -0.00007 0.008869 0 + -0.017381 0.002865 0.004851 0 + -0.019872 0.002117 0.005335 0 + -0.021278 0.001346 0.006105 0 + -0.027051 0 -0.009433 0 + 0.023691 0.000469 0.0073 0 + 0.025264 0.000381 0.007627 0 + 0.02687 0.000323 0.008108 0 + -0.017381 -0.002865 0.004851 0 + -0.019872 -0.002117 0.005335 0 + -0.021278 -0.001346 0.006105 0 + -0.022336 0.000703 0.001435 0 + -0.02223 0.000793 0.00336 0 + -0.022244 0.00081 0.005248 0 + -0.025642 0 -0.00946 0 + -0.024231 0 -0.009458 0 + 0.017381 0.002865 -0.004851 0 + 0.019872 0.002117 -0.005335 0 + 0.028207 0.000071 0.0094 0 + 0.028241 0.000149 0.009368 0 + -0.028795 0.00021 0.008877 0 + -0.029059 0.000148 0.008889 0 + -0.029265 0.00007 0.008869 0 + 0.028281 0.000212 0.009272 0 + 0.021278 0.001346 -0.006105 0 + 0.023691 -0.000469 0.0073 0 + 0.025264 -0.000381 0.007627 0 + 0.02687 -0.000323 0.008108 0 + -0.02939 -0 0.007005 0 + -0.029394 -0 0.0047 0 + -0.029394 -0 0.00235 0 + -0.022336 -0.000703 0.001435 0 + -0.02223 -0.000793 0.00336 0 + -0.022244 -0.00081 0.005248 0 + 0.027599 0.000371 0.0023 0 + 0.027683 0.000351 0.004591 0 + 0.027915 0.000313 0.006849 0 + 0.022336 0.000703 -0.001435 0 + 0.023576 0.000536 0 0 + 0.025035 0.000483 0 0 + 0.026435 0.000436 0 0 + 0.028417 0.000299 0 0 + 0.028965 0.000208 0 0 + 0.029286 0.000106 0 0 + 0.017381 -0.002865 -0.004851 0 + 0.019872 -0.002117 -0.005335 0 + 0.028207 -0.000071 0.0094 0 + 0.02223 0.000793 -0.00336 0 + 0.022244 0.00081 -0.005248 0 + 0.028795 0.00021 -0.008877 0 + 0.029059 0.000148 -0.008889 0 + 0.029265 0.00007 -0.008869 0 + 0.02939 0 -0.007005 0 + 0.028241 -0.000149 0.009368 0 + -0.028795 -0.00021 0.008877 0 + -0.029059 -0.000148 0.008889 0 + 0.022879 0.000229 0.009187 0 + 0.022717 0.000442 0.008781 0 + 0.022519 0.00062 0.008026 0 + 0.029394 0 -0.0047 0 + 0.029394 0 -0.00235 0 + -0.029265 -0.00007 0.008869 0 + -0.023691 0.000469 0.0073 0 + -0.025264 0.000381 0.007627 0 + -0.02687 0.000323 0.008108 0 + 0.028281 -0.000212 0.009272 0 + 0.021278 -0.001346 -0.006105 0 + 0.013251 0.002848 0.0061 0 + 0.013283 0.002017 0.007018 0 + 0.013314 0.001044 0.007479 0 + 0.027599 -0.000371 0.0023 0 + -0.028207 0.000071 0.0094 0 + -0.028241 0.000149 0.009368 0 + -0.028281 0.000212 0.009272 0 + 0.027683 -0.000351 0.004591 0 + 0.027915 -0.000313 0.006849 0 + -0.017381 0.002865 -0.004851 0 + 0.022336 -0.000703 -0.001435 0 + 0.023576 -0.000536 -0 0 + 0.025035 -0.000483 -0 0 + -0.019872 0.002117 -0.005335 0 + -0.021278 0.001346 -0.006105 0 + 0.023691 0.000469 -0.0073 0 + 0.025264 0.000381 -0.007627 0 + 0.021779 -0 0.008919 0 + 0.020199 -0 0.008418 0 + 0.017569 -0 0.007959 0 + 0.02687 0.000323 -0.008108 0 + 0.026435 -0.000436 -0 0 + 0.028417 -0.000299 -0 0 + 0.028965 -0.000208 -0 0 + 0.029286 -0.000106 -0 0 + -0.027599 0.000371 0.0023 0 + -0.027683 0.000351 0.004591 0 + -0.027915 0.000313 0.006849 0 + -0.023576 0.000536 0 0 + -0.025035 0.000483 0 0 + -0.026435 0.000436 0 0 + -0.028417 0.000299 0 0 + -0.028965 0.000208 0 0 + -0.029286 0.000106 0 0 + 0.02223 -0.000793 -0.00336 0 + 0.022244 -0.00081 -0.005248 0 + 0.028795 -0.00021 -0.008877 0 + 0.029059 -0.000148 -0.008889 0 + 0.029265 -0.00007 -0.008869 0 + -0.022336 0.000703 -0.001435 0 + -0.02223 0.000793 -0.00336 0 + -0.022244 0.00081 -0.005248 0 + 0.022879 -0.000229 0.009187 0 + 0.022717 -0.000442 0.008781 0 + 0.028207 0.000071 -0.0094 0 + 0.028241 0.000149 -0.009368 0 + -0.028795 0.00021 -0.008877 0 + -0.029059 0.000148 -0.008889 0 + -0.022879 0.000229 0.009187 0 + -0.022717 0.000442 0.008781 0 + -0.022519 0.00062 0.008026 0 + -0.013251 0.002848 0.0061 0 + -0.013283 0.002017 0.007018 0 + -0.013314 0.001044 0.007479 0 + -0.029265 0.00007 -0.008869 0 + 0.028281 0.000212 -0.009272 0 + 0.022519 -0.00062 0.008026 0 + -0.023691 -0.000469 0.0073 0 + -0.025264 -0.000381 0.007627 0 + -0.02687 -0.000323 0.008108 0 + 0.013251 -0.002848 0.0061 0 + 0.013237 0.003935 0 0 + 0.013231 0.003825 0.002476 0 + 0.013283 -0.002017 0.007018 0 + 0.013314 -0.001044 0.007479 0 + -0.02939 0 -0.007005 0 + -0.029394 0 -0.0047 0 + -0.021779 -0 0.008919 0 + -0.020199 -0 0.008418 0 + -0.017569 -0 0.007959 0 + 0.007202 -0 0.007389 0 + -0.029394 0 -0.00235 0 + -0.028207 -0.000071 0.0094 0 + -0.028241 -0.000149 0.009368 0 + -0.028281 -0.000212 0.009272 0 + 0.027599 0.000371 -0.0023 0 + 0.027683 0.000351 -0.004591 0 + 0.027915 0.000313 -0.006849 0 + 0.007163 0.003841 0.004465 0 + -0.017381 -0.002865 -0.004851 0 + -0.019872 -0.002117 -0.005335 0 + -0.021278 -0.001346 -0.006105 0 + 0.017422 0.002372 0.006403 0 + 0.017485 0.001687 0.007353 0 + 0.017543 0.000875 0.007829 0 + 0.023691 -0.000469 -0.0073 0 + 0.025264 -0.000381 -0.007627 0 + -0.013237 0.003935 0 0 + -0.013231 0.003825 0.002476 0 + 0.019951 0.001768 0.006864 0 + 0.020061 0.001265 0.007807 0 + 0 -0 0.007317 0 + -0.007202 -0 0.007389 0 + -0.007163 0.003841 0.004465 0 + 0 0.003965 0.00442 0 + 0.020158 0.000658 0.008286 0 + 0.021414 0.001127 0.007472 0 + 0.02158 0.000807 0.008336 0 + 0.02172 0.00042 0.008789 0 + 0.02687 -0.000323 -0.008108 0 + -0.027599 -0.000371 0.0023 0 + -0.027683 -0.000351 0.004591 0 + -0.017422 0.002372 0.006403 0 + -0.017485 0.001687 0.007353 0 + -0.017543 0.000875 0.007829 0 + -0.019951 0.001768 0.006864 0 + -0.020061 0.001265 0.007807 0 + -0.020158 0.000658 0.008286 0 + -0.021414 0.001127 0.007472 0 + -0.02158 0.000807 0.008336 0 + -0.02172 0.00042 0.008789 0 + -0.027915 -0.000313 0.006849 0 + -0.023576 -0.000536 -0 0 + -0.025035 -0.000483 -0 0 + -0.026435 -0.000436 -0 0 + -0.028417 -0.000299 -0 0 + -0.028965 -0.000208 -0 0 + -0.029286 -0.000106 -0 0 + -0.022336 -0.000703 -0.001435 0 + -0.02223 -0.000793 -0.00336 0 + -0.022244 -0.00081 -0.005248 0 + 0.028207 -0.000071 -0.0094 0 + 0.028241 -0.000149 -0.009368 0 + 0.022879 0.000229 -0.009187 0 + 0.022717 0.000442 -0.008781 0 + 0.022519 0.00062 -0.008026 0 + -0.023691 0.000469 -0.0073 0 + -0.025264 0.000381 -0.007627 0 + -0.028795 -0.00021 -0.008877 0 + -0.02687 0.000323 -0.008108 0 + 0.013251 0.002848 -0.0061 0 + 0.013283 0.002017 -0.007018 0 + -0.029059 -0.000148 -0.008889 0 + -0.022879 -0.000229 0.009187 0 + -0.022717 -0.000442 0.008781 0 + -0.022519 -0.00062 0.008026 0 + 0 0.003239 0.005863 0 + 0 0.002286 0.006748 0 + 0 0.001181 0.007194 0 + -0.007171 0.003141 0.005922 0 + -0.007184 0.002218 0.006816 0 + -0.007196 0.001146 0.007265 0 + -0.02856 -0 0.009401 0 + -0.013251 -0.002848 0.0061 0 + -0.013283 -0.002017 0.007018 0 + -0.028661 0.00008 0.009399 0 + -0.028817 -0 0.009401 0 + -0.013314 -0.001044 0.007479 0 + -0.028756 0.000151 0.009366 0 + -0.028957 0.00008 0.009322 0 + -0.029134 -0 0.009342 0 + 0.013314 0.001044 -0.007479 0 + -0.029265 -0.00007 -0.008869 0 + 0.028281 -0.000212 -0.009272 0 + -0.028207 0.000071 -0.0094 0 + -0.028241 0.000149 -0.009368 0 + 0 0.004403 0.002378 0 + -0.007163 0.004258 0.002403 0 + -0.028281 0.000212 -0.009272 0 + 0 0.004546 0 0 + -0.007165 0.004394 0 0 + 0.013237 -0.003935 -0 0 + 0.013231 -0.003825 0.002476 0 + 0.021779 0 -0.008919 0 + 0.020199 0 -0.008418 0 + 0.017569 0 -0.007959 0 + -0.027599 0.000371 -0.0023 0 + -0.027683 0.000351 -0.004591 0 + -0.027915 0.000313 -0.006849 0 + 0.007171 0.003141 0.005922 0 + 0.007184 0.002218 0.006816 0 + 0.007196 0.001146 0.007265 0 + 0.02856 -0 0.009401 0 + 0.028661 0.00008 0.009399 0 + 0.028817 -0 0.009401 0 + 0.027599 -0.000371 -0.0023 0 + 0.028756 0.000151 0.009366 0 + 0.028957 0.00008 0.009322 0 + 0.029134 -0 0.009342 0 + 0.027683 -0.000351 -0.004591 0 + 0.027915 -0.000313 -0.006849 0 + 0.007163 -0.003841 0.004465 0 + 0.017422 -0.002372 0.006403 0 + 0.017485 -0.001687 0.007353 0 + 0.017543 -0.000875 0.007829 0 + -0.013237 -0.003935 -0 0 + -0.013231 -0.003825 0.002476 0 + 0.019951 -0.001768 0.006864 0 + -0.022879 0.000229 -0.009187 0 + -0.022717 0.000442 -0.008781 0 + -0.022519 0.00062 -0.008026 0 + -0.013251 0.002848 -0.0061 0 + 0.020061 -0.001265 0.007807 0 + -0.007163 -0.003841 0.004465 0 + -0.013283 0.002017 -0.007018 0 + -0.013314 0.001044 -0.007479 0 + 0 -0.003965 0.00442 0 + 0.020158 -0.000658 0.008286 0 + 0.021414 -0.001127 0.007472 0 + 0.02158 -0.000807 0.008336 0 + 0.013231 0.003825 -0.002476 0 + 0.02172 -0.00042 0.008789 0 + -0.021779 0 -0.008919 0 + -0.020199 0 -0.008418 0 + -0.017569 0 -0.007959 0 + 0.007202 0 -0.007389 0 + 0.007163 0.003841 -0.004465 0 + 0.017422 0.002372 -0.006403 0 + 0.017485 0.001687 -0.007353 0 + 0.017543 0.000875 -0.007829 0 + -0.017422 -0.002372 0.006403 0 + 0.007163 0.004258 0.002403 0 + 0.007165 0.004394 0 0 + -0.013231 0.003825 -0.002476 0 + -0.017485 -0.001687 0.007353 0 + -0.017543 -0.000875 0.007829 0 + -0.019951 -0.001768 0.006864 0 + -0.020061 -0.001265 0.007807 0 + -0.020158 -0.000658 0.008286 0 + -0.021414 -0.001127 0.007472 0 + -0.02158 -0.000807 0.008336 0 + -0.02172 -0.00042 0.008789 0 + 0.022879 -0.000229 -0.009187 0 + 0.022717 -0.000442 -0.008781 0 + 0.022519 -0.00062 -0.008026 0 + 0.019951 0.001768 -0.006864 0 + 0.020061 0.001265 -0.007807 0 + 0 0 -0.007317 0 + -0.007202 0 -0.007389 0 + -0.007163 0.003841 -0.004465 0 + 0 0.003965 -0.00442 0 + 0.020158 0.000658 -0.008286 0 + 0.021414 0.001127 -0.007472 0 + 0.02158 0.000807 -0.008336 0 + 0.02172 0.00042 -0.008789 0 + -0.023691 -0.000469 -0.0073 0 + -0.025264 -0.000381 -0.007627 0 + -0.02687 -0.000323 -0.008108 0 + 0.013251 -0.002848 -0.0061 0 + 0.013283 -0.002017 -0.007018 0 + 0 -0.003239 0.005863 0 + -0.017422 0.002372 -0.006403 0 + -0.017485 0.001687 -0.007353 0 + -0.017543 0.000875 -0.007829 0 + -0.019951 0.001768 -0.006864 0 + -0.020061 0.001265 -0.007807 0 + -0.020158 0.000658 -0.008286 0 + -0.021414 0.001127 -0.007472 0 + -0.02158 0.000807 -0.008336 0 + -0.02172 0.00042 -0.008789 0 + 0 -0.002286 0.006748 0 + 0 -0.001181 0.007194 0 + -0.007171 -0.003141 0.005922 0 + -0.007184 -0.002218 0.006816 0 + -0.007196 -0.001146 0.007265 0 + -0.028661 -0.00008 0.009399 0 + -0.028756 -0.000151 0.009366 0 + -0.028957 -0.00008 0.009322 0 + 0.013314 -0.001044 -0.007479 0 + -0.028207 -0.000071 -0.0094 0 + -0.028241 -0.000149 -0.009368 0 + 0 0.003239 -0.005863 0 + 0 0.002286 -0.006748 0 + 0 0.001181 -0.007194 0 + -0.007171 0.003141 -0.005922 0 + -0.007184 0.002218 -0.006816 0 + -0.007196 0.001146 -0.007265 0 + -0.02856 0 -0.009401 0 + 0 -0.004403 0.002378 0 + -0.007163 -0.004258 0.002403 0 + -0.028661 0.00008 -0.009399 0 + -0.028817 0 -0.009401 0 + -0.028281 -0.000212 -0.009272 0 + -0.023852 0.000382 0.008351 0 + -0.024028 0.00027 0.009011 0 + -0.024172 0.000139 0.009357 0 + -0.025388 0.000309 0.008589 0 + -0.025505 0.000218 0.009125 0 + -0.025601 0.000113 0.009388 0 + -0.02696 0.000263 0.008918 0 + -0.027003 0.000188 0.009251 0 + -0.027039 0.000098 0.009395 0 + 0 -0.004546 -0 0 + -0.007165 -0.004394 -0 0 + -0.028756 0.000151 -0.009366 0 + 0.023852 0.000382 0.008351 0 + 0.024028 0.00027 0.009011 0 + 0.024172 0.000139 0.009357 0 + -0.027599 -0.000371 -0.0023 0 + -0.027683 -0.000351 -0.004591 0 + 0.025388 0.000309 0.008589 0 + -0.028957 0.00008 -0.009322 0 + -0.029134 0 -0.009342 0 + 0 0.004403 -0.002378 0 + -0.007163 0.004258 -0.002403 0 + 0.007171 0.003141 -0.005922 0 + 0.007184 0.002218 -0.006816 0 + 0.007196 0.001146 -0.007265 0 + 0.02856 0 -0.009401 0 + -0.027915 -0.000313 -0.006849 0 + 0.007171 -0.003141 0.005922 0 + 0.028661 0.00008 -0.009399 0 + 0.028817 0 -0.009401 0 + 0.007184 -0.002218 0.006816 0 + 0.028756 0.000151 -0.009366 0 + 0.028957 0.00008 -0.009322 0 + 0.029134 0 -0.009342 0 + 0.007196 -0.001146 0.007265 0 + 0.028661 -0.00008 0.009399 0 + 0.028756 -0.000151 0.009366 0 + 0.028957 -0.00008 0.009322 0 + -0.022879 -0.000229 -0.009187 0 + -0.022717 -0.000442 -0.008781 0 + -0.022519 -0.00062 -0.008026 0 + -0.013251 -0.002848 -0.0061 0 + -0.013283 -0.002017 -0.007018 0 + -0.013314 -0.001044 -0.007479 0 + 0.013231 -0.003825 -0.002476 0 + -0.026673 0.000375 0.006494 0 + -0.02651 0.000412 0.004441 0 + -0.026444 0.000431 0.002246 0 + -0.025149 0.000433 0.006135 0 + -0.025067 0.000465 0.004255 0 + -0.025037 0.00048 0.002174 0 + -0.023584 0.000522 0.005819 0 + -0.023536 0.000545 0.00401 0 + -0.023542 0.000543 0.002023 0 + -0.029293 0.000093 0.007016 0 + -0.029289 0.0001 0.004699 0 + -0.029287 0.000105 0.00235 0 + -0.029035 0.000179 0.007015 0 + -0.028988 0.000195 0.004692 0 + -0.028968 0.000204 0.002345 0 + -0.028633 0.000251 0.006989 0 + -0.028485 0.000279 0.004667 0 + -0.028425 0.000295 0.00233 0 + 0.007163 -0.003841 -0.004465 0 + 0.017422 -0.002372 -0.006403 0 + 0.017485 -0.001687 -0.007353 0 + 0.017543 -0.000875 -0.007829 0 + 0.007163 -0.004258 0.002403 0 + 0.007165 -0.004394 -0 0 + -0.013231 -0.003825 -0.002476 0 + 0.019951 -0.001768 -0.006864 0 + 0.020061 -0.001265 -0.007807 0 + 0.007163 0.004258 -0.002403 0 + 0.025505 0.000218 0.009125 0 + 0.025601 0.000113 0.009388 0 + 0.02696 0.000263 0.008918 0 + 0.027003 0.000188 0.009251 0 + 0.027039 0.000098 0.009395 0 + -0.007163 -0.003841 -0.004465 0 + 0 -0.003965 -0.00442 0 + 0.020158 -0.000658 -0.008286 0 + 0.021414 -0.001127 -0.007472 0 + 0.02158 -0.000807 -0.008336 0 + 0.02172 -0.00042 -0.008789 0 + -0.017422 -0.002372 -0.006403 0 + -0.017485 -0.001687 -0.007353 0 + -0.017543 -0.000875 -0.007829 0 + -0.019951 -0.001768 -0.006864 0 + -0.020061 -0.001265 -0.007807 0 + -0.020158 -0.000658 -0.008286 0 + -0.021414 -0.001127 -0.007472 0 + -0.02158 -0.000807 -0.008336 0 + -0.02172 -0.00042 -0.008789 0 + 0 -0.003239 -0.005863 0 + 0 -0.002286 -0.006748 0 + -0.023852 0.000382 -0.008351 0 + -0.024028 0.00027 -0.009011 0 + -0.024172 0.000139 -0.009357 0 + -0.025388 0.000309 -0.008589 0 + -0.025505 0.000218 -0.009125 0 + -0.025601 0.000113 -0.009388 0 + -0.02696 0.000263 -0.008918 0 + -0.027003 0.000188 -0.009251 0 + -0.027039 0.000098 -0.009395 0 + 0 -0.001181 -0.007194 0 + -0.020199 0.002144 0 0 + -0.021229 0.001431 0.004201 0 + -0.021331 0.00133 0.002005 0 + -0.021661 0.001012 0 0 + 0.023852 0.000382 -0.008351 0 + 0.024028 0.00027 -0.009011 0 + 0.024172 0.000139 -0.009357 0 + -0.017421 0.003184 0 0 + -0.017387 0.003122 0.002636 0 + -0.019886 0.002265 0.003124 0 + -0.007171 -0.003141 -0.005922 0 + -0.007184 -0.002218 -0.006816 0 + -0.007196 -0.001146 -0.007265 0 + 0.025388 0.000309 -0.008589 0 + -0.028661 -0.00008 -0.009399 0 + -0.023852 -0.000382 0.008351 0 + -0.024028 -0.00027 0.009011 0 + -0.024172 -0.000139 0.009357 0 + -0.025388 -0.000309 0.008589 0 + -0.025505 -0.000218 0.009125 0 + -0.025601 -0.000113 0.009388 0 + -0.02696 -0.000263 0.008918 0 + -0.027003 -0.000188 0.009251 0 + -0.027039 -0.000098 0.009395 0 + -0.028756 -0.000151 -0.009366 0 + 0.023852 -0.000382 0.008351 0 + 0.024028 -0.00027 0.009011 0 + 0.024172 -0.000139 0.009357 0 + 0.025388 -0.000309 0.008589 0 + -0.028957 -0.00008 -0.009322 0 + 0 -0.004403 -0.002378 0 + -0.007163 -0.004258 -0.002403 0 + 0.007171 -0.003141 -0.005922 0 + 0.007184 -0.002218 -0.006816 0 + 0.026673 0.000375 0.006494 0 + 0.02651 0.000412 0.004441 0 + 0.026444 0.000431 0.002246 0 + 0.025149 0.000433 0.006135 0 + 0.025067 0.000465 0.004255 0 + 0.025037 0.00048 0.002174 0 + 0.023584 0.000522 0.005819 0 + 0.023536 0.000545 0.00401 0 + 0.023542 0.000543 0.002023 0 + 0.029293 0.000093 0.007016 0 + 0.029289 0.0001 0.004699 0 + 0.029287 0.000105 0.00235 0 + 0.029035 0.000179 0.007015 0 + 0.028988 0.000195 0.004692 0 + 0.028968 0.000204 0.002345 0 + 0.028633 0.000251 0.006989 0 + 0.028485 0.000279 0.004667 0 + 0.028425 0.000295 0.00233 0 + 0.007196 -0.001146 -0.007265 0 + 0.028661 -0.00008 -0.009399 0 + 0.028756 -0.000151 -0.009366 0 + -0.026673 0.000375 -0.006494 0 + -0.02651 0.000412 -0.004441 0 + -0.026444 0.000431 -0.002246 0 + 0.028957 -0.00008 -0.009322 0 + -0.026673 -0.000375 0.006494 0 + -0.02651 -0.000412 0.004441 0 + -0.026444 -0.000431 0.002246 0 + -0.025149 0.000433 -0.006135 0 + -0.025067 0.000465 -0.004255 0 + -0.025037 0.00048 -0.002174 0 + -0.023584 0.000522 -0.005819 0 + -0.023536 0.000545 -0.00401 0 + -0.023542 0.000543 -0.002023 0 + -0.029293 0.000093 -0.007016 0 + -0.029289 0.0001 -0.004699 0 + -0.029287 0.000105 -0.00235 0 + -0.029035 0.000179 -0.007015 0 + -0.028988 0.000195 -0.004692 0 + -0.028968 0.000204 -0.002345 0 + -0.028633 0.000251 -0.006989 0 + -0.028485 0.000279 -0.004667 0 + -0.028425 0.000295 -0.00233 0 + -0.025149 -0.000433 0.006135 0 + -0.025067 -0.000465 0.004255 0 + -0.025037 -0.00048 0.002174 0 + -0.023584 -0.000522 0.005819 0 + -0.023536 -0.000545 0.00401 0 + -0.023542 -0.000543 0.002023 0 + -0.029293 -0.000093 0.007016 0 + -0.029289 -0.0001 0.004699 0 + -0.029287 -0.000105 0.00235 0 + 0.020199 0.002144 0 0 + 0.021229 0.001431 0.004201 0 + 0.021331 0.00133 0.002005 0 + 0.021661 0.001012 0 0 + 0.025505 0.000218 -0.009125 0 + 0.025601 0.000113 -0.009388 0 + 0.02696 0.000263 -0.008918 0 + 0.027003 0.000188 -0.009251 0 + 0.017421 0.003184 0 0 + 0.017387 0.003122 0.002636 0 + 0.019886 0.002265 0.003124 0 + -0.029035 -0.000179 0.007015 0 + -0.028988 -0.000195 0.004692 0 + -0.028968 -0.000204 0.002345 0 + 0.027039 0.000098 -0.009395 0 + -0.028633 -0.000251 0.006989 0 + -0.028485 -0.000279 0.004667 0 + -0.028425 -0.000295 0.00233 0 + 0.007163 -0.004258 -0.002403 0 + -0.021229 0.001431 -0.004201 0 + -0.021331 0.00133 -0.002005 0 + -0.017387 0.003122 -0.002636 0 + -0.019886 0.002265 -0.003124 0 + 0.025505 -0.000218 0.009125 0 + 0.025601 -0.000113 0.009388 0 + 0.02696 -0.000263 0.008918 0 + 0.027003 -0.000188 0.009251 0 + 0.027039 -0.000098 0.009395 0 + -0.023852 -0.000382 -0.008351 0 + -0.024028 -0.00027 -0.009011 0 + -0.024172 -0.000139 -0.009357 0 + -0.025388 -0.000309 -0.008589 0 + -0.025505 -0.000218 -0.009125 0 + -0.025601 -0.000113 -0.009388 0 + -0.02696 -0.000263 -0.008918 0 + -0.027003 -0.000188 -0.009251 0 + -0.027039 -0.000098 -0.009395 0 + -0.020199 -0.002144 -0 0 + 0.026673 0.000375 -0.006494 0 + 0.02651 0.000412 -0.004441 0 + 0.026444 0.000431 -0.002246 0 + 0.025149 0.000433 -0.006135 0 + 0.025067 0.000465 -0.004255 0 + 0.025037 0.00048 -0.002174 0 + 0.023584 0.000522 -0.005819 0 + 0.023536 0.000545 -0.00401 0 + 0.023542 0.000543 -0.002023 0 + 0.029293 0.000093 -0.007016 0 + 0.029289 0.0001 -0.004699 0 + 0.029287 0.000105 -0.00235 0 + 0.029035 0.000179 -0.007015 0 + 0.028988 0.000195 -0.004692 0 + 0.028968 0.000204 -0.002345 0 + 0.028633 0.000251 -0.006989 0 + 0.028485 0.000279 -0.004667 0 + 0.028425 0.000295 -0.00233 0 + -0.021229 -0.001431 0.004201 0 + -0.021331 -0.00133 0.002005 0 + -0.021661 -0.001012 -0 0 + 0.023852 -0.000382 -0.008351 0 + 0.024028 -0.00027 -0.009011 0 + 0.024172 -0.000139 -0.009357 0 + -0.017421 -0.003184 -0 0 + -0.017387 -0.003122 0.002636 0 + -0.019886 -0.002265 0.003124 0 + 0.021229 0.001431 -0.004201 0 + 0.021331 0.00133 -0.002005 0 + 0.017387 0.003122 -0.002636 0 + 0.019886 0.002265 -0.003124 0 + 0.025388 -0.000309 -0.008589 0 + 0.026673 -0.000375 0.006494 0 + 0.02651 -0.000412 0.004441 0 + 0.026444 -0.000431 0.002246 0 + 0.025149 -0.000433 0.006135 0 + 0.025067 -0.000465 0.004255 0 + 0.025037 -0.00048 0.002174 0 + 0.023584 -0.000522 0.005819 0 + 0.023536 -0.000545 0.00401 0 + 0.023542 -0.000543 0.002023 0 + 0.029293 -0.000093 0.007016 0 + 0.029289 -0.0001 0.004699 0 + 0.029287 -0.000105 0.00235 0 + 0.029035 -0.000179 0.007015 0 + 0.028988 -0.000195 0.004692 0 + 0.028968 -0.000204 0.002345 0 + 0.028633 -0.000251 0.006989 0 + 0.028485 -0.000279 0.004667 0 + 0.028425 -0.000295 0.00233 0 + -0.026673 -0.000375 -0.006494 0 + -0.02651 -0.000412 -0.004441 0 + -0.026444 -0.000431 -0.002246 0 + -0.025149 -0.000433 -0.006135 0 + -0.025067 -0.000465 -0.004255 0 + -0.025037 -0.00048 -0.002174 0 + -0.023584 -0.000522 -0.005819 0 + -0.023536 -0.000545 -0.00401 0 + -0.023542 -0.000543 -0.002023 0 + -0.029293 -0.000093 -0.007016 0 + -0.029289 -0.0001 -0.004699 0 + -0.029287 -0.000105 -0.00235 0 + -0.029035 -0.000179 -0.007015 0 + -0.028988 -0.000195 -0.004692 0 + -0.028968 -0.000204 -0.002345 0 + -0.028633 -0.000251 -0.006989 0 + -0.028485 -0.000279 -0.004667 0 + -0.028425 -0.000295 -0.00233 0 + 0.020199 -0.002144 -0 0 + 0.021229 -0.001431 0.004201 0 + 0.021331 -0.00133 0.002005 0 + 0.021661 -0.001012 -0 0 + 0.025505 -0.000218 -0.009125 0 + 0.025601 -0.000113 -0.009388 0 + 0.02696 -0.000263 -0.008918 0 + 0.027003 -0.000188 -0.009251 0 + 0.017421 -0.003184 -0 0 + 0.017387 -0.003122 0.002636 0 + 0.019886 -0.002265 0.003124 0 + 0.027039 -0.000098 -0.009395 0 + -0.021229 -0.001431 -0.004201 0 + -0.021331 -0.00133 -0.002005 0 + -0.017387 -0.003122 -0.002636 0 + -0.019886 -0.002265 -0.003124 0 + 0.026673 -0.000375 -0.006494 0 + 0.02651 -0.000412 -0.004441 0 + 0.026444 -0.000431 -0.002246 0 + 0.025149 -0.000433 -0.006135 0 + 0.025067 -0.000465 -0.004255 0 + 0.025037 -0.00048 -0.002174 0 + 0.023584 -0.000522 -0.005819 0 + 0.023536 -0.000545 -0.00401 0 + 0.023542 -0.000543 -0.002023 0 + 0.029293 -0.000093 -0.007016 0 + 0.029289 -0.0001 -0.004699 0 + 0.029287 -0.000105 -0.00235 0 + 0.029035 -0.000179 -0.007015 0 + 0.028988 -0.000195 -0.004692 0 + 0.028968 -0.000204 -0.002345 0 + 0.028633 -0.000251 -0.006989 0 + 0.028485 -0.000279 -0.004667 0 + 0.028425 -0.000295 -0.00233 0 + 0.021229 -0.001431 -0.004201 0 + 0.021331 -0.00133 -0.002005 0 + 0.017387 -0.003122 -0.002636 0 + 0.019886 -0.002265 -0.003124 0 + } + $texCoords { + 0.16251 0.09934 + 0.16251 0.0748 + 0.19912 0.07481 + 0.1965 0.10002 + 0.30871 0.1594 + 0.31466 0.13117 + 0.32228 0.13016 + 0.32026 0.15859 + 0.63373 0.8406 + 0.63968 0.86883 + 0.62972 0.86522 + 0.62066 0.83762 + 0.06137 0.61918 + 0.03998 0.61993 + 0.04013 0.5 + 0.06183 0.5 + 0.32024 0.98957 + 0.31773 0.99148 + 0.31805 0.98804 + 0.31944 0.98678 + 0.6467 0.97706 + 0.64599 0.98533 + 0.64535 0.97945 + 0.53942 0.16906 + 0.48754 0.16332 + 0.521 0.14021 + 0.55788 0.14291 + 0.3864 0.61918 + 0.38467 0.72026 + 0.36406 0.7219 + 0.36501 0.61993 + 0.24173 0.99729 + 0.24159 0.99198 + 0.28042 0.99265 + 0.28049 0.99719 + 0.04453 0.99719 + 0.08329 0.99729 + 0.08326 0.99972 + 0.04466 0.99941 + 0.36106 0.86095 + 0.34536 0.86522 + 0.35442 0.83762 + 0.37239 0.83391 + 0.60367 0.87857 + 0.62416 0.8819 + 0.62949 0.90551 + 0.61139 0.90233 + 0.40738 0.78805 + 0.4115 0.71885 + 0.44691 0.71812 + 0.44415 0.78735 + 0.41719 0.8571 + 0.38482 0.85786 + 0.3987 0.83117 + 0.43565 0.83094 + 0.37812 0.95291 + 0.35107 0.95655 + 0.35855 0.92937 + 0.3839 0.92709 + 0.30782 0.06811 + 0.31696 0.06579 + 0.31582 0.09102 + 0.30446 0.09449 + 0.64395 0.97992 + 0.64446 0.98677 + 0.64308 0.98804 + 0.64207 0.98044 + 0.60266 0.02615 + 0.56489 0.03014 + 0.56618 0.0166 + 0.60495 0.01414 + 0.63284 0.06811 + 0.64199 0.06579 + 0.64084 0.09102 + 0.62949 0.09449 + 0.33756 0.11395 + 0.34536 0.13478 + 0.33539 0.13117 + 0.32996 0.11046 + 0.27193 0.04709 + 0.23737 0.04996 + 0.23987 0.03014 + 0.27764 0.02615 + 0.02939 0.16238 + 0.02033 0.13478 + 0.03604 0.13905 + 0.04737 0.16609 + 0.59025 0.85786 + 0.61401 0.86095 + 0.52717 0.00268 + 0.48754 0.00266 + 0.48754 0.00011 + 0.52719 0.00016 + 0.64084 0.90898 + 0.64199 0.93421 + 0.63284 0.93189 + 0.521 0.85979 + 0.54389 0.87727 + 0.5115 0.87964 + 0.48754 0.86734 + 0.00274 0.13016 + 0.01037 0.13117 + 0.01632 0.1594 + 0.00476 0.15859 + 0.00334 0.06397 + 0.00111 0.0632 + 0.00228 0.03952 + 0.00402 0.0398 + 0.12288 0.00268 + 0.12297 0.00832 + 0.08343 0.00802 + 0.08329 0.00271 + 0.33309 0.06579 + 0.33185 0.04053 + 0.33751 0.04152 + 0.34223 0.06811 + 0.36406 0.2781 + 0.38467 0.27974 + 0.3864 0.38082 + 0.36501 0.38007 + 0.00479 0.01043 + 0.00688 0.00517 + 0.00729 0.00852 + 0.48754 0.11546 + 0.5115 0.12036 + 0.48754 0.13266 + 0.29913 0.1181 + 0.27864 0.12143 + 0.28636 0.09767 + 0.08236 0.21195 + 0.05535 0.20981 + 0.07368 0.16883 + 0.38482 0.14214 + 0.37141 0.12143 + 0.39911 0.12298 + 0.41719 0.1429 + 0.48754 0.96822 + 0.48754 0.94879 + 0.52539 0.94893 + 0.5263 0.96842 + 0.33539 0.86883 + 0.34134 0.8406 + 0.33756 0.88605 + 0.35092 0.8819 + 0.34559 0.90551 + 0.33423 0.90898 + 0.28042 0.00735 + 0.24159 0.00802 + 0.24173 0.00271 + 0.28049 0.00281 + 0.34223 0.93189 + 0.33309 0.93421 + 0.08647 0.28115 + 0.05964 0.27974 + 0.26365 0.38082 + 0.26538 0.27974 + 0.28599 0.2781 + 0.28504 0.38007 + 0.36084 0.79288 + 0.38037 0.79019 + 0.20128 0.03158 + 0.16251 0.03178 + 0.16251 0.01772 + 0.20181 0.01759 + 0.29563 0.16238 + 0.30503 0.20499 + 0.28921 0.20712 + 0.63756 0.04152 + 0.61652 0.07063 + 0.62401 0.04345 + 0.32614 0.9368 + 0.32514 0.91289 + 0.32802 0.91176 + 0.32837 0.93603 + 0.34502 0.79501 + 0.34606 0.72324 + 0.33004 0.79586 + 0.32841 0.72399 + 0.48754 0.71793 + 0.48754 0.61801 + 0.52715 0.61813 + 0.52817 0.71812 + 0.32979 0.84141 + 0.30871 0.8406 + 0.31466 0.86883 + 0.30469 0.86522 + 0.29563 0.83762 + 0.32777 0.86984 + 0.28921 0.79288 + 0.27765 0.83391 + 0.26968 0.79019 + 0.32996 0.88954 + 0.32557 0.89083 + 0.20181 0.98241 + 0.20128 0.96842 + 0.23987 0.96986 + 0.24115 0.9834 + 0.37141 0.87857 + 0.33751 0.95848 + 0.33185 0.95947 + 0.31582 0.90898 + 0.31696 0.93421 + 0.30782 0.93189 + 0.30446 0.90551 + 0.52719 0.99984 + 0.52717 0.99732 + 0.56676 0.99729 + 0.56679 0.99972 + 0.64308 0.01196 + 0.64446 0.01323 + 0.64395 0.02008 + 0.64207 0.01956 + 0.32731 0.96048 + 0.32905 0.9602 + 0.01999 0.20499 + 0.03581 0.20713 + 0.33983 0.00413 + 0.33191 0.00517 + 0.34331 0.00204 + 0.32164 0.72399 + 0.32001 0.79586 + 0.30503 0.79501 + 0.30399 0.72324 + 0.0092 0.09102 + 0.00806 0.06579 + 0.01721 0.06811 + 0.02056 0.09449 + 0.12466 0.94893 + 0.16251 0.94879 + 0.16251 0.96822 + 0.12375 0.96842 + 0.30469 0.13478 + 0.31249 0.11395 + 0.32009 0.11046 + 0.2144 0.16906 + 0.2059 0.21265 + 0.16251 0.21234 + 0.16251 0.16332 + 0.03604 0.86095 + 0.0598 0.85786 + 0.04638 0.87857 + 0.02589 0.8819 + 0.03352 0.07064 + 0.02604 0.04345 + 0.0531 0.04709 + 0.05888 0.07291 + 0.16251 0.00011 + 0.16251 0.00266 + 0.12286 0.00016 + 0.31254 0.04152 + 0.3182 0.04053 + 0.09495 0.89965 + 0.12852 0.89998 + 0.12591 0.92519 + 0.09074 0.92563 + 0.29913 0.8819 + 0.31249 0.88605 + 0.0531 0.95291 + 0.08766 0.95004 + 0.08516 0.96986 + 0.04739 0.97385 + 0.01249 0.04152 + 0.13855 0.12036 + 0.16251 0.11546 + 0.16251 0.13266 + 0.41018 0.03014 + 0.41268 0.04996 + 0.37812 0.04709 + 0.37241 0.02615 + 0.25094 0.12298 + 0.26522 0.14214 + 0.23286 0.1429 + 0.01721 0.93189 + 0.00806 0.93421 + 0.0092 0.90898 + 0.02056 0.90551 + 0.61139 0.09767 + 0.31814 0.99483 + 0.31893 0.97992 + 0.31705 0.98044 + 0.28899 0.13905 + 0.19912 0.92519 + 0.16251 0.9252 + 0.16251 0.90066 + 0.1965 0.89998 + 0.03866 0.09767 + 0.20036 0.94893 + 0.23737 0.95004 + 0.48754 0.00835 + 0.52708 0.00832 + 0.32001 0.20414 + 0.00798 0.01956 + 0.01703 0.0206 + 0.3987 0.16883 + 0.43565 0.16906 + 0.0451 0.98586 + 0.08387 0.9834 + 0.08343 0.99198 + 0.04461 0.99265 + 0.56358 0.71885 + 0.56769 0.78805 + 0.53092 0.78735 + 0.16251 0.05121 + 0.20036 0.05107 + 0.08817 0.61851 + 0.1229 0.61813 + 0.12188 0.71812 + 0.08647 0.71885 + 0.35855 0.07063 + 0.35107 0.04345 + 0.48754 0.78766 + 0.61423 0.79288 + 0.60268 0.83391 + 0.5947 0.79019 + 0.02939 0.83762 + 0.01632 0.8406 + 0.01999 0.79501 + 0.03581 0.79288 + 0.32626 0.62098 + 0.34559 0.62057 + 0.16251 0.00835 + 0.20206 0.00832 + 0.05888 0.92709 + 0.57637 0.83117 + 0.55788 0.8571 + 0.53942 0.83094 + 0.58867 0.38082 + 0.59041 0.27974 + 0.61102 0.2781 + 0.61007 0.38007 + 0.56239 0.04996 + 0.52539 0.05107 + 0.5263 0.03158 + 0.52414 0.92519 + 0.48754 0.9252 + 0.48754 0.90066 + 0.52153 0.89998 + 0.5551 0.89965 + 0.55931 0.92563 + 0.23428 0.92563 + 0.23008 0.89965 + 0.26089 0.90036 + 0.26615 0.92709 + 0.20215 0.00268 + 0.4132 0.61851 + 0.4137 0.5 + 0.44823 0.5 + 0.44792 0.61813 + 0.05964 0.72026 + 0.09217 0.14291 + 0.07408 0.12298 + 0.10616 0.12273 + 0.12905 0.14021 + 0.61423 0.20713 + 0.63006 0.20499 + 0.62901 0.27676 + 0.53092 0.21265 + 0.48754 0.21234 + 0.56489 0.96986 + 0.56239 0.95004 + 0.59695 0.95291 + 0.60266 0.97385 + 0.61653 0.92937 + 0.62401 0.95655 + 0.59117 0.92709 + 0.00274 0.86984 + 0.01037 0.86883 + 0.00494 0.88954 + 0.00054 0.89083 + 0.32168 0.06397 + 0.32203 0.08824 + 0.19598 0.14021 + 0.63968 0.13117 + 0.62972 0.13478 + 0.63751 0.11395 + 0.64511 0.11046 + 0.63559 0.99248 + 0.64275 0.99148 + 0.64317 0.99483 + 0.63524 0.99587 + 0.44415 0.21265 + 0.40738 0.21195 + 0.57596 0.12298 + 0.60367 0.12143 + 0.59025 0.14214 + 0.31944 0.01323 + 0.32096 0.01467 + 0.32033 0.02055 + 0.31893 0.02008 + 0.33949 0.00752 + 0.36956 0.00281 + 0.36963 0.00735 + 0.4115 0.28115 + 0.4132 0.38149 + 0.26968 0.20981 + 0.00697 0.01196 + 0.00559 0.01323 + 0.26615 0.07291 + 0.23428 0.07437 + 0.20215 0.99732 + 0.16251 0.99734 + 0.16251 0.99165 + 0.20206 0.99168 + 0.63751 0.88605 + 0.64511 0.88954 + 0.64731 0.86984 + 0.64951 0.89083 + 0.34522 0.5 + 0.36515 0.5 + 0.27993 0.01414 + 0.24115 0.0166 + 0.35092 0.1181 + 0.34559 0.09449 + 0.36369 0.09767 + 0.32167 0.02294 + 0.32274 0.03952 + 0.321 0.0398 + 0.12591 0.07481 + 0.12852 0.10002 + 0.09495 0.10035 + 0.09074 0.07437 + 0.333 0.98044 + 0.33112 0.97992 + 0.32168 0.93603 + 0.32391 0.9368 + 0.32274 0.96048 + 0.321 0.9602 + 0.0598 0.14214 + 0.04638 0.12143 + 0.38916 0.09964 + 0.41997 0.10035 + 0.43119 0.12273 + 0.36956 0.99719 + 0.33983 0.99587 + 0.33949 0.99248 + 0.36963 0.99265 + 0.5551 0.10035 + 0.58591 0.09964 + 0.54389 0.12273 + 0.57597 0.87702 + 0.58591 0.90036 + 0.36968 0.99941 + 0.34331 0.99796 + 0.19598 0.85979 + 0.16251 0.86734 + 0.16251 0.83668 + 0.38686 0.5 + 0.12466 0.05107 + 0.28636 0.90233 + 0.2915 0.92937 + 0.44691 0.28188 + 0.45093 0.07481 + 0.48754 0.0748 + 0.48754 0.09934 + 0.45355 0.10002 + 0.64317 0.00517 + 0.64526 0.01043 + 0.64275 0.00852 + 0.32532 0.5 + 0.23008 0.10035 + 0.21886 0.12273 + 0.18648 0.12036 + 0.48754 0.83668 + 0.34134 0.1594 + 0.35442 0.16238 + 0.02589 0.1181 + 0.33962 0.98828 + 0.34205 0.9794 + 0.37241 0.97385 + 0.37012 0.98586 + 0.64529 0.84141 + 0.63006 0.79501 + 0.64503 0.79586 + 0.26089 0.09964 + 0.4089 0.9834 + 0.44824 0.98241 + 0.44799 0.99168 + 0.40846 0.99198 + 0.40832 0.99729 + 0.32626 0.37902 + 0.34559 0.37943 + 0.33962 0.01172 + 0.34205 0.0206 + 0.333 0.01956 + 0.332 0.01196 + 0.11062 0.16906 + 0.332 0.98804 + 0.33232 0.99148 + 0.32981 0.98957 + 0.33061 0.98677 + 0.27864 0.87857 + 0.26522 0.85786 + 0.28899 0.86095 + 0.13855 0.87964 + 0.16251 0.88454 + 0.24267 0.78805 + 0.25135 0.83117 + 0.32972 0.97945 + 0.3182 0.95947 + 0.31254 0.95848 + 0.64599 0.01467 + 0.6467 0.02294 + 0.64535 0.02055 + 0.0061 0.02008 + 0.12288 0.99732 + 0.12286 0.99984 + 0.45407 0.14021 + 0.33191 0.99483 + 0.08516 0.03014 + 0.08766 0.04996 + 0.04739 0.02615 + 0.38037 0.20981 + 0.37239 0.16609 + 0.32909 0.98533 + 0.56662 0.00802 + 0.60544 0.00735 + 0.44969 0.05107 + 0.48754 0.05121 + 0.63302 0.0206 + 0.59695 0.04709 + 0.64706 0.91176 + 0.64994 0.91289 + 0.64894 0.9368 + 0.6467 0.93603 + 0.00502 0.20414 + 0.63302 0.9794 + 0.63545 0.98828 + 0.60495 0.98586 + 0.24176 0.00028 + 0.28037 0.00059 + 0.59041 0.72026 + 0.62901 0.72324 + 0.61102 0.7219 + 0.61401 0.13905 + 0.62066 0.16238 + 0.60268 0.16609 + 0.02033 0.86522 + 0.01253 0.88605 + 0.48754 0.5 + 0.05535 0.79019 + 0.08236 0.78805 + 0.32203 0.91176 + 0.32491 0.91289 + 0.56662 0.99198 + 0.60544 0.99265 + 0.60552 0.99719 + 0.12322 0.01759 + 0.10616 0.87727 + 0.07408 0.87702 + 0.09217 0.8571 + 0.12905 0.85979 + 0.03903 0.7219 + 0.01249 0.95848 + 0.03352 0.92937 + 0.02604 0.95655 + 0.48754 0.03178 + 0.44877 0.03158 + 0.20217 0.00016 + 0.00697 0.98804 + 0.0073 0.99148 + 0.00479 0.98957 + 0.00559 0.98677 + 0.31814 0.00517 + 0.31773 0.00852 + 0.31056 0.00752 + 0.31022 0.00413 + 0.00502 0.79586 + 0.00339 0.72399 + 0.02104 0.72324 + 0.00339 0.27601 + 0.02104 0.27676 + 0.63756 0.95848 + 0.64881 0.62098 + 0.64666 0.72399 + 0.62948 0.62057 + 0.0202 0.5 + 0.02057 0.62057 + 0.00124 0.62098 + 0.00029 0.5 + 0.0146 0.01172 + 0.0451 0.01414 + 0.48754 0.99734 + 0.48754 0.99165 + 0.52708 0.99168 + 0.32981 0.01043 + 0.33232 0.00852 + 0.31043 0.01172 + 0.308 0.0206 + 0.08387 0.0166 + 0.04461 0.00735 + 0.00406 0.98533 + 0.64526 0.98957 + 0.0061 0.97992 + 0.0047 0.97945 + 0.00402 0.9602 + 0.00683 0.95947 + 0.00299 0.91176 + 0.23685 0.38149 + 0.23635 0.5 + 0.20182 0.5 + 0.20213 0.38187 + 0.64777 0.96048 + 0.64603 0.9602 + 0.03866 0.90233 + 0.06414 0.90036 + 0.32838 0.97706 + 0.16251 0.61801 + 0.16251 0.71793 + 0.46357 0.12036 + 0.32841 0.27601 + 0.34606 0.27676 + 0.48754 0.01772 + 0.44824 0.01759 + 0.16251 0.78766 + 0.11913 0.78735 + 0.32009 0.88954 + 0.33004 0.20414 + 0.34502 0.20499 + 0.64322 0.95947 + 0.2144 0.83094 + 0.23286 0.8571 + 0.32557 0.10917 + 0.32514 0.08711 + 0.32802 0.08824 + 0.56188 0.38149 + 0.56358 0.28115 + 0.31056 0.99248 + 0.31022 0.99587 + 0.48754 0.28207 + 0.48754 0.38199 + 0.44792 0.38187 + 0.5947 0.20981 + 0.56769 0.21195 + 0.57637 0.16883 + 0.40846 0.00802 + 0.4089 0.0166 + 0.37012 0.01414 + 0.16251 0.98228 + 0.12297 0.99168 + 0.12322 0.98241 + 0.32777 0.13016 + 0.32979 0.15859 + 0.64706 0.08824 + 0.00798 0.98044 + 0.12375 0.03158 + 0.63545 0.01172 + 0.63559 0.00752 + 0.32033 0.97945 + 0.32096 0.98533 + 0.0047 0.02055 + 0.00406 0.01467 + 0.20217 0.99984 + 0.24176 0.99972 + 0.08867 0.5 + 0.01446 0.00752 + 0.30674 0.00204 + 0.63524 0.00413 + 0.63176 0.00204 + 0.20314 0.28188 + 0.23855 0.28115 + 0.52153 0.10002 + 0.36084 0.20713 + 0.27193 0.95291 + 0.27764 0.97385 + 0.00124 0.37902 + 0.02057 0.37943 + 0.28599 0.7219 + 0.32614 0.0632 + 0.32837 0.06397 + 0.01829 0.99796 + 0.0148 0.99587 + 0.41577 0.07437 + 0.3839 0.07291 + 0.29898 0.04345 + 0.00335 0.93603 + 0.64603 0.0398 + 0.64322 0.04053 + 0.36106 0.13905 + 0.01253 0.11395 + 0.00494 0.11046 + 0.32448 0.89083 + 0.2059 0.78735 + 0.48754 0.98228 + 0.52683 0.98241 + 0.24267 0.21195 + 0.33112 0.02008 + 0.33061 0.01323 + 0.32905 0.0398 + 0.32731 0.03952 + 0.32838 0.02294 + 0.32972 0.02055 + 0.52683 0.01759 + 0.27765 0.16609 + 0.25135 0.16883 + 0.21886 0.87727 + 0.18648 0.87964 + 0.48754 0.99989 + 0.07368 0.83117 + 0.11063 0.83094 + 0.62416 0.1181 + 0.64731 0.13016 + 0.64951 0.10917 + 0.20213 0.61813 + 0.20314 0.71812 + 0.45093 0.92519 + 0.45355 0.89998 + 0.03903 0.2781 + 0.06137 0.38082 + 0.03998 0.38007 + 0.01703 0.9794 + 0.0146 0.98828 + 0.31805 0.01196 + 0.32024 0.01043 + 0.48754 0.88454 + 0.04737 0.83391 + 0.00688 0.99483 + 0.01446 0.99248 + 0.25094 0.87702 + 0.00335 0.02294 + 0.44969 0.94893 + 0.58822 0.5 + 0.56138 0.5 + 0.31043 0.98828 + 0.00299 0.08824 + 0.08817 0.38149 + 0.0148 0.00413 + 0.30483 0.5 + 0.30446 0.37943 + 0.32379 0.37902 + 0.32473 0.5 + 0.52715 0.38187 + 0.52817 0.28188 + 0.30446 0.62057 + 0.28504 0.61993 + 0.2849 0.5 + 0.12188 0.28188 + 0.11913 0.21265 + 0.06414 0.09964 + 0.00683 0.04053 + 0.00476 0.84141 + 0.26365 0.61918 + 0.26319 0.5 + 0.32379 0.62098 + 0.26538 0.72026 + 0.2915 0.07063 + 0.60552 0.00281 + 0.29898 0.95655 + 0.1229 0.38187 + 0.16251 0.38199 + 0.16251 0.5 + 0.12321 0.5 + 0.00011 0.91289 + 0.44799 0.00832 + 0.32228 0.86984 + 0.32026 0.84141 + 0.23855 0.71885 + 0.23685 0.61851 + 0.16251 0.99989 + 0.32909 0.01467 + 0.52414 0.07481 + 0.55931 0.07437 + 0.64666 0.27601 + 0.64881 0.37902 + 0.62948 0.37943 + 0.63176 0.99796 + 0.60539 0.99941 + 0.58867 0.61918 + 0.61007 0.61993 + 0.41018 0.96986 + 0.00011 0.08711 + 0.00228 0.96048 + 0.00111 0.9368 + 0.33423 0.09102 + 0.60992 0.5 + 0.6467 0.06397 + 0.56676 0.00271 + 0.56679 0.00028 + 0.62985 0.5 + 0.01829 0.00204 + 0.04466 0.00059 + 0.04453 0.00281 + 0.40832 0.00271 + 0.40829 0.00028 + 0.36968 0.00059 + 0.4479 0.99732 + 0.56618 0.9834 + 0.63373 0.1594 + 0.64976 0.5 + 0.308 0.9794 + 0.27993 0.98586 + 0.64894 0.0632 + 0.64994 0.08711 + 0.32167 0.97706 + 0.00335 0.97706 + 0.32391 0.0632 + 0.32491 0.08711 + 0.59117 0.07291 + 0.64777 0.03952 + 0.56188 0.61851 + 0.64529 0.15859 + 0.30399 0.27676 + 0.08326 0.00028 + 0.60539 0.00059 + 0.52684 0.5 + 0.4479 0.00268 + 0.43119 0.87727 + 0.39911 0.87702 + 0.45407 0.85979 + 0.46357 0.87964 + 0.41997 0.89965 + 0.41577 0.92563 + 0.44788 0.00016 + 0.41268 0.95004 + 0.36369 0.90233 + 0.44877 0.96842 + 0.32164 0.27601 + 0.31705 0.01956 + 0.00054 0.10917 + 0.64503 0.20414 + 0.38916 0.90036 + 0.30674 0.99796 + 0.40829 0.99972 + 0.44788 0.99984 + 0.32448 0.10917 + 0.16251 0.28207 + 0.28037 0.99941 + } + $normals { + 0.0671 -0.9977 -0 + 0.0367 -0.9993 -0 + 0.039 -0.9992 0.0028 + 0.0838 -0.9965 -0.0061 + -0.1426 -0.3962 0.907 + -0.1778 -0.5151 0.8385 + -0.292 -0 0.9564 + -0.2356 -0.0357 0.9712 + 0.1427 0.3962 -0.907 + 0.1778 0.5151 -0.8385 + -0.1104 0.8696 -0.4812 + -0.0266 0.769 -0.6386 + -0.0154 -0.8275 -0.5612 + 0.0039 -0.5645 -0.8254 + 0 -0.5504 -0.8349 + 0 -0.8168 -0.577 + -0.1834 -0 0.983 + -0.3506 -0.8758 0.3318 + -0.1368 -0.9583 0.2509 + -0.0513 -0.4298 0.9015 + -0.0126 0 -0.9999 + -0.005 0 -1 + 0.0108 0.5 -0.8659 + 0.3891 0.9204 -0.0381 + 0.4402 0.8979 0.0006 + 0.5505 0.8347 0.0112 + 0.5185 0.855 -0.0148 + -0.0154 0.8275 0.5612 + -0.0427 0.857 0.5136 + 0.0063 0.607 0.7947 + 0.0039 0.5645 0.8254 + -0.4384 -0.8988 0.0012 + -0.2177 -0.976 0.0021 + -0.2339 -0.9722 0.0056 + -0.4438 -0.8961 0.0071 + -0.4438 -0.8961 -0.0065 + -0.4384 -0.8988 -0.0012 + -0.694 -0.7199 -0.0007 + -0.6787 -0.7344 -0.0073 + -0.3303 0.9227 0.1987 + -0.1104 0.8696 0.4813 + -0.0266 0.769 0.6386 + -0.206 0.9228 0.3257 + -0.3315 0.9426 -0.0405 + -0.2599 0.9581 -0.1204 + -0.091 0.9901 -0.1069 + -0.1133 0.9925 -0.0455 + -0.1752 0.9641 0.1993 + -0.0825 0.9625 0.2584 + -0.1056 0.9894 0.0995 + -0.224 0.9723 0.0667 + -0.5185 0.855 0.0143 + -0.4508 0.89 0.0687 + -0.3212 0.9376 0.1335 + -0.3891 0.9205 0.036 + -0.0376 0.9991 0.0206 + -0.0273 0.9987 0.0436 + -0.0345 0.9983 0.0473 + -0.0414 0.9989 0.0216 + 0.0217 -0.9939 0.1082 + 0.0074 -0.9689 0.2474 + 0.0541 -0.9685 0.2429 + 0.0911 -0.9901 0.1069 + 0.0056 0.8493 -0.5279 + -0.0422 0.4301 -0.9018 + -0.1803 0.9531 -0.2431 + -0.0113 0.9878 -0.1553 + 0.059 0.9981 -0.0152 + 0.065 0.9978 -0.0082 + 0.1179 0.993 -0.0046 + 0.1191 0.9928 -0.0081 + 0.0217 0.9939 -0.1082 + 0.0074 0.9689 -0.2474 + 0.0541 0.9685 -0.2429 + 0.0911 0.9901 -0.1069 + 0.132 0.9424 0.3074 + 0.1093 0.8701 0.4805 + -0.1784 0.5152 0.8383 + -0.0814 0.716 0.6933 + 0.0376 -0.9991 0.0206 + 0.0419 -0.9991 0.0105 + 0.065 -0.9978 0.0082 + 0.059 -0.9981 0.0151 + 0.026 -0.7695 -0.6381 + 0.1094 -0.8701 -0.4806 + 0.3311 -0.9223 -0.1995 + 0.2056 -0.9224 -0.3268 + -0.4504 0.8902 -0.0682 + -0.3312 0.9222 -0.1995 + 0.4355 0.9002 -0.0009 + 0.4364 0.8998 -0 + 0.7019 0.7123 0 + 0.6991 0.715 -0.0002 + -0.053 0.9687 -0.2425 + -0.0081 0.9689 -0.2475 + -0.0216 0.9939 -0.1082 + -0.5504 0.8348 0.0106 + -0.3554 0.9346 0.0156 + -0.2817 0.9593 0.0175 + -0.5402 0.8415 0.0019 + -0.2961 0 -0.9551 + -0.1783 -0.5152 -0.8383 + -0.1417 -0.3966 -0.907 + -0.2285 -0.0357 -0.9729 + 0.0017 -0.8254 -0.5646 + 0.0016 0.0001 -1 + 0.0107 -0 -0.9999 + -0.0054 -0.7202 -0.6937 + 0.4355 -0.9002 -0.0009 + 0.2138 -0.9769 -0.0016 + 0.2177 -0.976 -0.002 + 0.4384 -0.8988 -0.0016 + 0.0074 0.9689 0.2474 + -0.0101 0.9458 0.3246 + 0.0076 0.9928 0.1195 + 0.0215 0.9939 0.1082 + -0.0063 0.607 0.7947 + 0.0428 0.857 0.5136 + 0.0152 0.8275 0.5612 + -0.0039 0.5645 0.8254 + 0.2156 0.0022 -0.9765 + 0.7928 -0.2268 -0.5657 + 0.3136 -0.8907 -0.3292 + 0.1818 0.9833 0 + 0.2817 0.9593 0.0186 + 0.5402 0.8415 0.0019 + 0.2593 -0.9583 0.1198 + 0.3318 -0.9425 0.0409 + 0.1132 -0.9925 0.0455 + 0.175 -0.9641 -0.1999 + 0.0995 -0.8958 -0.4332 + 0.3213 -0.9377 -0.132 + 0.4508 0.89 0.0687 + 0.3315 0.9426 0.0404 + 0.3638 0.9315 0.0049 + 0.5185 0.8549 0.0142 + -0.0681 0.9977 -0 + -0.0422 0.9991 0 + -0.0425 0.9991 -0.0044 + -0.0676 0.9977 -0.004 + 0.1784 0.5152 0.8383 + 0.1417 0.3966 0.907 + -0.1329 0.942 0.3081 + -0.2596 0.9582 0.1201 + -0.091 0.9901 0.1069 + -0.053 0.9687 0.2425 + 0.2339 -0.9722 0.0056 + 0.2177 -0.976 0.002 + 0.4384 -0.8988 0.0016 + 0.4438 -0.8961 0.0071 + -0.0217 0.9939 0.1082 + -0.0074 0.9689 0.2474 + 0.0825 -0.9625 -0.2584 + 0.0428 -0.857 -0.5136 + 0.0154 -0.8275 0.5612 + 0.0427 -0.857 0.5136 + -0.0063 -0.607 0.7947 + -0.0039 -0.5645 0.8254 + 0.0016 0.678 0.735 + -0.0995 0.8958 0.4332 + 0.0676 -0.9977 0.004 + 0.0681 -0.9977 0 + 0.1198 -0.9928 -0 + 0.1191 -0.9929 0.0027 + 0.0263 -0.7693 0.6384 + -0.0809 -0.3252 0.9422 + -0.0018 -0.6781 0.735 + 0.0077 0.9928 -0.1195 + 0.0346 0.9983 -0.0473 + 0.0271 0.9987 -0.0435 + -0.0016 -0.0001 1 + 0.0635 -0 0.998 + 0.0086 0.8278 0.561 + -0.0013 0.8254 0.5646 + 0.0811 0.325 0.9422 + 0.0402 0.2785 0.9596 + 0.1058 0 0.9944 + 0.0504 -0 0.9987 + -0.1132 0.9936 0 + -0.0447 0.999 0 + -0.0415 0.9919 -0.1197 + -0.1055 0.9894 -0.0995 + 0.1986 0.0001 0.9801 + 0.1427 -0.3962 0.907 + 0.1778 -0.5151 0.8385 + -0.1104 -0.8696 0.4812 + -0.0266 -0.769 0.6386 + 0.292 0 0.9564 + 0.0018 -0.6781 0.735 + -0.206 -0.9228 0.3257 + -0.0992 -0.8957 0.4335 + 0.0814 0.716 0.6933 + 0.2319 -0.0014 0.9727 + -0.1191 -0.9929 0.0027 + -0.0676 -0.9977 0.004 + -0.065 -0.9978 0.0082 + -0.1179 -0.993 0.0046 + -0.3315 0.9426 0.0404 + -0.0069 0.9928 0.1194 + 0.0104 0.9458 0.3246 + -0.053 -0.9687 0.2425 + -0.0081 -0.9689 0.2475 + -0.0216 -0.9939 0.1082 + -0.0913 -0.9901 0.107 + -0.6991 0.715 -0.0002 + -0.4355 0.9002 -0.0009 + -0.4384 0.8988 -0.0012 + -0.694 0.7199 -0.0007 + 0.1206 0.9594 -0.2549 + 0.0513 0.4298 -0.9015 + -0.028 0.8487 -0.5281 + 0.0288 0.9875 -0.1549 + -0.0107 -0 0.9999 + 0.003 0.7203 0.6937 + -0.0811 -0.325 -0.9422 + -0.0015 -0.6781 -0.735 + 0.4809 0.8747 0.0599 + 0.8493 -0.0005 0.5279 + 0.9976 0 0.0689 + 0.0811 -0.325 0.9422 + 0.0402 -0.2785 0.9596 + 0.053 -0.9687 -0.2425 + 0.0081 -0.9689 -0.2475 + 0.0216 -0.9939 -0.1082 + 0.0913 -0.9901 -0.107 + -0.0425 -0.9991 -0.0044 + -0.0422 -0.9991 -0 + -0.0681 -0.9977 -0 + -0.0676 -0.9977 -0.0039 + 0.1104 -0.8696 0.4812 + 0.1304 -0.9429 0.3064 + -0.0806 -0.7158 0.6936 + 0.3891 -0.9205 0.0357 + 0.224 -0.9723 0.067 + 0.2423 -0.9702 -0 + 0.4402 -0.8979 -0 + -0.3302 -0.9228 -0.1986 + -0.4508 -0.89 -0.0687 + -0.3315 -0.9426 -0.0404 + -0.2599 -0.9581 -0.1204 + 0.0346 -0.9983 -0.0474 + 0.0271 -0.9987 -0.0435 + 0.0375 -0.9991 -0.0204 + 0.0414 -0.9989 -0.0216 + 0.7019 -0.7123 -0 + 0.4364 -0.8998 0 + 0.6991 -0.715 -0.0002 + 0.0069 -0.9928 0.1194 + -0.0104 -0.9458 0.3246 + -0.1096 -0.994 0.0004 + -0.0838 -0.9965 0.0064 + -0.039 -0.9992 -0.0028 + -0.0425 -0.999 -0.0096 + -0.2593 -0.9583 0.1198 + -0.1327 -0.9421 0.3079 + -0.0376 -0.9991 -0.0206 + -0.0419 -0.9991 -0.0105 + -0.065 -0.9978 -0.0082 + -0.059 -0.9981 -0.0151 + 0.0069 -0.9928 -0.1194 + 0.2819 -0.9593 0.0144 + 0.1818 -0.9833 0.0016 + 0.5403 -0.8415 -0 + 0.065 0.9978 0.0082 + 0.0419 0.9991 0.0105 + 0.0376 0.9991 0.0206 + 0.059 0.9981 0.0152 + 0.3636 -0.9315 0.0046 + 0.4504 -0.8902 0.0682 + 0.5185 -0.8549 0.0148 + -0.0217 -0.9939 -0.1082 + -0.0074 -0.9689 -0.2474 + -0.0541 -0.9685 -0.2429 + -0.0911 -0.9901 -0.1069 + 0.1133 0.9925 -0.0455 + -0.8078 0.0961 0.5815 + 0.0056 -0.8493 0.5279 + -0.0113 -0.9878 0.1553 + 0.3302 -0.9228 0.1986 + -0.0386 -0.9993 0.0027 + -0.0367 -0.9993 -0 + -0.0671 -0.9977 -0 + -0.0838 -0.9965 -0.0064 + 0.1132 -0.9925 -0.0455 + -0.0424 -0.9991 0.0044 + -0.0419 -0.9991 0.0105 + 0.2137 0.9769 -0 + 0.2138 0.9769 -0.0016 + -0.1058 -0 0.9944 + 0.01 -0.9878 -0.1554 + 0.0475 -0.9982 -0.0373 + 0.3213 0.9377 0.132 + 0.3891 0.9204 0.0381 + -0.1191 -0.9928 -0.0081 + -0.1179 -0.993 -0.0046 + -0.2177 -0.976 -0.0022 + -0.2339 -0.9722 -0.0056 + -0.0827 0.9625 -0.2583 + -0.1751 0.9641 -0.1995 + -0.2241 0.9723 -0.0665 + 0.0422 -0.9991 -0 + 0.0425 -0.9991 0.0044 + -0.0319 -0.9545 -0.2966 + -0.0415 -0.9919 -0.1197 + -0.1055 -0.9894 -0.0995 + -0.0827 -0.9625 -0.2583 + 0.0345 0.9983 0.0473 + 0.0273 0.9987 0.0436 + -0.2423 0.9702 0 + 0.0018 0.6781 -0.735 + -0.2059 0.9228 -0.3257 + -0.0992 0.8957 -0.4335 + -0.0263 -0.7693 -0.6384 + 0.1427 -0.3962 -0.907 + 0.0809 -0.3252 -0.9422 + 0.0018 -0.6781 -0.735 + 0.0203 -0 0.9998 + 0.0167 0.2534 0.9672 + 0.2137 -0.9769 -0 + 0.2138 -0.9769 0.0016 + -0.0414 -0.9989 -0.0216 + -0.3213 0.9377 -0.132 + -0.5185 0.8549 -0.0148 + -0.3891 0.9204 -0.0381 + 0.0154 0.8275 -0.5612 + 0.0427 0.857 -0.5136 + -0.0063 0.607 -0.7947 + -0.0039 0.5645 -0.8254 + 0.0419 0.9991 -0.0105 + 0.0423 0.9991 -0.0044 + 0.0676 0.9977 -0.004 + -0.039 0.9992 -0.0028 + -0.0367 0.9993 0 + -0.0671 0.9977 0 + -0.0838 0.9965 0.0064 + -0.1096 0.994 0.0007 + -0.0425 0.999 -0.0096 + -0.042 -0.9991 0.0093 + -0.1096 -0.994 -0.0004 + -0.12 -0.9926 0.0157 + -0.0414 -0.9989 0.0216 + 0.4355 -0.9002 0.0011 + -0.032 0.9545 0.2966 + 0 0.9508 0.3099 + 0 0.9919 0.1267 + -0.0415 0.9919 0.1197 + -0.0428 -0.857 -0.5136 + 0.5185 -0.855 -0.0148 + 0.3636 -0.9316 -0.0047 + 0.3554 -0.9346 0.0161 + 0.5505 -0.8347 0.0113 + -0.0017 0.6781 -0.735 + -0.0811 0.325 -0.9422 + -0.0402 0.2785 -0.9596 + 0.224 0.9723 -0.067 + 0.2423 0.9702 0 + -0.065 0.9978 -0.0082 + -0.0419 0.9991 -0.0105 + -0.0376 0.9991 -0.0206 + -0.059 0.9981 -0.0152 + -0.0346 0.9983 -0.0474 + -0.0271 0.9987 -0.0435 + -0.0414 0.9989 -0.0216 + 0.2944 -0.0027 -0.9557 + 0.1783 -0.5152 -0.8383 + 0.0814 -0.716 -0.6933 + 0.167 -0.0528 -0.9845 + -0.0045 -0.8253 0.5647 + -0.0027 -0.8273 0.5618 + 0.5505 -0.8347 -0.0112 + -0.1778 0.5151 -0.8385 + 0.1104 0.8696 -0.4812 + 0.1304 0.9429 -0.3064 + -0.0806 0.7158 -0.6936 + -0.263 0.9638 -0.0431 + -0.3293 0.8848 -0.3296 + -0.5397 0.2276 -0.8105 + -0.4817 0.8744 -0.0584 + 0.224 0.9723 0.067 + 0.1752 0.9641 0.1993 + 0.3636 0.9315 -0.0047 + 0.3319 0.9424 -0.041 + 0.4504 0.8902 -0.0682 + 0.0422 -0.4301 0.9018 + 0.0051 0.0005 1 + -0.0108 -0.5 0.8659 + -0.0042 -0.8493 0.5279 + 0.262 0.9641 0.0438 + 0.4438 0.8961 0.0068 + 0.2339 0.9722 0.0056 + 0.0827 0.9625 0.2583 + 0.0319 0.9545 0.2966 + 0.0994 -0.8957 0.4333 + 0.1368 -0.9583 -0.2509 + 0.0513 -0.4298 -0.9015 + 0.0414 -0.9989 0.0217 + 0.0425 -0.999 0.0096 + -0.4355 -0.9002 0.0011 + -0.4364 -0.8998 -0 + -0.2137 -0.9769 -0 + -0.2138 -0.9769 0.0016 + -0.1327 0.9421 -0.3079 + 0.0806 0.7158 -0.6936 + 0.2944 0.0027 -0.9557 + 0.167 0.0528 -0.9845 + -0 0.2458 0.9693 + 0 0.5504 0.8349 + 0.1191 -0.9928 0.0081 + 0.1179 -0.993 0.0046 + 0.2599 0.9581 0.1204 + 0.091 0.9901 0.1069 + 0.1133 0.9925 0.0455 + 0.0126 0 0.9999 + 0.0103 0 0.9999 + -0.0054 -0.7202 0.6937 + 0.039 -0.9992 -0.0028 + 0.0838 -0.9965 0.0061 + 0.1096 -0.994 0.0007 + 0.042 -0.9991 -0.0093 + -0.0101 0.9878 0.1554 + 0.0056 0.8493 0.5279 + -0.0017 -0.8254 0.5646 + 0.0054 -0.7202 0.6937 + 0.4508 -0.89 -0.0687 + 0.3315 -0.9426 -0.0404 + 0.1199 0.9927 0.0161 + 0.1096 0.994 -0.0007 + 0.3554 0.9346 -0.0155 + -0.4438 0.8961 0.0071 + -0.4758 0.8767 0.0707 + -0.263 0.9638 0.0431 + -0.2339 0.9722 0.0056 + 0.1096 0.994 -0 + 0.12 0.9926 -0.0157 + 0.3554 0.9346 0.0161 + -0.3638 0.9315 -0.0049 + -0.1199 0.9927 -0.0161 + -0.6787 0.7344 0.0073 + -0.9932 0.0862 0.0786 + -0.5505 -0.8347 -0.0112 + -0.5403 -0.8415 0.0006 + -0.4402 -0.8979 -0 + 0 0.8168 0.577 + 0.0423 -0.9991 -0.0044 + -0.1134 -0.9925 0.0454 + -0.0345 -0.9983 0.0473 + 0.1055 0.9894 0.0996 + 0.039 0.9992 0.0028 + 0.0367 0.9993 0 + 0.0671 0.9977 -0 + 0.0838 0.9965 -0.0064 + 0.7928 0.2268 -0.5657 + 0.2156 -0.0022 -0.9765 + 0.3506 0.8758 -0.3318 + 0 -0 1 + 0.1096 -0.994 -0.0007 + 0.3554 -0.9346 -0.0155 + 0.2817 -0.9593 -0.0175 + -0.4402 0.8979 0 + -0.1427 0.3962 0.907 + 0.0266 0.769 0.6386 + 0.2588 -0.9585 -0.1193 + -0.1222 0.992 0.0329 + -0.0468 0.9982 0.0376 + -0.059 0.9981 0.0151 + -0.1191 0.9928 0.0085 + 0.2285 -0.0329 -0.973 + 0.0809 0.3252 -0.9422 + 0.1249 0.0185 -0.992 + 0.1199 -0.9927 0.0161 + -0.1179 0.993 0.0046 + -0.1191 0.9929 0.0027 + -0.2138 0.9769 0.0017 + -0.2177 0.976 0.002 + -0.4384 0.8988 0.0016 + -0.0237 -0 0.9997 + -0.0167 0.2534 0.9672 + 0.1236 0.9918 0.0315 + 0.0468 0.9982 0.0376 + 0.0166 0.9878 0.155 + 0.1206 0.9594 0.2549 + 0.3891 -0.9205 -0.0357 + -0.1803 0.9531 0.2431 + -0.3249 0.8865 0.3294 + -0.0394 0.43 0.902 + -0.3318 -0.9425 0.0409 + -0.4504 -0.8902 0.0682 + -0.3312 -0.9222 0.1995 + -0.282 -0.9593 0.0135 + -0.1818 -0.9833 0.0016 + -0.175 -0.9641 0.1999 + -0.3213 -0.9377 0.132 + -0.0053 0.5006 0.8656 + 0.0101 -0.9458 0.3246 + -0.0076 -0.9928 0.1195 + 0.0051 -0 -1 + 0.0126 -0 -0.9999 + 0.0078 0.5006 -0.8657 + -0.0056 -0.8493 -0.5279 + -0.4355 -0.9002 -0.0009 + -0.6991 -0.715 -0.0002 + 0.5505 0.8347 -0.0112 + -0.8078 -0.0961 0.5815 + 0.065 -0.9978 -0.0082 + 0.0419 -0.9991 -0.0105 + 0.0591 -0.9981 -0.0152 + 0.0995 0.8958 0.4332 + 0.2058 0.9226 0.3263 + 0.0061 0.0005 1 + 0.2177 0.976 -0.0022 + 0.2339 0.9722 -0.0056 + 0.0425 0.9991 0.0044 + 0.0422 0.9991 0 + 0.0473 0.9982 -0.0374 + 0.0375 0.9991 -0.0205 + 0.0027 0.8273 -0.5618 + 0.03 0.017 -0.9994 + -0.0016 -0 -1 + 0.0039 0.8253 -0.5646 + -0.1058 0 -0.9944 + -0.0473 0.9982 -0.0374 + -0.1204 0.9921 -0.0347 + -0.1191 0.9928 -0.0082 + 0.694 -0.7199 0.0007 + 0.6787 -0.7344 0.0073 + -0.0428 0.857 -0.5136 + 0.0403 0.2784 -0.9596 + 0.0062 0.607 -0.7947 + 0.3303 0.9227 -0.1987 + 0.0266 0.769 -0.6386 + 0.206 0.9228 -0.3257 + -0.1093 -0.8701 -0.4805 + -0.1327 -0.9421 -0.3079 + 0 1 0 + -0.0995 -0.8958 -0.4332 + -0.1751 -0.9641 -0.1995 + 0.0027 -0.8273 0.5618 + -0.2177 0.976 -0.0021 + -0.2339 0.9722 -0.0056 + -0.4438 0.8961 -0.0071 + 0.1191 -0.9929 -0.0027 + -0.3554 -0.9346 0.0156 + -0.3638 -0.9315 -0.0049 + -0.5185 -0.8549 -0.0142 + -0.5504 -0.8348 0.0107 + 0.0063 -0.607 -0.7947 + -0.0077 -0.9928 -0.1195 + -0.0346 -0.9983 -0.0473 + -0.0271 -0.9987 -0.0435 + 0.0681 0.9977 0 + 0.0676 0.9977 0.004 + 0.6991 -0.715 0.0002 + -0.1803 -0.9531 -0.2431 + -0.3249 -0.8865 -0.3294 + -0.1933 -0.022 -0.9809 + -0.0394 -0.43 -0.902 + 0.3136 -0.8906 0.3292 + 0.2654 -0.9632 0.0417 + 0.4759 -0.8767 0.0704 + 0.1249 -0.0185 -0.992 + 0.0645 -0 -0.9979 + 0.0403 -0.2784 -0.9596 + -0.0504 -0 -0.9987 + -0.0402 -0.2785 -0.9596 + -0.0069 0.9928 -0.1194 + 0.0203 0 -0.9998 + 0.0167 0.2535 -0.9672 + -0 -0.2458 -0.9693 + 0.0167 -0.2534 -0.9672 + 0 0 -1 + 0.1204 -0.9921 -0.0347 + 0.1191 -0.9928 -0.0082 + -0.4364 0.8998 -0 + -0.2137 0.9769 0 + -0.2138 0.9769 -0.0016 + 0.217 -0.0011 0.9762 + 0.3136 0.8906 0.3292 + 0.1222 -0.992 0.0329 + 0.0468 -0.9982 0.0376 + 0.1179 -0.993 -0.0046 + 0.2339 -0.9722 -0.0055 + -0.1933 0.022 -0.9809 + 0.0241 -0.8489 -0.528 + -0.0053 -0.5006 -0.8656 + 0.0033 -0.7203 -0.6937 + 0.0117 -0.9458 -0.3245 + 0.009 -0.8278 -0.5609 + 0.032 -0.9545 0.2966 + -0 -0.9508 0.3099 + -0 -0.9919 0.1267 + 0.0415 -0.9919 0.1197 + -0.0103 0 -0.9999 + 0.0054 0.7202 -0.6937 + -0.1132 -0.9925 -0.0455 + -0.12 -0.9926 -0.0158 + -0.0126 -0 0.9999 + -0.0447 -0.999 0 + -0.1132 -0.9936 -0 + 0.2817 0.9593 -0.0186 + -0.0504 -0 0.9987 + -0.0403 0.2784 0.9596 + 0.1198 0.9928 0 + 0.1191 0.9929 0.0028 + -0.2423 -0.9702 -0 + -0.224 -0.9723 -0.0665 + 0.0814 -0.716 0.6933 + -0.0811 0.325 0.9422 + 0.0104 0.9458 -0.3246 + -0.3891 -0.9205 0.0357 + -0.5185 -0.855 0.0143 + -0.2319 -0.0014 0.9727 + -0.0635 0 0.998 + -0.0086 0.8278 0.561 + 0.032 0.9545 -0.2966 + 0.0826 0.9625 -0.2583 + -0.262 -0.9641 0.0438 + -0.4759 -0.8767 0.0704 + 0.1132 0.9936 -0 + 0.0447 0.999 -0 + 0.0415 0.9919 0.1197 + 0.0992 0.8957 -0.4335 + 0.1752 0.9641 -0.1993 + 0.3212 0.9376 -0.1329 + 0.2177 0.976 0.002 + 0.1179 0.993 0.0046 + 0.1191 0.9928 0.0081 + -0.1198 -0.9928 -0 + -0.2138 -0.9769 -0.0016 + -0.1191 -0.9929 -0.0027 + -0.2356 0.0357 0.9712 + -0.009 0.8278 -0.5609 + -0.0101 -0.9878 -0.1554 + 0.0676 -0.9977 -0.004 + 0.1236 0.9918 -0.0315 + 0.2616 0.9642 -0.044 + -0.0053 -0.5006 0.8656 + 0.0053 -0.5006 -0.8656 + -0.6991 -0.715 0.0002 + -0.694 -0.7199 0.0007 + 0 -0.9508 -0.3099 + 0.2616 -0.9642 -0.044 + 0.4817 0.8744 -0.0584 + 0.9932 0.0862 -0.0785 + 0.1055 -0.9894 0.0995 + 0.0827 -0.9625 0.2583 + 0.0839 0.9965 0.0054 + -0.0018 0.6781 0.735 + -0.0376 -0.9991 0.0206 + -0.059 -0.9981 0.0152 + -0.022 0 -0.9998 + -0.0166 -0.2534 -0.9672 + 0.0062 -0.607 0.7947 + 0.0016 -0 1 + -0.0039 0.8253 0.5646 + -0.9932 -0.0862 -0.0786 + -0.481 -0.8747 -0.0599 + 0.0425 0.999 0.0096 + 0.0415 0.9989 0.0217 + 0.027 -0.9987 0.0435 + 0.0045 -0.8253 -0.5647 + -0.0033 0.7203 -0.6937 + -0.0117 0.9458 -0.3245 + 0.3302 0.9228 0.1986 + 0.132 -0.9424 -0.3074 + -0.0814 -0.716 -0.6933 + -0.224 -0.9723 0.0665 + -0.1198 0.9928 0 + -0.1191 0.9929 -0.0027 + 0.1752 -0.9641 0.1993 + -0.0056 0.8493 0.5279 + 0.0422 0.4301 0.9018 + -0.0033 0.7203 0.6937 + 0.0078 0.5006 0.8657 + 0.1191 0.9929 -0.0027 + 0.2056 -0.9224 0.3268 + 0.3213 -0.9377 0.132 + -0.3554 -0.9346 -0.0162 + -0.282 -0.9593 -0.0135 + -0.7019 0.7123 0 + -0.3213 -0.9377 -0.132 + -0.3891 -0.9205 -0.0372 + 0.2596 0.9582 -0.1201 + -0.2319 -0.0014 -0.9727 + -0.0415 -0.9919 0.1197 + -0.1055 -0.9894 0.0995 + -0.0386 0.9993 0.0027 + -0.0838 0.9965 -0.0061 + -0.0063 -0.607 -0.7947 + 0.0152 -0.8275 -0.5612 + -0.0039 -0.5645 -0.8254 + -0.0475 -0.9982 -0.0373 + -0.1204 -0.9921 -0.0347 + 0.1803 -0.9531 0.2431 + -0.1818 0.9833 0 + -0.2056 -0.9225 -0.3268 + -0.5397 -0.2276 -0.8105 + -0.2654 -0.9632 -0.0418 + -0.3637 -0.9315 0.0049 + -0.0424 0.9991 0.0044 + -0.0001 0.8168 -0.577 + -0 0.9508 -0.3099 + -0.1224 -0.9919 0.0327 + -0.009 -0.8278 -0.5609 + 0.0319 -0.9545 -0.2966 + 0.4817 -0.8744 -0.0584 + 0 -0.2458 0.9693 + -0.0166 -0.2534 0.9672 + 0.0415 0.9919 -0.1197 + 0.1055 0.9894 -0.0995 + 0.0167 -0.2534 0.9672 + 0.0039 -0.5645 0.8254 + 0 -0.5504 0.8349 + 0.1055 -0.9894 -0.0996 + 0.2241 -0.9723 -0.0665 + 0.1199 -0.9927 -0.0161 + -0.0117 -0.9458 -0.3245 + 0.2285 0.0329 -0.973 + -0.0154 -0.8275 0.5612 + 0.0001 -0.8168 0.577 + -0.0425 -0.857 0.5136 + 0.0345 -0.9983 0.0473 + 0.4438 0.8961 -0.0071 + -0.0273 -0.9987 0.0436 + 0.0415 -0.9919 -0.1197 + 0.0447 -0.999 0 + 0 -1 -0 + 0 -0.9919 -0.1267 + 0.03 -0.017 -0.9994 + 0.2138 0.9769 0.0016 + -0.0827 -0.9625 0.2583 + -0.0319 -0.9545 0.2966 + -0.7019 -0.7123 -0 + 0.039 0.9992 -0.0028 + 0.042 0.9991 -0.0093 + -0.0167 0.2534 -0.9672 + -0.9932 0.0862 -0.0786 + -0.6787 0.7344 -0.0073 + -0.0152 0.8275 -0.5612 + 0.0039 0.5645 -0.8254 + -0.065 0.9978 0.0082 + -0.0635 0.001 -0.998 + 0.0524 0.9688 0.2423 + -0 0.5504 -0.8349 + -0.0045 0.8253 -0.5647 + 0.4384 0.8988 -0.0013 + 0.694 0.7199 -0.0007 + 0 0.2458 -0.9693 + 0.9932 -0.0863 -0.0785 + 0.6787 -0.7344 -0.0073 + 0.4438 -0.8961 -0.0065 + 0.4384 0.8988 0.0012 + 0.694 0.7199 0.0007 + 0.6787 0.7344 0.0073 + -0.4355 0.9002 0.0008 + -0.1179 0.993 -0.0045 + -0.1417 0.3966 -0.907 + -0.0473 -0.9982 0.0374 + -0.1191 -0.9928 0.0082 + 0.0414 0.9989 -0.0216 + -0.032 0.9545 -0.2966 + -0.2285 0.0357 -0.9729 + -0.0403 -0.2784 0.9596 + 0.694 -0.7199 -0.0007 + 0.6787 0.7344 -0.0073 + -0 0.9919 -0.1267 + 0.4355 0.9002 0.0008 + -0.3554 0.9346 -0.0156 + -0.3638 0.9315 0.0049 + -0.5504 0.8348 -0.0107 + -0.2817 0.9593 -0.0186 + -0.1096 0.994 -0.0004 + -0.042 0.9991 0.0093 + 0.6991 0.715 0.0002 + -0.0419 0.9991 0.0105 + -0.1132 0.9925 0.0455 + -0.0676 0.9977 0.004 + 0.0166 -0.9878 0.155 + -0.1199 0.9927 0.0159 + -0.9932 -0.0863 0.0785 + -0.694 0.7199 0.0007 + -0.6991 0.715 0.0002 + 0.1132 -0.9936 0 + -0.6787 -0.7344 0.0073 + } + } + } +} diff --git a/addons/medical_circulation/Assets/Items/Medicine/AmmoniumCarbonate/Data/ACE_Medical_AmmoniumCarbonatePackage.xob b/addons/medical_circulation/Assets/Items/Medicine/AmmoniumCarbonate/Data/ACE_Medical_AmmoniumCarbonatePackage.xob new file mode 100644 index 000000000..aaa8d715b Binary files /dev/null and b/addons/medical_circulation/Assets/Items/Medicine/AmmoniumCarbonate/Data/ACE_Medical_AmmoniumCarbonatePackage.xob differ diff --git a/addons/medical_circulation/Assets/Items/Medicine/AmmoniumCarbonate/Data/ACE_Medical_AmmoniumCarbonatePackage.xob.meta b/addons/medical_circulation/Assets/Items/Medicine/AmmoniumCarbonate/Data/ACE_Medical_AmmoniumCarbonatePackage.xob.meta new file mode 100644 index 000000000..66305fd33 --- /dev/null +++ b/addons/medical_circulation/Assets/Items/Medicine/AmmoniumCarbonate/Data/ACE_Medical_AmmoniumCarbonatePackage.xob.meta @@ -0,0 +1,39 @@ +MetaFileClass { + Name "{66A319321561B93E}Assets/Items/Medicine/AmmoniumCarbonate/Data/ACE_Medical_AmmoniumCarbonatePackage.xob" + Configurations { + FBXResourceClass PC { + MaterialAssigns { + MaterialAssignClass "{6214F8EE4F73F082}" { + SourceMaterial "DefaultGeneratedMaterial" + AssignedMaterial "{EB2C62A6F1BC5BE7}Assets/Items/Medicine/AmmoniumCarbonate/Data/Data/DefaultGeneratedMaterial.emat" + } + } + MeshParams { + MeshParam AmmoniumCarbonatePackage { + } + } + Common TXOCommonClass "{6214F8EE4F5F197A}" : "{0877E7C4BB2B2C9A}Configs/System/ResourceTypes/PC/MeshObjectCommon.conf" { + } + } + FBXResourceClass XBOX_ONE : PC { + Common TXOCommonClass "{6214F8EE4F5F07EA}" : "{9D5B6207F7628CE2}Configs/System/ResourceTypes/XBOX_ONE/MeshObjectCommon.conf" { + } + } + FBXResourceClass XBOX_SERIES : PC { + Common TXOCommonClass "{6214F8EE4F5F073B}" : "{DD9F02115C764647}Configs/System/ResourceTypes/XBOX_SERIES/MeshObjectCommon.conf" { + } + } + FBXResourceClass PS4 : PC { + Common TXOCommonClass "{6214F8EE4F5F076A}" : "{53EC476BC921D99A}Configs/System/ResourceTypes/PS4/MeshObjectCommon.conf" { + } + } + FBXResourceClass PS5 : PC { + Common TXOCommonClass "{6214F8EE4F5F074E}" : "{F62AA8E7B8EA9D26}Configs/System/ResourceTypes/PS5/MeshObjectCommon.conf" { + } + } + FBXResourceClass HEADLESS : PC { + Common TXOCommonClass "{6214F8EE4F5F06AC}" : "{3A5B3356978039E8}Configs/System/ResourceTypes/HEADLESS/MeshObjectCommon.conf" { + } + } + } +} \ No newline at end of file diff --git a/addons/medical_circulation/Assets/Items/Medicine/AmmoniumCarbonate/Data/ACE_Medical_AmmoniumCarbonatePackage_BCR.edds b/addons/medical_circulation/Assets/Items/Medicine/AmmoniumCarbonate/Data/ACE_Medical_AmmoniumCarbonatePackage_BCR.edds new file mode 100644 index 000000000..9fa0ec876 Binary files /dev/null and b/addons/medical_circulation/Assets/Items/Medicine/AmmoniumCarbonate/Data/ACE_Medical_AmmoniumCarbonatePackage_BCR.edds differ diff --git a/addons/medical_circulation/Assets/Items/Medicine/AmmoniumCarbonate/Data/ACE_Medical_AmmoniumCarbonatePackage_BCR.edds.meta b/addons/medical_circulation/Assets/Items/Medicine/AmmoniumCarbonate/Data/ACE_Medical_AmmoniumCarbonatePackage_BCR.edds.meta new file mode 100644 index 000000000..0bbc6acaf --- /dev/null +++ b/addons/medical_circulation/Assets/Items/Medicine/AmmoniumCarbonate/Data/ACE_Medical_AmmoniumCarbonatePackage_BCR.edds.meta @@ -0,0 +1,17 @@ +MetaFileClass { + Name "{B1C1C9155B2DF82F}Assets/Items/Medicine/AmmoniumCarbonate/Data/ACE_Medical_AmmoniumCarbonatePackage_BCR.edds" + Configurations { + PNGResourceClass PC : "{EAB5DE3219F9CBA8}Configs/System/ResourceTypes/PC/TextureColorMap.conf" { + } + PNGResourceClass XBOX_ONE : "{91D862F89991BFBE}Configs/System/ResourceTypes/XBOX_ONE/TextureColorMap.conf" { + } + PNGResourceClass XBOX_SERIES : "{5FEAED1642ECE679}Configs/System/ResourceTypes/XBOX_SERIES/TextureColorMap.conf" { + } + PNGResourceClass PS4 : "{12273E1A0928F0C4}Configs/System/ResourceTypes/PS4/TextureColorMap.conf" { + } + PNGResourceClass PS5 : "{531A0D167B1ABD97}Configs/System/ResourceTypes/PS5/TextureColorMap.conf" { + } + PNGResourceClass HEADLESS : "{BEAF5CD0C438676E}Configs/System/ResourceTypes/HEADLESS/TextureColorMap.conf" { + } + } +} \ No newline at end of file diff --git a/addons/medical_circulation/Assets/Items/Medicine/AmmoniumCarbonate/Data/ACE_Medical_AmmoniumCarbonatePackage_BCR.png b/addons/medical_circulation/Assets/Items/Medicine/AmmoniumCarbonate/Data/ACE_Medical_AmmoniumCarbonatePackage_BCR.png new file mode 100644 index 000000000..2f3f522dd Binary files /dev/null and b/addons/medical_circulation/Assets/Items/Medicine/AmmoniumCarbonate/Data/ACE_Medical_AmmoniumCarbonatePackage_BCR.png differ diff --git a/addons/medical_circulation/Assets/Items/Medicine/AmmoniumCarbonate/Data/ACE_Medical_AmmoniumCarbonatePackage_NMO.edds b/addons/medical_circulation/Assets/Items/Medicine/AmmoniumCarbonate/Data/ACE_Medical_AmmoniumCarbonatePackage_NMO.edds new file mode 100644 index 000000000..ec951499d Binary files /dev/null and b/addons/medical_circulation/Assets/Items/Medicine/AmmoniumCarbonate/Data/ACE_Medical_AmmoniumCarbonatePackage_NMO.edds differ diff --git a/addons/medical_circulation/Assets/Items/Medicine/AmmoniumCarbonate/Data/ACE_Medical_AmmoniumCarbonatePackage_NMO.edds.meta b/addons/medical_circulation/Assets/Items/Medicine/AmmoniumCarbonate/Data/ACE_Medical_AmmoniumCarbonatePackage_NMO.edds.meta new file mode 100644 index 000000000..4361e15f3 --- /dev/null +++ b/addons/medical_circulation/Assets/Items/Medicine/AmmoniumCarbonate/Data/ACE_Medical_AmmoniumCarbonatePackage_NMO.edds.meta @@ -0,0 +1,17 @@ +MetaFileClass { + Name "{89197287825AAAB1}Assets/Items/Medicine/AmmoniumCarbonate/Data/ACE_Medical_AmmoniumCarbonatePackage_NMO.edds" + Configurations { + PNGResourceClass PC : "{A968DA7F9A1E3A3E}Configs/System/ResourceTypes/PC/TextureNType.conf" { + } + PNGResourceClass XBOX_ONE : "{7F6A4D372443A88D}Configs/System/ResourceTypes/XBOX_ONE/TextureNType.conf" { + } + PNGResourceClass XBOX_SERIES : "{065D289C7FF8B20D}Configs/System/ResourceTypes/XBOX_SERIES/TextureNType.conf" { + } + PNGResourceClass PS4 : "{29DF4A6CBBABE916}Configs/System/ResourceTypes/PS4/TextureNType.conf" { + } + PNGResourceClass PS5 : "{DED3C8CA8494EA99}Configs/System/ResourceTypes/PS5/TextureNType.conf" { + } + PNGResourceClass HEADLESS : "{AFD658E4D0EB5FBC}Configs/System/ResourceTypes/HEADLESS/TextureNType.conf" { + } + } +} \ No newline at end of file diff --git a/addons/medical_circulation/Assets/Items/Medicine/AmmoniumCarbonate/Data/ACE_Medical_AmmoniumCarbonatePackage_NMO.png b/addons/medical_circulation/Assets/Items/Medicine/AmmoniumCarbonate/Data/ACE_Medical_AmmoniumCarbonatePackage_NMO.png new file mode 100644 index 000000000..11cab0b6a Binary files /dev/null and b/addons/medical_circulation/Assets/Items/Medicine/AmmoniumCarbonate/Data/ACE_Medical_AmmoniumCarbonatePackage_NMO.png differ diff --git a/addons/medical_circulation/Assets/Items/Medicine/AmmoniumCarbonate/Data/Data/DefaultGeneratedMaterial.emat b/addons/medical_circulation/Assets/Items/Medicine/AmmoniumCarbonate/Data/Data/DefaultGeneratedMaterial.emat new file mode 100644 index 000000000..dadb593f0 --- /dev/null +++ b/addons/medical_circulation/Assets/Items/Medicine/AmmoniumCarbonate/Data/Data/DefaultGeneratedMaterial.emat @@ -0,0 +1,4 @@ +MatPBRBasic { + BCRMap "{B1C1C9155B2DF82F}Assets/Items/Medicine/AmmoniumCarbonate/Data/ACE_Medical_AmmoniumCarbonatePackage_BCR.edds" + NMOMap "{89197287825AAAB1}Assets/Items/Medicine/AmmoniumCarbonate/Data/ACE_Medical_AmmoniumCarbonatePackage_NMO.edds" +} \ No newline at end of file diff --git a/addons/medical_circulation/Assets/Items/Medicine/AmmoniumCarbonate/Data/Data/DefaultGeneratedMaterial.emat.meta b/addons/medical_circulation/Assets/Items/Medicine/AmmoniumCarbonate/Data/Data/DefaultGeneratedMaterial.emat.meta new file mode 100644 index 000000000..7f6caee11 --- /dev/null +++ b/addons/medical_circulation/Assets/Items/Medicine/AmmoniumCarbonate/Data/Data/DefaultGeneratedMaterial.emat.meta @@ -0,0 +1,17 @@ +MetaFileClass { + Name "{EB2C62A6F1BC5BE7}Assets/Items/Medicine/AmmoniumCarbonate/Data/Data/DefaultGeneratedMaterial.emat" + Configurations { + EMATResourceClass PC { + } + EMATResourceClass XBOX_ONE : PC { + } + EMATResourceClass XBOX_SERIES : PC { + } + EMATResourceClass PS4 : PC { + } + EMATResourceClass PS5 : PC { + } + EMATResourceClass HEADLESS : PC { + } + } +} \ No newline at end of file diff --git a/addons/medical_circulation/Assets/Items/Medicine/MetoprololInjection/Data/ACE_Medical_MetoprololInjection.edds b/addons/medical_circulation/Assets/Items/Medicine/MetoprololInjection/Data/ACE_Medical_MetoprololInjection.edds new file mode 100644 index 000000000..4968d0e1e Binary files /dev/null and b/addons/medical_circulation/Assets/Items/Medicine/MetoprololInjection/Data/ACE_Medical_MetoprololInjection.edds differ diff --git a/addons/medical_circulation/Assets/Items/Medicine/MetoprololInjection/Data/ACE_Medical_MetoprololInjection.edds.meta b/addons/medical_circulation/Assets/Items/Medicine/MetoprololInjection/Data/ACE_Medical_MetoprololInjection.edds.meta new file mode 100644 index 000000000..13c4b2b14 --- /dev/null +++ b/addons/medical_circulation/Assets/Items/Medicine/MetoprololInjection/Data/ACE_Medical_MetoprololInjection.edds.meta @@ -0,0 +1,17 @@ +MetaFileClass { + Name "{69EFE14998583293}Assets/Items/Medicine/MetoprololInjection/Data/ACE_Medical_MetoprololInjection.edds" + Configurations { + PNGResourceClass PC : "{DC555BD399D92412}Configs/System/ResourceTypes/PC/TextureUnspecified.conf" { + } + PNGResourceClass XBOX_ONE : "{8F13AE697AE60784}Configs/System/ResourceTypes/XBOX_ONE/TextureUnspecified.conf" { + } + PNGResourceClass XBOX_SERIES : "{D28E01700D90F52C}Configs/System/ResourceTypes/XBOX_SERIES/TextureUnspecified.conf" { + } + PNGResourceClass PS4 : "{C6CD3D8752652D2A}Configs/System/ResourceTypes/PS4/TextureUnspecified.conf" { + } + PNGResourceClass PS5 : "{6248F71B9D7C1E93}Configs/System/ResourceTypes/PS5/TextureUnspecified.conf" { + } + PNGResourceClass HEADLESS : "{699C82A6807668A7}Configs/System/ResourceTypes/HEADLESS/TextureUnspecified.conf" { + } + } +} \ No newline at end of file diff --git a/addons/medical_circulation/Assets/Items/Medicine/MetoprololInjection/Data/ACE_Medical_MetoprololInjection.emat b/addons/medical_circulation/Assets/Items/Medicine/MetoprololInjection/Data/ACE_Medical_MetoprololInjection.emat new file mode 100644 index 000000000..31d42ae3e --- /dev/null +++ b/addons/medical_circulation/Assets/Items/Medicine/MetoprololInjection/Data/ACE_Medical_MetoprololInjection.emat @@ -0,0 +1,9 @@ +MatPBRBasic { + SpecularIBL 0.479 0.479 0.479 1 + Specular 0.913 0.879 0.865 1 + SpecularMul 0.821 + RoughnessScale 0.5 + MetalnessScale 0 + DielectricReflectance 0.16 + BCRMap "{69EFE14998583293}Assets/Items/Medicine/MetoprololInjection/Data/ACE_Medical_MetoprololInjection.edds" +} \ No newline at end of file diff --git a/addons/medical_circulation/Assets/Items/Medicine/MetoprololInjection/Data/ACE_Medical_MetoprololInjection.emat.meta b/addons/medical_circulation/Assets/Items/Medicine/MetoprololInjection/Data/ACE_Medical_MetoprololInjection.emat.meta new file mode 100644 index 000000000..7ade11b3b --- /dev/null +++ b/addons/medical_circulation/Assets/Items/Medicine/MetoprololInjection/Data/ACE_Medical_MetoprololInjection.emat.meta @@ -0,0 +1,17 @@ +MetaFileClass { + Name "{0F544FAC67C0A39E}Assets/Items/Medicine/MetoprololInjection/Data/ACE_Medical_MetoprololInjection.emat" + Configurations { + EMATResourceClass PC { + } + EMATResourceClass XBOX_ONE : PC { + } + EMATResourceClass XBOX_SERIES : PC { + } + EMATResourceClass PS4 : PC { + } + EMATResourceClass HEADLESS : PC { + } + EMATResourceClass PS5 : PC { + } + } +} \ No newline at end of file diff --git a/addons/medical_circulation/Assets/Items/Medicine/MetoprololInjection/Data/ACE_Medical_MetoprololInjection.png b/addons/medical_circulation/Assets/Items/Medicine/MetoprololInjection/Data/ACE_Medical_MetoprololInjection.png new file mode 100644 index 000000000..0e43fbedc Binary files /dev/null and b/addons/medical_circulation/Assets/Items/Medicine/MetoprololInjection/Data/ACE_Medical_MetoprololInjection.png differ diff --git a/addons/medical_circulation/Assets/Items/Medicine/NaloxoneInjection/Data/ACE_Medical_NaloxoneInjection.edds b/addons/medical_circulation/Assets/Items/Medicine/NaloxoneInjection/Data/ACE_Medical_NaloxoneInjection.edds new file mode 100644 index 000000000..211b13de4 Binary files /dev/null and b/addons/medical_circulation/Assets/Items/Medicine/NaloxoneInjection/Data/ACE_Medical_NaloxoneInjection.edds differ diff --git a/addons/medical_circulation/Assets/Items/Medicine/NaloxoneInjection/Data/ACE_Medical_NaloxoneInjection.edds.meta b/addons/medical_circulation/Assets/Items/Medicine/NaloxoneInjection/Data/ACE_Medical_NaloxoneInjection.edds.meta new file mode 100644 index 000000000..d11737434 --- /dev/null +++ b/addons/medical_circulation/Assets/Items/Medicine/NaloxoneInjection/Data/ACE_Medical_NaloxoneInjection.edds.meta @@ -0,0 +1,17 @@ +MetaFileClass { + Name "{A1F84CF60C6D947B}Assets/Items/Medicine/NaloxoneInjection/Data/ACE_Medical_NaloxoneInjection.edds" + Configurations { + PNGResourceClass PC : "{DC555BD399D92412}Configs/System/ResourceTypes/PC/TextureUnspecified.conf" { + } + PNGResourceClass XBOX_ONE : "{8F13AE697AE60784}Configs/System/ResourceTypes/XBOX_ONE/TextureUnspecified.conf" { + } + PNGResourceClass XBOX_SERIES : "{D28E01700D90F52C}Configs/System/ResourceTypes/XBOX_SERIES/TextureUnspecified.conf" { + } + PNGResourceClass PS4 : "{C6CD3D8752652D2A}Configs/System/ResourceTypes/PS4/TextureUnspecified.conf" { + } + PNGResourceClass PS5 : "{6248F71B9D7C1E93}Configs/System/ResourceTypes/PS5/TextureUnspecified.conf" { + } + PNGResourceClass HEADLESS : "{699C82A6807668A7}Configs/System/ResourceTypes/HEADLESS/TextureUnspecified.conf" { + } + } +} \ No newline at end of file diff --git a/addons/medical_circulation/Assets/Items/Medicine/NaloxoneInjection/Data/ACE_Medical_NaloxoneInjection.emat b/addons/medical_circulation/Assets/Items/Medicine/NaloxoneInjection/Data/ACE_Medical_NaloxoneInjection.emat new file mode 100644 index 000000000..b37bf5ae0 --- /dev/null +++ b/addons/medical_circulation/Assets/Items/Medicine/NaloxoneInjection/Data/ACE_Medical_NaloxoneInjection.emat @@ -0,0 +1,9 @@ +MatPBRBasic { + SpecularIBL 0.479 0.479 0.479 1 + Specular 0.913 0.879 0.865 1 + SpecularMul 0.821 + RoughnessScale 0.5 + MetalnessScale 0 + DielectricReflectance 0.16 + BCRMap "{A1F84CF60C6D947B}Assets/Items/Medicine/NaloxoneInjection/Data/ACE_Medical_NaloxoneInjection.edds" +} \ No newline at end of file diff --git a/addons/medical_circulation/Assets/Items/Medicine/NaloxoneInjection/Data/ACE_Medical_NaloxoneInjection.emat.meta b/addons/medical_circulation/Assets/Items/Medicine/NaloxoneInjection/Data/ACE_Medical_NaloxoneInjection.emat.meta new file mode 100644 index 000000000..1f8648c2e --- /dev/null +++ b/addons/medical_circulation/Assets/Items/Medicine/NaloxoneInjection/Data/ACE_Medical_NaloxoneInjection.emat.meta @@ -0,0 +1,17 @@ +MetaFileClass { + Name "{C743E213F3F50576}Assets/Items/Medicine/NaloxoneInjection/Data/ACE_Medical_NaloxoneInjection.emat" + Configurations { + EMATResourceClass PC { + } + EMATResourceClass XBOX_ONE : PC { + } + EMATResourceClass XBOX_SERIES : PC { + } + EMATResourceClass PS4 : PC { + } + EMATResourceClass PS5 : PC { + } + EMATResourceClass HEADLESS : PC { + } + } +} \ No newline at end of file diff --git a/addons/medical_circulation/Assets/Items/Medicine/NaloxoneInjection/Data/ACE_Medical_NaloxoneInjection.png b/addons/medical_circulation/Assets/Items/Medicine/NaloxoneInjection/Data/ACE_Medical_NaloxoneInjection.png new file mode 100644 index 000000000..f48ecf97f Binary files /dev/null and b/addons/medical_circulation/Assets/Items/Medicine/NaloxoneInjection/Data/ACE_Medical_NaloxoneInjection.png differ diff --git a/addons/medical_circulation/Assets/Items/Medicine/PhenylephrineInjection/Data/ACE_Medical_PhenylephrineInjection.edds b/addons/medical_circulation/Assets/Items/Medicine/PhenylephrineInjection/Data/ACE_Medical_PhenylephrineInjection.edds new file mode 100644 index 000000000..765bb4941 Binary files /dev/null and b/addons/medical_circulation/Assets/Items/Medicine/PhenylephrineInjection/Data/ACE_Medical_PhenylephrineInjection.edds differ diff --git a/addons/medical_circulation/Assets/Items/Medicine/PhenylephrineInjection/Data/ACE_Medical_PhenylephrineInjection.edds.meta b/addons/medical_circulation/Assets/Items/Medicine/PhenylephrineInjection/Data/ACE_Medical_PhenylephrineInjection.edds.meta new file mode 100644 index 000000000..179f957ac --- /dev/null +++ b/addons/medical_circulation/Assets/Items/Medicine/PhenylephrineInjection/Data/ACE_Medical_PhenylephrineInjection.edds.meta @@ -0,0 +1,17 @@ +MetaFileClass { + Name "{3E2C0EF430599C94}Assets/Items/Medicine/PhenylephrineInjection/Data/ACE_Medical_PhenylephrineInjection.edds" + Configurations { + PNGResourceClass PC : "{DC555BD399D92412}Configs/System/ResourceTypes/PC/TextureUnspecified.conf" { + } + PNGResourceClass XBOX_ONE : "{8F13AE697AE60784}Configs/System/ResourceTypes/XBOX_ONE/TextureUnspecified.conf" { + } + PNGResourceClass XBOX_SERIES : "{D28E01700D90F52C}Configs/System/ResourceTypes/XBOX_SERIES/TextureUnspecified.conf" { + } + PNGResourceClass PS4 : "{C6CD3D8752652D2A}Configs/System/ResourceTypes/PS4/TextureUnspecified.conf" { + } + PNGResourceClass PS5 : "{6248F71B9D7C1E93}Configs/System/ResourceTypes/PS5/TextureUnspecified.conf" { + } + PNGResourceClass HEADLESS : "{699C82A6807668A7}Configs/System/ResourceTypes/HEADLESS/TextureUnspecified.conf" { + } + } +} \ No newline at end of file diff --git a/addons/medical_circulation/Assets/Items/Medicine/PhenylephrineInjection/Data/ACE_Medical_PhenylephrineInjection.emat b/addons/medical_circulation/Assets/Items/Medicine/PhenylephrineInjection/Data/ACE_Medical_PhenylephrineInjection.emat new file mode 100644 index 000000000..805be8d65 --- /dev/null +++ b/addons/medical_circulation/Assets/Items/Medicine/PhenylephrineInjection/Data/ACE_Medical_PhenylephrineInjection.emat @@ -0,0 +1,9 @@ +MatPBRBasic { + SpecularIBL 0.479 0.479 0.479 1 + Specular 0.913 0.879 0.865 1 + SpecularMul 0.821 + RoughnessScale 0.5 + MetalnessScale 0 + DielectricReflectance 0.16 + BCRMap "{3E2C0EF430599C94}Assets/Items/Medicine/PhenylephrineInjection/Data/ACE_Medical_PhenylephrineInjection.edds" +} \ No newline at end of file diff --git a/addons/medical_circulation/Assets/Items/Medicine/PhenylephrineInjection/Data/ACE_Medical_PhenylephrineInjection.emat.meta b/addons/medical_circulation/Assets/Items/Medicine/PhenylephrineInjection/Data/ACE_Medical_PhenylephrineInjection.emat.meta new file mode 100644 index 000000000..0c6ef8d9b --- /dev/null +++ b/addons/medical_circulation/Assets/Items/Medicine/PhenylephrineInjection/Data/ACE_Medical_PhenylephrineInjection.emat.meta @@ -0,0 +1,17 @@ +MetaFileClass { + Name "{646DB64448CDBDA5}Assets/Items/Medicine/PhenylephrineInjection/Data/ACE_Medical_PhenylephrineInjection.emat" + Configurations { + EMATResourceClass PC { + } + EMATResourceClass XBOX_ONE : PC { + } + EMATResourceClass XBOX_SERIES : PC { + } + EMATResourceClass PS4 : PC { + } + EMATResourceClass PS5 : PC { + } + EMATResourceClass HEADLESS : PC { + } + } +} \ No newline at end of file diff --git a/addons/medical_circulation/Assets/Items/Medicine/PhenylephrineInjection/Data/ACE_Medical_PhenylephrineInjection.png b/addons/medical_circulation/Assets/Items/Medicine/PhenylephrineInjection/Data/ACE_Medical_PhenylephrineInjection.png new file mode 100644 index 000000000..65b59b6e2 Binary files /dev/null and b/addons/medical_circulation/Assets/Items/Medicine/PhenylephrineInjection/Data/ACE_Medical_PhenylephrineInjection.png differ diff --git a/addons/medical_circulation/Configs/ACE/ACE_AnimationHelpers.conf b/addons/medical_circulation/Configs/ACE/ACE_AnimationHelpers.conf new file mode 100644 index 000000000..5a34ddefe --- /dev/null +++ b/addons/medical_circulation/Configs/ACE/ACE_AnimationHelpers.conf @@ -0,0 +1,8 @@ +ACE_AnimationHelpersConfig { + m_aEntries { + ACE_AnimationHelperConfigEntry "{65E0FA0BC02325CD}" { + m_eID CPR + m_sPrefabName "{604E93B236B19A29}Prefabs/Helpers/ACE_Medical_CPRHelperCompartment.et" + } + } +} \ No newline at end of file diff --git a/addons/core/Configs/EntityCatalog/US/US_InventoryItems.conf.meta b/addons/medical_circulation/Configs/ACE/ACE_AnimationHelpers.conf.meta similarity index 77% rename from addons/core/Configs/EntityCatalog/US/US_InventoryItems.conf.meta rename to addons/medical_circulation/Configs/ACE/ACE_AnimationHelpers.conf.meta index f496e754c..6fa89c468 100644 --- a/addons/core/Configs/EntityCatalog/US/US_InventoryItems.conf.meta +++ b/addons/medical_circulation/Configs/ACE/ACE_AnimationHelpers.conf.meta @@ -1,5 +1,5 @@ MetaFileClass { - Name "{5F7EC52FC40A03E2}Configs/EntityCatalog/US/US_InventoryItems.conf" + Name "{49EB6E775F6E8519}Configs/ACE/ACE_AnimationHelpers.conf" Configurations { CONFResourceClass PC { } diff --git a/addons/medical_circulation/Configs/ACE/Settings.conf b/addons/medical_circulation/Configs/ACE/Settings.conf new file mode 100644 index 000000000..819daf4e0 --- /dev/null +++ b/addons/medical_circulation/Configs/ACE/Settings.conf @@ -0,0 +1,136 @@ +ACE_SettingsConfig { + m_aInitialModSettings { + ACE_Medical_Circulation_Settings "{65D2FB432916B718}" { + m_UnstableThresholds ACE_Medical_VitalStateThresholdsConfig "{623A6BE958DE994D}" { + m_fHeartRateLowBPM 40 + m_fHeartRateHighBPM 220 + m_fMeanArterialPressureLowKPA 7.11 + m_fMeanArterialPressureHighKPA 29.5 + m_fMaxHeartForMeanArterialPressureLowBPM 80 + m_eBloodState CLASS_2_HEMORRHAGE + } + m_CriticalThresholds ACE_Medical_VitalStateThresholdsConfig "{623A6BE9593D9FCC}" { + m_fHeartRateLowBPM 30 + m_fHeartRateHighBPM 220 + m_fMeanArterialPressureLowKPA 5.21 + m_fMeanArterialPressureHighKPA 29.5 + m_fMaxHeartForMeanArterialPressureLowBPM 40 + m_eBloodState CLASS_3_HEMORRHAGE + } + m_CardiacArrestThresholds ACE_Medical_VitalStateThresholdsConfig "{623A6BE95ECF7B07}" { + m_fHeartRateLowBPM 20 + m_fHeartRateHighBPM 220 + m_fMeanArterialPressureLowKPA 5.21 + m_fMeanArterialPressureHighKPA 29.5 + m_fMaxHeartForMeanArterialPressureLowBPM 30 + m_eBloodState CLASS_4_HEMORRHAGE + } + m_CardiacArrestDamageEffect ACE_Medical_CardiacArrestDamageEffect "{622ECE676AA733F5}" { + } + } + ACE_Medical_Medication_Settings "{65D2FB435BB9FF96}" { + m_aPharmacokineticsConfigs { + ACE_Medical_PharmacokineticsConfig "{62263CD083087EC6}" { + m_eType EPINEPHRINE + m_fActivationRateConstant 0.05193617 + m_fDeactivationRateConstant 0.03441518 + } + ACE_Medical_PharmacokineticsConfig "{62263CD08392765F}" { + m_eType METOPROLOL + m_fActivationRateConstant 0.03872958 + m_fDeactivationRateConstant 0.03872936 + } + ACE_Medical_PharmacokineticsConfig "{62263CD08342FEF0}" { + m_eType MORPHINE + m_fActivationRateConstant 0.03090123 + m_fDeactivationRateConstant 0.0009 + } + ACE_Medical_PharmacokineticsConfig "{62263CD0837DD8F5}" { + m_eType NALOXONE + m_fActivationRateConstant 0.02911635 + m_fDeactivationRateConstant 0.0022 + } + ACE_Medical_PharmacokineticsConfig "{62263CD0BBEB0D63}" { + m_eType PHENYLEPHRINE + m_fActivationRateConstant 0.03007057 + m_fDeactivationRateConstant 0.0386053 + } + } + m_aPharmacodynamicsConfigs { + ACE_Medical_BloodFlowScaleDrugEffect "{62263CDBD4D641B4}" { + m_aDrugConfigs { + ACE_Medical_PharmacodynamicsConfig "{62263CDBCA2CF8F9}" { + m_eType PHENYLEPHRINE + m_fEC50 156.231 + } + } + m_fMaxEffect 0.55 + } + ACE_Medical_HeartRateEffect "{622630B39840E673}" { + m_aDrugConfigs { + ACE_Medical_PharmacodynamicsConfig "{62263CDA78F2C735}" { + m_eType EPINEPHRINE + m_fEC50 9.724 + } + ACE_Medical_PharmacodynamicsConfig "{62263CD888DF923E}" { + m_eType METOPROLOL + m_fEC50 -10.674 + } + ACE_Medical_PharmacodynamicsConfig "{62263CDA7F7415E3}" { + m_eType MORPHINE + m_fEC50 -41.337 + m_aAntagonistConfigs { + ACE_Medical_PharmacodynamicsConfig "{62263CDA696D857F}" { + m_eType NALOXONE + m_fEC50 120 + } + } + } + } + } + ACE_Medical_PainSuppressionDrugEffect "{62263CDB98E0806D}" { + m_aDrugConfigs { + ACE_Medical_PharmacodynamicsConfig "{62263CDB9C28446E}" { + m_eType MORPHINE + m_fEC50 300.964 + m_fGamma 2.7 + m_aAntagonistConfigs { + ACE_Medical_PharmacodynamicsConfig "{62263CDB918FDA44}" { + m_eType NALOXONE + m_fEC50 120 + } + } + } + } + } + ACE_Medical_ReviveSuccessDrugEffect "{622A920047B9C4B1}" { + m_aDrugConfigs { + ACE_Medical_PharmacodynamicsConfig "{622A920078A26C4C}" { + m_fEC50 100 + m_fGamma 2 + } + } + m_fMaxEffect 0.5 + } + ACE_Medical_SystemicVascularResistencDrugEffect "{62263CDBB1786D9E}" { + m_aDrugConfigs { + ACE_Medical_PharmacodynamicsConfig "{62263CDBA9A16B7C}" { + m_eType MORPHINE + m_fEC50 -6747324 + m_aAntagonistConfigs { + ACE_Medical_PharmacodynamicsConfig "{62263CDBDD44C11A}" { + m_eType NALOXONE + m_fEC50 120 + } + } + } + ACE_Medical_PharmacodynamicsConfig "{62263CD1D6F876E8}" { + m_eType PHENYLEPHRINE + m_fEC50 273140.375 + } + } + } + } + } + } +} \ No newline at end of file diff --git a/addons/medical_circulation/Configs/ACE/Settings.conf.meta b/addons/medical_circulation/Configs/ACE/Settings.conf.meta new file mode 100644 index 000000000..094ecd2fc --- /dev/null +++ b/addons/medical_circulation/Configs/ACE/Settings.conf.meta @@ -0,0 +1,17 @@ +MetaFileClass { + Name "{A305FEB7400A2965}Configs/ACE/Settings.conf" + Configurations { + CONFResourceClass PC { + } + CONFResourceClass XBOX_ONE : PC { + } + CONFResourceClass XBOX_SERIES : PC { + } + CONFResourceClass PS4 : PC { + } + CONFResourceClass PS5 : PC { + } + CONFResourceClass HEADLESS : PC { + } + } +} \ No newline at end of file diff --git a/addons/medical_circulation/Configs/Editor/Tooltips/EntityTooltips.conf b/addons/medical_circulation/Configs/Editor/Tooltips/EntityTooltips.conf new file mode 100644 index 000000000..0f932f95d --- /dev/null +++ b/addons/medical_circulation/Configs/Editor/Tooltips/EntityTooltips.conf @@ -0,0 +1,16 @@ +SCR_EntityTooltipConfig { + m_aDetailTypes { + SCR_EntityTooltipDetailType "{546674DF20D07CF0}" { + m_aDetails { + ACE_Medical_BrainTooltipDetail "{6624FDAA05347450}" { + m_sDisplayName "#ACE_Medical-Editor_TooltipDetail_Brain_Name" + m_Layout "{771F6010E0CA2F0B}UI/layouts/Editor/Tooltips/TooltipPrefabs/TooltipPrefab_ProgressBar.layout" + } + ACE_Medical_VitalSignsTooltipDetail "{6230E5C18CFC457C}" { + m_sDisplayName "#ACE_Medical-Editor_TooltipDetail_VitalSigns_Name" + m_Layout "{93AF6A0EA7571B84}UI/layouts/Editor/Tooltips/TooltipPrefabs/TooltipPrefab_Text.layout" + } + } + } + } +} \ No newline at end of file diff --git a/addons/medical_circulation/Configs/Editor/Tooltips/EntityTooltips.conf.meta b/addons/medical_circulation/Configs/Editor/Tooltips/EntityTooltips.conf.meta new file mode 100644 index 000000000..725e4888f --- /dev/null +++ b/addons/medical_circulation/Configs/Editor/Tooltips/EntityTooltips.conf.meta @@ -0,0 +1,17 @@ +MetaFileClass { + Name "{96EFE81470EF9AA5}Configs/Editor/Tooltips/EntityTooltips.conf" + Configurations { + CONFResourceClass PC { + } + CONFResourceClass XBOX_ONE : PC { + } + CONFResourceClass XBOX_SERIES : PC { + } + CONFResourceClass PS4 : PC { + } + CONFResourceClass PS5 : PC { + } + CONFResourceClass HEADLESS : PC { + } + } +} \ No newline at end of file diff --git a/addons/medical_circulation/Configs/EntityCatalog/ACE_InventoryItems_EntityCatalog_Medical.conf b/addons/medical_circulation/Configs/EntityCatalog/ACE_InventoryItems_EntityCatalog_Medical.conf new file mode 100644 index 000000000..1b56e2b58 --- /dev/null +++ b/addons/medical_circulation/Configs/EntityCatalog/ACE_InventoryItems_EntityCatalog_Medical.conf @@ -0,0 +1,44 @@ +ACE_EntityCatalogMultiListEntry { + m_aEntities { + SCR_EntityCatalogInventoryItem "{62211775457BAED2}" { + m_sEntityPrefab "{D0434D5215B54181}Prefabs/Items/Medicine/MetoprololInjection/ACE_Medical_MetoprololInjection.et" + m_aEntityDataList { + SCR_ArsenalItem "{622117757B62316A}" { + m_eItemType HEAL + m_eItemMode CONSUMABLE + m_iSupplyCost 3 + } + } + } + SCR_EntityCatalogInventoryItem "{621956F50AF470EE}" { + m_sEntityPrefab "{58CF3AB87C441295}Prefabs/Items/Medicine/AmmoniumCarbonatePackage/ACE_Medical_AmmoniumCarbonatePackage.et" + m_aEntityDataList { + SCR_ArsenalItem "{621956F46FDCDDCB}" { + m_eItemType HEAL + m_eItemMode CONSUMABLE + m_iSupplyCost 3 + } + } + } + SCR_EntityCatalogInventoryItem "{62211775EA7405E8}" { + m_sEntityPrefab "{02DD34077F51F65E}Prefabs/Items/Medicine/NaloxoneInjection/ACE_Medical_NaloxoneInjection.et" + m_aEntityDataList { + SCR_ArsenalItem "{62211775E99A9627}" { + m_eItemType HEAL + m_eItemMode CONSUMABLE + m_iSupplyCost 3 + } + } + } + SCR_EntityCatalogInventoryItem "{6221175BA4F3BFD4}" { + m_sEntityPrefab "{9BBA766CD869002C}Prefabs/Items/Medicine/PhenylephrineInjection/ACE_Medical_PhenylephrineInjection.et" + m_aEntityDataList { + SCR_ArsenalItem "{6221175BD9C79636}" { + m_eItemType HEAL + m_eItemMode CONSUMABLE + m_iSupplyCost 3 + } + } + } + } +} \ No newline at end of file diff --git a/addons/medical_circulation/Configs/EntityCatalog/ACE_InventoryItems_EntityCatalog_Medical.conf.meta b/addons/medical_circulation/Configs/EntityCatalog/ACE_InventoryItems_EntityCatalog_Medical.conf.meta new file mode 100644 index 000000000..a7d63222d --- /dev/null +++ b/addons/medical_circulation/Configs/EntityCatalog/ACE_InventoryItems_EntityCatalog_Medical.conf.meta @@ -0,0 +1,17 @@ +MetaFileClass { + Name "{A5E3827C546B8210}Configs/EntityCatalog/ACE_InventoryItems_EntityCatalog_Medical.conf" + Configurations { + CONFResourceClass PC { + } + CONFResourceClass XBOX_ONE : PC { + } + CONFResourceClass XBOX_SERIES : PC { + } + CONFResourceClass PS4 : PC { + } + CONFResourceClass PS5 : PC { + } + CONFResourceClass HEADLESS : PC { + } + } +} \ No newline at end of file diff --git a/addons/medical_circulation/Configs/Notifications/Notifications.conf b/addons/medical_circulation/Configs/Notifications/Notifications.conf new file mode 100644 index 000000000..5c261b898 --- /dev/null +++ b/addons/medical_circulation/Configs/Notifications/Notifications.conf @@ -0,0 +1,18 @@ +SCR_NotificationConfig { + m_aNotificationDisplayData { + SCR_NotificationNumber "{621737CA15A0F891}" { + m_NotificationKey ACE_MEDICAL_PULSE_RESULT + m_info SCR_UINotificationInfo "{621737CA273A296E}" { + Name "#ACE_Medical-Notification_PULSE_RESULT" + m_cNotificationColor WARNING + } + } + SCR_NotificationNumber "{621737CBFD7730E8}" { + m_NotificationKey ACE_MEDICAL_BLOOD_PRESSURE_RESULT + m_info SCR_UINotificationInfo "{621737CBF77F9D73}" { + Name "#ACE_Medical-Notification_BLOOD_PRESSURE_RESULT" + m_cNotificationColor WARNING + } + } + } +} \ No newline at end of file diff --git a/addons/medical_circulation/Configs/Notifications/Notifications.conf.meta b/addons/medical_circulation/Configs/Notifications/Notifications.conf.meta new file mode 100644 index 000000000..204ebf460 --- /dev/null +++ b/addons/medical_circulation/Configs/Notifications/Notifications.conf.meta @@ -0,0 +1,17 @@ +MetaFileClass { + Name "{7134157CA6B1FA8E}Configs/Notifications/Notifications.conf" + Configurations { + CONFResourceClass PC { + } + CONFResourceClass XBOX_ONE : PC { + } + CONFResourceClass XBOX_SERIES : PC { + } + CONFResourceClass PS4 : PC { + } + CONFResourceClass PS5 : PC { + } + CONFResourceClass HEADLESS : PC { + } + } +} \ No newline at end of file diff --git a/addons/medical_circulation/Configs/Systems/ChimeraSystemsConfig.conf b/addons/medical_circulation/Configs/Systems/ChimeraSystemsConfig.conf new file mode 100644 index 000000000..147de66ae --- /dev/null +++ b/addons/medical_circulation/Configs/Systems/ChimeraSystemsConfig.conf @@ -0,0 +1,16 @@ +SystemSettings : "{45C53F06BA17238D}configs/Systems/SystemsConfig.conf" { + Systems { + ACE_Medical_VitalStatesSystem "{65DF4B9677A471ED}" { + SystemLocation Server + SystemPoints 0x10 0x10 + m_pScheduler ACE_Medical_VitalStates_JobScheduler "{65DF62F165EE6998}" { + } + } + ACE_Medical_MedicationSystem "{65DF4B967B516FB5}" { + SystemLocation Server + SystemPoints 0x10 0x10 + m_pScheduler ACE_Medical_Medication_JobScheduler "{65DF62FE98592539}" { + } + } + } +} \ No newline at end of file diff --git a/addons/medical_circulation/Configs/Systems/ChimeraSystemsConfig.conf.meta b/addons/medical_circulation/Configs/Systems/ChimeraSystemsConfig.conf.meta new file mode 100644 index 000000000..06c5eb99e --- /dev/null +++ b/addons/medical_circulation/Configs/Systems/ChimeraSystemsConfig.conf.meta @@ -0,0 +1,17 @@ +MetaFileClass { + Name "{86E953538A28A98D}Configs/Systems/ChimeraSystemsConfig.conf" + Configurations { + CONFResourceClass PC { + } + CONFResourceClass XBOX_ONE : PC { + } + CONFResourceClass XBOX_SERIES : PC { + } + CONFResourceClass PS4 : PC { + } + CONFResourceClass PS5 : PC { + } + CONFResourceClass HEADLESS : PC { + } + } +} \ No newline at end of file diff --git a/addons/medical_circulation/Language/ACE_Medical_Circulation_localization.cs_cz.conf b/addons/medical_circulation/Language/ACE_Medical_Circulation_localization.cs_cz.conf new file mode 100644 index 000000000..ee73d90cb --- /dev/null +++ b/addons/medical_circulation/Language/ACE_Medical_Circulation_localization.cs_cz.conf @@ -0,0 +1,68 @@ +StringTableRuntime { + Ids { + "ACE_Medical-AmmoniumCarbonatePackageAction" + "ACE_Medical-BloodState_Class1" + "ACE_Medical-BloodState_Class2" + "ACE_Medical-BloodState_Class3" + "ACE_Medical-BloodState_Class4" + "ACE_Medical-CheckBloodPressureAction" + "ACE_Medical-CheckPulseAction" + "ACE_Medical-CPRAction" + "ACE_Medical-Editor_TooltipDetail_Brain_Name" + "ACE_Medical-Editor_TooltipDetail_VitalSigns_Name" + "ACE_Medical-FailReason_NotOnBack" + "ACE_Medical-InfoWidget_AmmoniumCarbonate" + "ACE_Medical-InfoWidget_Epinephrine" + "ACE_Medical-InfoWidget_Metoprolol" + "ACE_Medical-InfoWidget_Naloxone" + "ACE_Medical-InfoWidget_Phenylephrine" + "ACE_Medical-Item_AmmoniumCarbonate_Description" + "ACE_Medical-Item_AmmoniumCarbonate_Name" + "ACE_Medical-Item_Epinephrine_Description" + "ACE_Medical-Item_Epinephrine_Name" + "ACE_Medical-Item_Metoprolol_Description" + "ACE_Medical-Item_Metoprolol_Name" + "ACE_Medical-Item_Naloxone_Description" + "ACE_Medical-Item_Naloxone_Name" + "ACE_Medical-Item_Phenylephrine_Description" + "ACE_Medical-Item_Phenylephrine_Name" + "ACE_Medical-MetoprololInjectionAction" + "ACE_Medical-NaloxoneInjectionAction" + "ACE_Medical-Notification_BLOOD_PRESSURE_RESULT" + "ACE_Medical-Notification_PULSE_RESULT" + "ACE_Medical-PhenylephrineInjectionAction" + } + Texts { + "Hold under nose" + "Class I hemorrhage" + "Class II hemorrhage" + "Class III hemorrhage" + "Class IV hemorrhage" + "Check blood pressure" + "Check pulse" + "Perform CPR" + "Brain" + "Vital signs" + "Not on back" + "Increases wake-up chance" + "Increases heart rate" + "Decreases heart rate" + "Antagonist for opioids like morphine" + "Increases blood pressure and slows down bleeding and transfusion" + "Administered to unconscious patients." + "Ammonium Carbonate" + "Administered to patients in cardiac arrest" + "Epinephrine" + "Administered to patients with too high heart rate" + "Metoprolol" + "Administered to patients with opioid overdose" + "Naloxone" + "Administered to patients for raising blood pressure" + "Phenylephrine" + "Inject metoprolol" + "Inject naloxone" + "You find a blood pressure of %1/%2 mmHg" + "You find a heart rate of %1" + "Inject phenylephrine" + } +} \ No newline at end of file diff --git a/addons/medical_circulation/Language/ACE_Medical_Circulation_localization.cs_cz.conf.meta b/addons/medical_circulation/Language/ACE_Medical_Circulation_localization.cs_cz.conf.meta new file mode 100644 index 000000000..a7816face --- /dev/null +++ b/addons/medical_circulation/Language/ACE_Medical_Circulation_localization.cs_cz.conf.meta @@ -0,0 +1,17 @@ +MetaFileClass { + Name "{6903D9F8F45FDC93}Language/ACE_Medical_Circulation_localization.cs_cz.conf" + Configurations { + CONFResourceClass PC { + } + CONFResourceClass XBOX_ONE : PC { + } + CONFResourceClass XBOX_SERIES : PC { + } + CONFResourceClass PS4 : PC { + } + CONFResourceClass PS5 : PC { + } + CONFResourceClass HEADLESS : PC { + } + } +} \ No newline at end of file diff --git a/addons/medical_circulation/Language/ACE_Medical_Circulation_localization.de_de.conf b/addons/medical_circulation/Language/ACE_Medical_Circulation_localization.de_de.conf new file mode 100644 index 000000000..927ef5492 --- /dev/null +++ b/addons/medical_circulation/Language/ACE_Medical_Circulation_localization.de_de.conf @@ -0,0 +1,68 @@ +StringTableRuntime { + Ids { + "ACE_Medical-AmmoniumCarbonatePackageAction" + "ACE_Medical-BloodState_Class1" + "ACE_Medical-BloodState_Class2" + "ACE_Medical-BloodState_Class3" + "ACE_Medical-BloodState_Class4" + "ACE_Medical-CheckBloodPressureAction" + "ACE_Medical-CheckPulseAction" + "ACE_Medical-CPRAction" + "ACE_Medical-Editor_TooltipDetail_Brain_Name" + "ACE_Medical-Editor_TooltipDetail_VitalSigns_Name" + "ACE_Medical-FailReason_NotOnBack" + "ACE_Medical-InfoWidget_AmmoniumCarbonate" + "ACE_Medical-InfoWidget_Epinephrine" + "ACE_Medical-InfoWidget_Metoprolol" + "ACE_Medical-InfoWidget_Naloxone" + "ACE_Medical-InfoWidget_Phenylephrine" + "ACE_Medical-Item_AmmoniumCarbonate_Description" + "ACE_Medical-Item_AmmoniumCarbonate_Name" + "ACE_Medical-Item_Epinephrine_Description" + "ACE_Medical-Item_Epinephrine_Name" + "ACE_Medical-Item_Metoprolol_Description" + "ACE_Medical-Item_Metoprolol_Name" + "ACE_Medical-Item_Naloxone_Description" + "ACE_Medical-Item_Naloxone_Name" + "ACE_Medical-Item_Phenylephrine_Description" + "ACE_Medical-Item_Phenylephrine_Name" + "ACE_Medical-MetoprololInjectionAction" + "ACE_Medical-NaloxoneInjectionAction" + "ACE_Medical-Notification_BLOOD_PRESSURE_RESULT" + "ACE_Medical-Notification_PULSE_RESULT" + "ACE_Medical-PhenylephrineInjectionAction" + } + Texts { + "Unter die Nase halten" + "Blutung Klasse 1" + "Blutung Klasse 2" + "Blutung Klasse 3" + "Blutung Klasse 4" + "Blutdruck überprüfen" + "Puls überprüfen" + "CPR durchführen" + "Gehirn" + "Vitaldaten" + "Nicht auf dem Rücken" + "Erhöht die Wahrscheinlichkeit des Aufwachens" + "Erhöht die Herzfrequenz" + "Sinkt die Herzfrequenz" + "Antagonist für Opioide wie Morphin" + "Erhöht den Blutdrucks und verlangsamt Blutung und Transfusion" + "Verabreicht an bewusstlose Patienten." + "Ammoniumcarbonat" + "Verabreicht an Patienten mit Herzstillstand" + "Epinephrin" + "Verabreicht an Patienten mit überhöhter Herzfrequenz" + "Metoprolol" + "Verabreicht an Patienten mit Opioidüberdosis" + "Naloxon" + "Verabreicht an Patienten um den Blutdruck zu erhöhen" + "Phenylephrin" + "Metoprolol injizieren" + "Naloxon injizieren" + "Der Blutdruck liegt bei %1/%2 mmHg" + "Herzfrequenz ist %1" + "Phenylephrin injizieren" + } +} \ No newline at end of file diff --git a/addons/medical_circulation/Language/ACE_Medical_Circulation_localization.de_de.conf.meta b/addons/medical_circulation/Language/ACE_Medical_Circulation_localization.de_de.conf.meta new file mode 100644 index 000000000..f818d9628 --- /dev/null +++ b/addons/medical_circulation/Language/ACE_Medical_Circulation_localization.de_de.conf.meta @@ -0,0 +1,17 @@ +MetaFileClass { + Name "{BC7DC3CBE7FCCDB3}Language/ACE_Medical_Circulation_localization.de_de.conf" + Configurations { + CONFResourceClass PC { + } + CONFResourceClass XBOX_ONE : PC { + } + CONFResourceClass XBOX_SERIES : PC { + } + CONFResourceClass PS4 : PC { + } + CONFResourceClass PS5 : PC { + } + CONFResourceClass HEADLESS : PC { + } + } +} \ No newline at end of file diff --git a/addons/medical_circulation/Language/ACE_Medical_Circulation_localization.en_us.conf b/addons/medical_circulation/Language/ACE_Medical_Circulation_localization.en_us.conf new file mode 100644 index 000000000..ee73d90cb --- /dev/null +++ b/addons/medical_circulation/Language/ACE_Medical_Circulation_localization.en_us.conf @@ -0,0 +1,68 @@ +StringTableRuntime { + Ids { + "ACE_Medical-AmmoniumCarbonatePackageAction" + "ACE_Medical-BloodState_Class1" + "ACE_Medical-BloodState_Class2" + "ACE_Medical-BloodState_Class3" + "ACE_Medical-BloodState_Class4" + "ACE_Medical-CheckBloodPressureAction" + "ACE_Medical-CheckPulseAction" + "ACE_Medical-CPRAction" + "ACE_Medical-Editor_TooltipDetail_Brain_Name" + "ACE_Medical-Editor_TooltipDetail_VitalSigns_Name" + "ACE_Medical-FailReason_NotOnBack" + "ACE_Medical-InfoWidget_AmmoniumCarbonate" + "ACE_Medical-InfoWidget_Epinephrine" + "ACE_Medical-InfoWidget_Metoprolol" + "ACE_Medical-InfoWidget_Naloxone" + "ACE_Medical-InfoWidget_Phenylephrine" + "ACE_Medical-Item_AmmoniumCarbonate_Description" + "ACE_Medical-Item_AmmoniumCarbonate_Name" + "ACE_Medical-Item_Epinephrine_Description" + "ACE_Medical-Item_Epinephrine_Name" + "ACE_Medical-Item_Metoprolol_Description" + "ACE_Medical-Item_Metoprolol_Name" + "ACE_Medical-Item_Naloxone_Description" + "ACE_Medical-Item_Naloxone_Name" + "ACE_Medical-Item_Phenylephrine_Description" + "ACE_Medical-Item_Phenylephrine_Name" + "ACE_Medical-MetoprololInjectionAction" + "ACE_Medical-NaloxoneInjectionAction" + "ACE_Medical-Notification_BLOOD_PRESSURE_RESULT" + "ACE_Medical-Notification_PULSE_RESULT" + "ACE_Medical-PhenylephrineInjectionAction" + } + Texts { + "Hold under nose" + "Class I hemorrhage" + "Class II hemorrhage" + "Class III hemorrhage" + "Class IV hemorrhage" + "Check blood pressure" + "Check pulse" + "Perform CPR" + "Brain" + "Vital signs" + "Not on back" + "Increases wake-up chance" + "Increases heart rate" + "Decreases heart rate" + "Antagonist for opioids like morphine" + "Increases blood pressure and slows down bleeding and transfusion" + "Administered to unconscious patients." + "Ammonium Carbonate" + "Administered to patients in cardiac arrest" + "Epinephrine" + "Administered to patients with too high heart rate" + "Metoprolol" + "Administered to patients with opioid overdose" + "Naloxone" + "Administered to patients for raising blood pressure" + "Phenylephrine" + "Inject metoprolol" + "Inject naloxone" + "You find a blood pressure of %1/%2 mmHg" + "You find a heart rate of %1" + "Inject phenylephrine" + } +} \ No newline at end of file diff --git a/addons/medical_circulation/Language/ACE_Medical_Circulation_localization.en_us.conf.meta b/addons/medical_circulation/Language/ACE_Medical_Circulation_localization.en_us.conf.meta new file mode 100644 index 000000000..640df6464 --- /dev/null +++ b/addons/medical_circulation/Language/ACE_Medical_Circulation_localization.en_us.conf.meta @@ -0,0 +1,17 @@ +MetaFileClass { + Name "{E28D49808D0FC8B2}Language/ACE_Medical_Circulation_localization.en_us.conf" + Configurations { + CONFResourceClass PC { + } + CONFResourceClass XBOX_ONE : PC { + } + CONFResourceClass XBOX_SERIES : PC { + } + CONFResourceClass PS4 : PC { + } + CONFResourceClass PS5 : PC { + } + CONFResourceClass HEADLESS : PC { + } + } +} \ No newline at end of file diff --git a/addons/medical_circulation/Language/ACE_Medical_Circulation_localization.es_es.conf b/addons/medical_circulation/Language/ACE_Medical_Circulation_localization.es_es.conf new file mode 100644 index 000000000..ee73d90cb --- /dev/null +++ b/addons/medical_circulation/Language/ACE_Medical_Circulation_localization.es_es.conf @@ -0,0 +1,68 @@ +StringTableRuntime { + Ids { + "ACE_Medical-AmmoniumCarbonatePackageAction" + "ACE_Medical-BloodState_Class1" + "ACE_Medical-BloodState_Class2" + "ACE_Medical-BloodState_Class3" + "ACE_Medical-BloodState_Class4" + "ACE_Medical-CheckBloodPressureAction" + "ACE_Medical-CheckPulseAction" + "ACE_Medical-CPRAction" + "ACE_Medical-Editor_TooltipDetail_Brain_Name" + "ACE_Medical-Editor_TooltipDetail_VitalSigns_Name" + "ACE_Medical-FailReason_NotOnBack" + "ACE_Medical-InfoWidget_AmmoniumCarbonate" + "ACE_Medical-InfoWidget_Epinephrine" + "ACE_Medical-InfoWidget_Metoprolol" + "ACE_Medical-InfoWidget_Naloxone" + "ACE_Medical-InfoWidget_Phenylephrine" + "ACE_Medical-Item_AmmoniumCarbonate_Description" + "ACE_Medical-Item_AmmoniumCarbonate_Name" + "ACE_Medical-Item_Epinephrine_Description" + "ACE_Medical-Item_Epinephrine_Name" + "ACE_Medical-Item_Metoprolol_Description" + "ACE_Medical-Item_Metoprolol_Name" + "ACE_Medical-Item_Naloxone_Description" + "ACE_Medical-Item_Naloxone_Name" + "ACE_Medical-Item_Phenylephrine_Description" + "ACE_Medical-Item_Phenylephrine_Name" + "ACE_Medical-MetoprololInjectionAction" + "ACE_Medical-NaloxoneInjectionAction" + "ACE_Medical-Notification_BLOOD_PRESSURE_RESULT" + "ACE_Medical-Notification_PULSE_RESULT" + "ACE_Medical-PhenylephrineInjectionAction" + } + Texts { + "Hold under nose" + "Class I hemorrhage" + "Class II hemorrhage" + "Class III hemorrhage" + "Class IV hemorrhage" + "Check blood pressure" + "Check pulse" + "Perform CPR" + "Brain" + "Vital signs" + "Not on back" + "Increases wake-up chance" + "Increases heart rate" + "Decreases heart rate" + "Antagonist for opioids like morphine" + "Increases blood pressure and slows down bleeding and transfusion" + "Administered to unconscious patients." + "Ammonium Carbonate" + "Administered to patients in cardiac arrest" + "Epinephrine" + "Administered to patients with too high heart rate" + "Metoprolol" + "Administered to patients with opioid overdose" + "Naloxone" + "Administered to patients for raising blood pressure" + "Phenylephrine" + "Inject metoprolol" + "Inject naloxone" + "You find a blood pressure of %1/%2 mmHg" + "You find a heart rate of %1" + "Inject phenylephrine" + } +} \ No newline at end of file diff --git a/addons/medical_circulation/Language/ACE_Medical_Circulation_localization.es_es.conf.meta b/addons/medical_circulation/Language/ACE_Medical_Circulation_localization.es_es.conf.meta new file mode 100644 index 000000000..d0e759708 --- /dev/null +++ b/addons/medical_circulation/Language/ACE_Medical_Circulation_localization.es_es.conf.meta @@ -0,0 +1,17 @@ +MetaFileClass { + Name "{27C10409630DA3AD}Language/ACE_Medical_Circulation_localization.es_es.conf" + Configurations { + CONFResourceClass PC { + } + CONFResourceClass XBOX_ONE : PC { + } + CONFResourceClass XBOX_SERIES : PC { + } + CONFResourceClass PS4 : PC { + } + CONFResourceClass PS5 : PC { + } + CONFResourceClass HEADLESS : PC { + } + } +} \ No newline at end of file diff --git a/addons/medical_circulation/Language/ACE_Medical_Circulation_localization.fr_fr.conf b/addons/medical_circulation/Language/ACE_Medical_Circulation_localization.fr_fr.conf new file mode 100644 index 000000000..ee73d90cb --- /dev/null +++ b/addons/medical_circulation/Language/ACE_Medical_Circulation_localization.fr_fr.conf @@ -0,0 +1,68 @@ +StringTableRuntime { + Ids { + "ACE_Medical-AmmoniumCarbonatePackageAction" + "ACE_Medical-BloodState_Class1" + "ACE_Medical-BloodState_Class2" + "ACE_Medical-BloodState_Class3" + "ACE_Medical-BloodState_Class4" + "ACE_Medical-CheckBloodPressureAction" + "ACE_Medical-CheckPulseAction" + "ACE_Medical-CPRAction" + "ACE_Medical-Editor_TooltipDetail_Brain_Name" + "ACE_Medical-Editor_TooltipDetail_VitalSigns_Name" + "ACE_Medical-FailReason_NotOnBack" + "ACE_Medical-InfoWidget_AmmoniumCarbonate" + "ACE_Medical-InfoWidget_Epinephrine" + "ACE_Medical-InfoWidget_Metoprolol" + "ACE_Medical-InfoWidget_Naloxone" + "ACE_Medical-InfoWidget_Phenylephrine" + "ACE_Medical-Item_AmmoniumCarbonate_Description" + "ACE_Medical-Item_AmmoniumCarbonate_Name" + "ACE_Medical-Item_Epinephrine_Description" + "ACE_Medical-Item_Epinephrine_Name" + "ACE_Medical-Item_Metoprolol_Description" + "ACE_Medical-Item_Metoprolol_Name" + "ACE_Medical-Item_Naloxone_Description" + "ACE_Medical-Item_Naloxone_Name" + "ACE_Medical-Item_Phenylephrine_Description" + "ACE_Medical-Item_Phenylephrine_Name" + "ACE_Medical-MetoprololInjectionAction" + "ACE_Medical-NaloxoneInjectionAction" + "ACE_Medical-Notification_BLOOD_PRESSURE_RESULT" + "ACE_Medical-Notification_PULSE_RESULT" + "ACE_Medical-PhenylephrineInjectionAction" + } + Texts { + "Hold under nose" + "Class I hemorrhage" + "Class II hemorrhage" + "Class III hemorrhage" + "Class IV hemorrhage" + "Check blood pressure" + "Check pulse" + "Perform CPR" + "Brain" + "Vital signs" + "Not on back" + "Increases wake-up chance" + "Increases heart rate" + "Decreases heart rate" + "Antagonist for opioids like morphine" + "Increases blood pressure and slows down bleeding and transfusion" + "Administered to unconscious patients." + "Ammonium Carbonate" + "Administered to patients in cardiac arrest" + "Epinephrine" + "Administered to patients with too high heart rate" + "Metoprolol" + "Administered to patients with opioid overdose" + "Naloxone" + "Administered to patients for raising blood pressure" + "Phenylephrine" + "Inject metoprolol" + "Inject naloxone" + "You find a blood pressure of %1/%2 mmHg" + "You find a heart rate of %1" + "Inject phenylephrine" + } +} \ No newline at end of file diff --git a/addons/medical_circulation/Language/ACE_Medical_Circulation_localization.fr_fr.conf.meta b/addons/medical_circulation/Language/ACE_Medical_Circulation_localization.fr_fr.conf.meta new file mode 100644 index 000000000..5d70e7bbb --- /dev/null +++ b/addons/medical_circulation/Language/ACE_Medical_Circulation_localization.fr_fr.conf.meta @@ -0,0 +1,17 @@ +MetaFileClass { + Name "{9C69F13E858E40AF}Language/ACE_Medical_Circulation_localization.fr_fr.conf" + Configurations { + CONFResourceClass PC { + } + CONFResourceClass XBOX_ONE : PC { + } + CONFResourceClass XBOX_SERIES : PC { + } + CONFResourceClass PS4 : PC { + } + CONFResourceClass PS5 : PC { + } + CONFResourceClass HEADLESS : PC { + } + } +} \ No newline at end of file diff --git a/addons/medical_circulation/Language/ACE_Medical_Circulation_localization.it_it.conf b/addons/medical_circulation/Language/ACE_Medical_Circulation_localization.it_it.conf new file mode 100644 index 000000000..ee73d90cb --- /dev/null +++ b/addons/medical_circulation/Language/ACE_Medical_Circulation_localization.it_it.conf @@ -0,0 +1,68 @@ +StringTableRuntime { + Ids { + "ACE_Medical-AmmoniumCarbonatePackageAction" + "ACE_Medical-BloodState_Class1" + "ACE_Medical-BloodState_Class2" + "ACE_Medical-BloodState_Class3" + "ACE_Medical-BloodState_Class4" + "ACE_Medical-CheckBloodPressureAction" + "ACE_Medical-CheckPulseAction" + "ACE_Medical-CPRAction" + "ACE_Medical-Editor_TooltipDetail_Brain_Name" + "ACE_Medical-Editor_TooltipDetail_VitalSigns_Name" + "ACE_Medical-FailReason_NotOnBack" + "ACE_Medical-InfoWidget_AmmoniumCarbonate" + "ACE_Medical-InfoWidget_Epinephrine" + "ACE_Medical-InfoWidget_Metoprolol" + "ACE_Medical-InfoWidget_Naloxone" + "ACE_Medical-InfoWidget_Phenylephrine" + "ACE_Medical-Item_AmmoniumCarbonate_Description" + "ACE_Medical-Item_AmmoniumCarbonate_Name" + "ACE_Medical-Item_Epinephrine_Description" + "ACE_Medical-Item_Epinephrine_Name" + "ACE_Medical-Item_Metoprolol_Description" + "ACE_Medical-Item_Metoprolol_Name" + "ACE_Medical-Item_Naloxone_Description" + "ACE_Medical-Item_Naloxone_Name" + "ACE_Medical-Item_Phenylephrine_Description" + "ACE_Medical-Item_Phenylephrine_Name" + "ACE_Medical-MetoprololInjectionAction" + "ACE_Medical-NaloxoneInjectionAction" + "ACE_Medical-Notification_BLOOD_PRESSURE_RESULT" + "ACE_Medical-Notification_PULSE_RESULT" + "ACE_Medical-PhenylephrineInjectionAction" + } + Texts { + "Hold under nose" + "Class I hemorrhage" + "Class II hemorrhage" + "Class III hemorrhage" + "Class IV hemorrhage" + "Check blood pressure" + "Check pulse" + "Perform CPR" + "Brain" + "Vital signs" + "Not on back" + "Increases wake-up chance" + "Increases heart rate" + "Decreases heart rate" + "Antagonist for opioids like morphine" + "Increases blood pressure and slows down bleeding and transfusion" + "Administered to unconscious patients." + "Ammonium Carbonate" + "Administered to patients in cardiac arrest" + "Epinephrine" + "Administered to patients with too high heart rate" + "Metoprolol" + "Administered to patients with opioid overdose" + "Naloxone" + "Administered to patients for raising blood pressure" + "Phenylephrine" + "Inject metoprolol" + "Inject naloxone" + "You find a blood pressure of %1/%2 mmHg" + "You find a heart rate of %1" + "Inject phenylephrine" + } +} \ No newline at end of file diff --git a/addons/medical_circulation/Language/ACE_Medical_Circulation_localization.it_it.conf.meta b/addons/medical_circulation/Language/ACE_Medical_Circulation_localization.it_it.conf.meta new file mode 100644 index 000000000..2bd3590d7 --- /dev/null +++ b/addons/medical_circulation/Language/ACE_Medical_Circulation_localization.it_it.conf.meta @@ -0,0 +1,17 @@ +MetaFileClass { + Name "{1C757E0A28ACC356}Language/ACE_Medical_Circulation_localization.it_it.conf" + Configurations { + CONFResourceClass PC { + } + CONFResourceClass XBOX_ONE : PC { + } + CONFResourceClass XBOX_SERIES : PC { + } + CONFResourceClass PS4 : PC { + } + CONFResourceClass PS5 : PC { + } + CONFResourceClass HEADLESS : PC { + } + } +} \ No newline at end of file diff --git a/addons/medical_circulation/Language/ACE_Medical_Circulation_localization.ja_jp.conf b/addons/medical_circulation/Language/ACE_Medical_Circulation_localization.ja_jp.conf new file mode 100644 index 000000000..ee73d90cb --- /dev/null +++ b/addons/medical_circulation/Language/ACE_Medical_Circulation_localization.ja_jp.conf @@ -0,0 +1,68 @@ +StringTableRuntime { + Ids { + "ACE_Medical-AmmoniumCarbonatePackageAction" + "ACE_Medical-BloodState_Class1" + "ACE_Medical-BloodState_Class2" + "ACE_Medical-BloodState_Class3" + "ACE_Medical-BloodState_Class4" + "ACE_Medical-CheckBloodPressureAction" + "ACE_Medical-CheckPulseAction" + "ACE_Medical-CPRAction" + "ACE_Medical-Editor_TooltipDetail_Brain_Name" + "ACE_Medical-Editor_TooltipDetail_VitalSigns_Name" + "ACE_Medical-FailReason_NotOnBack" + "ACE_Medical-InfoWidget_AmmoniumCarbonate" + "ACE_Medical-InfoWidget_Epinephrine" + "ACE_Medical-InfoWidget_Metoprolol" + "ACE_Medical-InfoWidget_Naloxone" + "ACE_Medical-InfoWidget_Phenylephrine" + "ACE_Medical-Item_AmmoniumCarbonate_Description" + "ACE_Medical-Item_AmmoniumCarbonate_Name" + "ACE_Medical-Item_Epinephrine_Description" + "ACE_Medical-Item_Epinephrine_Name" + "ACE_Medical-Item_Metoprolol_Description" + "ACE_Medical-Item_Metoprolol_Name" + "ACE_Medical-Item_Naloxone_Description" + "ACE_Medical-Item_Naloxone_Name" + "ACE_Medical-Item_Phenylephrine_Description" + "ACE_Medical-Item_Phenylephrine_Name" + "ACE_Medical-MetoprololInjectionAction" + "ACE_Medical-NaloxoneInjectionAction" + "ACE_Medical-Notification_BLOOD_PRESSURE_RESULT" + "ACE_Medical-Notification_PULSE_RESULT" + "ACE_Medical-PhenylephrineInjectionAction" + } + Texts { + "Hold under nose" + "Class I hemorrhage" + "Class II hemorrhage" + "Class III hemorrhage" + "Class IV hemorrhage" + "Check blood pressure" + "Check pulse" + "Perform CPR" + "Brain" + "Vital signs" + "Not on back" + "Increases wake-up chance" + "Increases heart rate" + "Decreases heart rate" + "Antagonist for opioids like morphine" + "Increases blood pressure and slows down bleeding and transfusion" + "Administered to unconscious patients." + "Ammonium Carbonate" + "Administered to patients in cardiac arrest" + "Epinephrine" + "Administered to patients with too high heart rate" + "Metoprolol" + "Administered to patients with opioid overdose" + "Naloxone" + "Administered to patients for raising blood pressure" + "Phenylephrine" + "Inject metoprolol" + "Inject naloxone" + "You find a blood pressure of %1/%2 mmHg" + "You find a heart rate of %1" + "Inject phenylephrine" + } +} \ No newline at end of file diff --git a/addons/medical_circulation/Language/ACE_Medical_Circulation_localization.ja_jp.conf.meta b/addons/medical_circulation/Language/ACE_Medical_Circulation_localization.ja_jp.conf.meta new file mode 100644 index 000000000..f9616dee2 --- /dev/null +++ b/addons/medical_circulation/Language/ACE_Medical_Circulation_localization.ja_jp.conf.meta @@ -0,0 +1,17 @@ +MetaFileClass { + Name "{0C6EC39816DDF3FD}Language/ACE_Medical_Circulation_localization.ja_jp.conf" + Configurations { + CONFResourceClass PC { + } + CONFResourceClass XBOX_ONE : PC { + } + CONFResourceClass XBOX_SERIES : PC { + } + CONFResourceClass PS4 : PC { + } + CONFResourceClass PS5 : PC { + } + CONFResourceClass HEADLESS : PC { + } + } +} \ No newline at end of file diff --git a/addons/medical_circulation/Language/ACE_Medical_Circulation_localization.ko_kr.conf b/addons/medical_circulation/Language/ACE_Medical_Circulation_localization.ko_kr.conf new file mode 100644 index 000000000..4407f9e16 --- /dev/null +++ b/addons/medical_circulation/Language/ACE_Medical_Circulation_localization.ko_kr.conf @@ -0,0 +1,68 @@ +StringTableRuntime { + Ids { + "ACE_Medical-AmmoniumCarbonatePackageAction" + "ACE_Medical-BloodState_Class1" + "ACE_Medical-BloodState_Class2" + "ACE_Medical-BloodState_Class3" + "ACE_Medical-BloodState_Class4" + "ACE_Medical-CheckBloodPressureAction" + "ACE_Medical-CheckPulseAction" + "ACE_Medical-CPRAction" + "ACE_Medical-Editor_TooltipDetail_Brain_Name" + "ACE_Medical-Editor_TooltipDetail_VitalSigns_Name" + "ACE_Medical-FailReason_NotOnBack" + "ACE_Medical-InfoWidget_AmmoniumCarbonate" + "ACE_Medical-InfoWidget_Epinephrine" + "ACE_Medical-InfoWidget_Metoprolol" + "ACE_Medical-InfoWidget_Naloxone" + "ACE_Medical-InfoWidget_Phenylephrine" + "ACE_Medical-Item_AmmoniumCarbonate_Description" + "ACE_Medical-Item_AmmoniumCarbonate_Name" + "ACE_Medical-Item_Epinephrine_Description" + "ACE_Medical-Item_Epinephrine_Name" + "ACE_Medical-Item_Metoprolol_Description" + "ACE_Medical-Item_Metoprolol_Name" + "ACE_Medical-Item_Naloxone_Description" + "ACE_Medical-Item_Naloxone_Name" + "ACE_Medical-Item_Phenylephrine_Description" + "ACE_Medical-Item_Phenylephrine_Name" + "ACE_Medical-MetoprololInjectionAction" + "ACE_Medical-NaloxoneInjectionAction" + "ACE_Medical-Notification_BLOOD_PRESSURE_RESULT" + "ACE_Medical-Notification_PULSE_RESULT" + "ACE_Medical-PhenylephrineInjectionAction" + } + Texts { + "코 아래에 대기" + "경미한 실혈 (1급)" + "보통 실혈 (2급)" + "심한 실혈 (3급)" + "극심한 실혈 (4급)" + "혈압 확인하기" + "맥박 확인하기" + "심폐소생술 수행" + "뇌" + "바이탈 사인" + "똑바로 눕혀지지 않음" + "환자가 깨어날 확률 증가" + "심박수 증가" + "심박수 감소" + "모르핀 같은 오이포이드 계열 약물 중독을 치료" + "혈압을 증가시키고 출혈과 수혈 속도를 늦춤" + "의식불명의 환자에게 사용됩니다." + "탄산암모늄" + "심정지 상태의 환자에게 투여됩니다." + "에피네프린" + "심박수가 너무 높은 환자에게 투여됩니다." + "메토프롤롤" + "오이포이드 계열 약물을 과다투여한 환자에게 사용됩니다." + "날록손" + "환자의 혈압을 높이는 데 사용됩니다." + "페닐에프린" + "메토프롤롤 주사하기" + "날록손 주사하기" + "혈압이 %1/%2mmHg임을 알아냈습니다" + "심박수가 %1임을 알아냈습니다" + "페닐에프린 주사하기" + } +} \ No newline at end of file diff --git a/addons/medical_circulation/Language/ACE_Medical_Circulation_localization.ko_kr.conf.meta b/addons/medical_circulation/Language/ACE_Medical_Circulation_localization.ko_kr.conf.meta new file mode 100644 index 000000000..fbf0e0779 --- /dev/null +++ b/addons/medical_circulation/Language/ACE_Medical_Circulation_localization.ko_kr.conf.meta @@ -0,0 +1,17 @@ +MetaFileClass { + Name "{ACD0EB3485F0F0C2}Language/ACE_Medical_Circulation_localization.ko_kr.conf" + Configurations { + CONFResourceClass PC { + } + CONFResourceClass XBOX_ONE : PC { + } + CONFResourceClass XBOX_SERIES : PC { + } + CONFResourceClass PS4 : PC { + } + CONFResourceClass PS5 : PC { + } + CONFResourceClass HEADLESS : PC { + } + } +} \ No newline at end of file diff --git a/addons/medical_circulation/Language/ACE_Medical_Circulation_localization.pl_pl.conf b/addons/medical_circulation/Language/ACE_Medical_Circulation_localization.pl_pl.conf new file mode 100644 index 000000000..ee73d90cb --- /dev/null +++ b/addons/medical_circulation/Language/ACE_Medical_Circulation_localization.pl_pl.conf @@ -0,0 +1,68 @@ +StringTableRuntime { + Ids { + "ACE_Medical-AmmoniumCarbonatePackageAction" + "ACE_Medical-BloodState_Class1" + "ACE_Medical-BloodState_Class2" + "ACE_Medical-BloodState_Class3" + "ACE_Medical-BloodState_Class4" + "ACE_Medical-CheckBloodPressureAction" + "ACE_Medical-CheckPulseAction" + "ACE_Medical-CPRAction" + "ACE_Medical-Editor_TooltipDetail_Brain_Name" + "ACE_Medical-Editor_TooltipDetail_VitalSigns_Name" + "ACE_Medical-FailReason_NotOnBack" + "ACE_Medical-InfoWidget_AmmoniumCarbonate" + "ACE_Medical-InfoWidget_Epinephrine" + "ACE_Medical-InfoWidget_Metoprolol" + "ACE_Medical-InfoWidget_Naloxone" + "ACE_Medical-InfoWidget_Phenylephrine" + "ACE_Medical-Item_AmmoniumCarbonate_Description" + "ACE_Medical-Item_AmmoniumCarbonate_Name" + "ACE_Medical-Item_Epinephrine_Description" + "ACE_Medical-Item_Epinephrine_Name" + "ACE_Medical-Item_Metoprolol_Description" + "ACE_Medical-Item_Metoprolol_Name" + "ACE_Medical-Item_Naloxone_Description" + "ACE_Medical-Item_Naloxone_Name" + "ACE_Medical-Item_Phenylephrine_Description" + "ACE_Medical-Item_Phenylephrine_Name" + "ACE_Medical-MetoprololInjectionAction" + "ACE_Medical-NaloxoneInjectionAction" + "ACE_Medical-Notification_BLOOD_PRESSURE_RESULT" + "ACE_Medical-Notification_PULSE_RESULT" + "ACE_Medical-PhenylephrineInjectionAction" + } + Texts { + "Hold under nose" + "Class I hemorrhage" + "Class II hemorrhage" + "Class III hemorrhage" + "Class IV hemorrhage" + "Check blood pressure" + "Check pulse" + "Perform CPR" + "Brain" + "Vital signs" + "Not on back" + "Increases wake-up chance" + "Increases heart rate" + "Decreases heart rate" + "Antagonist for opioids like morphine" + "Increases blood pressure and slows down bleeding and transfusion" + "Administered to unconscious patients." + "Ammonium Carbonate" + "Administered to patients in cardiac arrest" + "Epinephrine" + "Administered to patients with too high heart rate" + "Metoprolol" + "Administered to patients with opioid overdose" + "Naloxone" + "Administered to patients for raising blood pressure" + "Phenylephrine" + "Inject metoprolol" + "Inject naloxone" + "You find a blood pressure of %1/%2 mmHg" + "You find a heart rate of %1" + "Inject phenylephrine" + } +} \ No newline at end of file diff --git a/addons/medical_circulation/Language/ACE_Medical_Circulation_localization.pl_pl.conf.meta b/addons/medical_circulation/Language/ACE_Medical_Circulation_localization.pl_pl.conf.meta new file mode 100644 index 000000000..4e2297018 --- /dev/null +++ b/addons/medical_circulation/Language/ACE_Medical_Circulation_localization.pl_pl.conf.meta @@ -0,0 +1,17 @@ +MetaFileClass { + Name "{F0A14DCE3B1F6CBE}Language/ACE_Medical_Circulation_localization.pl_pl.conf" + Configurations { + CONFResourceClass PC { + } + CONFResourceClass XBOX_ONE : PC { + } + CONFResourceClass XBOX_SERIES : PC { + } + CONFResourceClass PS4 : PC { + } + CONFResourceClass PS5 : PC { + } + CONFResourceClass HEADLESS : PC { + } + } +} \ No newline at end of file diff --git a/addons/medical_circulation/Language/ACE_Medical_Circulation_localization.pt_br.conf b/addons/medical_circulation/Language/ACE_Medical_Circulation_localization.pt_br.conf new file mode 100644 index 000000000..1714ccccd --- /dev/null +++ b/addons/medical_circulation/Language/ACE_Medical_Circulation_localization.pt_br.conf @@ -0,0 +1,68 @@ +StringTableRuntime { + Ids { + "ACE_Medical-AmmoniumCarbonatePackageAction" + "ACE_Medical-BloodState_Class1" + "ACE_Medical-BloodState_Class2" + "ACE_Medical-BloodState_Class3" + "ACE_Medical-BloodState_Class4" + "ACE_Medical-CheckBloodPressureAction" + "ACE_Medical-CheckPulseAction" + "ACE_Medical-CPRAction" + "ACE_Medical-Editor_TooltipDetail_Brain_Name" + "ACE_Medical-Editor_TooltipDetail_VitalSigns_Name" + "ACE_Medical-FailReason_NotOnBack" + "ACE_Medical-InfoWidget_AmmoniumCarbonate" + "ACE_Medical-InfoWidget_Epinephrine" + "ACE_Medical-InfoWidget_Metoprolol" + "ACE_Medical-InfoWidget_Naloxone" + "ACE_Medical-InfoWidget_Phenylephrine" + "ACE_Medical-Item_AmmoniumCarbonate_Description" + "ACE_Medical-Item_AmmoniumCarbonate_Name" + "ACE_Medical-Item_Epinephrine_Description" + "ACE_Medical-Item_Epinephrine_Name" + "ACE_Medical-Item_Metoprolol_Description" + "ACE_Medical-Item_Metoprolol_Name" + "ACE_Medical-Item_Naloxone_Description" + "ACE_Medical-Item_Naloxone_Name" + "ACE_Medical-Item_Phenylephrine_Description" + "ACE_Medical-Item_Phenylephrine_Name" + "ACE_Medical-MetoprololInjectionAction" + "ACE_Medical-NaloxoneInjectionAction" + "ACE_Medical-Notification_BLOOD_PRESSURE_RESULT" + "ACE_Medical-Notification_PULSE_RESULT" + "ACE_Medical-PhenylephrineInjectionAction" + } + Texts { + "Segure sob o nariz" + "Hemorragia de Classe I" + "Hemorragia de Classe II" + "Hemorragia de Classe III" + "Hemorragia de Classe IV" + "Verificar pressão arterial" + "Verificar pulso" + "Realizar RCP" + "Brain" + "Vital signs" + "Not on back" + "Aumenta a chance de acordar" + "Aumenta a frequência cardíaca" + "Reduz a frequência cardíaca" + "Antagonista para opioides como morfina" + "Aumenta a pressão arterial e diminui o sangramento e transfusão" + "Administrado a pacientes inconscientes." + "Carbonato de Amônio" + "Administrado a pacientes em parada cardíaca" + "Epinephrine" + "Administrado a pacientes com frequência cardíaca muito alta" + "Metoprolol" + "Administrado a pacientes com overdose de opioides" + "Naloxona" + "Administrado a pacientes para elevar a pressão arterial" + "Fenilefrina" + "Injetar metoprolol" + "Injetar naloxona" + "pressão arterial em %1/%2 mmHg" + "Frequência cardíaca em %1" + "Injetar fenilefrina" + } +} \ No newline at end of file diff --git a/addons/medical_circulation/Language/ACE_Medical_Circulation_localization.pt_br.conf.meta b/addons/medical_circulation/Language/ACE_Medical_Circulation_localization.pt_br.conf.meta new file mode 100644 index 000000000..6119fc76a --- /dev/null +++ b/addons/medical_circulation/Language/ACE_Medical_Circulation_localization.pt_br.conf.meta @@ -0,0 +1,17 @@ +MetaFileClass { + Name "{25D6D70200E1A604}Language/ACE_Medical_Circulation_localization.pt_br.conf" + Configurations { + CONFResourceClass PC { + } + CONFResourceClass XBOX_ONE : PC { + } + CONFResourceClass XBOX_SERIES : PC { + } + CONFResourceClass PS4 : PC { + } + CONFResourceClass PS5 : PC { + } + CONFResourceClass HEADLESS : PC { + } + } +} \ No newline at end of file diff --git a/addons/medical_circulation/Language/ACE_Medical_Circulation_localization.ru_ru.conf b/addons/medical_circulation/Language/ACE_Medical_Circulation_localization.ru_ru.conf new file mode 100644 index 000000000..364ad4c14 --- /dev/null +++ b/addons/medical_circulation/Language/ACE_Medical_Circulation_localization.ru_ru.conf @@ -0,0 +1,68 @@ +StringTableRuntime { + Ids { + "ACE_Medical-AmmoniumCarbonatePackageAction" + "ACE_Medical-BloodState_Class1" + "ACE_Medical-BloodState_Class2" + "ACE_Medical-BloodState_Class3" + "ACE_Medical-BloodState_Class4" + "ACE_Medical-CheckBloodPressureAction" + "ACE_Medical-CheckPulseAction" + "ACE_Medical-CPRAction" + "ACE_Medical-Editor_TooltipDetail_Brain_Name" + "ACE_Medical-Editor_TooltipDetail_VitalSigns_Name" + "ACE_Medical-FailReason_NotOnBack" + "ACE_Medical-InfoWidget_AmmoniumCarbonate" + "ACE_Medical-InfoWidget_Epinephrine" + "ACE_Medical-InfoWidget_Metoprolol" + "ACE_Medical-InfoWidget_Naloxone" + "ACE_Medical-InfoWidget_Phenylephrine" + "ACE_Medical-Item_AmmoniumCarbonate_Description" + "ACE_Medical-Item_AmmoniumCarbonate_Name" + "ACE_Medical-Item_Epinephrine_Description" + "ACE_Medical-Item_Epinephrine_Name" + "ACE_Medical-Item_Metoprolol_Description" + "ACE_Medical-Item_Metoprolol_Name" + "ACE_Medical-Item_Naloxone_Description" + "ACE_Medical-Item_Naloxone_Name" + "ACE_Medical-Item_Phenylephrine_Description" + "ACE_Medical-Item_Phenylephrine_Name" + "ACE_Medical-MetoprololInjectionAction" + "ACE_Medical-NaloxoneInjectionAction" + "ACE_Medical-Notification_BLOOD_PRESSURE_RESULT" + "ACE_Medical-Notification_PULSE_RESULT" + "ACE_Medical-PhenylephrineInjectionAction" + } + Texts { + "Поднести к носу" + "Кровопотеря I класса" + "Кровопотеря II класса" + "Кровопотеря III класса" + "Кровопотеря IV класса" + "Проверить давление" + "Проверить пульс" + "Выполнить СЛР" + "Мозг" + "Жизненные показатели" + "Not on back" + "Повышает вероятность пробуждения" + "Увеличивает частоту пульса" + "Снижает частоту пульса" + "Блокатор опиоидов (например, морфина)" + "Повышает давление и замедляет кровотечение и потребность в переливании" + "Назначают пациентам без сознания." + "Карбонат аммония" + "Назначают пациентам при остановке сердца" + "Эпинефрин" + "Назначают пациентам при повышенном пульсе" + "Метопролол" + "Назначают пациентам при передозировке опиойдами" + "Налоксон" + "Назначают пациентам при повышенном давлении" + "Фенилэфрин" + "Ввести метопролол" + "Ввести налоксон" + "Давление у пациента %1/%2 мм рт.ст" + "Пульс у пациента %1" + "Ввести фенилэфрин" + } +} \ No newline at end of file diff --git a/addons/medical_circulation/Language/ACE_Medical_Circulation_localization.ru_ru.conf.meta b/addons/medical_circulation/Language/ACE_Medical_Circulation_localization.ru_ru.conf.meta new file mode 100644 index 000000000..fe8950d51 --- /dev/null +++ b/addons/medical_circulation/Language/ACE_Medical_Circulation_localization.ru_ru.conf.meta @@ -0,0 +1,17 @@ +MetaFileClass { + Name "{7097C3AA9D98C372}Language/ACE_Medical_Circulation_localization.ru_ru.conf" + Configurations { + CONFResourceClass PC { + } + CONFResourceClass XBOX_ONE : PC { + } + CONFResourceClass XBOX_SERIES : PC { + } + CONFResourceClass PS4 : PC { + } + CONFResourceClass PS5 : PC { + } + CONFResourceClass HEADLESS : PC { + } + } +} \ No newline at end of file diff --git a/addons/medical_circulation/Language/ACE_Medical_Circulation_localization.st b/addons/medical_circulation/Language/ACE_Medical_Circulation_localization.st new file mode 100644 index 000000000..dd297fc75 --- /dev/null +++ b/addons/medical_circulation/Language/ACE_Medical_Circulation_localization.st @@ -0,0 +1,400 @@ +StringTable { + ItemClassName "CustomStringTableItem" + Items { + CustomStringTableItem "{6228B55EF02EBEDA}" { + Id "ACE_Medical-AmmoniumCarbonatePackageAction" + Target_en_us "Hold under nose" + Target_de_de "Unter die Nase halten" + Target_ru_ru "Поднести к носу" + Target_pt_br "Segure sob o nariz" + Target_zh_cn "置於鼻下" + Target_uk_ua "Піднести до носа" + Target_ko_kr "코 아래에 대기" + Modified 1725500839 + Author "Kexanone" + LastChanged "Psycool" + } + CustomStringTableItem "{6228B53ACDD034A6}" { + Id "ACE_Medical-BloodState_Class1" + Target_en_us "Class I hemorrhage" + Target_de_de "Blutung Klasse 1" + Target_ru_ru "Кровопотеря I класса" + Target_pt_br "Hemorragia de Classe I" + Target_zh_cn "I 級出血" + Target_uk_ua "Кровотеча I ступеня" + Target_ko_kr "경미한 실혈 (1급)" + Modified 1722592586 + Author "Kexanone" + LastChanged "Psycool" + } + CustomStringTableItem "{6228B53AC27D464E}" { + Id "ACE_Medical-BloodState_Class2" + Target_en_us "Class II hemorrhage" + Target_de_de "Blutung Klasse 2" + Target_ru_ru "Кровопотеря II класса" + Target_pt_br "Hemorragia de Classe II" + Target_zh_cn "II 級出血" + Target_uk_ua "Кровотеча II ступеня" + Target_ko_kr "보통 실혈 (2급)" + Modified 1722592593 + Author "Kexanone" + LastChanged "Psycool" + } + CustomStringTableItem "{6228B53AC01F5452}" { + Id "ACE_Medical-BloodState_Class3" + Target_en_us "Class III hemorrhage" + Target_de_de "Blutung Klasse 3" + Target_ru_ru "Кровопотеря III класса" + Target_pt_br "Hemorragia de Classe III" + Target_zh_cn "III 級出血" + Target_uk_ua "Кровотеча III ступеня" + Target_ko_kr "심한 실혈 (3급)" + Modified 1722592601 + Author "Kexanone" + LastChanged "Psycool" + } + CustomStringTableItem "{6228B53AC6AA6AB1}" { + Id "ACE_Medical-BloodState_Class4" + Target_en_us "Class IV hemorrhage" + Target_de_de "Blutung Klasse 4" + Target_ru_ru "Кровопотеря IV класса" + Target_pt_br "Hemorragia de Classe IV" + Target_zh_cn "IV 級出血" + Target_uk_ua "Кровотеча IV ступеня" + Target_ko_kr "극심한 실혈 (4급)" + Modified 1722592610 + Author "Kexanone" + LastChanged "Psycool" + } + CustomStringTableItem "{6228B55046CF7CC7}" { + Id "ACE_Medical-CheckBloodPressureAction" + Target_en_us "Check blood pressure" + Target_de_de "Blutdruck überprüfen" + Target_ru_ru "Проверить давление" + Target_pt_br "Verificar pressão arterial" + Target_zh_cn "量測血壓" + Target_uk_ua "Перевірити тиск" + Target_ko_kr "혈압 확인하기" + Modified 1722592660 + Author "Kexanone" + LastChanged "Psycool" + } + CustomStringTableItem "{6228B5504DC3E45E}" { + Id "ACE_Medical-CheckPulseAction" + Target_en_us "Check pulse" + Target_de_de "Puls überprüfen" + Target_ru_ru "Проверить пульс" + Target_pt_br "Verificar pulso" + Target_zh_cn "量測脈搏" + Target_uk_ua "Перевірити пульс" + Target_ko_kr "맥박 확인하기" + Modified 1722592669 + Author "Kexanone" + LastChanged "Psycool" + } + CustomStringTableItem "{6228B5503F479D0C}" { + Id "ACE_Medical-CPRAction" + Target_en_us "Perform CPR" + Target_de_de "CPR durchführen" + Target_ru_ru "Выполнить СЛР" + Target_pt_br "Realizar RCP" + Target_zh_cn "進行心肺復甦術 (CPR)" + Target_uk_ua "Провести серцево-легеневу реанімацію" + Target_ko_kr "심폐소생술 수행" + Modified 1722592628 + Author "Kexanone" + LastChanged "Psycool" + } + CustomStringTableItem "{6624FDAA28CE989A}" { + Id "ACE_Medical-Editor_TooltipDetail_Brain_Name" + Target_en_us "Brain" + Target_de_de "Gehirn" + Target_ru_ru "Мозг" + Target_zh_cn "大腦" + Target_ko_kr "뇌" + Modified 1722592675 + Author "Kexanone" + LastChanged "Psycool" + } + CustomStringTableItem "{6230E5C2DA63508A}" { + Id "ACE_Medical-Editor_TooltipDetail_VitalSigns_Name" + Target_en_us "Vital signs" + Target_de_de "Vitaldaten" + Target_ru_ru "Жизненные показатели" + Target_zh_cn "生命徵象" + Target_uk_ua "Життєві показники" + Target_ko_kr "바이탈 사인" + Modified 1722592685 + Author "Kexanone" + LastChanged "Psycool" + } + CustomStringTableItem "{6720C07189EC3236}" { + Id "ACE_Medical-FailReason_NotOnBack" + Target_en_us "Not on back" + Target_de_de "Nicht auf dem Rücken" + Target_ko_kr "똑바로 눕혀지지 않음" + Modified 1730199717 + Author "Kexanone" + LastChanged "Psycool" + } + CustomStringTableItem "{6228B55BAA8F501D}" { + Id "ACE_Medical-InfoWidget_AmmoniumCarbonate" + Target_en_us "Increases wake-up chance" + Target_de_de "Erhöht die Wahrscheinlichkeit des Aufwachens" + Target_ru_ru "Повышает вероятность пробуждения" + Target_pt_br "Aumenta a chance de acordar" + Target_zh_cn "增加甦醒機率" + Target_uk_ua "Збільшує шанс отямлення" + Target_ko_kr "환자가 깨어날 확률 증가" + Modified 1722592716 + Author "Kexanone" + LastChanged "Psycool" + } + CustomStringTableItem "{6228B55BAE36450B}" { + Id "ACE_Medical-InfoWidget_Epinephrine" + Target_en_us "Increases heart rate" + Target_de_de "Erhöht die Herzfrequenz" + Target_ru_ru "Увеличивает частоту пульса" + Target_pt_br "Aumenta a frequência cardíaca" + Target_zh_cn "提高心率" + Target_uk_ua "Підвищує частоту серцевих скорочень" + Target_ko_kr "심박수 증가" + Modified 1722592725 + Author "Kexanone" + LastChanged "Psycool" + } + CustomStringTableItem "{6228B55BA0A3E335}" { + Id "ACE_Medical-InfoWidget_Metoprolol" + Target_en_us "Decreases heart rate" + Target_de_de "Sinkt die Herzfrequenz" + Target_ru_ru "Снижает частоту пульса" + Target_pt_br "Reduz a frequência cardíaca" + Target_zh_cn "降低心率" + Target_uk_ua "Знижує частоту серцевих скорочень" + Target_ko_kr "심박수 감소" + Modified 1722592731 + Author "Kexanone" + LastChanged "Psycool" + } + CustomStringTableItem "{6228B55BA77C7538}" { + Id "ACE_Medical-InfoWidget_Naloxone" + Target_en_us "Antagonist for opioids like morphine" + Target_de_de "Antagonist für Opioide wie Morphin" + Target_ru_ru "Блокатор опиоидов (например, морфина)" + Target_pt_br "Antagonista para opioides como morfina" + Target_zh_cn "對嗎啡等鴉片類藥物的拮抗劑" + Target_uk_ua "Застосовується при передозуванні" + Target_ko_kr "모르핀 같은 오이포이드 계열 약물 중독을 치료" + Modified 1722592750 + Author "Kexanone" + LastChanged "Psycool" + } + CustomStringTableItem "{6228B55BB2295B31}" { + Id "ACE_Medical-InfoWidget_Phenylephrine" + Target_en_us "Increases blood pressure and slows down bleeding and transfusion" + Target_de_de "Erhöht den Blutdrucks und verlangsamt Blutung und Transfusion" + Target_ru_ru "Повышает давление и замедляет кровотечение и потребность в переливании" + Target_pt_br "Aumenta a pressão arterial e diminui o sangramento e transfusão" + Target_zh_cn "提高血壓,並減緩出血與輸血速度" + Target_uk_ua "Підвищує артеріальний тиск" + Target_ko_kr "혈압을 증가시키고 출혈과 수혈 속도를 늦춤" + Modified 1722592770 + Author "Kexanone" + LastChanged "Psycool" + } + CustomStringTableItem "{6228B5586006E639}" { + Id "ACE_Medical-Item_AmmoniumCarbonate_Description" + Target_en_us "Administered to unconscious patients." + Target_de_de "Verabreicht an bewusstlose Patienten." + Target_ru_ru "Назначают пациентам без сознания." + Target_pt_br "Administrado a pacientes inconscientes." + Target_zh_cn "給予無意識患者使用" + Target_uk_ua "Застосовується до непритомних пацієнтів, УВАГА застосовувати при нормальних показниках ЧСС (близько 70 ударів на секунду) та Артеріальному тиску близько 120/80 " + Target_ko_kr "의식불명의 환자에게 사용됩니다." + Modified 1722592791 + Author "Kexanone" + LastChanged "Psycool" + } + CustomStringTableItem "{6228B5586D87363C}" { + Id "ACE_Medical-Item_AmmoniumCarbonate_Name" + Target_en_us "Ammonium Carbonate" + Target_de_de "Ammoniumcarbonat" + Target_ru_ru "Карбонат аммония" + Target_pt_br "Carbonato de Amônio" + Target_zh_cn "碳酸铵 (嗅鹽)" + Target_uk_ua "Амонію карбонат (нюхальна сіль)" + Target_ko_kr "탄산암모늄" + Modified 1722592801 + Author "Kexanone" + LastChanged "Psycool" + } + CustomStringTableItem "{6228B55B9B65D93A}" { + Id "ACE_Medical-Item_Epinephrine_Description" + Target_en_us "Administered to patients in cardiac arrest" + Target_de_de "Verabreicht an Patienten mit Herzstillstand" + Target_ru_ru "Назначают пациентам при остановке сердца" + Target_pt_br "Administrado a pacientes em parada cardíaca" + Target_zh_cn "給予心臟驟停的患者使用" + Target_uk_ua "Застосовується при зупинці серця" + Target_ko_kr "심정지 상태의 환자에게 투여됩니다." + Modified 1722592976 + Author "Kexanone" + LastChanged "Psycool" + } + CustomStringTableItem "{65C6FCD64D6EB190}" { + Id "ACE_Medical-Item_Epinephrine_Name" + Target_en_us "Epinephrine" + Target_de_de "Epinephrin" + Target_ru_ru "Эпинефрин" + Target_zh_cn "腎上腺素" + Target_uk_ua "Адреналін (Епінефрин)" + Target_ko_kr "에피네프린" + Modified 1722592847 + Author "PC Ill" + LastChanged "Psycool" + } + CustomStringTableItem "{6228B5585D442A6C}" { + Id "ACE_Medical-Item_Metoprolol_Description" + Target_en_us "Administered to patients with too high heart rate" + Target_de_de "Verabreicht an Patienten mit überhöhter Herzfrequenz" + Target_ru_ru "Назначают пациентам при повышенном пульсе" + Target_pt_br "Administrado a pacientes com frequência cardíaca muito alta" + Target_zh_cn "給予心率過高的患者使用" + Target_uk_ua "Застосовується при занадто високому пульсі" + Target_ko_kr "심박수가 너무 높은 환자에게 투여됩니다." + Modified 1722592989 + Author "Kexanone" + LastChanged "Psycool" + } + CustomStringTableItem "{6228B5585EEF5D9C}" { + Id "ACE_Medical-Item_Metoprolol_Name" + Target_en_us "Metoprolol" + Target_de_de "Metoprolol" + Target_ru_ru "Метопролол" + Target_pt_br "Metoprolol" + Target_zh_cn "美托洛爾 (Metoprolol)" + Target_uk_ua "Метопролол" + Target_ko_kr "메토프롤롤" + Modified 1722592887 + Author "Kexanone" + LastChanged "Psycool" + } + CustomStringTableItem "{6228B5582C95F2EA}" { + Id "ACE_Medical-Item_Naloxone_Description" + Target_en_us "Administered to patients with opioid overdose" + Target_de_de "Verabreicht an Patienten mit Opioidüberdosis" + Target_ru_ru "Назначают пациентам при передозировке опиойдами" + Target_pt_br "Administrado a pacientes com overdose de opioides" + Target_zh_cn "給予鴉片類藥物過量的患者使用" + Target_uk_ua "Застосовується при передозуванні опіоїдами" + Target_ko_kr "오이포이드 계열 약물을 과다투여한 환자에게 사용됩니다." + Modified 1722593001 + Author "Kexanone" + LastChanged "Psycool" + } + CustomStringTableItem "{6228B558202D6005}" { + Id "ACE_Medical-Item_Naloxone_Name" + Target_en_us "Naloxone" + Target_de_de "Naloxon" + Target_ru_ru "Налоксон" + Target_pt_br "Naloxona" + Target_zh_cn "納洛酮 (Naloxone)" + Target_uk_ua "Налоксон" + Target_ko_kr "날록손" + Modified 1722592919 + Author "Kexanone" + LastChanged "Psycool" + } + CustomStringTableItem "{6228B55877861E3A}" { + Id "ACE_Medical-Item_Phenylephrine_Description" + Target_en_us "Administered to patients for raising blood pressure" + Target_de_de "Verabreicht an Patienten um den Blutdruck zu erhöhen" + Target_ru_ru "Назначают пациентам при повышенном давлении" + Target_pt_br "Administrado a pacientes para elevar a pressão arterial" + Target_zh_cn "給予因低血壓需要升壓的患者使用" + Target_uk_ua "Застосовується для підвищення тиску" + Target_ko_kr "환자의 혈압을 높이는 데 사용됩니다." + Modified 1722593010 + Author "Kexanone" + LastChanged "Psycool" + } + CustomStringTableItem "{6228B55875DE022F}" { + Id "ACE_Medical-Item_Phenylephrine_Name" + Target_en_us "Phenylephrine" + Target_de_de "Phenylephrin" + Target_ru_ru "Фенилэфрин" + Target_pt_br "Fenilefrina" + Target_zh_cn "苯福林 (Phenylephrine)" + Target_uk_ua "Фенілефрин" + Target_ko_kr "페닐에프린" + Modified 1722593017 + Author "Kexanone" + LastChanged "Psycool" + } + CustomStringTableItem "{6228B55ED01FBD98}" { + Id "ACE_Medical-MetoprololInjectionAction" + Target_en_us "Inject metoprolol" + Target_de_de "Metoprolol injizieren" + Target_ru_ru "Ввести метопролол" + Target_pt_br "Injetar metoprolol" + Target_zh_cn "注射美托洛爾 (Metoprolol)" + Target_uk_ua "Ввести метопролол" + Target_ko_kr "메토프롤롤 주사하기" + Modified 1722593310 + Author "Kexanone" + LastChanged "Psycool" + } + CustomStringTableItem "{6228B55ECF6624E9}" { + Id "ACE_Medical-NaloxoneInjectionAction" + Target_en_us "Inject naloxone" + Target_de_de "Naloxon injizieren" + Target_ru_ru "Ввести налоксон" + Target_pt_br "Injetar naloxona" + Target_zh_cn "注射納洛酮 (Naloxone)" + Target_uk_ua "Ввести налоксон" + Target_ko_kr "날록손 주사하기" + Modified 1722593317 + Author "Kexanone" + LastChanged "Psycool" + } + CustomStringTableItem "{6228B55235D38AF1}" { + Id "ACE_Medical-Notification_BLOOD_PRESSURE_RESULT" + Target_en_us "You find a blood pressure of %1/%2 mmHg" + Target_de_de "Der Blutdruck liegt bei %1/%2 mmHg" + Target_ru_ru "Давление у пациента %1/%2 мм рт.ст" + Target_pt_br "pressão arterial em %1/%2 mmHg" + Target_zh_cn "你測得的血壓為 %1/%2 mmHg" + Target_uk_ua "У пацієнта тиск %1/%2 мм рт.ст." + Target_ko_kr "혈압이 %1/%2mmHg임을 알아냈습니다" + Modified 1722593510 + Author "Kexanone" + LastChanged "Psycool" + } + CustomStringTableItem "{6228B5523F76CF1E}" { + Id "ACE_Medical-Notification_PULSE_RESULT" + Target_en_us "You find a heart rate of %1" + Target_de_de "Herzfrequenz ist %1" + Target_ru_ru "Пульс у пациента %1" + Target_pt_br "Frequência cardíaca em %1" + Target_zh_cn "你測得的心律為 %1" + Target_uk_ua "У пацієнта пульс %1" + Target_ko_kr "심박수가 %1임을 알아냈습니다" + Modified 1722593499 + Author "Kexanone" + LastChanged "Psycool" + } + CustomStringTableItem "{6228B55ED9DB4B14}" { + Id "ACE_Medical-PhenylephrineInjectionAction" + Target_en_us "Inject phenylephrine" + Target_de_de "Phenylephrin injizieren" + Target_ru_ru "Ввести фенилэфрин" + Target_pt_br "Injetar fenilefrina" + Target_zh_cn "注射苯福林 (Phenylephrine)" + Target_uk_ua "Ввести фенілефрин" + Target_ko_kr "페닐에프린 주사하기" + Modified 1722593525 + Author "Kexanone" + LastChanged "Psycool" + } + } +} diff --git a/addons/medical_circulation/Language/ACE_Medical_Circulation_localization.st.meta b/addons/medical_circulation/Language/ACE_Medical_Circulation_localization.st.meta new file mode 100644 index 000000000..441eba633 --- /dev/null +++ b/addons/medical_circulation/Language/ACE_Medical_Circulation_localization.st.meta @@ -0,0 +1,17 @@ +MetaFileClass { + Name "{0780D43A82968920}Language/ACE_Medical_Circulation_localization.st" + Configurations { + StringTableResourceClass PC { + } + StringTableResourceClass XBOX_ONE : PC { + } + StringTableResourceClass XBOX_SERIES : PC { + } + StringTableResourceClass PS4 : PC { + } + StringTableResourceClass PS5 : PC { + } + StringTableResourceClass HEADLESS : PC { + } + } +} \ No newline at end of file diff --git a/addons/medical_circulation/Language/ACE_Medical_Circulation_localization.uk_ua.conf b/addons/medical_circulation/Language/ACE_Medical_Circulation_localization.uk_ua.conf new file mode 100644 index 000000000..24f65bec7 --- /dev/null +++ b/addons/medical_circulation/Language/ACE_Medical_Circulation_localization.uk_ua.conf @@ -0,0 +1,68 @@ +StringTableRuntime { + Ids { + "ACE_Medical-AmmoniumCarbonatePackageAction" + "ACE_Medical-BloodState_Class1" + "ACE_Medical-BloodState_Class2" + "ACE_Medical-BloodState_Class3" + "ACE_Medical-BloodState_Class4" + "ACE_Medical-CheckBloodPressureAction" + "ACE_Medical-CheckPulseAction" + "ACE_Medical-CPRAction" + "ACE_Medical-Editor_TooltipDetail_Brain_Name" + "ACE_Medical-Editor_TooltipDetail_VitalSigns_Name" + "ACE_Medical-FailReason_NotOnBack" + "ACE_Medical-InfoWidget_AmmoniumCarbonate" + "ACE_Medical-InfoWidget_Epinephrine" + "ACE_Medical-InfoWidget_Metoprolol" + "ACE_Medical-InfoWidget_Naloxone" + "ACE_Medical-InfoWidget_Phenylephrine" + "ACE_Medical-Item_AmmoniumCarbonate_Description" + "ACE_Medical-Item_AmmoniumCarbonate_Name" + "ACE_Medical-Item_Epinephrine_Description" + "ACE_Medical-Item_Epinephrine_Name" + "ACE_Medical-Item_Metoprolol_Description" + "ACE_Medical-Item_Metoprolol_Name" + "ACE_Medical-Item_Naloxone_Description" + "ACE_Medical-Item_Naloxone_Name" + "ACE_Medical-Item_Phenylephrine_Description" + "ACE_Medical-Item_Phenylephrine_Name" + "ACE_Medical-MetoprololInjectionAction" + "ACE_Medical-NaloxoneInjectionAction" + "ACE_Medical-Notification_BLOOD_PRESSURE_RESULT" + "ACE_Medical-Notification_PULSE_RESULT" + "ACE_Medical-PhenylephrineInjectionAction" + } + Texts { + "Піднести до носа" + "Кровотеча I ступеня" + "Кровотеча II ступеня" + "Кровотеча III ступеня" + "Кровотеча IV ступеня" + "Перевірити тиск" + "Перевірити пульс" + "Провести серцево-легеневу реанімацію" + "Brain" + "Життєві показники" + "Not on back" + "Збільшує шанс отямлення" + "Підвищує частоту серцевих скорочень" + "Знижує частоту серцевих скорочень" + "Застосовується при передозуванні" + "Підвищує артеріальний тиск" + "Застосовується до непритомних пацієнтів, УВАГА застосовувати при нормальних показниках ЧСС (близько 70 ударів на секунду) та Артеріальному тиску близько 120/80 " + "Амонію карбонат (нюхальна сіль)" + "Застосовується при зупинці серця" + "Адреналін (Епінефрин)" + "Застосовується при занадто високому пульсі" + "Метопролол" + "Застосовується при передозуванні опіоїдами" + "Налоксон" + "Застосовується для підвищення тиску" + "Фенілефрин" + "Ввести метопролол" + "Ввести налоксон" + "У пацієнта тиск %1/%2 мм рт.ст." + "У пацієнта пульс %1" + "Ввести фенілефрин" + } +} \ No newline at end of file diff --git a/addons/medical_circulation/Language/ACE_Medical_Circulation_localization.uk_ua.conf.meta b/addons/medical_circulation/Language/ACE_Medical_Circulation_localization.uk_ua.conf.meta new file mode 100644 index 000000000..33f325b4d --- /dev/null +++ b/addons/medical_circulation/Language/ACE_Medical_Circulation_localization.uk_ua.conf.meta @@ -0,0 +1,17 @@ +MetaFileClass { + Name "{FACF965CF1B67D27}Language/ACE_Medical_Circulation_localization.uk_ua.conf" + Configurations { + CONFResourceClass PC { + } + CONFResourceClass XBOX_ONE : PC { + } + CONFResourceClass XBOX_SERIES : PC { + } + CONFResourceClass PS4 : PC { + } + CONFResourceClass PS5 : PC { + } + CONFResourceClass HEADLESS : PC { + } + } +} \ No newline at end of file diff --git a/addons/medical_circulation/Language/ACE_Medical_Circulation_localization.zh_cn.conf b/addons/medical_circulation/Language/ACE_Medical_Circulation_localization.zh_cn.conf new file mode 100644 index 000000000..948bf86fa --- /dev/null +++ b/addons/medical_circulation/Language/ACE_Medical_Circulation_localization.zh_cn.conf @@ -0,0 +1,68 @@ +StringTableRuntime { + Ids { + "ACE_Medical-AmmoniumCarbonatePackageAction" + "ACE_Medical-BloodState_Class1" + "ACE_Medical-BloodState_Class2" + "ACE_Medical-BloodState_Class3" + "ACE_Medical-BloodState_Class4" + "ACE_Medical-CheckBloodPressureAction" + "ACE_Medical-CheckPulseAction" + "ACE_Medical-CPRAction" + "ACE_Medical-Editor_TooltipDetail_Brain_Name" + "ACE_Medical-Editor_TooltipDetail_VitalSigns_Name" + "ACE_Medical-FailReason_NotOnBack" + "ACE_Medical-InfoWidget_AmmoniumCarbonate" + "ACE_Medical-InfoWidget_Epinephrine" + "ACE_Medical-InfoWidget_Metoprolol" + "ACE_Medical-InfoWidget_Naloxone" + "ACE_Medical-InfoWidget_Phenylephrine" + "ACE_Medical-Item_AmmoniumCarbonate_Description" + "ACE_Medical-Item_AmmoniumCarbonate_Name" + "ACE_Medical-Item_Epinephrine_Description" + "ACE_Medical-Item_Epinephrine_Name" + "ACE_Medical-Item_Metoprolol_Description" + "ACE_Medical-Item_Metoprolol_Name" + "ACE_Medical-Item_Naloxone_Description" + "ACE_Medical-Item_Naloxone_Name" + "ACE_Medical-Item_Phenylephrine_Description" + "ACE_Medical-Item_Phenylephrine_Name" + "ACE_Medical-MetoprololInjectionAction" + "ACE_Medical-NaloxoneInjectionAction" + "ACE_Medical-Notification_BLOOD_PRESSURE_RESULT" + "ACE_Medical-Notification_PULSE_RESULT" + "ACE_Medical-PhenylephrineInjectionAction" + } + Texts { + "置於鼻下" + "I 級出血" + "II 級出血" + "III 級出血" + "IV 級出血" + "量測血壓" + "量測脈搏" + "進行心肺復甦術 (CPR)" + "大腦" + "生命徵象" + "非仰躺" + "增加甦醒機率" + "提高心率" + "降低心率" + "對嗎啡等鴉片類藥物的拮抗劑" + "提高血壓,並減緩出血與輸血速度" + "給予無意識患者使用" + "碳酸铵 (嗅鹽)" + "給予心臟驟停的患者使用" + "腎上腺素" + "給予心率過高的患者使用" + "美托洛爾 (Metoprolol)" + "給予鴉片類藥物過量的患者使用" + "納洛酮 (Naloxone)" + "給予因低血壓需要升壓的患者使用" + "苯福林 (Phenylephrine)" + "注射美托洛爾 (Metoprolol)" + "注射納洛酮 (Naloxone)" + "你測得的血壓為 %1/%2 mmHg" + "你測得的心律為 %1" + "注射苯福林 (Phenylephrine)" + } +} \ No newline at end of file diff --git a/addons/medical_circulation/Language/ACE_Medical_Circulation_localization.zh_cn.conf.meta b/addons/medical_circulation/Language/ACE_Medical_Circulation_localization.zh_cn.conf.meta new file mode 100644 index 000000000..3b51afa84 --- /dev/null +++ b/addons/medical_circulation/Language/ACE_Medical_Circulation_localization.zh_cn.conf.meta @@ -0,0 +1,17 @@ +MetaFileClass { + Name "{207FF861C816AD3A}Language/ACE_Medical_Circulation_localization.zh_cn.conf" + Configurations { + CONFResourceClass PC { + } + CONFResourceClass XBOX_ONE : PC { + } + CONFResourceClass XBOX_SERIES : PC { + } + CONFResourceClass PS4 : PC { + } + CONFResourceClass PS5 : PC { + } + CONFResourceClass HEADLESS : PC { + } + } +} \ No newline at end of file diff --git a/addons/medical_circulation/Prefabs/Characters/Core/Character_Base.et b/addons/medical_circulation/Prefabs/Characters/Core/Character_Base.et new file mode 100644 index 000000000..b5bf0a4f4 --- /dev/null +++ b/addons/medical_circulation/Prefabs/Characters/Core/Character_Base.et @@ -0,0 +1,111 @@ +SCR_ChimeraCharacter { + ID "520EC961A090B1EE" + components { + ACE_Medical_MedicationComponent "{621B2BABDAF5867E}" { + } + ACE_Medical_VitalsComponent "{6220003330350BC2}" { + } + ActionsManagerComponent "{520EA1D2F659CE02}" { + additionalActions { + SCR_HealSupportStationAction "{5E14966CF597F6B3}" { + "Sort Priority" 0 + } + SCR_MorphineUserAction "{60CF45A52131AD5A}" { + ActionTitle "Inject Epinephrine" + m_eConsumableType ACE_MEDICAL_EPINEPHRINE_INJECTOR + } + ACE_Medical_AmmoniumCarbonateUserAction "{62150A66FC4875D8}" { + ParentContextList { + "Head" + } + UIInfo SCR_ActionUIInfo "{62150A66E8D34DA5}" { + Name "#ACE_Medical-AmmoniumCarbonatePackageAction" + m_sInteractionIcon "{B9199157B90D6216}UI/Textures/InventoryIcons/Medical/Medical-icons.imageset" + m_sInteractionGlowIcon "{E4B841462701A4D7}UI/Textures/InventoryIcons/Medical/Medical-icons-glow.imageset" + m_sIconName "Morphine_UI" + } + m_eConsumableType ACE_MEDICAL_AMMONIUM_CARBONATE + } + SCR_MorphineUserAction "{62150A6C41D53656}" { + ParentContextList { + "RightArm" "LeftArm" "RightLeg" "LeftLeg" + } + UIInfo SCR_ActionUIInfo "{62150A6C71EFEF99}" { + Name "#ACE_Medical-MetoprololInjectionAction" + m_sInteractionIcon "{B9199157B90D6216}UI/Textures/InventoryIcons/Medical/Medical-icons.imageset" + m_sInteractionGlowIcon "{E4B841462701A4D7}UI/Textures/InventoryIcons/Medical/Medical-icons-glow.imageset" + m_sIconName "Morphine_UI" + } + ActionTitle "Inject Metoprolol" + m_eConsumableType ACE_MEDICAL_METOPROLOL_INJECTOR + } + SCR_MorphineUserAction "{6226EDEC7ACB618B}" { + ParentContextList { + "RightArm" "LeftArm" "RightLeg" "LeftLeg" + } + UIInfo SCR_ActionUIInfo "{6226EDEC7241F1E1}" { + Name "#ACE_Medical-NaloxoneInjectionAction" + m_sInteractionIcon "{B9199157B90D6216}UI/Textures/InventoryIcons/Medical/Medical-icons.imageset" + m_sInteractionGlowIcon "{E4B841462701A4D7}UI/Textures/InventoryIcons/Medical/Medical-icons-glow.imageset" + m_sIconName "Morphine_UI" + } + ActionTitle "Inject Naloxone" + m_eConsumableType ACE_MEDICAL_NALOXONE_INJECTOR + } + SCR_MorphineUserAction "{6226EDEDB4F10C69}" { + ParentContextList { + "RightArm" "LeftArm" "RightLeg" "LeftLeg" + } + UIInfo SCR_ActionUIInfo "{6226EDEDA11A533D}" { + Name "#ACE_Medical-PhenylephrineInjectionAction" + m_sInteractionIcon "{B9199157B90D6216}UI/Textures/InventoryIcons/Medical/Medical-icons.imageset" + m_sInteractionGlowIcon "{E4B841462701A4D7}UI/Textures/InventoryIcons/Medical/Medical-icons-glow.imageset" + m_sIconName "Morphine_UI" + } + ActionTitle "Inject Phenylephrine" + m_eConsumableType ACE_MEDICAL_PHENYLEPHRINE_INJECTOR + } + ACE_Medical_CPRUserAction "{6216F73FC7EBD067}" { + ParentContextList { + "Chest" + } + UIInfo SCR_ActionUIInfo "{6216F73FFFACAE56}" { + Name "#ACE_Medical-CPRAction" + } + ActionTitle "Perfrom CPR" + VisibilityRange 2 + Duration 1 + "Sort Priority" 10 + } + ACE_Medical_CheckVitalsUserAction "{621737D0C7C00B68}" { + ParentContextList { + "Head" "Chest" "RightArm" "LeftArm" "RightLeg" "LeftLeg" + } + UIInfo SCR_ActionUIInfo "{621737D0F7FF3B55}" { + Name "#ACE_Medical-CheckPulseAction" + m_sIconName "search" + } + ActionTitle "Check Pulse" + VisibilityRange 2 + Duration 3 + "Sort Priority" 10 + m_eNotificationType ACE_MEDICAL_PULSE_RESULT + } + ACE_Medical_CheckVitalsUserAction "{621737D02A688589}" { + ParentContextList { + "RightArm" "LeftArm" "RightLeg" "LeftLeg" + } + UIInfo SCR_ActionUIInfo "{621737D025B25341}" { + Name "#ACE_Medical-CheckBloodPressureAction" + m_sIconName "search" + } + ActionTitle "Check Blood Pressure" + VisibilityRange 2 + Duration 3 + "Sort Priority" 11 + m_eNotificationType ACE_MEDICAL_BLOOD_PRESSURE_RESULT + } + } + } + } +} \ No newline at end of file diff --git a/addons/medical_circulation/Prefabs/Characters/Core/Character_Base.et.meta b/addons/medical_circulation/Prefabs/Characters/Core/Character_Base.et.meta new file mode 100644 index 000000000..e053c97d2 --- /dev/null +++ b/addons/medical_circulation/Prefabs/Characters/Core/Character_Base.et.meta @@ -0,0 +1,17 @@ +MetaFileClass { + Name "{37578B1666981FCE}Prefabs/Characters/Core/Character_Base.et" + Configurations { + EntityTemplateResourceClass PC { + } + EntityTemplateResourceClass XBOX_ONE : PC { + } + EntityTemplateResourceClass XBOX_SERIES : PC { + } + EntityTemplateResourceClass PS4 : PC { + } + EntityTemplateResourceClass HEADLESS : PC { + } + EntityTemplateResourceClass PS5 : PC { + } + } +} \ No newline at end of file diff --git a/addons/medical_circulation/Prefabs/Characters/Core/DamageManager_Character_Base.ct b/addons/medical_circulation/Prefabs/Characters/Core/DamageManager_Character_Base.ct new file mode 100644 index 000000000..593283b3e --- /dev/null +++ b/addons/medical_circulation/Prefabs/Characters/Core/DamageManager_Character_Base.ct @@ -0,0 +1,67 @@ +SCR_CharacterDamageManagerComponent { + "Additional hit zones" { + SCR_CharacterBloodHitZone Blood { + MaxHealth 3000 + "DamageState threshold" { + 0.7 + 0.4 + 0.2 + } + } + SCR_CharacterHeadHitZone Head { + m_fBleedingRateScale 0.325 + } + ACE_Medical_CharacterChestHitZone Chest { + m_fBleedingRateScale 0.325 + } + ACE_Medical_CharacterAbdomenHitZone Abdomen { + m_fBleedingRateScale 0.325 + } + ACE_Medical_HipsHitZone Hips { + m_fBleedingRateScale 0.325 + } + SCR_CharacterHitZone RArm { + m_fBleedingRateScale 0.325 + } + SCR_CharacterHitZone LArm { + m_fBleedingRateScale 0.325 + } + SCR_CharacterHitZone RForearm { + m_fBleedingRateScale 0.325 + } + SCR_CharacterHitZone LForearm { + m_fBleedingRateScale 0.325 + } + SCR_CharacterHitZone RHand { + m_fBleedingRateScale 0.325 + } + SCR_CharacterHitZone LHand { + m_fBleedingRateScale 0.325 + } + SCR_CharacterHitZone RThigh { + m_fBleedingRateScale 0.325 + } + SCR_CharacterHitZone LThigh { + m_fBleedingRateScale 0.325 + } + SCR_CharacterHitZone RCalf { + m_fBleedingRateScale 0.325 + } + SCR_CharacterHitZone LCalf { + m_fBleedingRateScale 0.325 + } + SCR_CharacterHitZone RFoot { + m_fBleedingRateScale 0.325 + } + SCR_CharacterHitZone LFoot { + m_fBleedingRateScale 0.325 + } + ACE_Medical_NeckHitZone Neck { + m_fBleedingRateScale 5 + } + ACE_Medical_BrainHitZone ACE_Medical_Brain { + MaxHealth 100 + m_fFullRegenerationTime 600 + } + } +} \ No newline at end of file diff --git a/addons/medical_circulation/Prefabs/Characters/Core/DamageManager_Character_Base.ct.meta b/addons/medical_circulation/Prefabs/Characters/Core/DamageManager_Character_Base.ct.meta new file mode 100644 index 000000000..cec7ccbe4 --- /dev/null +++ b/addons/medical_circulation/Prefabs/Characters/Core/DamageManager_Character_Base.ct.meta @@ -0,0 +1,17 @@ +MetaFileClass { + Name "{73C708A20F8B22E6}Prefabs/Characters/Core/DamageManager_Character_Base.ct" + Configurations { + ComponentTemplateResourceClass PC { + } + ComponentTemplateResourceClass XBOX_ONE : PC { + } + ComponentTemplateResourceClass XBOX_SERIES : PC { + } + ComponentTemplateResourceClass PS4 : PC { + } + ComponentTemplateResourceClass PS5 : PC { + } + ComponentTemplateResourceClass HEADLESS : PC { + } + } +} \ No newline at end of file diff --git a/addons/medical_circulation/Prefabs/Characters/Core/DefaultPlayerController.et b/addons/medical_circulation/Prefabs/Characters/Core/DefaultPlayerController.et new file mode 100644 index 000000000..34441a855 --- /dev/null +++ b/addons/medical_circulation/Prefabs/Characters/Core/DefaultPlayerController.et @@ -0,0 +1,33 @@ +SCR_PlayerController { + ID "1A9BA6BEFA06E3B1" + components { + ACE_Medical_NetworkComponent "{621737D1BE405EF0}" { + } + ACE_RadialMenuComponent "{654944904311E33E}" { + m_aRadialMenuControllers { + ACE_RadialMenuController "{65494490457B367E}" { + m_Data SCR_SelectionMenuData "{654944919C4B07CF}" { + m_aEntries { + ACE_Medical_ExamineCasualtyRadialMenuCategoryEntry "{654944954316FDE9}" { + m_aEntries { + ACE_Medical_CheckVitalsRadialMenuEntry "{654A2126FF3B00EE}" { + Name "#ACE_Medical-CheckPulseAction" + Icon "{B9199157B90D6216}UI/Textures/InventoryIcons/Medical/Medical-icons.imageset" + IconSetName "Unconscious_UI" + m_eNotificationType ACE_MEDICAL_PULSE_RESULT + } + ACE_Medical_CheckVitalsRadialMenuEntry "{654A2126F37B8121}" { + Name "#ACE_Medical-CheckBloodPressureAction" + Icon "{B9199157B90D6216}UI/Textures/InventoryIcons/Medical/Medical-icons.imageset" + IconSetName "Unconscious_UI" + m_eNotificationType ACE_MEDICAL_BLOOD_PRESSURE_RESULT + } + } + } + } + } + } + } + } + } +} \ No newline at end of file diff --git a/addons/medical_circulation/Prefabs/Characters/Core/DefaultPlayerController.et.meta b/addons/medical_circulation/Prefabs/Characters/Core/DefaultPlayerController.et.meta new file mode 100644 index 000000000..8f52e4e7e --- /dev/null +++ b/addons/medical_circulation/Prefabs/Characters/Core/DefaultPlayerController.et.meta @@ -0,0 +1,15 @@ +MetaFileClass { + Name "{6E2BB64764E3BE9B}Prefabs/Characters/Core/DefaultPlayerController.et" + Configurations { + EntityTemplateResourceClass PC { + } + EntityTemplateResourceClass XBOX_ONE : PC { + } + EntityTemplateResourceClass XBOX_SERIES : PC { + } + EntityTemplateResourceClass PS4 : PC { + } + EntityTemplateResourceClass HEADLESS : PC { + } + } +} \ No newline at end of file diff --git a/addons/medical_circulation/Prefabs/Helpers/ACE_Medical_CPRHelperCompartment.et b/addons/medical_circulation/Prefabs/Helpers/ACE_Medical_CPRHelperCompartment.et new file mode 100644 index 000000000..9bbe4a5d9 --- /dev/null +++ b/addons/medical_circulation/Prefabs/Helpers/ACE_Medical_CPRHelperCompartment.et @@ -0,0 +1,25 @@ +ACE_Medical_CPRHelperCompartment : "{0D226790BE615DC7}Prefabs/Helpers/ACE_AnimationHelperCompartment.et" { + ID "4B42E71698F5739C" + components { + SCR_BaseCompartmentManagerComponent "{2CD4A765A7D52986}" { + DoorInfoList { + CompartmentDoorInfo "{62CF60C6D92648FD}" { + StanceChangeOnExit Crouch + } + } + CompartmentSlots { + CargoCompartmentSlot Performer { + GetOutAction SCR_GetOutAction "{69AD479EB4813AE0}" { + } + } + } + } + VehicleAnimationComponent "{50B812962B17E60B}" { + AnimInstance "{9591A985FDD73C7B}Assets/Helpers/Workspace/ACE_Medical_CPR.asi" + AnimInjection AnimationAttachmentInfo "{50B812961A339FD2}" { + AnimInstance "{9591A985FDD73C7B}Assets/Helpers/Workspace/ACE_Medical_CPR.asi" + } + } + } + m_eLifeStateChangedGetOutType TELEPORT +} \ No newline at end of file diff --git a/addons/medical_circulation/Prefabs/Helpers/ACE_Medical_CPRHelperCompartment.et.meta b/addons/medical_circulation/Prefabs/Helpers/ACE_Medical_CPRHelperCompartment.et.meta new file mode 100644 index 000000000..4335257cc --- /dev/null +++ b/addons/medical_circulation/Prefabs/Helpers/ACE_Medical_CPRHelperCompartment.et.meta @@ -0,0 +1,17 @@ +MetaFileClass { + Name "{604E93B236B19A29}Prefabs/Helpers/ACE_Medical_CPRHelperCompartment.et" + Configurations { + EntityTemplateResourceClass PC { + } + EntityTemplateResourceClass XBOX_ONE : PC { + } + EntityTemplateResourceClass XBOX_SERIES : PC { + } + EntityTemplateResourceClass PS4 : PC { + } + EntityTemplateResourceClass PS5 : PC { + } + EntityTemplateResourceClass HEADLESS : PC { + } + } +} \ No newline at end of file diff --git a/addons/medical_circulation/Prefabs/Items/Medicine/AmmoniumCarbonatePackage/ACE_Medical_AmmoniumCarbonatePackage.et b/addons/medical_circulation/Prefabs/Items/Medicine/AmmoniumCarbonatePackage/ACE_Medical_AmmoniumCarbonatePackage.et new file mode 100644 index 000000000..6e9cc6ffc --- /dev/null +++ b/addons/medical_circulation/Prefabs/Items/Medicine/AmmoniumCarbonatePackage/ACE_Medical_AmmoniumCarbonatePackage.et @@ -0,0 +1,72 @@ +GenericEntity : "{C95E11C60810F432}Prefabs/Items/Core/Item_Base.et" { + ID "508AB2013EEE1E00" + components { + InventoryItemComponent "{5222EB4D0C73006B}" { + Attributes SCR_ItemAttributeCollection "{5222EB4D0A2B466B}" { + ItemDisplayName SCR_InventoryUIInfo "{5222EB4D07D865FA}" { + Name "#ACE_Medical-Item_AmmoniumCarbonate_Name" + Description "#ACE_Medical-Item_AmmoniumCarbonate_Description" + m_aItemHints { + SCR_InventoryItemHintUIInfo "{6228B5509B5A1DC8}" { + Name "#ACE_Medical-InfoWidget_AmmoniumCarbonate" + Icon "{B9199157B90D6216}UI/Textures/InventoryIcons/Medical/Medical-icons.imageset" + IconSetName "Morphine_l_UI" + } + } + } + ItemPhysAttributes ItemPhysicalAttributes PhysicalAttributes { + SizeSetupStrategy Manual + ItemDimensions 5 5 5 + ItemVolume 10 + } + ItemAnimationAttributes ItemAnimationAttributes "{62150A64C480907E}" { + AnimationInstance "{4FCBEA45CAEBC9C0}anims/workspaces/player/player_main_1h.asi" + AnimationIKPose "{3E5C93E85F05C6B5}Assets/Weapons/Grenades/RGD5/anims/anm/p_rgd5_ik.anm" + AnimationAttachments { + AnimationAttachmentInfo "{62150A64E44E7555}" { + AnimGraph "{25B5CD66792F60F4}Assets/Items/Medicine/Workspaces/MorphineInjection_01.agr" + AnimInstance "{B900F61FD4D7F1DA}Assets/Items/Medicine/Workspaces/morphine_injection_player.asi" + BindingName "Gadget" + } + } + HandAdditiveRotation 180 -90 0 + HandAdditiveTranslation 0 0.005 0 + } + CustomAttributes { + SCR_ItemOfInterestAttribute "{6214F8E614CF74A2}" { + m_InterestType MORPHINE + } + ItemActionAnimAttributes "{6214F8E6B0CA383B}" { + AnimationGraphTemplate "{DFFC0A34A77ADCB4}anims/workspaces/player/player_main.agr" + ActionAnimationCommandName "CMD_HealSelf" + ActionAnimDuration 10 + AllowMovementDuringAction 1 + } + PreviewRenderAttributes "{6214F8E99145C88E}" { + CameraPreset Top + CameraOrbitAngles 0 0 -45 + CameraDistanceToItem 0.05 + LodModel 0 + } + } + CommonItemType "MORPHINE" + } + } + MeshObject "{6214F8E90D1F3C47}" { + Object "{66A319321561B93E}Assets/Items/Medicine/AmmoniumCarbonate/Data/ACE_Medical_AmmoniumCarbonatePackage.xob" + } + RigidBody "{6214F8E90359578D}" { + } + SCR_ConsumableItemComponent "{6214F8ED50695075}" { + m_eAnimVariable ADRIANOV + m_ConsumableEffect ACE_Medical_ConsumableAmmoniumCarbonate "{6214F8ED57615E05}" { + m_fItemRegenerationSpeed 30 + m_fItemRegenerationDuration 5 + m_aDamageEffectsToLoad { + ACE_Medical_AmmoniumCarbonateDamageEffect "{6214F8ED4A130B32}" { + } + } + } + } + } +} \ No newline at end of file diff --git a/addons/medical_circulation/Prefabs/Items/Medicine/AmmoniumCarbonatePackage/ACE_Medical_AmmoniumCarbonatePackage.et.meta b/addons/medical_circulation/Prefabs/Items/Medicine/AmmoniumCarbonatePackage/ACE_Medical_AmmoniumCarbonatePackage.et.meta new file mode 100644 index 000000000..54e7a15bc --- /dev/null +++ b/addons/medical_circulation/Prefabs/Items/Medicine/AmmoniumCarbonatePackage/ACE_Medical_AmmoniumCarbonatePackage.et.meta @@ -0,0 +1,17 @@ +MetaFileClass { + Name "{58CF3AB87C441295}Prefabs/Items/Medicine/AmmoniumCarbonatePackage/ACE_Medical_AmmoniumCarbonatePackage.et" + Configurations { + EntityTemplateResourceClass PC { + } + EntityTemplateResourceClass XBOX_ONE : PC { + } + EntityTemplateResourceClass XBOX_SERIES : PC { + } + EntityTemplateResourceClass PS4 : PC { + } + EntityTemplateResourceClass PS5 : PC { + } + EntityTemplateResourceClass HEADLESS : PC { + } + } +} \ No newline at end of file diff --git a/addons/medical_circulation/Prefabs/Items/Medicine/EpinephrineInjection/ACE_Medical_EpinephrineInjection.et b/addons/medical_circulation/Prefabs/Items/Medicine/EpinephrineInjection/ACE_Medical_EpinephrineInjection.et new file mode 100644 index 000000000..90b356a6a --- /dev/null +++ b/addons/medical_circulation/Prefabs/Items/Medicine/EpinephrineInjection/ACE_Medical_EpinephrineInjection.et @@ -0,0 +1,20 @@ +GenericEntity : "{3238FC0BDB67AA78}Prefabs/Items/Medicine/MorphineInjection_01/MorphineInjection_01_base.et" { + ID "508AB2013EEE1E00" + components { + SCR_ConsumableItemComponent "{59E68C74C5CEE74F}" { + m_ConsumableEffect ACE_Medical_ConsumableMedication "{59E68C74C1F3910E}" { + m_aDamageEffectsToLoad { + UnknownDamageEffect "{6122D60861B541E7}" { + } + } + m_eDeviceType ACE_MEDICAL_EPINEPHRINE_INJECTOR + m_Doses { + ACE_Medical_Bolus "{62211753B58C0FAA}" { + m_eDrugType EPINEPHRINE + m_fConcentrationNM 550 + } + } + } + } + } +} \ No newline at end of file diff --git a/addons/medical_circulation/Prefabs/Items/Medicine/EpinephrineInjection/ACE_Medical_EpinephrineInjection.et.meta b/addons/medical_circulation/Prefabs/Items/Medicine/EpinephrineInjection/ACE_Medical_EpinephrineInjection.et.meta new file mode 100644 index 000000000..7bba241c0 --- /dev/null +++ b/addons/medical_circulation/Prefabs/Items/Medicine/EpinephrineInjection/ACE_Medical_EpinephrineInjection.et.meta @@ -0,0 +1,17 @@ +MetaFileClass { + Name "{5B2FD067D70C1E8F}Prefabs/Items/Medicine/EpinephrineInjection/ACE_Medical_EpinephrineInjection.et" + Configurations { + EntityTemplateResourceClass PC { + } + EntityTemplateResourceClass XBOX_ONE : PC { + } + EntityTemplateResourceClass XBOX_SERIES : PC { + } + EntityTemplateResourceClass PS4 : PC { + } + EntityTemplateResourceClass HEADLESS : PC { + } + EntityTemplateResourceClass PS5 : PC { + } + } +} \ No newline at end of file diff --git a/addons/medical_circulation/Prefabs/Items/Medicine/MetoprololInjection/ACE_Medical_MetoprololInjection.et b/addons/medical_circulation/Prefabs/Items/Medicine/MetoprololInjection/ACE_Medical_MetoprololInjection.et new file mode 100644 index 000000000..ae0363977 --- /dev/null +++ b/addons/medical_circulation/Prefabs/Items/Medicine/MetoprololInjection/ACE_Medical_MetoprololInjection.et @@ -0,0 +1,41 @@ +GenericEntity : "{3238FC0BDB67AA78}Prefabs/Items/Medicine/MorphineInjection_01/MorphineInjection_01_base.et" { + ID "508AB2013EEE1E00" + components { + InventoryItemComponent "{5222EB4D0C73006B}" { + Attributes SCR_ItemAttributeCollection "{5222EB4D0A2B466B}" { + ItemDisplayName SCR_InventoryUIInfo "{5222EB4D07D865FA}" { + Name "#ACE_Medical-Item_Metoprolol_Name" + Description "#ACE_Medical-Item_Metoprolol_Description" + m_aItemHints { + SCR_InventoryItemHintUIInfo "{5E04DAAE66DE1E77}" { + Name "#ACE_Medical-InfoWidget_Metoprolol" + } + } + } + } + } + MeshObject "{59CE87DB17B6B1C5}" { + Materials { + MaterialAssignClass "{6214E80A70A62246}" { + SourceMaterial "MorphineInjection_01" + AssignedMaterial "{0F544FAC67C0A39E}Assets/Items/Medicine/MetoprololInjection/Data/ACE_Medical_MetoprololInjection.emat" + } + } + } + SCR_ConsumableItemComponent "{59E68C74C5CEE74F}" { + m_ConsumableEffect ACE_Medical_ConsumableMedication "{59E68C74C1F3910E}" { + m_aDamageEffectsToLoad { + UnknownDamageEffect "{6122D60861B541E7}" { + } + } + m_eDeviceType ACE_MEDICAL_METOPROLOL_INJECTOR + m_Doses { + ACE_Medical_Bolus "{6221174C139FA6F7}" { + m_eDrugType METOPROLOL + m_fConcentrationNM 480 + } + } + } + } + } +} \ No newline at end of file diff --git a/addons/medical_circulation/Prefabs/Items/Medicine/MetoprololInjection/ACE_Medical_MetoprololInjection.et.meta b/addons/medical_circulation/Prefabs/Items/Medicine/MetoprololInjection/ACE_Medical_MetoprololInjection.et.meta new file mode 100644 index 000000000..4a6cba4a5 --- /dev/null +++ b/addons/medical_circulation/Prefabs/Items/Medicine/MetoprololInjection/ACE_Medical_MetoprololInjection.et.meta @@ -0,0 +1,17 @@ +MetaFileClass { + Name "{D0434D5215B54181}Prefabs/Items/Medicine/MetoprololInjection/ACE_Medical_MetoprololInjection.et" + Configurations { + EntityTemplateResourceClass PC { + } + EntityTemplateResourceClass XBOX_ONE : PC { + } + EntityTemplateResourceClass XBOX_SERIES : PC { + } + EntityTemplateResourceClass PS4 : PC { + } + EntityTemplateResourceClass PS5 : PC { + } + EntityTemplateResourceClass HEADLESS : PC { + } + } +} \ No newline at end of file diff --git a/addons/medical_circulation/Prefabs/Items/Medicine/MorphineInjection_01/MorphineInjection_01.et b/addons/medical_circulation/Prefabs/Items/Medicine/MorphineInjection_01/MorphineInjection_01.et new file mode 100644 index 000000000..8b902a97c --- /dev/null +++ b/addons/medical_circulation/Prefabs/Items/Medicine/MorphineInjection_01/MorphineInjection_01.et @@ -0,0 +1,20 @@ +GenericEntity : "{3238FC0BDB67AA78}Prefabs/Items/Medicine/MorphineInjection_01/MorphineInjection_01_base.et" { + ID "0000000000000001" + components { + SCR_ConsumableItemComponent "{59E68C74C5CEE74F}" { + m_ConsumableEffect ACE_Medical_ConsumableMedication "{59E68C74C1F3910E}" { + m_aDamageEffectsToLoad { + UnknownDamageEffect "{6122D60861B541E7}" { + } + } + m_eDeviceType MORPHINE + m_Doses { + ACE_Medical_Bolus "{62211753DEE3BAC9}" { + m_eDrugType MORPHINE + m_fConcentrationNM 600 + } + } + } + } + } +} \ No newline at end of file diff --git a/addons/medical_circulation/Prefabs/Items/Medicine/MorphineInjection_01/MorphineInjection_01.et.meta b/addons/medical_circulation/Prefabs/Items/Medicine/MorphineInjection_01/MorphineInjection_01.et.meta new file mode 100644 index 000000000..f6865ef40 --- /dev/null +++ b/addons/medical_circulation/Prefabs/Items/Medicine/MorphineInjection_01/MorphineInjection_01.et.meta @@ -0,0 +1,17 @@ +MetaFileClass { + Name "{0D9A5DCF89AE7AA9}Prefabs/Items/Medicine/MorphineInjection_01/MorphineInjection_01.et" + Configurations { + EntityTemplateResourceClass PC { + } + EntityTemplateResourceClass XBOX_ONE : PC { + } + EntityTemplateResourceClass XBOX_SERIES : PC { + } + EntityTemplateResourceClass PS4 : PC { + } + EntityTemplateResourceClass HEADLESS : PC { + } + EntityTemplateResourceClass PS5 : PC { + } + } +} \ No newline at end of file diff --git a/addons/medical_circulation/Prefabs/Items/Medicine/NaloxoneInjection/ACE_Medical_NaloxoneInjection.et b/addons/medical_circulation/Prefabs/Items/Medicine/NaloxoneInjection/ACE_Medical_NaloxoneInjection.et new file mode 100644 index 000000000..726fd4649 --- /dev/null +++ b/addons/medical_circulation/Prefabs/Items/Medicine/NaloxoneInjection/ACE_Medical_NaloxoneInjection.et @@ -0,0 +1,41 @@ +GenericEntity : "{3238FC0BDB67AA78}Prefabs/Items/Medicine/MorphineInjection_01/MorphineInjection_01_base.et" { + ID "508AB2013EEE1E00" + components { + InventoryItemComponent "{5222EB4D0C73006B}" { + Attributes SCR_ItemAttributeCollection "{5222EB4D0A2B466B}" { + ItemDisplayName SCR_InventoryUIInfo "{5222EB4D07D865FA}" { + Name "#ACE_Medical-Item_Naloxone_Name" + Description "#ACE_Medical-Item_Naloxone_Description" + m_aItemHints { + SCR_InventoryItemHintUIInfo "{5E04DAAE66DE1E77}" { + Name "#ACE_Medical-InfoWidget_Naloxone" + } + } + } + } + } + MeshObject "{59CE87DB17B6B1C5}" { + Materials { + MaterialAssignClass "{62211777D706941C}" { + SourceMaterial "MorphineInjection_01" + AssignedMaterial "{C743E213F3F50576}Assets/Items/Medicine/NaloxoneInjection/Data/ACE_Medical_NaloxoneInjection.emat" + } + } + } + SCR_ConsumableItemComponent "{59E68C74C5CEE74F}" { + m_ConsumableEffect ACE_Medical_ConsumableMedication "{59E68C74C1F3910E}" { + m_aDamageEffectsToLoad { + UnknownDamageEffect "{6122D60861B541E7}" { + } + } + m_eDeviceType ACE_MEDICAL_NALOXONE_INJECTOR + m_Doses { + ACE_Medical_Bolus "{62211753E2C04DB9}" { + m_eDrugType NALOXONE + m_fConcentrationNM 600 + } + } + } + } + } +} \ No newline at end of file diff --git a/addons/medical_circulation/Prefabs/Items/Medicine/NaloxoneInjection/ACE_Medical_NaloxoneInjection.et.meta b/addons/medical_circulation/Prefabs/Items/Medicine/NaloxoneInjection/ACE_Medical_NaloxoneInjection.et.meta new file mode 100644 index 000000000..6c02a7c06 --- /dev/null +++ b/addons/medical_circulation/Prefabs/Items/Medicine/NaloxoneInjection/ACE_Medical_NaloxoneInjection.et.meta @@ -0,0 +1,17 @@ +MetaFileClass { + Name "{02DD34077F51F65E}Prefabs/Items/Medicine/NaloxoneInjection/ACE_Medical_NaloxoneInjection.et" + Configurations { + EntityTemplateResourceClass PC { + } + EntityTemplateResourceClass XBOX_ONE : PC { + } + EntityTemplateResourceClass XBOX_SERIES : PC { + } + EntityTemplateResourceClass PS4 : PC { + } + EntityTemplateResourceClass PS5 : PC { + } + EntityTemplateResourceClass HEADLESS : PC { + } + } +} \ No newline at end of file diff --git a/addons/medical_circulation/Prefabs/Items/Medicine/PhenylephrineInjection/ACE_Medical_PhenylephrineInjection.et b/addons/medical_circulation/Prefabs/Items/Medicine/PhenylephrineInjection/ACE_Medical_PhenylephrineInjection.et new file mode 100644 index 000000000..dbd078875 --- /dev/null +++ b/addons/medical_circulation/Prefabs/Items/Medicine/PhenylephrineInjection/ACE_Medical_PhenylephrineInjection.et @@ -0,0 +1,41 @@ +GenericEntity : "{3238FC0BDB67AA78}Prefabs/Items/Medicine/MorphineInjection_01/MorphineInjection_01_base.et" { + ID "508AB2013EEE1E00" + components { + InventoryItemComponent "{5222EB4D0C73006B}" { + Attributes SCR_ItemAttributeCollection "{5222EB4D0A2B466B}" { + ItemDisplayName SCR_InventoryUIInfo "{5222EB4D07D865FA}" { + Name "#ACE_Medical-Item_Phenylephrine_Name" + Description "#ACE_Medical-Item_Phenylephrine_Description" + m_aItemHints { + SCR_InventoryItemHintUIInfo "{5E04DAAE66DE1E77}" { + Name "#ACE_Medical-InfoWidget_Phenylephrine" + } + } + } + } + } + MeshObject "{59CE87DB17B6B1C5}" { + Materials { + MaterialAssignClass "{62211755A9EE015E}" { + SourceMaterial "MorphineInjection_01" + AssignedMaterial "{646DB64448CDBDA5}Assets/Items/Medicine/PhenylephrineInjection/Data/ACE_Medical_PhenylephrineInjection.emat" + } + } + } + SCR_ConsumableItemComponent "{59E68C74C5CEE74F}" { + m_ConsumableEffect ACE_Medical_ConsumableMedication "{59E68C74C1F3910E}" { + m_aDamageEffectsToLoad { + UnknownDamageEffect "{6122D60861B541E7}" { + } + } + m_eDeviceType ACE_MEDICAL_PHENYLEPHRINE_INJECTOR + m_Doses { + ACE_Medical_Bolus "{622117566CC6EFEE}" { + m_eDrugType PHENYLEPHRINE + m_fConcentrationNM 650 + } + } + } + } + } +} \ No newline at end of file diff --git a/addons/medical_circulation/Prefabs/Items/Medicine/PhenylephrineInjection/ACE_Medical_PhenylephrineInjection.et.meta b/addons/medical_circulation/Prefabs/Items/Medicine/PhenylephrineInjection/ACE_Medical_PhenylephrineInjection.et.meta new file mode 100644 index 000000000..9f6eb1835 --- /dev/null +++ b/addons/medical_circulation/Prefabs/Items/Medicine/PhenylephrineInjection/ACE_Medical_PhenylephrineInjection.et.meta @@ -0,0 +1,17 @@ +MetaFileClass { + Name "{9BBA766CD869002C}Prefabs/Items/Medicine/PhenylephrineInjection/ACE_Medical_PhenylephrineInjection.et" + Configurations { + EntityTemplateResourceClass PC { + } + EntityTemplateResourceClass XBOX_ONE : PC { + } + EntityTemplateResourceClass XBOX_SERIES : PC { + } + EntityTemplateResourceClass PS4 : PC { + } + EntityTemplateResourceClass PS5 : PC { + } + EntityTemplateResourceClass HEADLESS : PC { + } + } +} \ No newline at end of file diff --git a/addons/medical_circulation/Prefabs/Items/Medicine/SalineBag_01/SalineBag_01_base.et b/addons/medical_circulation/Prefabs/Items/Medicine/SalineBag_01/SalineBag_01_base.et new file mode 100644 index 000000000..17d6aa3b0 --- /dev/null +++ b/addons/medical_circulation/Prefabs/Items/Medicine/SalineBag_01/SalineBag_01_base.et @@ -0,0 +1,10 @@ +GenericEntity : "{C95E11C60810F432}Prefabs/Items/Core/Item_Base.et" { + ID "508AB2013EEE1E00" + components { + SCR_ConsumableItemComponent "{59E68C4DC131E9FC}" { + m_ConsumableEffect SCR_ConsumableSalineBag "{59E68C4DDD8B416A}" { + m_fItemAbsoluteRegenerationAmount 750 + } + } + } +} \ No newline at end of file diff --git a/addons/medical_circulation/Prefabs/Items/Medicine/SalineBag_01/SalineBag_01_base.et.meta b/addons/medical_circulation/Prefabs/Items/Medicine/SalineBag_01/SalineBag_01_base.et.meta new file mode 100644 index 000000000..c67b28cd0 --- /dev/null +++ b/addons/medical_circulation/Prefabs/Items/Medicine/SalineBag_01/SalineBag_01_base.et.meta @@ -0,0 +1,17 @@ +MetaFileClass { + Name "{8435F7561C0FBB44}Prefabs/Items/Medicine/SalineBag_01/SalineBag_01_base.et" + Configurations { + EntityTemplateResourceClass PC { + } + EntityTemplateResourceClass XBOX_ONE : PC { + } + EntityTemplateResourceClass XBOX_SERIES : PC { + } + EntityTemplateResourceClass PS4 : PC { + } + EntityTemplateResourceClass PS5 : PC { + } + EntityTemplateResourceClass HEADLESS : PC { + } + } +} \ No newline at end of file diff --git a/addons/medical_circulation/Sounds/UI/UI_Actions.acp b/addons/medical_circulation/Sounds/UI/UI_Actions.acp new file mode 100644 index 000000000..f5bee7061 --- /dev/null +++ b/addons/medical_circulation/Sounds/UI/UI_Actions.acp @@ -0,0 +1,554 @@ +AudioClass { + signals { + SignalClass "52237" { + id 52237 + name "Signal 45" + tl 676.665 -516.091 + res "{3C4126CF7BFD7368}Sounds/_SharedData/Signals/OneSignal/BloodLoss.sig" + inputsport { + 1 + } + outputsport { + 2 + } + inputvalues { + 0 + } + inputvaluesmin { + 0 + } + inputvaluesmax { + 1 + } + path "{3C4126CF7BFD7368}Sounds/_SharedData/Signals/OneSignal/BloodLoss.sig" + } + SignalClass "72717" { + id 72717 + name "ACE_Medical_CardiacArrest" + tl 682 -619 + res "{9F097893B8596923}Sounds/_SharedData/Signals/OneSignal/ACE_Medical_CardiacArrest.sig" + inputsport { + 1 + } + outputsport { + 2 + } + inputvalues { + 0 + } + inputvaluesmin { + 0 + } + inputvaluesmax { + 1 + } + path "{9F097893B8596923}Sounds/_SharedData/Signals/OneSignal/ACE_Medical_CardiacArrest.sig" + } + } + sounds { + SoundClass "55305" { + id 55305 + name "SOUND_SIREN" + version 5 + tl 938.094 558.492 + ins { + ConnectionsClass "con:64" { + id 64 + links { + ConnectionClass "66564:65" { + id 66564 + port 65 + } + } + } + } + outState 75787 + outStatePort 26631 + } + SoundClass "56329" { + id 56329 + name "SOUND_INJURED_PLAYERCHARACTER" + version 5 + tl 938.094 -434.189 + ctl 0 -21 + ins { + ConnectionsClass "con:64" { + id 64 + links { + ConnectionClass "73734:65" { + id 73734 + port 65 + } + } + } + } + priority 100 + outState 75787 + outStatePort 26631 + } + SoundClass "58377" { + id 58377 + name "SOUND_LOADSUPPLIES" + version 5 + tl 938.094 9.326 + ins { + ConnectionsClass "con:64" { + id 64 + links { + ConnectionClass "65540:65" { + id 65540 + port 65 + } + } + } + } + outState 75787 + outStatePort 26631 + } + SoundClass "62473" { + id 62473 + name "SOUND_RADIO_ROGERBEEP" + version 5 + tl 938.094 386.111 + ins { + ConnectionsClass "con:64" { + id 64 + links { + ConnectionClass "60420:65" { + id 60420 + port 65 + } + } + } + } + outState 75787 + outStatePort 26631 + } + SoundClass "64521" { + id 64521 + name "SOUND_UNLOADSUPPLIES" + version 5 + tl 938.094 -168.674 + ins { + ConnectionsClass "con:64" { + id 64 + links { + ConnectionClass "59396:65" { + id 59396 + port 65 + } + } + } + } + outState 75787 + outStatePort 26631 + } + SoundClass "67593" { + id 67593 + name "SOUND_DISASSEMBLY" + version 5 + tl 938.094 167.381 + ins { + ConnectionsClass "con:64" { + id 64 + links { + ConnectionClass "53252:65" { + id 53252 + port 65 + } + } + } + } + outState 75787 + outStatePort 26631 + } + SoundClass "70665" { + id 70665 + name "SOUND_DEPOSITINTEL" + version 5 + tl 940.407 737.778 + ins { + ConnectionsClass "con:64" { + id 64 + links { + ConnectionClass "71684:65" { + id 71684 + port 65 + } + } + } + } + outState 75787 + outStatePort 26631 + } + } + selectors { + SelectorClass "61446" { + id 61446 + name "Selector 46" + version 5 + tl 675.127 -435.706 + ins { + ConnectionsClass "con:0" { + id 0 + links { + ConnectionClass "52237:2" { + id 52237 + port 2 + } + } + } + ConnectionsClass "con:932527375" { + id 932527375 + links { + ConnectionClass "63492:65" { + id 63492 + port 65 + } + } + } + ConnectionsClass "con:1733352493" { + id 1733352493 + links { + ConnectionClass "54276:65" { + id 54276 + port 65 + } + } + } + ConnectionsClass "con:1795165494" { + id 1795165494 + links { + ConnectionClass "68612:65" { + id 68612 + port 65 + } + } + } + } + pi { + 1 0 + } + ports { + PortClass LowBloodLoss { + max 0.4 + default 1 + } + PortClass MidBloosLoss { + min 0.4 + max 0.7 + } + PortClass HighBloodLoss { + min 0.7 + max 1 + } + } + } + SelectorClass "73734" { + id 73734 + name "ACE_Medical_Selector" + version 5 + tl 877.4 -618.45 + ins { + ConnectionsClass "con:0" { + id 0 + links { + ConnectionClass "72717:2" { + id 72717 + port 2 + } + } + } + ConnectionsClass "con:665139527" { + id 665139527 + links { + ConnectionClass "61446:65" { + id 61446 + port 65 + } + } + } + ConnectionsClass "con:1847335848" { + id 1847335848 + links { + ConnectionClass "61446:65" { + id 61446 + port 65 + } + } + } + } + ports { + PortClass enabled { + max 1 + } + PortClass disabled { + min 1 + max 2 + volume_dB -60 + } + } + } + } + mixers { + MixerClass "75787" { + id 75787 + name "OutputState 20" + version 4 + tl 1349.749 -205.146 + res "{AF08E302CF8BA2E6}Sounds/FinalMix_UI_Music.afm" + ins { + ConnectionsClass "con:26631" { + id 26631 + links { + ConnectionClass "56329:65" { + id 56329 + port 65 + } + ConnectionClass "64521:65" { + id 64521 + port 65 + } + ConnectionClass "58377:65" { + id 58377 + port 65 + } + ConnectionClass "67593:65" { + id 67593 + port 65 + } + ConnectionClass "62473:65" { + id 62473 + port 65 + } + ConnectionClass "55305:65" { + id 55305 + port 65 + } + ConnectionClass "70665:65" { + id 70665 + port 65 + } + } + } + } + pi { + 2 0 + } + path "{AF08E302CF8BA2E6}Sounds/FinalMix_UI_Music.afm" + inputs { + "Music" "UI" + } + } + } + banks_local { + BankLocalClass "53252" { + id 53252 + name "Disassembly" + version 7 + tl 349.165 166.714 + Volume -11 + Samples { + AudioBankSampleClass "UI_Campaign_Disassembly.wav" { + Filename "{D5D7C4745AF70B22}Sounds/UI/Samples/Campaign/UI_Campaign_Disassembly.wav" + Probability 100 + Index 0 + SampleMetadata "" + } + } + } + BankLocalClass "54276" { + id 54276 + name "Heartbeat_Fast" + version 7 + tl 349.165 -325.365 + Samples { + AudioBankSampleClass "Character_Voice_Heartbeat_Fast_01.wav" { + Filename "{93F9F242DC3E0E1C}Sounds/Character/Voice/Samples/Heartbeat/Character_Voice_Heartbeat_Fast_01.wav" + Probability 100 + Index 0 + SampleMetadata "" + } + AudioBankSampleClass "Character_Voice_Heartbeat_Fast_02.wav" { + Filename "{0AE74BDBC1D93F8C}Sounds/Character/Voice/Samples/Heartbeat/Character_Voice_Heartbeat_Fast_02.wav" + Probability 100 + Index 0 + SampleMetadata "" + } + AudioBankSampleClass "Character_Voice_Heartbeat_Fast_03.wav" { + Filename "{7DED2353357BD0FC}Sounds/Character/Voice/Samples/Heartbeat/Character_Voice_Heartbeat_Fast_03.wav" + Probability 100 + Index 0 + SampleMetadata "" + } + AudioBankSampleClass "Character_Voice_Heartbeat_Fast_04.wav" { + Filename "{7A2AD90253FD6A3F}Sounds/Character/Voice/Samples/Heartbeat/Character_Voice_Heartbeat_Fast_04.wav" + Probability 100 + Index 0 + SampleMetadata "" + } + AudioBankSampleClass "Character_Voice_Heartbeat_Fast_05.wav" { + Filename "{0D20B18AA75F854F}Sounds/Character/Voice/Samples/Heartbeat/Character_Voice_Heartbeat_Fast_05.wav" + Probability 100 + Index 0 + SampleMetadata "" + } + } + } + BankLocalClass "59396" { + id 59396 + name "UnloadSupplies" + version 7 + tl 349.165 -169.341 + Volume -8 + Samples { + AudioBankSampleClass "UI_Campaign_Unload_Supplies.wav" { + Filename "{2CBF9835039200D6}Sounds/UI/Samples/Campaign/UI_Campaign_Unload_Supplies.wav" + Probability 100 + Index 0 + SampleMetadata "" + } + } + } + BankLocalClass "60420" { + id 60420 + name "RogerBeep" + version 7 + tl 349.165 390.873 + Volume -11 + Samples { + AudioBankSampleClass "Radio_RogerBeep_A_3.wav" { + Filename "{F3A4CAD9F63AAED8}Sounds/RadioProtocol/Samples/RogerBeep/Radio_RogerBeep_A_3.wav" + Probability 100 + Index 0 + SampleMetadata "" + } + } + } + BankLocalClass "63492" { + id 63492 + name "Heartbeat_Slow" + version 7 + tl 349.165 -530.304 + Volume -8 + Samples { + AudioBankSampleClass "Character_Voice_Heartbeat_Slow_01.wav" { + Filename "{9A36B88CB586AA8C}Sounds/Character/Voice/Samples/Heartbeat/Character_Voice_Heartbeat_Slow_01.wav" + Probability 100 + Index 0 + SampleMetadata "" + } + AudioBankSampleClass "Character_Voice_Heartbeat_Slow_02.wav" { + Filename "{03280115A8619B1C}Sounds/Character/Voice/Samples/Heartbeat/Character_Voice_Heartbeat_Slow_02.wav" + Probability 100 + Index 0 + SampleMetadata "" + } + AudioBankSampleClass "Character_Voice_Heartbeat_Slow_03.wav" { + Filename "{7422699D5CC3746C}Sounds/Character/Voice/Samples/Heartbeat/Character_Voice_Heartbeat_Slow_03.wav" + Probability 100 + Index 0 + SampleMetadata "" + } + AudioBankSampleClass "Character_Voice_Heartbeat_Slow_04.wav" { + Filename "{73E593CC3A45CEAF}Sounds/Character/Voice/Samples/Heartbeat/Character_Voice_Heartbeat_Slow_04.wav" + Probability 100 + Index 0 + SampleMetadata "" + } + AudioBankSampleClass "Character_Voice_Heartbeat_Slow_05.wav" { + Filename "{04EFFB44CEE721DF}Sounds/Character/Voice/Samples/Heartbeat/Character_Voice_Heartbeat_Slow_05.wav" + Probability 100 + Index 0 + SampleMetadata "" + } + } + } + BankLocalClass "65540" { + id 65540 + name "LoadSupplies" + version 7 + tl 349.165 8.659 + Volume -8 + Samples { + AudioBankSampleClass "UI_Campaign_Load_Supplies.wav" { + Filename "{E19EA4AD29C9A8DE}Sounds/UI/Samples/Campaign/UI_Campaign_Load_Supplies.wav" + Probability 100 + Index 0 + SampleMetadata "" + } + } + } + BankLocalClass "66564" { + id 66564 + name "Siren" + version 7 + tl 349.165 560.159 + Volume -6 + Samples { + AudioBankSampleClass "UI_Campaign_Siren.wav" { + Filename "{03D87648DB8A7641}Sounds/UI/Samples/Campaign/UI_Campaign_Siren.wav" + Probability 100 + Index 0 + SampleMetadata "" + } + } + } + BankLocalClass "68612" { + id 68612 + name "Heartbeat_Mid" + version 7 + tl 349.165 -430.332 + Volume -2 + Samples { + AudioBankSampleClass "Character_Voice_Heartbeat_Mid_01.wav" { + Filename "{7795DA13D207A2B1}Sounds/Character/Voice/Samples/Heartbeat/Character_Voice_Heartbeat_Mid_01.wav" + Probability 100 + Index 0 + SampleMetadata "" + } + AudioBankSampleClass "Character_Voice_Heartbeat_Mid_02.wav" { + Filename "{EE8B638ACFE09321}Sounds/Character/Voice/Samples/Heartbeat/Character_Voice_Heartbeat_Mid_02.wav" + Probability 100 + Index 0 + SampleMetadata "" + } + AudioBankSampleClass "Character_Voice_Heartbeat_Mid_03.wav" { + Filename "{99810B023B427C51}Sounds/Character/Voice/Samples/Heartbeat/Character_Voice_Heartbeat_Mid_03.wav" + Probability 100 + Index 0 + SampleMetadata "" + } + AudioBankSampleClass "Character_Voice_Heartbeat_Mid_04.wav" { + Filename "{9E46F1535DC4C692}Sounds/Character/Voice/Samples/Heartbeat/Character_Voice_Heartbeat_Mid_04.wav" + Probability 100 + Index 0 + SampleMetadata "" + } + AudioBankSampleClass "Character_Voice_Heartbeat_Mid_05.wav" { + Filename "{E94C99DBA96629E2}Sounds/Character/Voice/Samples/Heartbeat/Character_Voice_Heartbeat_Mid_05.wav" + Probability 100 + Index 0 + SampleMetadata "" + } + } + } + BankLocalClass "71684" { + id 71684 + name "DepositIntel" + version 7 + tl 349.165 747 + Volume 3 + Samples { + AudioBankSampleClass "UI_Campaign_Deposit_Intel.wav" { + Filename "{5414605BC8633ADA}Sounds/UI/Samples/Campaign/UI_Campaign_Deposit_Intel.wav" + Probability 100 + Index 0 + SampleMetadata "" + } + } + } + } + version 1 + sourcesLimit 1 +} \ No newline at end of file diff --git a/addons/medical_circulation/Sounds/UI/UI_Actions.acp.meta b/addons/medical_circulation/Sounds/UI/UI_Actions.acp.meta new file mode 100644 index 000000000..e6b3d4060 --- /dev/null +++ b/addons/medical_circulation/Sounds/UI/UI_Actions.acp.meta @@ -0,0 +1,17 @@ +MetaFileClass { + Name "{C7EE4C198B641E21}Sounds/UI/UI_Actions.acp" + Configurations { + AudioProjectResourceClass PC { + } + AudioProjectResourceClass XBOX_ONE : PC { + } + AudioProjectResourceClass XBOX_SERIES : PC { + } + AudioProjectResourceClass PS4 : PC { + } + AudioProjectResourceClass PS5 : PC { + } + AudioProjectResourceClass HEADLESS : PC { + } + } +} \ No newline at end of file diff --git a/addons/medical_circulation/Sounds/_SharedData/Signals/OneSignal/ACE_Medical_CardiacArrest.sig b/addons/medical_circulation/Sounds/_SharedData/Signals/OneSignal/ACE_Medical_CardiacArrest.sig new file mode 100644 index 000000000..84dd259e6 --- /dev/null +++ b/addons/medical_circulation/Sounds/_SharedData/Signals/OneSignal/ACE_Medical_CardiacArrest.sig @@ -0,0 +1,41 @@ +AudioSignalResClass { + Inputs { + IOPItemInputClass { + id 1 + name "ACE_Medical_CardiacArrest" + tl 0 32 + children { + 2 + } + } + } + Outputs { + IOPItemOutputClass { + id 2 + name "ACE_Medical_CardiacArrest" + tl 198 32 + input 1 + } + } + compiled IOPCompiledClass { + visited { + 5 6 + } + ins { + IOPCompiledIn { + data { + 1 2 + } + } + } + outs { + IOPCompiledOut { + data { + 0 + } + } + } + processed 2 + version 2 + } +} \ No newline at end of file diff --git a/addons/medical_circulation/Sounds/_SharedData/Signals/OneSignal/ACE_Medical_CardiacArrest.sig.meta b/addons/medical_circulation/Sounds/_SharedData/Signals/OneSignal/ACE_Medical_CardiacArrest.sig.meta new file mode 100644 index 000000000..07827b85f --- /dev/null +++ b/addons/medical_circulation/Sounds/_SharedData/Signals/OneSignal/ACE_Medical_CardiacArrest.sig.meta @@ -0,0 +1,17 @@ +MetaFileClass { + Name "{9F097893B8596923}Sounds/_SharedData/Signals/OneSignal/ACE_Medical_CardiacArrest.sig" + Configurations { + AudioSignalResourceClass PC { + } + AudioSignalResourceClass XBOX_ONE : PC { + } + AudioSignalResourceClass XBOX_SERIES : PC { + } + AudioSignalResourceClass PS4 : PC { + } + AudioSignalResourceClass PS5 : PC { + } + AudioSignalResourceClass HEADLESS : PC { + } + } +} \ No newline at end of file diff --git a/addons/medical_circulation/UI/layouts/Damage/InspectCasualtyMenu.layout b/addons/medical_circulation/UI/layouts/Damage/InspectCasualtyMenu.layout new file mode 100644 index 000000000..b14485e88 --- /dev/null +++ b/addons/medical_circulation/UI/layouts/Damage/InspectCasualtyMenu.layout @@ -0,0 +1,55 @@ +FrameWidgetClass { + { + FrameWidgetClass "{5D8CD8E0B7ECD7DE}" { + Prefab "{5D8CD8E0B7ECD7DE}" + { + SizeLayoutWidgetClass "{5D8CD8E0B7ECD7CF}" { + Prefab "{5D8CD8E0B7ECD7CF}" + { + FrameWidgetClass "{5D8CD8E0B7ECD7F5}" { + Prefab "{5D8CD8E0B7ECD7F5}" + { + OverlayWidgetClass "{5D8CD8E0B7ECD7FC}" { + Prefab "{5D8CD8E0B7ECD7FC}" + { + VerticalLayoutWidgetClass "{5D8EBD44CE264FE8}" { + Prefab "{5D8EBD44CE264FE8}" + { + VerticalLayoutWidgetClass "{5D8EBD44CE264F96}" { + Prefab "{5D8EBD44CE264F96}" + { + HorizontalLayoutWidgetClass "{5D8EBD44CE264F9B}" { + Prefab "{5D8EBD44CE264F9B}" + { + VerticalLayoutWidgetClass "{5D8EBD44CE264F86}" { + Prefab "{5D8EBD44CE264F86}" + { + TextWidgetClass "{6228B54216177DFD}" { + Name "ACE_Medical_BleedingRate_text" + Slot LayoutSlot "{6228B54273AB71B8}" { + } + "Is Visible" 0 + "Font Size" 14 + "Min Font Size" 14 + "Vertical Alignment" Center + Wrap 1 + Offset 25 0 + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } +} \ No newline at end of file diff --git a/addons/medical_circulation/UI/layouts/Damage/InspectCasualtyMenu.layout.meta b/addons/medical_circulation/UI/layouts/Damage/InspectCasualtyMenu.layout.meta new file mode 100644 index 000000000..6590ce973 --- /dev/null +++ b/addons/medical_circulation/UI/layouts/Damage/InspectCasualtyMenu.layout.meta @@ -0,0 +1,17 @@ +MetaFileClass { + Name "{11AC7D61FD4CF3F6}UI/layouts/Damage/InspectCasualtyMenu.layout" + Configurations { + LayoutResourceClass PC { + } + LayoutResourceClass XBOX_ONE : PC { + } + LayoutResourceClass XBOX_SERIES : PC { + } + LayoutResourceClass PS4 : PC { + } + LayoutResourceClass PS5 : PC { + } + LayoutResourceClass HEADLESS : PC { + } + } +} \ No newline at end of file diff --git a/addons/medical_circulation/UI/layouts/Menus/Inventory/InventoryDamageInfo.layout b/addons/medical_circulation/UI/layouts/Menus/Inventory/InventoryDamageInfo.layout new file mode 100644 index 000000000..8c5cc1400 --- /dev/null +++ b/addons/medical_circulation/UI/layouts/Menus/Inventory/InventoryDamageInfo.layout @@ -0,0 +1,39 @@ +FrameWidgetClass { + { + FrameWidgetClass "{5CEED9EF77337926}" { + Prefab "{5CEED9EF77337926}" + { + SizeLayoutWidgetClass "{5CEED9EF77337922}" { + Prefab "{5CEED9EF77337922}" + { + FrameWidgetClass "{5CEED9EF7733792C}" { + Prefab "{5CEED9EF7733792C}" + { + OverlayWidgetClass "{5CEED9EF7733792D}" { + Prefab "{5CEED9EF7733792D}" + { + VerticalLayoutWidgetClass "{5CEED9EF7733792A}" { + Prefab "{5CEED9EF7733792A}" + { + VerticalLayoutWidgetClass "{5CEED9EF773378D2}" { + Prefab "{5CEED9EF773378D2}" + { + HorizontalLayoutWidgetClass "{671D563B7FE5005C}" : "{A0E642090EC80F41}UI/layouts/Menus/Inventory/Medical/ACE_Medical_MedicationTooltipEntry.layout" { + Name "ACE_Medical_MedicationLayout" + Slot LayoutSlot "{671D563B4A9CC93C}" { + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } +} \ No newline at end of file diff --git a/addons/medical_circulation/UI/layouts/Menus/Inventory/InventoryDamageInfo.layout.meta b/addons/medical_circulation/UI/layouts/Menus/Inventory/InventoryDamageInfo.layout.meta new file mode 100644 index 000000000..cd01487cb --- /dev/null +++ b/addons/medical_circulation/UI/layouts/Menus/Inventory/InventoryDamageInfo.layout.meta @@ -0,0 +1,17 @@ +MetaFileClass { + Name "{55AFA256E1C20FB2}UI/layouts/Menus/Inventory/InventoryDamageInfo.layout" + Configurations { + LayoutResourceClass PC { + } + LayoutResourceClass XBOX_ONE : PC { + } + LayoutResourceClass XBOX_SERIES : PC { + } + LayoutResourceClass PS4 : PC { + } + LayoutResourceClass PS5 : PC { + } + LayoutResourceClass HEADLESS : PC { + } + } +} \ No newline at end of file diff --git a/addons/medical_circulation/UI/layouts/Menus/Inventory/InventoryMain.layout b/addons/medical_circulation/UI/layouts/Menus/Inventory/InventoryMain.layout new file mode 100644 index 000000000..d44b4476e --- /dev/null +++ b/addons/medical_circulation/UI/layouts/Menus/Inventory/InventoryMain.layout @@ -0,0 +1,50 @@ +FrameWidgetClass { + { + OverlayWidgetClass "{60DCC8DF2787CD32}" { + Prefab "{60DCC8DF2787CD32}" + { + SizeLayoutWidgetClass "{589F049780D13CA5}" { + Prefab "{589F049780D13CA5}" + { + VerticalLayoutWidgetClass "{589F049780D13CA3}" { + Prefab "{589F049780D13CA3}" + { + OverlayWidgetClass "{589F0497F7A00346}" { + Prefab "{589F0497F7A00346}" + { + HorizontalLayoutWidgetClass "{60DCC8DF2787CD00}" { + Prefab "{60DCC8DF2787CD00}" + { + SizeLayoutWidgetClass "{60E8ACB4B49799E9}" { + Prefab "{60E8ACB4B49799E9}" + { + OverlayWidgetClass "{60E672A53165A6BB}" { + Prefab "{60E672A53165A6BB}" + { + VerticalLayoutWidgetClass "{60DCC8DF2787CD61}" { + Prefab "{60DCC8DF2787CD61}" + { + FrameWidgetClass "{671C3808486C0DD3}" : "{B9C23E1A72BB9D35}UI/layouts/Menus/Inventory/Medical/ACE_Medical_MedicationInfo.layout" { + Name "ACE_Medical_MedicationInfo" + Slot LayoutSlot "{671C3808486C0DB7}" { + Padding 0 0 0 4 + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } +} \ No newline at end of file diff --git a/addons/medical_circulation/UI/layouts/Menus/Inventory/InventoryMain.layout.meta b/addons/medical_circulation/UI/layouts/Menus/Inventory/InventoryMain.layout.meta new file mode 100644 index 000000000..7cada3543 --- /dev/null +++ b/addons/medical_circulation/UI/layouts/Menus/Inventory/InventoryMain.layout.meta @@ -0,0 +1,17 @@ +MetaFileClass { + Name "{981ACF4F45EAECAE}UI/layouts/Menus/Inventory/InventoryMain.layout" + Configurations { + LayoutResourceClass PC { + } + LayoutResourceClass XBOX_ONE : PC { + } + LayoutResourceClass XBOX_SERIES : PC { + } + LayoutResourceClass PS4 : PC { + } + LayoutResourceClass PS5 : PC { + } + LayoutResourceClass HEADLESS : PC { + } + } +} \ No newline at end of file diff --git a/addons/medical_circulation/UI/layouts/Menus/Inventory/Medical/ACE_Medical_MedicationInfo.layout b/addons/medical_circulation/UI/layouts/Menus/Inventory/Medical/ACE_Medical_MedicationInfo.layout new file mode 100644 index 000000000..9b3f8c9e9 --- /dev/null +++ b/addons/medical_circulation/UI/layouts/Menus/Inventory/Medical/ACE_Medical_MedicationInfo.layout @@ -0,0 +1,104 @@ +FrameWidgetClass { + Name "MedicationInfo" + Slot FrameWidgetSlot "{5A5A812761D27B12}" { + OffsetLeft 0 + OffsetTop 0 + SizeX 48 + OffsetRight -48 + SizeY 48 + OffsetBottom -48 + Alignment 0.5 0.5 + } + "Z Order" 1000 + Clipping False + components { + SCR_InventoryHitZonePointUI "{5A5A9494EB54C5E9}" { + m_bAllowHoverOver 0 + m_bBleedingHitZone 1 + m_aDOTLevels { + 0 10 20 30 + } + m_eACE_Medical_TooltipInfoType MEDICATION + } + } + { + OverlayWidgetClass "{671C380801558B46}" { + Name "Overlay0" + Slot FrameWidgetSlot "{5A6059EC9C7D4AEC}" { + Anchor 0.5 0.5 0.5 0.5 + PositionX 0 + OffsetLeft 0 + PositionY 0 + OffsetTop 0 + SizeX 48 + OffsetRight -48 + SizeY 48 + OffsetBottom -48 + Alignment 0.5 0.5 + } + Clipping False + { + SizeLayoutWidgetClass "{671C380801558B45}" { + Name "rootFrame" + Slot OverlayWidgetSlot "{5A5A8123BB0BEB70}" { + HorizontalAlign 3 + VerticalAlign 3 + } + Clipping False + WidthOverride 80 + HeightOverride 80 + { + OverlayWidgetClass "{671C380801558B44}" { + Name "Overlay0" + Slot AlignableSlot "{5A5A5CEA6816EA21}" { + HorizontalAlign 3 + VerticalAlign 3 + } + { + ImageWidgetClass "{671C38080155449F}" { + Name "Background" + Slot OverlayWidgetSlot "{5A5A5CEA615FA2E8}" { + } + Color 0.074 0.074 0.074 1 + Texture "{758F6E249DD20A02}UI/Textures/InventoryIcons/Medical/medical-con-BG_UI.edds" + Size 64 64 + } + ButtonWidgetClass "{671C380801558B4B}" { + Name "BigMorphineIcon" + Slot OverlayWidgetSlot "{5A5A5EC2ED525CEA}" { + HorizontalAlign 3 + VerticalAlign 3 + } + Opacity 0 + Color 0 0 0 0.369 + } + ImageWidgetClass "{671C380801550B45}" { + Name "Icon" + Slot OverlayWidgetSlot "{5A5A5EC4D9AADDAE}" { + HorizontalAlign 3 + VerticalAlign 3 + } + Texture "{B9199157B90D6216}UI/Textures/InventoryIcons/Medical/Medical-icons.imageset" + Image "Morphine_UI" + Size 64 64 + Mask "{EEEA388EB9A457E9}UI/Textures/ProgressMasks/ProgressMaskVertical_256x1.edds" + "Transition width" 0.07 + Progress 0 + "Mask Mode" "Include Below" + Range 0.5 + } + ImageWidgetClass "{671C38080155449C}" { + Name "Outline" + Slot OverlayWidgetSlot "{5A5A8121CADF661C}" { + } + Texture "{4C13A0801C18ED27}UI/Textures/InventoryIcons/Medical/outline_UI.edds" + Size 64 64 + } + } + } + } + } + } + } + } +} \ No newline at end of file diff --git a/addons/medical_circulation/UI/layouts/Menus/Inventory/Medical/ACE_Medical_MedicationInfo.layout.meta b/addons/medical_circulation/UI/layouts/Menus/Inventory/Medical/ACE_Medical_MedicationInfo.layout.meta new file mode 100644 index 000000000..babc6eea0 --- /dev/null +++ b/addons/medical_circulation/UI/layouts/Menus/Inventory/Medical/ACE_Medical_MedicationInfo.layout.meta @@ -0,0 +1,17 @@ +MetaFileClass { + Name "{B9C23E1A72BB9D35}UI/layouts/Menus/Inventory/Medical/ACE_Medical_MedicationInfo.layout" + Configurations { + LayoutResourceClass PC { + } + LayoutResourceClass XBOX_ONE : PC { + } + LayoutResourceClass XBOX_SERIES : PC { + } + LayoutResourceClass PS4 : PC { + } + LayoutResourceClass PS5 : PC { + } + LayoutResourceClass HEADLESS : PC { + } + } +} \ No newline at end of file diff --git a/addons/medical_circulation/UI/layouts/Menus/Inventory/Medical/ACE_Medical_MedicationTooltipEntry.layout b/addons/medical_circulation/UI/layouts/Menus/Inventory/Medical/ACE_Medical_MedicationTooltipEntry.layout new file mode 100644 index 000000000..1580bc2ce --- /dev/null +++ b/addons/medical_circulation/UI/layouts/Menus/Inventory/Medical/ACE_Medical_MedicationTooltipEntry.layout @@ -0,0 +1,41 @@ +HorizontalLayoutWidgetClass "{671C387381A92902}" { + Name "ACE_Medical_MedicationLayout" + Slot LayoutSlot "{671D563B4A9CC93C}" { + } + { + VerticalLayoutWidgetClass "{671C3873B94DD0A0}" { + Name "VerticalLayout0" + Slot LayoutSlot "{671D563B4A9CC92D}" { + } + { + ImageWidgetClass "{671C3873AF2A66F5}" { + Name "MorphineInfo_icon" + Slot LayoutSlot "{671D563B4A9CC977}" { + } + "Is Visible" 0 + Size 48 48 + } + } + } + VerticalLayoutWidgetClass "{671C3873A85D800B}" { + Name "VerticalLayout1" + Slot LayoutSlot "{671D563B4A9CC969}" { + } + { + TextWidgetClass "{671C3873A2E2973B}" { + Name "MorphineInfo_text" + Slot LayoutSlot "{671D563B4A9CC9B6}" { + VerticalAlign 1 + SizeMode Fill + } + "Is Visible" 0 + "Font Size" 18 + "Min Font Size" 18 + "Vertical Alignment" Center + Wrap 1 + Offset 20 0 + } + } + } + } +} \ No newline at end of file diff --git a/addons/medical_circulation/UI/layouts/Menus/Inventory/Medical/ACE_Medical_MedicationTooltipEntry.layout.meta b/addons/medical_circulation/UI/layouts/Menus/Inventory/Medical/ACE_Medical_MedicationTooltipEntry.layout.meta new file mode 100644 index 000000000..52922f0d6 --- /dev/null +++ b/addons/medical_circulation/UI/layouts/Menus/Inventory/Medical/ACE_Medical_MedicationTooltipEntry.layout.meta @@ -0,0 +1,17 @@ +MetaFileClass { + Name "{A0E642090EC80F41}UI/layouts/Menus/Inventory/Medical/ACE_Medical_MedicationLayout.layout" + Configurations { + LayoutResourceClass PC { + } + LayoutResourceClass XBOX_ONE : PC { + } + LayoutResourceClass XBOX_SERIES : PC { + } + LayoutResourceClass PS4 : PC { + } + LayoutResourceClass PS5 : PC { + } + LayoutResourceClass HEADLESS : PC { + } + } +} \ No newline at end of file diff --git a/addons/medical_circulation/addon.gproj b/addons/medical_circulation/addon.gproj new file mode 100644 index 000000000..66e8ed393 --- /dev/null +++ b/addons/medical_circulation/addon.gproj @@ -0,0 +1,83 @@ +GameProject { + ID "ACE_Medical_Circulation" + GUID "6214CEA5DA92BFF3" + TITLE "ACE Medical Circulation" + Dependencies { + "60C4C12DAE90727B" "58D0FB3206B6F859" + } + Configurations { + GameProjectConfig PC { + WidgetManagerSettings WidgetManagerSettings "{AC4BE58770485E02}" { + StringTables { + StringTableDefinition "{6228B5580E12AEF7}" { + StringTableSource "{0780D43A82968920}Language/ACE_Medical_Circulation_localization.st" + Languages { + LanguageDefinition "{6228B5580CB048CE}" { + Code "cs_cz" + StringTableRuntime "{6903D9F8F45FDC93}Language/ACE_Medical_Circulation_localization.cs_cz.conf" + } + LanguageDefinition "{6228B5580CB0487E}" { + Code "de_de" + StringTableRuntime "{BC7DC3CBE7FCCDB3}Language/ACE_Medical_Circulation_localization.de_de.conf" + } + LanguageDefinition "{6228B5580CB04854}" { + Code "en_us" + StringTableRuntime "{E28D49808D0FC8B2}Language/ACE_Medical_Circulation_localization.en_us.conf" + } + LanguageDefinition "{6228B5580CB04849}" { + Code "es_es" + StringTableRuntime "{27C10409630DA3AD}Language/ACE_Medical_Circulation_localization.es_es.conf" + } + LanguageDefinition "{6228B5580CB037A2}" { + Code "fr_fr" + StringTableRuntime "{9C69F13E858E40AF}Language/ACE_Medical_Circulation_localization.fr_fr.conf" + } + LanguageDefinition "{6228B5580CB0379B}" { + Code "it_it" + StringTableRuntime "{1C757E0A28ACC356}Language/ACE_Medical_Circulation_localization.it_it.conf" + } + LanguageDefinition "{6228B5580CB0378C}" { + Code "ja_jp" + StringTableRuntime "{0C6EC39816DDF3FD}Language/ACE_Medical_Circulation_localization.ja_jp.conf" + } + LanguageDefinition "{6228B5580CB037E4}" { + Code "ko_kr" + StringTableRuntime "{ACD0EB3485F0F0C2}Language/ACE_Medical_Circulation_localization.ko_kr.conf" + } + LanguageDefinition "{6228B5580CB037DE}" { + Code "pl_pl" + StringTableRuntime "{F0A14DCE3B1F6CBE}Language/ACE_Medical_Circulation_localization.pl_pl.conf" + } + LanguageDefinition "{6228B5580CB035BB}" { + Code "pt_br" + StringTableRuntime "{25D6D70200E1A604}Language/ACE_Medical_Circulation_localization.pt_br.conf" + } + LanguageDefinition "{6228B5580CB03598}" { + Code "ru_ru" + StringTableRuntime "{7097C3AA9D98C372}Language/ACE_Medical_Circulation_localization.ru_ru.conf" + } + LanguageDefinition "{6228B5580CB035FA}" { + Code "uk_ua" + StringTableRuntime "{FACF965CF1B67D27}Language/ACE_Medical_Circulation_localization.uk_ua.conf" + } + LanguageDefinition "{6228B5580CB035EF}" { + Code "zh_cn" + StringTableRuntime "{207FF861C816AD3A}Language/ACE_Medical_Circulation_localization.zh_cn.conf" + } + } + } + } + } + } + GameProjectConfig XBOX_ONE { + } + GameProjectConfig XBOX_SERIES { + } + GameProjectConfig PS4 { + } + GameProjectConfig PS5 { + } + GameProjectConfig HEADLESS { + } + } +} \ No newline at end of file diff --git a/addons/medical_circulation/dev.gproj b/addons/medical_circulation/dev.gproj index 878d69c69..d53440d52 100644 --- a/addons/medical_circulation/dev.gproj +++ b/addons/medical_circulation/dev.gproj @@ -7,6 +7,67 @@ GameProject { } Configurations { GameProjectConfig PC { + WidgetManagerSettings WidgetManagerSettings "{AC4BE58770485E02}" { + StringTables { + StringTableDefinition "{6228B5580E12AEF7}" { + StringTableSource "{0780D43A82968920}Language/ACE_Medical_Circulation_localization.st" + Languages { + LanguageDefinition "{6228B5580CB048CE}" { + Code "cs_cz" + StringTableRuntime "{6903D9F8F45FDC93}Language/ACE_Medical_Circulation_localization.cs_cz.conf" + } + LanguageDefinition "{6228B5580CB0487E}" { + Code "de_de" + StringTableRuntime "{BC7DC3CBE7FCCDB3}Language/ACE_Medical_Circulation_localization.de_de.conf" + } + LanguageDefinition "{6228B5580CB04854}" { + Code "en_us" + StringTableRuntime "{E28D49808D0FC8B2}Language/ACE_Medical_Circulation_localization.en_us.conf" + } + LanguageDefinition "{6228B5580CB04849}" { + Code "es_es" + StringTableRuntime "{27C10409630DA3AD}Language/ACE_Medical_Circulation_localization.es_es.conf" + } + LanguageDefinition "{6228B5580CB037A2}" { + Code "fr_fr" + StringTableRuntime "{9C69F13E858E40AF}Language/ACE_Medical_Circulation_localization.fr_fr.conf" + } + LanguageDefinition "{6228B5580CB0379B}" { + Code "it_it" + StringTableRuntime "{1C757E0A28ACC356}Language/ACE_Medical_Circulation_localization.it_it.conf" + } + LanguageDefinition "{6228B5580CB0378C}" { + Code "ja_jp" + StringTableRuntime "{0C6EC39816DDF3FD}Language/ACE_Medical_Circulation_localization.ja_jp.conf" + } + LanguageDefinition "{6228B5580CB037E4}" { + Code "ko_kr" + StringTableRuntime "{ACD0EB3485F0F0C2}Language/ACE_Medical_Circulation_localization.ko_kr.conf" + } + LanguageDefinition "{6228B5580CB037DE}" { + Code "pl_pl" + StringTableRuntime "{F0A14DCE3B1F6CBE}Language/ACE_Medical_Circulation_localization.pl_pl.conf" + } + LanguageDefinition "{6228B5580CB035BB}" { + Code "pt_br" + StringTableRuntime "{25D6D70200E1A604}Language/ACE_Medical_Circulation_localization.pt_br.conf" + } + LanguageDefinition "{6228B5580CB03598}" { + Code "ru_ru" + StringTableRuntime "{7097C3AA9D98C372}Language/ACE_Medical_Circulation_localization.ru_ru.conf" + } + LanguageDefinition "{6228B5580CB035FA}" { + Code "uk_ua" + StringTableRuntime "{FACF965CF1B67D27}Language/ACE_Medical_Circulation_localization.uk_ua.conf" + } + LanguageDefinition "{6228B5580CB035EF}" { + Code "zh_cn" + StringTableRuntime "{207FF861C816AD3A}Language/ACE_Medical_Circulation_localization.zh_cn.conf" + } + } + } + } + } } GameProjectConfig XBOX_ONE { } diff --git a/addons/medical_circulation/license.txt b/addons/medical_circulation/license.txt new file mode 100644 index 000000000..6ebf24cf1 --- /dev/null +++ b/addons/medical_circulation/license.txt @@ -0,0 +1,18 @@ +ACE Anvil - An experimental realism mod for Arma Reforger +Copyright (C) 2024 acemod + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +When publishing a derivative of this product you may not use a name that +might create the impression that your version is an official release. + +A full copy of this license can be found at the following address: +https://github.com/acemod/ACE-Anvil/blob/master/LICENSE. diff --git a/addons/medical_circulation/scripts/Game/ACE_Medical_Circulation/Character/SCR_CharacterControllerComponent.c b/addons/medical_circulation/scripts/Game/ACE_Medical_Circulation/Character/SCR_CharacterControllerComponent.c new file mode 100644 index 000000000..f909e11f6 --- /dev/null +++ b/addons/medical_circulation/scripts/Game/ACE_Medical_Circulation/Character/SCR_CharacterControllerComponent.c @@ -0,0 +1,25 @@ +//------------------------------------------------------------------------------------------------ +modded class SCR_CharacterControllerComponent : CharacterControllerComponent +{ + //----------------------------------------------------------------------------------------------------------- + //! Unset "m_bWasRevived" when waking up + override void OnLifeStateChanged(ECharacterLifeState previousLifeState, ECharacterLifeState newLifeState, bool isJIP) + { + super.OnLifeStateChanged(previousLifeState, newLifeState, isJIP); + + if (!Replication.IsServer() || (previousLifeState != ECharacterLifeState.INCAPACITATED) || (newLifeState != ECharacterLifeState.ALIVE)) + return; + + SCR_ChimeraCharacter ownerChar = SCR_ChimeraCharacter.Cast(GetOwner()); + if (!ownerChar) + return; + + ACE_Medical_VitalsComponent vitalsComponent = ACE_Medical_VitalsComponent.Cast(ownerChar.FindComponent(ACE_Medical_VitalsComponent)); + if (vitalsComponent) + vitalsComponent.ClearReviveHistory(); + + SCR_CharacterDamageManagerComponent damageManager = SCR_CharacterDamageManagerComponent.Cast(ownerChar.GetDamageManager()); + if (damageManager) + damageManager.ACE_Medical_UpdateResilienceRegenScale(); + } +} diff --git a/addons/medical_circulation/scripts/Game/ACE_Medical_Circulation/Components/ACE_Medical_NetworkComponent.c b/addons/medical_circulation/scripts/Game/ACE_Medical_Circulation/Components/ACE_Medical_NetworkComponent.c new file mode 100644 index 000000000..66421ff8a --- /dev/null +++ b/addons/medical_circulation/scripts/Game/ACE_Medical_Circulation/Components/ACE_Medical_NetworkComponent.c @@ -0,0 +1,81 @@ +//------------------------------------------------------------------------------------------------ +class ACE_Medical_NetworkComponentClass: ScriptComponentClass +{ +} + +//------------------------------------------------------------------------------------------------ +//! Class attached to player controller +class ACE_Medical_NetworkComponent : ScriptComponent +{ + //------------------------------------------------------------------------------------------------ + void RequestPatientStateNotification(ENotification type, SCR_ChimeraCharacter patient) + { + Rpc(RpcAsk_SendPatientStateNotification, type, Replication.FindItemId(patient)); + } + + //------------------------------------------------------------------------------------------------ + [RplRpc(RplChannel.Reliable, RplRcver.Server)] + protected void RpcAsk_SendPatientStateNotification(ENotification type, RplId patientId) + { + SCR_ChimeraCharacter patient = SCR_ChimeraCharacter.Cast(Replication.FindItem(patientId)); + if (!patient) + return; + + ACE_Medical_CharacterContext patientContext = new ACE_Medical_CharacterContext(patient); + + int param1, param2; + if (!GetPatientStateNotificationData(patientContext, type, param1, param2)) + return; + + SCR_PlayerController ownerPlayerController = SCR_PlayerController.Cast(GetOwner()); + SCR_NotificationsComponent.SendToPlayer(ownerPlayerController.GetPlayerId(), type, param1, param2); + } + + //------------------------------------------------------------------------------------------------ + protected bool GetPatientStateNotificationData(ACE_Medical_CharacterContext patientContext, ENotification type, out int param1, out int param2) + { + switch (type) + { + case ENotification.ACE_MEDICAL_PULSE_RESULT: + { + param1 = patientContext.m_pVitals.GetHeartRate(); + return true; + } + + case ENotification.ACE_MEDICAL_BLOOD_PRESSURE_RESULT: + { + Tuple2 pressures = patientContext.m_pVitals.GetBloodPressures(); + param1 = pressures.param2 * ACE_PhysicalConstants.KPA2MMHG; + param2 = pressures.param1 * ACE_PhysicalConstants.KPA2MMHG; + return true; + } + } + + return false; + } + + //------------------------------------------------------------------------------------------------ + //! Allows clients to request an update of the data of a patient + void RequestUpdatePatientData(SCR_ChimeraCharacter patient) + { + Rpc(RpcAsk_UpdatePatientData, Replication.FindItemId(patient)); + } + + //------------------------------------------------------------------------------------------------ + [RplRpc(RplChannel.Reliable, RplRcver.Server)] + protected void RpcAsk_UpdatePatientData(RplId patientID) + { + SCR_ChimeraCharacter patient = SCR_ChimeraCharacter.Cast(Replication.FindItem(patientID)); + if (patient) + Rpc(RpcDo_UpdatePatientDataOwner, patientID, ACE_Medical_PatientData.Create(patient)); + } + + //------------------------------------------------------------------------------------------------ + [RplRpc(RplChannel.Reliable, RplRcver.Owner)] + protected void RpcDo_UpdatePatientDataOwner(RplId patientID, ACE_Medical_PatientData data) + { + SCR_ChimeraCharacter patient = SCR_ChimeraCharacter.Cast(Replication.FindItem(patientID)); + if (patient) + data.Apply(patient); + } +} diff --git a/addons/medical_circulation/scripts/Game/ACE_Medical_Circulation/Components/ACE_Medical_PatientData.c b/addons/medical_circulation/scripts/Game/ACE_Medical_Circulation/Components/ACE_Medical_PatientData.c new file mode 100644 index 000000000..c971e52ea --- /dev/null +++ b/addons/medical_circulation/scripts/Game/ACE_Medical_Circulation/Components/ACE_Medical_PatientData.c @@ -0,0 +1,80 @@ +//------------------------------------------------------------------------------------------------ +//! Data to be synchronized for medic +class ACE_Medical_PatientData : Managed +{ + protected float m_fHeartRate; + protected float m_fMeanArterialPressure; + protected float m_fPulsePressure; + + protected static const int SNAPSHOT_SIZE = 12; + + //------------------------------------------------------------------------------------------------ + static ACE_Medical_PatientData Create(notnull SCR_ChimeraCharacter char) + { + ACE_Medical_VitalsComponent vitalsComponent = ACE_Medical_VitalsComponent.Cast(char.FindComponent(ACE_Medical_VitalsComponent)); + if (!vitalsComponent) + return null; + + ACE_Medical_PatientData instance = new ACE_Medical_PatientData(); + instance.m_fHeartRate = vitalsComponent.GetHeartRate(); + instance.m_fMeanArterialPressure = vitalsComponent.GetMeanArterialPressure(); + instance.m_fPulsePressure = vitalsComponent.GetPulsePressure(); + return instance; + } + + //------------------------------------------------------------------------------------------------ + void Apply(notnull SCR_ChimeraCharacter char) + { + ACE_Medical_VitalsComponent vitalsComponent = ACE_Medical_VitalsComponent.Cast(char.FindComponent(ACE_Medical_VitalsComponent)); + if (!vitalsComponent) + return; + + vitalsComponent.SetHeartRate(m_fHeartRate); + vitalsComponent.SetMeanArterialPressure(m_fMeanArterialPressure); + vitalsComponent.SetPulsePressure(m_fPulsePressure); + } + + //------------------------------------------------------------------------------------------------ + static bool Extract(ACE_Medical_PatientData instance, ScriptCtx ctx, SSnapSerializerBase snapshot) + { + snapshot.SerializeFloat(instance.m_fHeartRate); + snapshot.SerializeFloat(instance.m_fMeanArterialPressure); + snapshot.SerializeFloat(instance.m_fPulsePressure); + return true; + } + + //------------------------------------------------------------------------------------------------ + static bool Inject(SSnapSerializerBase snapshot, ScriptCtx ctx, ACE_Medical_PatientData instance) + { + snapshot.SerializeFloat(instance.m_fHeartRate); + snapshot.SerializeFloat(instance.m_fMeanArterialPressure); + snapshot.SerializeFloat(instance.m_fPulsePressure); + return true; + } + + //------------------------------------------------------------------------------------------------ + static void Encode(SSnapSerializerBase snapshot, ScriptCtx ctx, ScriptBitSerializer packet) + { + snapshot.Serialize(packet, SNAPSHOT_SIZE); + } + + //------------------------------------------------------------------------------------------------ + static bool Decode(ScriptBitSerializer packet, ScriptCtx ctx, SSnapSerializerBase snapshot) + { + return snapshot.Serialize(packet, SNAPSHOT_SIZE); + } + + //------------------------------------------------------------------------------------------------ + static bool SnapCompare(SSnapSerializerBase lhs, SSnapSerializerBase rhs, ScriptCtx ctx) + { + return lhs.CompareSnapshots(rhs, SNAPSHOT_SIZE); + } + + //------------------------------------------------------------------------------------------------ + static bool PropCompare(ACE_Medical_PatientData instance, SSnapSerializerBase snapshot, ScriptCtx ctx) + { + return snapshot.CompareFloat(instance.m_fHeartRate) + && snapshot.CompareFloat(instance.m_fMeanArterialPressure) + && snapshot.CompareFloat(instance.m_fPulsePressure); + } +} diff --git a/addons/medical_circulation/scripts/Game/ACE_Medical_Circulation/Components/ACE_Medical_VitalsComponent.c b/addons/medical_circulation/scripts/Game/ACE_Medical_Circulation/Components/ACE_Medical_VitalsComponent.c new file mode 100644 index 000000000..9a42cf545 --- /dev/null +++ b/addons/medical_circulation/scripts/Game/ACE_Medical_Circulation/Components/ACE_Medical_VitalsComponent.c @@ -0,0 +1,268 @@ +//------------------------------------------------------------------------------------------------ +class ACE_Medical_VitalsComponentClass : ScriptComponentClass +{ +} + +//------------------------------------------------------------------------------------------------ +//! Updates to vitals are mostly server side right now +//! Clients can request values for vitals via ACE_Medical_NetworkComponent +class ACE_Medical_VitalsComponent : ScriptComponent +{ + [RplProp()] + protected ACE_Medical_EVitalStateID m_eVitalStateID = ACE_Medical_EVitalStateID.STABLE; + + [RplProp()] + protected bool m_bIsCPRPerformed = false; + + protected bool m_bWasRevived = false; + + protected float m_fHeartRateBPM; + protected float m_fCardiacOutput; + protected float m_fSystemicVascularResistance; + protected float m_fMeanArterialPressureKPA; + protected float m_fPulsePressureKPA; + + protected float m_fCoreTemperature; + + protected float m_fHeartRateMedicationAdjustment = 0; + protected float m_fSystemicVascularResistanceMedicationAdjustment = 0; + protected float m_fReviveSuccessCheckTimerScale = 1; + + //------------------------------------------------------------------------------------------------ + override protected void OnPostInit(IEntity owner) + { + super.OnPostInit(owner); + SetEventMask(owner, EntityEvent.INIT); + } + + //------------------------------------------------------------------------------------------------ + override protected void EOnInit(IEntity owner) + { + super.EOnInit(owner); + + if (!GetGame().InPlayMode() || !Replication.IsServer()) + return; + + Reset(); + + ACE_Medical_VitalStatesSystem system = ACE_Medical_VitalStatesSystem.GetInstance(owner.GetWorld()); + if (system) + system.Register(SCR_ChimeraCharacter.Cast(owner)); + } + + //------------------------------------------------------------------------------------------------ + //! Friend method of ACE_Medical_IVitalState + void SetVitalStateID(ACE_Medical_EVitalStateID newStateID) + { + if (m_eVitalStateID == newStateID) + return; + + m_eVitalStateID = newStateID; + Replication.BumpMe(); + } + + //------------------------------------------------------------------------------------------------ + //! Returns vital state. Can also be called by clients. + ACE_Medical_EVitalStateID GetVitalStateID() + { + return m_eVitalStateID; + } + + //------------------------------------------------------------------------------------------------ + void SetIsCPRPerformed(bool isPerformed) + { + m_bIsCPRPerformed = isPerformed; + Replication.BumpMe(); + } + //------------------------------------------------------------------------------------------------ + //! Returns true when in someone is peforming CPR on this system. Can also be called by clients. + bool IsCPRPerformed() + { + return m_bIsCPRPerformed; + } + + //------------------------------------------------------------------------------------------------ + void OnRevived() + { + m_bWasRevived = true; + } + + //------------------------------------------------------------------------------------------------ + void ClearReviveHistory() + { + m_bWasRevived = false; + } + + //------------------------------------------------------------------------------------------------ + bool WasRevived() + { + return m_bWasRevived; + } + + //------------------------------------------------------------------------------------------------ + void SetHeartRate(float heartRate) + { + m_fHeartRateBPM = heartRate; + } + + //------------------------------------------------------------------------------------------------ + //! Returns heart rate in bpm + float GetHeartRate() + { + return m_fHeartRateBPM; + } + + //------------------------------------------------------------------------------------------------ + //! Set cardiac output in ml/min + void SetCardiacOutput(float cardiacOutput) + { + m_fCardiacOutput = cardiacOutput; + } + + //------------------------------------------------------------------------------------------------ + //! Returns cardiac output in ml/min + float GetCardiacOutput() + { + return m_fCardiacOutput; + } + + //------------------------------------------------------------------------------------------------ + //! Set systemic vascular resistence in kPa * min / ml + void SetSystemicVascularResistance(float resistance) + { + m_fSystemicVascularResistance = resistance; + } + + //------------------------------------------------------------------------------------------------ + //! Returns systemic vascular resistence in kPa * min / ml + float GetSystemicVascularResistance() + { + return m_fSystemicVascularResistance; + } + + //------------------------------------------------------------------------------------------------ + //! Set mean arterial pressure in kPA + void SetMeanArterialPressure(float pressure) + { + m_fMeanArterialPressureKPA = pressure; + } + + //------------------------------------------------------------------------------------------------ + //! Returns mean arterial pressure in kPA + float GetMeanArterialPressure() + { + return m_fMeanArterialPressureKPA; + } + + //------------------------------------------------------------------------------------------------ + //! Set pulse pressure in kPA + void SetPulsePressure(float pressure) + { + m_fPulsePressureKPA = pressure; + } + + //------------------------------------------------------------------------------------------------ + //! Returns pulse pressure in kPA + float GetPulsePressure() + { + return m_fPulsePressureKPA; + } + + //------------------------------------------------------------------------------------------------ + //! Returns diastolic and systolic blood pressures in kPa + Tuple2 GetBloodPressures() + { + return new Tuple2 + ( + m_fMeanArterialPressureKPA - 1/3 * m_fPulsePressureKPA, + m_fMeanArterialPressureKPA + 2/3 * m_fPulsePressureKPA + ); + } + + //------------------------------------------------------------------------------------------------ + void SetHeartRateMedicationAdjustment(float adjustment) + { + m_fHeartRateMedicationAdjustment = adjustment; + } + + //------------------------------------------------------------------------------------------------ + float GetHeartRateMedicationAdjustment() + { + return m_fHeartRateMedicationAdjustment; + } + + //------------------------------------------------------------------------------------------------ + void SetSystemicVascularResistenceMedicationAdjustment(float adjustment) + { + m_fSystemicVascularResistanceMedicationAdjustment = adjustment; + } + + //------------------------------------------------------------------------------------------------ + float GetSystemicVascularResistenceMedicationAdjustment() + { + return m_fSystemicVascularResistanceMedicationAdjustment; + } + + //------------------------------------------------------------------------------------------------ + //! Set scale for accelerating the revive success check timer + void SetReviveSuccessCheckTimerScale(float scale) + { + m_fReviveSuccessCheckTimerScale = scale; + } + + //------------------------------------------------------------------------------------------------ + float GetReviveSuccessCheckTimerScale() + { + return m_fReviveSuccessCheckTimerScale; + } + + + //------------------------------------------------------------------------------------------------ + //! Sets body temperature in K + void SetTemperature(float temperature) + { + m_fCoreTemperature = temperature; + } + //------------------------------------------------------------------------------------------------ + //! Returns body temperature in K + float GetTemperature() + { + return m_fCoreTemperature; + } + //------------------------------------------------------------------------------------------------ + //! Resets vitals to defaults + void Reset() + { + ACE_Medical_Circulation_Settings settings = ACE_SettingsHelperT.GetModSettings(); + if (settings) + { + SetHeartRate(settings.m_fDefaultHeartRateBPM); + SetCardiacOutput(settings.m_fDefaultHeartRateBPM * settings.m_fDefaultStrokeVolumeML); + SetSystemicVascularResistance(settings.m_fDefaultSystemicVascularResistance); + SetMeanArterialPressure(settings.m_fDefaultMeanArterialPressureKPA); + SetPulsePressure(settings.m_fDefaultPulsePressureKPA); + } + + SetHeartRateMedicationAdjustment(0); + SetSystemicVascularResistenceMedicationAdjustment(0); + SetReviveSuccessCheckTimerScale(1); + SetTemperature(310.15); + + ClearReviveHistory(); + + SetVitalStateID(ACE_Medical_EVitalStateID.STABLE); + } + + //------------------------------------------------------------------------------------------------ + override protected void OnDelete(IEntity owner) + { + super.OnDelete(owner); + + if (!GetGame().InPlayMode() || !Replication.IsServer()) + return; + + ACE_Medical_VitalStatesSystem system = ACE_Medical_VitalStatesSystem.GetInstance(owner.GetWorld()); + if (system) + system.Unregister(SCR_ChimeraCharacter.Cast(owner)); + } +} diff --git a/addons/medical_circulation/scripts/Game/ACE_Medical_Circulation/Components/Damage/SCR_CharacterDamageManagerComponent.c b/addons/medical_circulation/scripts/Game/ACE_Medical_Circulation/Components/Damage/SCR_CharacterDamageManagerComponent.c new file mode 100644 index 000000000..1e7cdb034 --- /dev/null +++ b/addons/medical_circulation/scripts/Game/ACE_Medical_Circulation/Components/Damage/SCR_CharacterDamageManagerComponent.c @@ -0,0 +1,110 @@ +//------------------------------------------------------------------------------------------------ +modded class SCR_CharacterDamageManagerComponent : SCR_DamageManagerComponent +{ + protected ACE_Medical_BrainHitZone m_ACE_Medical_BrainHitZone; + protected ACE_Medical_VitalsComponent m_ACE_Medical_Vitals; + protected float m_fACE_Medical_BloodFlowScale = 1; + + //----------------------------------------------------------------------------------------------------------- + //! Initialize members + override void OnPostInit(IEntity owner) + { + super.OnPostInit(owner); + + if (!GetGame().InPlayMode()) + return; + + m_ACE_Medical_Vitals = ACE_Medical_VitalsComponent.Cast(owner.FindComponent(ACE_Medical_VitalsComponent)); + } + + //----------------------------------------------------------------------------------------------------------- + //! Transition to cardiac arrest + override void ACE_Medical_OnSecondChanceGranted() + { + // Only handle first second chance + if (m_ACE_Medical_Vitals && !m_bACE_Medical_WasSecondChanceGranted) + m_ACE_Medical_Vitals.SetVitalStateID(ACE_Medical_EVitalStateID.CARDIAC_ARREST); + + super.ACE_Medical_OnSecondChanceGranted(); + } + + //----------------------------------------------------------------------------------------------------------- + //! Reset vitals when fully healed (e.g. by GM) + override void FullHeal(bool ignoreHealingDOT = true) + { + super.FullHeal(ignoreHealingDOT); + + if (m_ACE_Medical_Vitals) + m_ACE_Medical_Vitals.Reset(); + } + + //----------------------------------------------------------------------------------------------------------- + //! Unregister from medical systems when killed + override void ACE_Medical_OnKilled() + { + super.ACE_Medical_OnKilled(); + + ACE_Medical_VitalStatesSystem system = ACE_Medical_VitalStatesSystem.GetInstance(GetOwner().GetWorld()); + if (system) + system.Unregister(SCR_ChimeraCharacter.Cast(GetOwner())); + + if (m_ACE_Medical_Vitals) + { + m_ACE_Medical_Vitals.SetHeartRate(0); + m_ACE_Medical_Vitals.SetCardiacOutput(0); + m_ACE_Medical_Vitals.SetMeanArterialPressure(0); + m_ACE_Medical_Vitals.SetPulsePressure(0); + } + } + + //------------------------------------------------------------------------------------------------ + //! Only allow resilience recovery in stable state + override void ACE_Medical_UpdateResilienceRegenScale() + { + ACE_Medical_Circulation_Settings circulationSettings = ACE_SettingsHelperT.GetModSettings(); + if (!circulationSettings) + return; + + if (!m_ACE_Medical_Vitals) + return; + + // No recovery when vitals are not stable + if (m_ACE_Medical_Vitals.GetVitalStateID() != ACE_Medical_EVitalStateID.STABLE) + m_fACE_Medical_ResilienceRegenScale = 0; + else if (m_ACE_Medical_Vitals.WasRevived()) + m_fACE_Medical_ResilienceRegenScale = circulationSettings.m_fMaxRevivalResilienceRecoveryScale; + else + m_fACE_Medical_ResilienceRegenScale = s_ACE_Medical_Core_Settings.m_fDefaultResilienceRegenScale; + + // Scale recovery scale by health of the brain hit zone + if (m_ACE_Medical_BrainHitZone) + m_fACE_Medical_ResilienceRegenScale *= m_ACE_Medical_BrainHitZone.GetHealthScaled(); + } + + //----------------------------------------------------------------------------------------------------------- + //! Called alpha factor in KAM + void ACE_Medical_SetBloodFlowScale(float scale) + { + m_fACE_Medical_BloodFlowScale = scale; + } + + //----------------------------------------------------------------------------------------------------------- + float ACE_Medical_GetBloodFlowScale() + { + return m_fACE_Medical_BloodFlowScale; + } + + //----------------------------------------------------------------------------------------------------------- + //! Called by ACE_Medical_BrainHitZone.OnInit to initialize the hit zone + void ACE_Medical_SetBrainHitZone(HitZone hitzone) + { + m_ACE_Medical_BrainHitZone = ACE_Medical_BrainHitZone.Cast(hitzone); + } + + //----------------------------------------------------------------------------------------------------------- + //! Return the pain hit zone + ACE_Medical_BrainHitZone ACE_Medical_GetBrainHitZone() + { + return m_ACE_Medical_BrainHitZone; + } +} diff --git a/addons/medical_circulation/scripts/Game/ACE_Medical_Circulation/Damage/DamageEffects/CharacterDamageEffects/ACE_Medical_AmmoniumCarbonateDamageEffect.c b/addons/medical_circulation/scripts/Game/ACE_Medical_Circulation/Damage/DamageEffects/CharacterDamageEffects/ACE_Medical_AmmoniumCarbonateDamageEffect.c new file mode 100644 index 000000000..6eba8f550 --- /dev/null +++ b/addons/medical_circulation/scripts/Game/ACE_Medical_Circulation/Damage/DamageEffects/CharacterDamageEffects/ACE_Medical_AmmoniumCarbonateDamageEffect.c @@ -0,0 +1,19 @@ +//------------------------------------------------------------------------------------------------ +class ACE_Medical_AmmoniumCarbonateDamageEffect : SCR_DotDamageEffect +{ + //------------------------------------------------------------------------------------------------ + override bool HijackDamageEffect(SCR_ExtendedDamageManagerComponent dmgManager) + { + SCR_CharacterDamageManagerComponent charDmgManager = SCR_CharacterDamageManagerComponent.Cast(dmgManager); + if (charDmgManager) + SetAffectedHitZone(charDmgManager.GetResilienceHitZone()); + + return false; + } + + //------------------------------------------------------------------------------------------------ + override EDamageType GetDefaultDamageType() + { + return EDamageType.HEALING; + } +} diff --git a/addons/medical_circulation/scripts/Game/ACE_Medical_Circulation/Damage/DamageEffects/CharacterDamageEffects/ACE_Medical_BloodLossDamageEffect.c b/addons/medical_circulation/scripts/Game/ACE_Medical_Circulation/Damage/DamageEffects/CharacterDamageEffects/ACE_Medical_BloodLossDamageEffect.c new file mode 100644 index 000000000..4b62bc5bf --- /dev/null +++ b/addons/medical_circulation/scripts/Game/ACE_Medical_Circulation/Damage/DamageEffects/CharacterDamageEffects/ACE_Medical_BloodLossDamageEffect.c @@ -0,0 +1,40 @@ +//------------------------------------------------------------------------------------------------ +//! Central effect responsible for applying all blood loss to SCR_CharacterBloodHitZone +modded class ACE_Medical_BloodLossDamageEffect : SCR_DotDamageEffect +{ + protected static ACE_Medical_Circulation_Settings s_pCirculationSettings; + protected ACE_Medical_VitalsComponent m_pVitalsComponent; + protected ref array m_aDamageEffects = {}; + + //------------------------------------------------------------------------------------------------ + override bool HijackDamageEffect(SCR_ExtendedDamageManagerComponent dmgManager) + { + if (super.HijackDamageEffect(dmgManager)) + return true; + + if (!s_pCirculationSettings) + s_pCirculationSettings = ACE_SettingsHelperT.GetModSettings(); + + IEntity char = dmgManager.GetOwner(); + if (!char) + return true; + + m_pVitalsComponent = ACE_Medical_VitalsComponent.Cast(char.FindComponent(ACE_Medical_VitalsComponent)); + return false; + } + + //------------------------------------------------------------------------------------------------ + //! Limit total blood loss by cardiac output and scale by blood flow scale + override protected float ComputeEffectiveTotalBloodLoss(float timeSlice, SCR_ExtendedDamageManagerComponent dmgManager) + { + float totalBloodLoss = super.ComputeEffectiveTotalBloodLoss(timeSlice, dmgManager); + float maxBleedingRate = Math.Max(s_pCirculationSettings.m_fCardiacArrestMaxTotalBleedingRate, m_pVitalsComponent.GetCardiacOutput() / 60); + totalBloodLoss = Math.Min(totalBloodLoss, maxBleedingRate * timeSlice); + + SCR_CharacterDamageManagerComponent charDmgManager = SCR_CharacterDamageManagerComponent.Cast(dmgManager); + if (dmgManager) + totalBloodLoss *= charDmgManager.ACE_Medical_GetBloodFlowScale(); + + return totalBloodLoss; + } +} diff --git a/addons/medical_circulation/scripts/Game/ACE_Medical_Circulation/Damage/DamageEffects/CharacterDamageEffects/ACE_Medical_CardiacArrestDamageEffect.c b/addons/medical_circulation/scripts/Game/ACE_Medical_Circulation/Damage/DamageEffects/CharacterDamageEffects/ACE_Medical_CardiacArrestDamageEffect.c new file mode 100644 index 000000000..02cd911de --- /dev/null +++ b/addons/medical_circulation/scripts/Game/ACE_Medical_Circulation/Damage/DamageEffects/CharacterDamageEffects/ACE_Medical_CardiacArrestDamageEffect.c @@ -0,0 +1,73 @@ +//------------------------------------------------------------------------------------------------ +[BaseContainerProps()] +class ACE_Medical_CardiacArrestDamageEffect: SCR_DotDamageEffect +{ + [Attribute(defvalue: "0.333", desc: "Damage the brain takes per second")] + protected float m_fBrainDamageRate; + + [Attribute(defvalue: "10", desc: "Delay in seconds before the effect starts [s]")] + protected float m_fEffectStartDelayS; + protected float m_fDelayTimerS = 0; + + //------------------------------------------------------------------------------------------------ + protected override void HandleConsequences(SCR_ExtendedDamageManagerComponent dmgManager, DamageEffectEvaluator evaluator) + { + super.HandleConsequences(dmgManager, evaluator); + evaluator.HandleEffectConsequences(this, dmgManager); + } + + //------------------------------------------------------------------------------------------------ + //! Make sure this effect can only be added once + event override bool HijackDamageEffect(SCR_ExtendedDamageManagerComponent dmgManager) + { + SCR_CharacterDamageManagerComponent charDamageManager = SCR_CharacterDamageManagerComponent.Cast(dmgManager); + if (!dmgManager) + return true; + + ACE_Medical_BrainHitZone hitZone = charDamageManager.ACE_Medical_GetBrainHitZone(); + if (!hitZone) + return true; + + SetAffectedHitZone(hitZone); + array effects = {}; + charDamageManager.FindAllDamageEffectsOfTypeOnHitZone(ACE_Medical_CardiacArrestDamageEffect, hitZone, effects); + return !effects.IsEmpty(); + } + + //------------------------------------------------------------------------------------------------ + override void OnEffectAdded(SCR_ExtendedDamageManagerComponent dmgManager) + { + super.OnEffectAdded(dmgManager); + SCR_CharacterDamageManagerComponent charDamageManager = SCR_CharacterDamageManagerComponent.Cast(dmgManager); + + SetDamageType(GetDefaultDamageType()); + SetDPS(m_fBrainDamageRate); + SetMaxDuration(0); + SetInstigator(charDamageManager.GetInstigator()); + + // Terminate any regeneration + array effects = {}; + charDamageManager.FindAllDamageEffectsOfTypeOnHitZone(SCR_PassiveHitZoneRegenDamageEffect, GetAffectedHitZone(), effects); + foreach (SCR_PersistentDamageEffect effect : effects) + { + effect.Terminate(); + } + } + + //------------------------------------------------------------------------------------------------ + protected override void EOnFrame(float timeSlice, SCR_ExtendedDamageManagerComponent dmgManager) + { + m_fDelayTimerS += timeSlice; + + if (m_fDelayTimerS < m_fEffectStartDelayS) + return; + + DealDot(timeSlice, dmgManager); + } + + //------------------------------------------------------------------------------------------------ + override EDamageType GetDefaultDamageType() + { + return EDamageType.ACE_MEDICAL_HYPOXIA; + } +} diff --git a/addons/medical_circulation/scripts/Game/ACE_Medical_Circulation/Diag/ArmaReforgerScripted.c b/addons/medical_circulation/scripts/Game/ACE_Medical_Circulation/Diag/ArmaReforgerScripted.c new file mode 100644 index 000000000..9441e70de --- /dev/null +++ b/addons/medical_circulation/scripts/Game/ACE_Medical_Circulation/Diag/ArmaReforgerScripted.c @@ -0,0 +1,21 @@ +#ifdef ENABLE_DIAG +//------------------------------------------------------------------------------------------------ +modded class ArmaReforgerScripted : ChimeraGame +{ + //------------------------------------------------------------------------------------------------ + override bool OnGameStart() + { + DiagMenu.RegisterBool(SCR_DebugMenuID.ACE_MEDICAL_DEBUGUI_MENU_VITAL_STATE_DEBUG, "", "Debug vital state", "ACE Medical"); + return super.OnGameStart(); + } + + //------------------------------------------------------------------------------------------------ + override void OnUpdate(BaseWorld world, float timeslice) + { + super.OnUpdate(world, timeslice); + + if (DiagMenu.GetBool(SCR_DebugMenuID.ACE_MEDICAL_DEBUGUI_MENU_VITAL_STATE_DEBUG)) + ACE_Medical_VitalStatesSystem.GetInstance(world).OnDiag(timeslice); + } +} +#endif diff --git a/addons/medical_circulation/scripts/Game/ACE_Medical_Circulation/Diag/SCR_DebugMenuID.c b/addons/medical_circulation/scripts/Game/ACE_Medical_Circulation/Diag/SCR_DebugMenuID.c new file mode 100644 index 000000000..73dd8e841 --- /dev/null +++ b/addons/medical_circulation/scripts/Game/ACE_Medical_Circulation/Diag/SCR_DebugMenuID.c @@ -0,0 +1,5 @@ +//------------------------------------------------------------------------------------------------ +modded enum SCR_DebugMenuID +{ + ACE_MEDICAL_DEBUGUI_MENU_VITAL_STATE_DEBUG +} diff --git a/addons/medical_circulation/scripts/Game/ACE_Medical_Circulation/Editor/UI/Components/Tooltips/Tooltips/Details/ACE_Medical_BrainTooltipDetail.c b/addons/medical_circulation/scripts/Game/ACE_Medical_Circulation/Editor/UI/Components/Tooltips/Tooltips/Details/ACE_Medical_BrainTooltipDetail.c new file mode 100644 index 000000000..8f47d4b0e --- /dev/null +++ b/addons/medical_circulation/scripts/Game/ACE_Medical_Circulation/Editor/UI/Components/Tooltips/Tooltips/Details/ACE_Medical_BrainTooltipDetail.c @@ -0,0 +1,28 @@ +[BaseContainerProps(), BaseContainerCustomTitleField("m_sDisplayName")] +class ACE_Medical_BrainTooltipDetail : SCR_DpsConditionBarBaseTooltipDetail +{ + protected ACE_Medical_BrainHitZone m_pBrainHitZone; + + //------------------------------------------------------------------------------------------------ + override void UpdateDetail(SCR_EditableEntityComponent entity) + { + super.UpdateDetail(entity); + + if (m_pBrainHitZone) + SetBarAndPercentageValue(m_pBrainHitZone.GetHealthScaled()); + } + + //------------------------------------------------------------------------------------------------ + override bool InitDetail(SCR_EditableEntityComponent entity, Widget widget) + { + if (!super.InitDetail(entity, widget)) + return false; + + SCR_CharacterDamageManagerComponent charDamageManager = SCR_CharacterDamageManagerComponent.Cast(m_DamageManager); + if (!charDamageManager || charDamageManager.GetState() == EDamageState.DESTROYED || !charDamageManager.IsDamageHandlingEnabled()) + return false; + + m_pBrainHitZone = charDamageManager.ACE_Medical_GetBrainHitZone(); + return true; + } +} diff --git a/addons/medical_circulation/scripts/Game/ACE_Medical_Circulation/Editor/UI/Components/Tooltips/Tooltips/Details/ACE_Medical_VitalSignsTooltipDetail.c b/addons/medical_circulation/scripts/Game/ACE_Medical_Circulation/Editor/UI/Components/Tooltips/Tooltips/Details/ACE_Medical_VitalSignsTooltipDetail.c new file mode 100644 index 000000000..8fa1ca9c5 --- /dev/null +++ b/addons/medical_circulation/scripts/Game/ACE_Medical_Circulation/Editor/UI/Components/Tooltips/Tooltips/Details/ACE_Medical_VitalSignsTooltipDetail.c @@ -0,0 +1,64 @@ +[BaseContainerProps(), BaseContainerCustomTitleField("m_sDisplayName")] +class ACE_Medical_VitalSignsTooltipDetail : SCR_EntityTooltipDetail +{ + [Attribute(defvalue: "1", desc: "Update frequency [s]")] + protected float m_fUpdateTimeout; + protected float m_fUpdateTimer = 0; + + protected TextWidget m_Text; + protected ACE_Medical_VitalsComponent m_pACE_Medical_VitalsComponent; + protected ACE_Medical_NetworkComponent m_pNetworkComponent; + + //------------------------------------------------------------------------------------------------ + override bool NeedUpdate() + { + return true; + } + + //------------------------------------------------------------------------------------------------ + override void UpdateDetail(SCR_EditableEntityComponent entity) + { + m_fUpdateTimer += GetGame().GetWorld().GetTimeSlice(); + + if (m_fUpdateTimer < m_fUpdateTimeout) + return; + + m_fUpdateTimer = 0; + ForceUpdateDetail(entity); + } + + //------------------------------------------------------------------------------------------------ + void ForceUpdateDetail(SCR_EditableEntityComponent entity) + { + m_pNetworkComponent.RequestUpdatePatientData(SCR_ChimeraCharacter.Cast(entity.GetOwner())); + Tuple2 pressures = m_pACE_Medical_VitalsComponent.GetBloodPressures(); + m_Text.SetTextFormat("%1 bpm\n%2/%3 mmHg", + Math.Round(m_pACE_Medical_VitalsComponent.GetHeartRate()), + Math.Round(pressures.param2 * ACE_PhysicalConstants.KPA2MMHG), + Math.Round(pressures.param1 * ACE_PhysicalConstants.KPA2MMHG) + ); + } + + //------------------------------------------------------------------------------------------------ + override bool InitDetail(SCR_EditableEntityComponent entity, Widget widget) + { + m_Text = TextWidget.Cast(widget); + if (!m_Text) + return false; + + IEntity owner = entity.GetOwner(); + if (!owner) + false; + + m_pACE_Medical_VitalsComponent = ACE_Medical_VitalsComponent.Cast(owner.FindComponent(ACE_Medical_VitalsComponent)); + if (!m_pACE_Medical_VitalsComponent) + return false; + + m_pNetworkComponent = ACE_Medical_NetworkComponent.Cast(GetGame().GetPlayerController().FindComponent(ACE_Medical_NetworkComponent)); + if (!m_pNetworkComponent) + return false; + + ForceUpdateDetail(entity); + return true; + } +} diff --git a/addons/medical_circulation/scripts/Game/ACE_Medical_Circulation/FSM/ACE_Medical_CharacterContext.c b/addons/medical_circulation/scripts/Game/ACE_Medical_Circulation/FSM/ACE_Medical_CharacterContext.c new file mode 100644 index 000000000..02d20ca7a --- /dev/null +++ b/addons/medical_circulation/scripts/Game/ACE_Medical_Circulation/FSM/ACE_Medical_CharacterContext.c @@ -0,0 +1,24 @@ +//------------------------------------------------------------------------------------------------ +class ACE_Medical_CharacterContext : ACE_FrameJobScheduler_IObjectContext +{ + ACE_Medical_VitalsComponent m_pVitals; + ACE_Medical_MedicationComponent m_pMedication; + SCR_CharacterDamageManagerComponent m_pDamageManager; + SCR_CharacterBloodHitZone m_pBloodHitZone; + float m_fCPRSuccessCheckTimerS = 0; + + //------------------------------------------------------------------------------------------------ + void ACE_Medical_CharacterContext(SCR_ChimeraCharacter object) + { + m_pVitals = ACE_Medical_VitalsComponent.Cast(object.FindComponent(ACE_Medical_VitalsComponent)); + m_pMedication = ACE_Medical_MedicationComponent.Cast(object.FindComponent(ACE_Medical_MedicationComponent)); + m_pDamageManager = SCR_CharacterDamageManagerComponent.Cast(object.GetDamageManager()); + m_pBloodHitZone = m_pDamageManager.GetBloodHitZone(); + } + + //------------------------------------------------------------------------------------------------ + override bool IsValid() + { + return (super.IsValid() && !m_pObject.IsDeleted()); + } +} diff --git a/addons/medical_circulation/scripts/Game/ACE_Medical_Circulation/FSM/ACE_Medical_EVitalStateID.c b/addons/medical_circulation/scripts/Game/ACE_Medical_Circulation/FSM/ACE_Medical_EVitalStateID.c new file mode 100644 index 000000000..712797db4 --- /dev/null +++ b/addons/medical_circulation/scripts/Game/ACE_Medical_Circulation/FSM/ACE_Medical_EVitalStateID.c @@ -0,0 +1,9 @@ +//------------------------------------------------------------------------------------------------ +enum ACE_Medical_EVitalStateID : ACE_FSM_EStateID +{ + STABLE = 1 << 0, + UNSTABLE = 1 << 1, + CRITICAL = 1 << 2, + RESUSCITATION = 1 << 3, + CARDIAC_ARREST = 1 << 4 +} diff --git a/addons/medical_circulation/scripts/Game/ACE_Medical_Circulation/FSM/ACE_Medical_VitalStateMachine.c b/addons/medical_circulation/scripts/Game/ACE_Medical_Circulation/FSM/ACE_Medical_VitalStateMachine.c new file mode 100644 index 000000000..827af6d72 --- /dev/null +++ b/addons/medical_circulation/scripts/Game/ACE_Medical_Circulation/FSM/ACE_Medical_VitalStateMachine.c @@ -0,0 +1,33 @@ +//------------------------------------------------------------------------------------------------ +class ACE_Medical_VitalStateMachine : ACE_FSM_Machine +{ + protected ACE_Medical_EVitalStateID m_eCurrentStateID; + + //------------------------------------------------------------------------------------------------ + //! Check for forced transitions on the component + override void OnUpdate(float timeSlice) + { + ACE_Medical_EVitalStateID stateID = m_pContext.m_pVitals.GetVitalStateID(); + if (m_iCurrentStateIdx >= 0 && stateID != m_eCurrentStateID) + ChangeState(stateID); + + super.OnUpdate(timeSlice); + } + + //------------------------------------------------------------------------------------------------ + //! Update state ID on the component + override protected void ChangeStateByIdx(int newStateIdx) + { + if (newStateIdx >= 0) + { + m_eCurrentStateID = m_aStates[newStateIdx].GetID(); + m_pContext.m_pVitals.SetVitalStateID(m_eCurrentStateID); + } + else + { + m_eCurrentStateID = ACE_Medical_EVitalStateID.STOP; + } + + super.ChangeStateByIdx(newStateIdx); + } +} diff --git a/addons/medical_circulation/scripts/Game/ACE_Medical_Circulation/FSM/States/ACE_Medical_CardiacArrestState.c b/addons/medical_circulation/scripts/Game/ACE_Medical_Circulation/FSM/States/ACE_Medical_CardiacArrestState.c new file mode 100644 index 000000000..d99ba07ae --- /dev/null +++ b/addons/medical_circulation/scripts/Game/ACE_Medical_Circulation/FSM/States/ACE_Medical_CardiacArrestState.c @@ -0,0 +1,59 @@ +//------------------------------------------------------------------------------------------------ +class ACE_Medical_CardiacArrestState : ACE_Medical_IVitalState +{ + //------------------------------------------------------------------------------------------------ + override void OnEnter(ACE_Medical_CharacterContext context) + { + super.OnEnter(context); + + //! Kill AI when cardiac arrest is not allowed + if (!s_pCirculationSettings.m_bCardiacArrestForAIEnabled && !EntityUtils.IsPlayer(context.m_pObject)) + { + context.m_pDamageManager.Kill(context.m_pDamageManager.GetInstigator()); + return; + } + + // Force uncon + context.m_pDamageManager.GetResilienceHitZone().SetHealth(0); + context.m_pDamageManager.UpdateConsciousness(); + + context.m_pDamageManager.AddDamageEffect(s_pCirculationSettings.m_CardiacArrestDamageEffect); + } + + //------------------------------------------------------------------------------------------------ + override void OnExit(ACE_Medical_CharacterContext context) + { + super.OnExit(context); + context.m_pDamageManager.TerminateDamageEffectsOfType(s_pCirculationSettings.m_CardiacArrestDamageEffect.Type()); + } + + //------------------------------------------------------------------------------------------------ + override protected float ComputeHeartRate(ACE_Medical_CharacterContext context, float timeSlice) + { + return 0; + } + + //------------------------------------------------------------------------------------------------ + override protected float ComputeCardiacOutput(ACE_Medical_CharacterContext context, float timeSlice) + { + return 0; + } + + //------------------------------------------------------------------------------------------------ + override protected float ComputeSystemicVascularResistance(ACE_Medical_CharacterContext context, float timeSlice) + { + return 0; + } + + //------------------------------------------------------------------------------------------------ + override protected float ComputeMeanArterialPressure(ACE_Medical_CharacterContext context, float timeSlice) + { + return 0; + } + + //------------------------------------------------------------------------------------------------ + override protected float ComputePulsePressure(ACE_Medical_CharacterContext context, float timeSlice) + { + return 0; + } +} diff --git a/addons/medical_circulation/scripts/Game/ACE_Medical_Circulation/FSM/States/ACE_Medical_CriticalState.c b/addons/medical_circulation/scripts/Game/ACE_Medical_Circulation/FSM/States/ACE_Medical_CriticalState.c new file mode 100644 index 000000000..734e473f0 --- /dev/null +++ b/addons/medical_circulation/scripts/Game/ACE_Medical_Circulation/FSM/States/ACE_Medical_CriticalState.c @@ -0,0 +1,24 @@ +//------------------------------------------------------------------------------------------------ +class ACE_Medical_CriticalState : ACE_Medical_StableState +{ + //------------------------------------------------------------------------------------------------ + //! Force uncon + override void OnEnter(ACE_Medical_CharacterContext context) + { + super.OnEnter(context); + // Force uncon + context.m_pDamageManager.GetResilienceHitZone().SetHealth(0); + context.m_pDamageManager.UpdateConsciousness(); + } + + //------------------------------------------------------------------------------------------------ + //! Add hypovolemic shock induced tachycardia + override protected float ComputeBaseTargetHeartRate(ACE_Medical_CharacterContext context, float timeSlice) + { + float bloodVolumeRatio = context.m_pBloodHitZone.GetHealthScaled(); + if (bloodVolumeRatio < context.m_pBloodHitZone.GetDamageStateThreshold(ACE_Medical_EBloodState.CLASS_3_HEMORRHAGE)) + return context.m_pVitals.GetHeartRate() * 14.3 * Math.Lerp(0.5, 1, bloodVolumeRatio) / Math.Max(6, context.m_pVitals.GetMeanArterialPressure()); + + return super.ComputeBaseTargetHeartRate(context, timeSlice); + } +} diff --git a/addons/medical_circulation/scripts/Game/ACE_Medical_Circulation/FSM/States/ACE_Medical_IVitalState.c b/addons/medical_circulation/scripts/Game/ACE_Medical_Circulation/FSM/States/ACE_Medical_IVitalState.c new file mode 100644 index 000000000..305060416 --- /dev/null +++ b/addons/medical_circulation/scripts/Game/ACE_Medical_Circulation/FSM/States/ACE_Medical_IVitalState.c @@ -0,0 +1,70 @@ +//------------------------------------------------------------------------------------------------ +class ACE_Medical_IVitalState : ACE_FSM_IState +{ + protected static ACE_Medical_Circulation_Settings s_pCirculationSettings; + + //------------------------------------------------------------------------------------------------ + void ACE_Medical_IVitalState(ACE_FSM_EStateID id) + { + if (!s_pCirculationSettings) + s_pCirculationSettings = ACE_SettingsHelperT.GetModSettings(); + } + + //------------------------------------------------------------------------------------------------ + //! Update resiliance scale for new state + override void OnEnter(ACE_Medical_CharacterContext context) + { + super.OnEnter(context); + context.m_pDamageManager.ACE_Medical_UpdateResilienceRegenScale(); + } + + //------------------------------------------------------------------------------------------------ + //! Update vitals + override void OnUpdate(ACE_Medical_CharacterContext context, float timeSlice) + { + super.OnUpdate(context, timeSlice); + context.m_pVitals.SetHeartRate(ComputeHeartRate(context, timeSlice)); + context.m_pVitals.SetCardiacOutput(ComputeCardiacOutput(context, timeSlice)); + context.m_pVitals.SetSystemicVascularResistance(ComputeSystemicVascularResistance(context, timeSlice)); + context.m_pVitals.SetMeanArterialPressure(ComputeMeanArterialPressure(context, timeSlice)); + context.m_pVitals.SetPulsePressure(ComputePulsePressure(context, timeSlice)); + } + + //------------------------------------------------------------------------------------------------ + //! Implement the heart rate simulation here + protected float ComputeHeartRate(ACE_Medical_CharacterContext context, float timeSlice); + + //------------------------------------------------------------------------------------------------ + //! CO = HR * SV + protected float ComputeCardiacOutput(ACE_Medical_CharacterContext context, float timeSlice) + { + return context.m_pVitals.GetHeartRate() * ComputeStrokeVolume(context, timeSlice); + } + + //------------------------------------------------------------------------------------------------ + protected float ComputeStrokeVolume(ACE_Medical_CharacterContext context, float timeSlice) + { + return s_pCirculationSettings.m_fDefaultStrokeVolumeML * context.m_pBloodHitZone.GetHealthScaled(); + } + + //------------------------------------------------------------------------------------------------ + //! Treated as constant, except for medication + protected float ComputeSystemicVascularResistance(ACE_Medical_CharacterContext context, float timeSlice) + { + return s_pCirculationSettings.m_fDefaultSystemicVascularResistance + context.m_pVitals.GetSystemicVascularResistenceMedicationAdjustment(); + } + + //------------------------------------------------------------------------------------------------ + //! MAP = CO * SVR + protected float ComputeMeanArterialPressure(ACE_Medical_CharacterContext context, float timeSlice) + { + return context.m_pVitals.GetCardiacOutput() * context.m_pVitals.GetSystemicVascularResistance(); + } + + //------------------------------------------------------------------------------------------------ + //! PP ~ MAP + protected float ComputePulsePressure(ACE_Medical_CharacterContext context, float timeSlice) + { + return s_pCirculationSettings.m_fPulsePressureScale * context.m_pVitals.GetMeanArterialPressure(); + } +} diff --git a/addons/medical_circulation/scripts/Game/ACE_Medical_Circulation/FSM/States/ACE_Medical_ResuscitationState.c b/addons/medical_circulation/scripts/Game/ACE_Medical_Circulation/FSM/States/ACE_Medical_ResuscitationState.c new file mode 100644 index 000000000..a11dc5cc7 --- /dev/null +++ b/addons/medical_circulation/scripts/Game/ACE_Medical_Circulation/FSM/States/ACE_Medical_ResuscitationState.c @@ -0,0 +1,23 @@ +//------------------------------------------------------------------------------------------------ +class ACE_Medical_ResuscitationState : ACE_Medical_IVitalState +{ + //------------------------------------------------------------------------------------------------ + //! Fake heart rate due to CPR + override protected float ComputeHeartRate(ACE_Medical_CharacterContext context, float timeSlice) + { + return 100 + Math.Clamp(Math.AbsFloat(Math.RandomGaussFloat(20/3, 0)), 0, 20); + } + + //------------------------------------------------------------------------------------------------ + override protected float ComputeStrokeVolume(ACE_Medical_CharacterContext context, float timeSlice) + { + return s_pCirculationSettings.m_fCPRStrokeVolumeScale * super.ComputeStrokeVolume(context, timeSlice); + } + + //------------------------------------------------------------------------------------------------ + //! Prevent BP from getting absurdly high through medication + override protected float ComputeMeanArterialPressure(ACE_Medical_CharacterContext context, float timeSlice) + { + return Math.Min(super.ComputeMeanArterialPressure(context, timeSlice), s_pCirculationSettings.m_CardiacArrestThresholds.m_fMeanArterialPressureHighKPA); + } +} diff --git a/addons/medical_circulation/scripts/Game/ACE_Medical_Circulation/FSM/States/ACE_Medical_StableState.c b/addons/medical_circulation/scripts/Game/ACE_Medical_Circulation/FSM/States/ACE_Medical_StableState.c new file mode 100644 index 000000000..f2fcb2c66 --- /dev/null +++ b/addons/medical_circulation/scripts/Game/ACE_Medical_Circulation/FSM/States/ACE_Medical_StableState.c @@ -0,0 +1,29 @@ +//------------------------------------------------------------------------------------------------ +class ACE_Medical_StableState : ACE_Medical_IVitalState +{ + //------------------------------------------------------------------------------------------------ + override protected float ComputeHeartRate(ACE_Medical_CharacterContext context, float timeSlice) + { + float targetHeartRate = ComputeTargetHeartRate(context, timeSlice); + float prevHeartRate = context.m_pVitals.GetHeartRate(); + float progress = Math.Min(0.5 * timeSlice, 1); + return Math.Lerp(prevHeartRate, targetHeartRate, progress); + } + + //------------------------------------------------------------------------------------------------ + protected float ComputeTargetHeartRate(ACE_Medical_CharacterContext context, float timeSlice) + { + float target = ComputeBaseTargetHeartRate(context, timeSlice); + target = Math.Max(target, s_pCirculationSettings.m_fDefaultHeartRateBPM + 50 * context.m_pDamageManager.ACE_Medical_GetPainIntensity()); + target += context.m_pVitals.GetHeartRateMedicationAdjustment(); + // TO DO: SpO2-based adjustments + + return Math.Max(0, target); + } + + //------------------------------------------------------------------------------------------------ + protected float ComputeBaseTargetHeartRate(ACE_Medical_CharacterContext context, float timeSlice) + { + return s_pCirculationSettings.m_fDefaultHeartRateBPM; + } +} diff --git a/addons/medical_circulation/scripts/Game/ACE_Medical_Circulation/FSM/Transitions/ACE_Medical_ReviveTransition.c b/addons/medical_circulation/scripts/Game/ACE_Medical_Circulation/FSM/Transitions/ACE_Medical_ReviveTransition.c new file mode 100644 index 000000000..49b1c3cf9 --- /dev/null +++ b/addons/medical_circulation/scripts/Game/ACE_Medical_Circulation/FSM/Transitions/ACE_Medical_ReviveTransition.c @@ -0,0 +1,46 @@ +//------------------------------------------------------------------------------------------------ +class ACE_Medical_ReviveTransition : ACE_FSM_ITransition +{ + protected static ACE_Medical_Circulation_Settings s_pCirculationSettings; + + //------------------------------------------------------------------------------------------------ + void ACE_Medical_ReviveTransition(ACE_FSM_EStateID fromStateIDs, ACE_FSM_EStateID toStateID) + { + if (!s_pCirculationSettings) + s_pCirculationSettings = ACE_SettingsHelperT.GetModSettings(); + } + + //------------------------------------------------------------------------------------------------ + override void OnPerform(ACE_Medical_CharacterContext context) + { + context.m_pVitals.OnRevived(); + context.m_pVitals.SetHeartRate(s_pCirculationSettings.m_CriticalThresholds.m_fHeartRateLowBPM); + // Add regneration when no longer in cardiac arrest + context.m_pDamageManager.RegenVirtualHitZone(context.m_pDamageManager.ACE_Medical_GetBrainHitZone()); + } + + //------------------------------------------------------------------------------------------------ + override bool ShouldBePerformed(ACE_Medical_CharacterContext context, float timeSlice) + { + // Cannot revive when MAP is too high + if (context.m_pVitals.GetMeanArterialPressure() > s_pCirculationSettings.m_CardiacArrestThresholds.m_fMeanArterialPressureHighKPA) + return false; + + context.m_fCPRSuccessCheckTimerS += timeSlice * context.m_pVitals.GetReviveSuccessCheckTimerScale(); + + if (context.m_fCPRSuccessCheckTimerS < s_pCirculationSettings.m_fCPRSuccessCheckTimeoutS) + return false; + + context.m_fCPRSuccessCheckTimerS = 0; + return (Math.RandomFloat(0, 1) < ComputeReviveChance(context)); + } + + //------------------------------------------------------------------------------------------------ + protected float ComputeReviveChance(ACE_Medical_CharacterContext context) + { + float minScale = context.m_pBloodHitZone.GetDamageStateThreshold(ACE_Medical_EBloodState.CLASS_4_HEMORRHAGE); + float maxScale = context.m_pBloodHitZone.GetDamageStateThreshold(ACE_Medical_EBloodState.CLASS_2_HEMORRHAGE); + float scale = Math.Clamp(context.m_pBloodHitZone.GetHealthScaled(), minScale, maxScale); + return Math.Map(scale, minScale, maxScale, s_pCirculationSettings.m_fCPRSuccessChanceMin, s_pCirculationSettings.m_fCPRSuccessChanceMax); + } +} diff --git a/addons/medical_circulation/scripts/Game/ACE_Medical_Circulation/FSM/Transitions/ACE_Medical_StartResuscitationTransition.c b/addons/medical_circulation/scripts/Game/ACE_Medical_Circulation/FSM/Transitions/ACE_Medical_StartResuscitationTransition.c new file mode 100644 index 000000000..bc3490940 --- /dev/null +++ b/addons/medical_circulation/scripts/Game/ACE_Medical_Circulation/FSM/Transitions/ACE_Medical_StartResuscitationTransition.c @@ -0,0 +1,9 @@ +//------------------------------------------------------------------------------------------------ +class ACE_Medical_StartResuscitationTransition : ACE_FSM_ITransition +{ + //------------------------------------------------------------------------------------------------ + override bool ShouldBePerformed(ACE_Medical_CharacterContext context, float timeSlice) + { + return context.m_pVitals.IsCPRPerformed(); + } +} diff --git a/addons/medical_circulation/scripts/Game/ACE_Medical_Circulation/FSM/Transitions/ACE_Medical_StopResuscitationTransition.c b/addons/medical_circulation/scripts/Game/ACE_Medical_Circulation/FSM/Transitions/ACE_Medical_StopResuscitationTransition.c new file mode 100644 index 000000000..a6ecb1899 --- /dev/null +++ b/addons/medical_circulation/scripts/Game/ACE_Medical_Circulation/FSM/Transitions/ACE_Medical_StopResuscitationTransition.c @@ -0,0 +1,9 @@ +//------------------------------------------------------------------------------------------------ +class ACE_Medical_StopResuscitationTransition : ACE_FSM_ITransition +{ + //------------------------------------------------------------------------------------------------ + override bool ShouldBePerformed(ACE_Medical_CharacterContext context, float timeSlice) + { + return !context.m_pVitals.IsCPRPerformed(); + } +} diff --git a/addons/medical_circulation/scripts/Game/ACE_Medical_Circulation/FSM/Transitions/ACE_Medical_VitalStateInverseThresholdTransition.c b/addons/medical_circulation/scripts/Game/ACE_Medical_Circulation/FSM/Transitions/ACE_Medical_VitalStateInverseThresholdTransition.c new file mode 100644 index 000000000..37a2c1915 --- /dev/null +++ b/addons/medical_circulation/scripts/Game/ACE_Medical_Circulation/FSM/Transitions/ACE_Medical_VitalStateInverseThresholdTransition.c @@ -0,0 +1,10 @@ +//------------------------------------------------------------------------------------------------ +//! Negates threshold check to evaluate the opposite range +class ACE_Medical_VitalStateInverseThresholdTransition : ACE_Medical_VitalStateThresholdTransition +{ + //------------------------------------------------------------------------------------------------ + override bool ShouldBePerformed(ACE_Medical_CharacterContext context, float timeSlice) + { + return !super.ShouldBePerformed(context, timeSlice); + } +} diff --git a/addons/medical_circulation/scripts/Game/ACE_Medical_Circulation/FSM/Transitions/ACE_Medical_VitalStateThresholdTransition.c b/addons/medical_circulation/scripts/Game/ACE_Medical_Circulation/FSM/Transitions/ACE_Medical_VitalStateThresholdTransition.c new file mode 100644 index 000000000..8e3526c3a --- /dev/null +++ b/addons/medical_circulation/scripts/Game/ACE_Medical_Circulation/FSM/Transitions/ACE_Medical_VitalStateThresholdTransition.c @@ -0,0 +1,31 @@ +//------------------------------------------------------------------------------------------------ +class ACE_Medical_VitalStateThresholdTransition : ACE_FSM_ITransition +{ + protected ref ACE_Medical_VitalStateThresholdsConfig m_pThresholds; + + //------------------------------------------------------------------------------------------------ + void ACE_Medical_VitalStateThresholdTransition(ACE_FSM_EStateID fromStateIDs, ACE_FSM_EStateID toStateID, ACE_Medical_VitalStateThresholdsConfig thresholds) + { + m_pThresholds = thresholds; + } + + //------------------------------------------------------------------------------------------------ + override bool ShouldBePerformed(ACE_Medical_CharacterContext context, float timeSlice) + { + float heartRate = context.m_pVitals.GetHeartRate(); + if ((heartRate < m_pThresholds.m_fHeartRateLowBPM) || (heartRate > m_pThresholds.m_fHeartRateHighBPM)) + return true; + + float meanArterialPressure = context.m_pVitals.GetMeanArterialPressure(); + if ((meanArterialPressure < m_pThresholds.m_fMeanArterialPressureLowKPA) && (heartRate <= m_pThresholds.m_fMaxHeartForMeanArterialPressureLowBPM)) + return true; + + if (meanArterialPressure > m_pThresholds.m_fMeanArterialPressureHighKPA) + return true; + + if (context.m_pBloodHitZone.GetHealthScaled() <= context.m_pBloodHitZone.GetDamageStateThreshold(m_pThresholds.m_eBloodState)) + return true; + + return false; + } +} diff --git a/addons/medical_circulation/scripts/Game/ACE_Medical_Circulation/Helpers/ACE_EAnimationHelperID.c b/addons/medical_circulation/scripts/Game/ACE_Medical_Circulation/Helpers/ACE_EAnimationHelperID.c new file mode 100644 index 000000000..f74fa155b --- /dev/null +++ b/addons/medical_circulation/scripts/Game/ACE_Medical_Circulation/Helpers/ACE_EAnimationHelperID.c @@ -0,0 +1,6 @@ +//---------------------------------------------------------------------------------------- +[EnumLinear()] +modded enum ACE_EAnimationHelperID +{ + CPR +} diff --git a/addons/medical_circulation/scripts/Game/ACE_Medical_Circulation/Helpers/ACE_Medical_CPRHelperCompartment.c b/addons/medical_circulation/scripts/Game/ACE_Medical_Circulation/Helpers/ACE_Medical_CPRHelperCompartment.c new file mode 100644 index 000000000..96401174f --- /dev/null +++ b/addons/medical_circulation/scripts/Game/ACE_Medical_Circulation/Helpers/ACE_Medical_CPRHelperCompartment.c @@ -0,0 +1,27 @@ +//------------------------------------------------------------------------------------------------ +class ACE_Medical_CPRHelperCompartmentClass : ACE_AnimationHelperCompartmentClass +{ +} + +//------------------------------------------------------------------------------------------------ +class ACE_Medical_CPRHelperCompartment : ACE_AnimationHelperCompartment +{ + protected ACE_Medical_VitalsComponent m_pPatientVitals; + + //------------------------------------------------------------------------------------------------ + void SetPatient(notnull SCR_ChimeraCharacter patient) + { + m_pPatientVitals = ACE_Medical_VitalsComponent.Cast(patient.FindComponent(ACE_Medical_VitalsComponent)); + if (m_pPatientVitals) + m_pPatientVitals.SetIsCPRPerformed(true); + } + + //------------------------------------------------------------------------------------------------ + override void OnCompartmentLeft() + { + super.OnCompartmentLeft(); + + if (m_pPatientVitals) + m_pPatientVitals.SetIsCPRPerformed(false); + } +} diff --git a/addons/medical_circulation/scripts/Game/ACE_Medical_Circulation/HitZone/ACE_Medical_BrainHitZone.c b/addons/medical_circulation/scripts/Game/ACE_Medical_Circulation/HitZone/ACE_Medical_BrainHitZone.c new file mode 100644 index 000000000..54b53be6c --- /dev/null +++ b/addons/medical_circulation/scripts/Game/ACE_Medical_Circulation/HitZone/ACE_Medical_BrainHitZone.c @@ -0,0 +1,45 @@ +//----------------------------------------------------------------------------------------------------------- +class ACE_Medical_BrainHitZone : SCR_RegeneratingHitZone +{ + protected ACE_Medical_VitalsComponent m_pVitalsComponent; + + //----------------------------------------------------------------------------------------------------------- + //! Store instance on SCR_CharacterDamageManagerComponent on init + override void OnInit(IEntity pOwnerEntity, GenericComponent pManagerComponent) + { + super.OnInit(pOwnerEntity, pManagerComponent); + + SCR_CharacterDamageManagerComponent damageManager = SCR_CharacterDamageManagerComponent.Cast(pManagerComponent); + if (damageManager) + damageManager.ACE_Medical_SetBrainHitZone(this); + + m_pVitalsComponent = ACE_Medical_VitalsComponent.Cast(pOwnerEntity.FindComponent(ACE_Medical_VitalsComponent)); + } + + //----------------------------------------------------------------------------------------------------------- + //! Kill character when destroyed + override void OnDamageStateChanged(EDamageState newState, EDamageState previousDamageState, bool isJIP) + { + super.OnDamageStateChanged(newState, previousDamageState, isJIP); + + if (!Replication.IsServer() || (newState != EDamageState.DESTROYED)) + return; + + SCR_CharacterDamageManagerComponent damageManager = SCR_CharacterDamageManagerComponent.Cast(GetHitZoneContainer()); + if (damageManager) + damageManager.Kill(damageManager.GetInstigator()); + } + + //------------------------------------------------------------------------------------------------ + //! TO DO: Figure out where the additional regeneration is comming from so we actually don't need this + //! Do not regenerate when in cardiac arrest + override float ComputeEffectiveDamage(notnull BaseDamageContext damageContext, bool isDOT) + { + float damage = super.ComputeEffectiveDamage(damageContext, isDOT); + + if (damage < 0 && (m_pVitalsComponent.GetVitalStateID() & (ACE_Medical_EVitalStateID.CARDIAC_ARREST | ACE_Medical_EVitalStateID.RESUSCITATION))) + return 0; + + return damage; + } +} diff --git a/addons/medical_circulation/scripts/Game/ACE_Medical_Circulation/HitZone/ACE_Medical_ECharacterBloodState.c b/addons/medical_circulation/scripts/Game/ACE_Medical_Circulation/HitZone/ACE_Medical_ECharacterBloodState.c new file mode 100644 index 000000000..a1bb3b17d --- /dev/null +++ b/addons/medical_circulation/scripts/Game/ACE_Medical_Circulation/HitZone/ACE_Medical_ECharacterBloodState.c @@ -0,0 +1,11 @@ +//------------------------------------------------------------------------------------------------ +//! This is basically a variant of EDamageState, but we don't inherit as it will break the attributes otherwise +enum ACE_Medical_EBloodState +{ + NORMAL = 0, + CLASS_1_HEMORRHAGE = 1, + CLASS_2_HEMORRHAGE = 3, + CLASS_3_HEMORRHAGE = 4, + CLASS_4_HEMORRHAGE = 5, + FATAL = 2 +} diff --git a/addons/medical_circulation/scripts/Game/ACE_Medical_Circulation/Mission/ACE_MissionHeaderSettings.c b/addons/medical_circulation/scripts/Game/ACE_Medical_Circulation/Mission/ACE_MissionHeaderSettings.c new file mode 100644 index 000000000..cb78bb872 --- /dev/null +++ b/addons/medical_circulation/scripts/Game/ACE_Medical_Circulation/Mission/ACE_MissionHeaderSettings.c @@ -0,0 +1,18 @@ +//------------------------------------------------------------------------------------------------ +//! Add mod settings to mission header +[BaseContainerProps()] +modded class ACE_MissionHeaderSettings +{ + [Attribute()] + protected ref ACE_Medical_Circulation_Settings m_ACE_Medical_Circulation; + + //------------------------------------------------------------------------------------------------ + //! Applies settings from mission header to config + override void ApplyToSettingsConfig(notnull ACE_SettingsConfig config) + { + super.ApplyToSettingsConfig(config); + + if (m_ACE_Medical_Circulation) + config.SetModSettings(m_ACE_Medical_Circulation); + } +} diff --git a/addons/medical_circulation/scripts/Game/ACE_Medical_Circulation/Network/Notifications/ENotification.c b/addons/medical_circulation/scripts/Game/ACE_Medical_Circulation/Network/Notifications/ENotification.c new file mode 100644 index 000000000..3406ed9a2 --- /dev/null +++ b/addons/medical_circulation/scripts/Game/ACE_Medical_Circulation/Network/Notifications/ENotification.c @@ -0,0 +1,7 @@ +//------------------------------------------------------------------------------------------------ +//! Notification IDs used by SCR_NotificationsComponent. +modded enum ENotification +{ + ACE_MEDICAL_PULSE_RESULT, + ACE_MEDICAL_BLOOD_PRESSURE_RESULT +} diff --git a/addons/medical_circulation/scripts/Game/ACE_Medical_Circulation/RadialMenus/Medical/ACE_Medical_CheckVitalsRadialMenuEntry.c b/addons/medical_circulation/scripts/Game/ACE_Medical_Circulation/RadialMenus/Medical/ACE_Medical_CheckVitalsRadialMenuEntry.c new file mode 100644 index 000000000..6d7ee0862 --- /dev/null +++ b/addons/medical_circulation/scripts/Game/ACE_Medical_Circulation/RadialMenus/Medical/ACE_Medical_CheckVitalsRadialMenuEntry.c @@ -0,0 +1,39 @@ +//------------------------------------------------------------------------------------------------ +[BaseContainerProps(configRoot: true), SCR_BaseContainerCustomTitleUIInfo("Name")] +class ACE_Medical_CheckVitalsRadialMenuEntry : ACE_SelectionMenuEntry +{ + [Attribute(uiwidget: UIWidgets.SearchComboBox, desc: "Type of the notification", enums: ParamEnumArray.FromEnum(ENotification))] + protected ENotification m_eNotificationType; + + //------------------------------------------------------------------------------------------------ + override protected void OnPerform() + { + PlayerCamera camera = PlayerCamera.Cast(GetGame().GetCameraManager().CurrentCamera()); + if (!camera) + return; + + SCR_ChimeraCharacter targetChar = SCR_ChimeraCharacter.Cast(camera.GetCursorTarget()); + if (!targetChar) + return; + + PlayerController playerController = GetGame().GetPlayerController(); + if (!playerController) + return; + + ACE_Medical_NetworkComponent networkComponent = ACE_Medical_NetworkComponent.Cast(playerController.FindComponent(ACE_Medical_NetworkComponent)); + if (!networkComponent) + return; + + networkComponent.RequestPatientStateNotification(m_eNotificationType, targetChar); + } + + //------------------------------------------------------------------------------------------------ + override bool CanBePerformed() + { + PlayerCamera camera = GetGame().GetPlayerController().GetPlayerCamera(); + if (!camera) + return false; + + return SCR_ChimeraCharacter.Cast(camera.GetCursorTarget()); + } +} diff --git a/addons/medical_circulation/scripts/Game/ACE_Medical_Circulation/Settings/ACE_Medical_Circulation_Settings.c b/addons/medical_circulation/scripts/Game/ACE_Medical_Circulation/Settings/ACE_Medical_Circulation_Settings.c new file mode 100644 index 000000000..6465b4138 --- /dev/null +++ b/addons/medical_circulation/scripts/Game/ACE_Medical_Circulation/Settings/ACE_Medical_Circulation_Settings.c @@ -0,0 +1,77 @@ +//------------------------------------------------------------------------------------------------ +[BaseContainerProps()] +class ACE_Medical_Circulation_Settings : ACE_ModSettings +{ + [Attribute(defvalue: "80.0", desc: "Default heart rate [bpm]", params: "0 inf")] + float m_fDefaultHeartRateBPM; + + [Attribute(defvalue: "95.0", desc: "Default stroke volume [ml]", params: "0 inf")] + float m_fDefaultStrokeVolumeML; + + [Attribute(defvalue: "12.443", desc: "Default mean arterial pressure [kPa]", params: "0 inf")] + float m_fDefaultMeanArterialPressureKPA; + + [Attribute(defvalue: "5.3329", desc: "Default pulse pressure [kPa]", params: "0 inf")] + float m_fDefaultPulsePressureKPA; + + [Attribute(desc: "Thresholds that lead to unstable vital state")] + ref ACE_Medical_VitalStateThresholdsConfig m_UnstableThresholds; + + [Attribute(desc: "Thresholds that lead to critical vital state")] + ref ACE_Medical_VitalStateThresholdsConfig m_CriticalThresholds; + + [Attribute(desc: "Thresholds that lead to cardiac arrest state")] + ref ACE_Medical_VitalStateThresholdsConfig m_CardiacArrestThresholds; + + [Attribute(desc: "Damage effects caused by cardiac arrest")] + ref ACE_Medical_CardiacArrestDamageEffect m_CardiacArrestDamageEffect; + + [Attribute(defvalue: "false", desc: "AI will die instead of entering cardiac arrest if false")] + bool m_bCardiacArrestForAIEnabled; + + [Attribute(defvalue: "0.23", desc: "Stroke volume gets multiplied by this scale during CPR.", params: "0 1")] + float m_fCPRStrokeVolumeScale; + + [Attribute(defvalue: "22.0", desc: "Default delay between check for successful CPR [s]", params: "0 inf")] + float m_fCPRSuccessCheckTimeoutS; + + [Attribute(defvalue: "0.0", desc: "Chance for exiting cardiac arrest while performing CPR at class IV hemorrhage", params: "0 1")] + float m_fCPRSuccessChanceMin; + + [Attribute(defvalue: "0.4", desc: "Chance for exiting cardiac arrest while performing CPR at above class II hemorrhage", params: "0 1")] + float m_fCPRSuccessChanceMax; + + [Attribute(defvalue: "0.2", desc: "Chance for waking up from ammonium carbonate when resilience recovery scale is close to 0", params: "0 1")] + float m_fAmmoniumCarbonateSuccessChanceMin; + + [Attribute(defvalue: "1.0", desc: "Chance for waking up from ammonium carbonate when resilience recovery scale is at `m_fMaxRevivalResilienceRecoveryScale` or above", params: "0 1")] + float m_fAmmoniumCarbonateSuccessChanceMax; + + [Attribute(defvalue: "0.2", desc: "Maximum resilience recovery scale applied after getting revived. This scale gets multiplied by the scaled health of the brain and will be removed once the patient becomes conscious", params: "0 inf")] + float m_fMaxRevivalResilienceRecoveryScale; + + // ACE3 has this set to 50, but we lowered so minimum bleedout in cardiac arrest is about 30 instead of 12 seconds + [Attribute(defvalue: "20.0", desc: "Maximum total bleeding rate at cardiac arrest due to gravity [ml/s]", params: "0 inf")] + float m_fCardiacArrestMaxTotalBleedingRate; + + // Values derived from others + float m_fDefaultSystemicVascularResistance; + float m_fPulsePressureScale; + + //------------------------------------------------------------------------------------------------ + //! Calculate derived values + override void Init() + { + // Make sure we retain the default settings for subconfigs when left empty + if (!m_CardiacArrestDamageEffect) + m_CardiacArrestDamageEffect = new ACE_Medical_CardiacArrestDamageEffect(); + + m_CardiacArrestDamageEffect.SetMaxDuration(0); + m_CardiacArrestDamageEffect.SetDamageType(EDamageType.ACE_MEDICAL_HYPOXIA); + + // Derive default SVR from other values + m_fDefaultSystemicVascularResistance = m_fDefaultMeanArterialPressureKPA / (m_fDefaultHeartRateBPM * m_fDefaultStrokeVolumeML); + // MAP multiplied by this value yields PP + m_fPulsePressureScale = m_fDefaultPulsePressureKPA / m_fDefaultMeanArterialPressureKPA; + } +} diff --git a/addons/medical_circulation/scripts/Game/ACE_Medical_Circulation/Settings/ACE_Medical_VitalStateThresholdsConfig.c b/addons/medical_circulation/scripts/Game/ACE_Medical_Circulation/Settings/ACE_Medical_VitalStateThresholdsConfig.c new file mode 100644 index 000000000..d496e2eb7 --- /dev/null +++ b/addons/medical_circulation/scripts/Game/ACE_Medical_Circulation/Settings/ACE_Medical_VitalStateThresholdsConfig.c @@ -0,0 +1,21 @@ +//------------------------------------------------------------------------------------------------ +class ACE_Medical_VitalStateThresholdsConfig : ScriptAndConfig +{ + [Attribute(desc: "A heart rate below this will trigger a transition to this state [bpm]", params: "0 inf")] + float m_fHeartRateLowBPM; + + [Attribute(desc: "A heart rate above this will trigger a transition to this state [bpm]", params: "0 inf")] + float m_fHeartRateHighBPM; + + [Attribute(desc: "A mean arterial pressure below this will trigger a transition to this state [kPa] (only if `m_fMaxHeartForMeanArterialPressureLowBPM` is satisifed)", params: "0 inf")] + float m_fMeanArterialPressureLowKPA; + + [Attribute(desc: "A mean arterial pressure above this will trigger a transition to this state [kPa]", params: "0 inf")] + float m_fMeanArterialPressureHighKPA; + + [Attribute(desc: "Maximum heart rate for trigger due to low mean arterial pressure [bpm]", params: "0 inf")] + float m_fMaxHeartForMeanArterialPressureLowBPM; + + [Attribute(uiwidget: UIWidgets.SearchComboBox, desc: "Blood volume at this level will trigger a transition to this state", enums: ParamEnumArray.FromEnum(ACE_Medical_EBloodState))] + ACE_Medical_EBloodState m_eBloodState; +} diff --git a/addons/medical_circulation/scripts/Game/ACE_Medical_Circulation/Systems/ACE_Medical_VitalStatesSystem.c b/addons/medical_circulation/scripts/Game/ACE_Medical_Circulation/Systems/ACE_Medical_VitalStatesSystem.c new file mode 100644 index 000000000..15e9f00af --- /dev/null +++ b/addons/medical_circulation/scripts/Game/ACE_Medical_Circulation/Systems/ACE_Medical_VitalStatesSystem.c @@ -0,0 +1,133 @@ +//------------------------------------------------------------------------------------------------ +class ACE_Medical_VitalStatesSystem : GameSystem +{ + [Attribute()] + protected ref ACE_Medical_VitalStates_JobScheduler m_pScheduler; + + protected ACE_Medical_Circulation_Settings m_pSettings; + + //------------------------------------------------------------------------------------------------ + static ACE_Medical_VitalStatesSystem GetInstance(ChimeraWorld world) + { + return ACE_Medical_VitalStatesSystem.Cast(world.FindSystem(ACE_Medical_VitalStatesSystem)); + } + + //------------------------------------------------------------------------------------------------ + override static void InitInfo(WorldSystemInfo outInfo) + { + super.InitInfo(outInfo); + outInfo.SetAbstract(false) + .SetUnique(true) + .SetLocation(WorldSystemLocation.Server) + .AddPoint(WorldSystemPoint.BeforeEntitiesCreated); + } + + //------------------------------------------------------------------------------------------------ + override protected void OnInit() + { + m_pSettings = ACE_SettingsHelperT.GetModSettings(); + m_pScheduler.OnInit(CreateTemplateJob()); + + ACE_FrameJobSystem jobManager = ACE_FrameJobSystem.GetInstance(); + if (jobManager) + jobManager.Register(m_pScheduler, ESystemPoint.Frame); + } + + //------------------------------------------------------------------------------------------------ + protected ACE_Medical_VitalStateMachine CreateTemplateJob() + { + ACE_Medical_VitalStateMachine machine = new ACE_Medical_VitalStateMachine(); + + machine.AddState(new ACE_Medical_StableState(ACE_Medical_EVitalStateID.STABLE)); + machine.AddState(new ACE_Medical_StableState(ACE_Medical_EVitalStateID.UNSTABLE)); + machine.AddState(new ACE_Medical_CriticalState(ACE_Medical_EVitalStateID.CRITICAL)); + machine.AddState(new ACE_Medical_CardiacArrestState(ACE_Medical_EVitalStateID.CARDIAC_ARREST)); + machine.AddState(new ACE_Medical_ResuscitationState(ACE_Medical_EVitalStateID.RESUSCITATION)); + + machine.AddTransition(new ACE_Medical_StartResuscitationTransition( + fromStateIDs: ACE_Medical_EVitalStateID.CARDIAC_ARREST, + toStateID: ACE_Medical_EVitalStateID.RESUSCITATION + )); + machine.AddTransition(new ACE_Medical_ReviveTransition( + fromStateIDs: ACE_Medical_EVitalStateID.RESUSCITATION, + toStateID: ACE_Medical_EVitalStateID.CRITICAL + )); + machine.AddTransition(new ACE_Medical_StopResuscitationTransition( + fromStateIDs: ACE_Medical_EVitalStateID.RESUSCITATION, + toStateID: ACE_Medical_EVitalStateID.CARDIAC_ARREST + )); + machine.AddTransition(new ACE_Medical_VitalStateThresholdTransition( + fromStateIDs: ACE_Medical_EVitalStateID.STABLE | ACE_Medical_EVitalStateID.UNSTABLE | ACE_Medical_EVitalStateID.CRITICAL, + toStateID: ACE_Medical_EVitalStateID.CARDIAC_ARREST, + thresholds: m_pSettings.m_CardiacArrestThresholds + )); + machine.AddTransition(new ACE_Medical_VitalStateThresholdTransition( + fromStateIDs: ACE_Medical_EVitalStateID.STABLE | ACE_Medical_EVitalStateID.UNSTABLE, + toStateID: ACE_Medical_EVitalStateID.CRITICAL, + thresholds: m_pSettings.m_CriticalThresholds + )); + machine.AddTransition(new ACE_Medical_VitalStateThresholdTransition( + fromStateIDs: ACE_Medical_EVitalStateID.STABLE, + toStateID: ACE_Medical_EVitalStateID.UNSTABLE, + thresholds: m_pSettings.m_UnstableThresholds + )); + machine.AddTransition(new ACE_Medical_VitalStateInverseThresholdTransition( + fromStateIDs: ACE_Medical_EVitalStateID.UNSTABLE, + toStateID: ACE_Medical_EVitalStateID.STABLE, + thresholds: m_pSettings.m_UnstableThresholds + )); + machine.AddTransition(new ACE_Medical_VitalStateInverseThresholdTransition( + fromStateIDs: ACE_Medical_EVitalStateID.CRITICAL, + toStateID: ACE_Medical_EVitalStateID.UNSTABLE, + thresholds: m_pSettings.m_CriticalThresholds + )); + + machine.UpdateTransitionTable(); + return machine; + } + + //------------------------------------------------------------------------------------------------ + void Register(notnull SCR_ChimeraCharacter char) + { + m_pScheduler.Register(char); + } + + //------------------------------------------------------------------------------------------------ + void Unregister(SCR_ChimeraCharacter char) + { + m_pScheduler.Unregister(char); + } + +#ifdef ENABLE_DIAG + //------------------------------------------------------------------------------------------------ + //! Show vitals for target entity + override void OnDiag(float timeSlice) + { + super.OnDiag(timeSlice); + + IEntity target; + string targetType; + if (!ACE_DiagTools.GetDiagTargetCharacter(target, targetType)) + return; + + ACE_Medical_VitalsComponent component = ACE_Medical_VitalsComponent.Cast(target.FindComponent(ACE_Medical_VitalsComponent)); + if (!component) + return; + + SCR_CharacterDamageManagerComponent damageManager = SCR_CharacterDamageManagerComponent.Cast(target.FindComponent(SCR_CharacterDamageManagerComponent)); + if (!damageManager) + return; + + DbgUI.Begin(string.Format("ACE_Medical_VitalStatesSystem (%1)", targetType), 0, 700); + DbgUI.Text(string.Format("Vital state: %1", SCR_Enum.GetEnumName(ACE_Medical_EVitalStateID, component.GetVitalStateID()))); + DbgUI.Text(string.Format("Blood state: %1", SCR_Enum.GetEnumName(ACE_Medical_EBloodState, damageManager.GetBloodHitZone().GetDamageState()))); + DbgUI.Text(string.Format("Resilience regen scale: %1", damageManager.ACE_Medical_GetResilienceRegenScale())); + DbgUI.Text(string.Format("Heart rate: %1 bpm", Math.Round(component.GetHeartRate()))); + DbgUI.PlotLiveClamped("HR", 500, 400, component.GetHeartRate(), 0, 220, 100, 1000); + Tuple2 pressures = component.GetBloodPressures(); + DbgUI.Text(string.Format("Blood pressure: %1/%2 mmHg", Math.Round(pressures.param2 * ACE_PhysicalConstants.KPA2MMHG), Math.Round(pressures.param1 * ACE_PhysicalConstants.KPA2MMHG))); + DbgUI.PlotLiveClamped("BP", 500, 400, pressures.param2, 0, 30, 100, 1000); + DbgUI.End(); + } +#endif +} diff --git a/addons/medical_circulation/scripts/Game/ACE_Medical_Circulation/UI/Inventory/SCR_InventoryDamageInfoUI.c b/addons/medical_circulation/scripts/Game/ACE_Medical_Circulation/UI/Inventory/SCR_InventoryDamageInfoUI.c new file mode 100644 index 000000000..3d92c9a35 --- /dev/null +++ b/addons/medical_circulation/scripts/Game/ACE_Medical_Circulation/UI/Inventory/SCR_InventoryDamageInfoUI.c @@ -0,0 +1,19 @@ +//------------------------------------------------------------------------------------------------ +[EntityEditorProps(category: "GameScripted/UI/Inventory", description: "Inventory Item Info UI class")] +modded class SCR_InventoryDamageInfoUI : ScriptedWidgetComponent +{ + //------------------------------------------------------------------------------------------------ + //! Insert blood state in bleeding widget + void ACE_Medical_SetBloodStateVisible(bool visible, string text) + { + if (!visible || !m_wBleedingIconWidget || !m_wBleedingTextWidget) + return; + + if (m_wBleedingTextWidget.IsVisible()) + text += "\n" + m_wBleedingTextWidget.GetText(); + + m_wBleedingIconWidget.SetVisible(visible); + m_wBleedingTextWidget.SetVisible(visible); + m_wBleedingTextWidget.SetText(text); + } +} diff --git a/addons/medical_circulation/scripts/Game/ACE_Medical_Circulation/UI/Inventory/SCR_InventoryHitZonePointUI.c b/addons/medical_circulation/scripts/Game/ACE_Medical_Circulation/UI/Inventory/SCR_InventoryHitZonePointUI.c new file mode 100644 index 000000000..0fd8d0399 --- /dev/null +++ b/addons/medical_circulation/scripts/Game/ACE_Medical_Circulation/UI/Inventory/SCR_InventoryHitZonePointUI.c @@ -0,0 +1,24 @@ +//------------------------------------------------------------------------------------------------ +modded class SCR_InventoryHitZonePointUI : ScriptedWidgetComponent +{ + //------------------------------------------------------------------------------------------------ + //! Show blood classes instead of vanilla states + override void GetBloodInfoText(float bloodHitZoneHealthScaled, out string bloodLossText) + { + ChimeraCharacter char = ChimeraCharacter.Cast(GetGame().GetPlayerController().GetControlledEntity()); + if (!char) + return; + + SCR_CharacterDamageManagerComponent damageManager = SCR_CharacterDamageManagerComponent.Cast(char.GetDamageManager()); + if (!damageManager) + return; + + switch (damageManager.GetBloodHitZone().GetDamageState()) + { + case ACE_Medical_EBloodState.CLASS_1_HEMORRHAGE: { bloodLossText = "#ACE_Medical-BloodState_Class1"; return; } + case ACE_Medical_EBloodState.CLASS_2_HEMORRHAGE: { bloodLossText = "#ACE_Medical-BloodState_Class2"; return; } + case ACE_Medical_EBloodState.CLASS_3_HEMORRHAGE: { bloodLossText = "#ACE_Medical-BloodState_Class3"; return; } + case ACE_Medical_EBloodState.CLASS_4_HEMORRHAGE: { bloodLossText = "#ACE_Medical-BloodState_Class4"; return; } + } + } +} diff --git a/addons/medical_circulation/scripts/Game/ACE_Medical_Circulation/UI/Inventory/SCR_InventoryMenuUI.c b/addons/medical_circulation/scripts/Game/ACE_Medical_Circulation/UI/Inventory/SCR_InventoryMenuUI.c new file mode 100644 index 000000000..ff6d6554d --- /dev/null +++ b/addons/medical_circulation/scripts/Game/ACE_Medical_Circulation/UI/Inventory/SCR_InventoryMenuUI.c @@ -0,0 +1,13 @@ +//------------------------------------------------------------------------------------------------ +modded class SCR_InventoryMenuUI : ChimeraMenuBase +{ + //------------------------------------------------------------------------------------------------ + //! Show blood loss widget for Class I already + override void OnDamageStateChanged() + { + super.OnDamageStateChanged(); + + if (m_bleedingHandlerGlobal) + m_bleedingHandlerGlobal.GetRootWidget().SetVisible(m_CharDamageManager.GetBloodHitZone().GetDamageState() > ACE_Medical_EBloodState.NORMAL); + } +} diff --git a/addons/medical_circulation/scripts/Game/ACE_Medical_Circulation/UI/ScreenEffects/SCR_BleedingScreenEffect.c b/addons/medical_circulation/scripts/Game/ACE_Medical_Circulation/UI/ScreenEffects/SCR_BleedingScreenEffect.c new file mode 100644 index 000000000..d3a053da9 --- /dev/null +++ b/addons/medical_circulation/scripts/Game/ACE_Medical_Circulation/UI/ScreenEffects/SCR_BleedingScreenEffect.c @@ -0,0 +1,29 @@ +//------------------------------------------------------------------------------------------------ +modded class SCR_BleedingScreenEffect : SCR_BaseScreenEffect +{ + [Attribute(defvalue: "0.85", uiwidget: UIWidgets.Slider, params: "0 1", desc: "Opacity for the blackout effect when in cardiac arrest")] + protected float m_fACE_Medical_CardiacArrestBlackoutOpacity; + + protected ACE_Medical_VitalsComponent m_pACE_Medical_VitalsComponent; + + //------------------------------------------------------------------------------------------------ + override void DisplayControlledEntityChanged(IEntity from, IEntity to) + { + super.DisplayControlledEntityChanged(from, to); + + if (to) + m_pACE_Medical_VitalsComponent = ACE_Medical_VitalsComponent.Cast(to.FindComponent(ACE_Medical_VitalsComponent)); + } + + //------------------------------------------------------------------------------------------------ + //! Make the screen completely black when in cardiac arrest + override void BlackoutEffect(float effectStrength) + { + bool inCardiacArrest = (m_pACE_Medical_VitalsComponent.GetVitalStateID() & (ACE_Medical_EVitalStateID.CARDIAC_ARREST | ACE_Medical_EVitalStateID.RESUSCITATION)); + if (inCardiacArrest) + effectStrength = m_fACE_Medical_CardiacArrestBlackoutOpacity / BLACKOUT_OPACITY_MULTIPLIER; + + SCR_UISoundEntity.SetSignalValueStr("ACE_Medical_CardiacArrest", inCardiacArrest); + super.BlackoutEffect(effectStrength); + } +} diff --git a/addons/medical_circulation/scripts/Game/ACE_Medical_Circulation/UI/ScreenEffects/SCR_InspectCasualtyWidget.c b/addons/medical_circulation/scripts/Game/ACE_Medical_Circulation/UI/ScreenEffects/SCR_InspectCasualtyWidget.c new file mode 100644 index 000000000..72b51bc94 --- /dev/null +++ b/addons/medical_circulation/scripts/Game/ACE_Medical_Circulation/UI/ScreenEffects/SCR_InspectCasualtyWidget.c @@ -0,0 +1,37 @@ +//------------------------------------------------------------------------------------------------ +modded class SCR_InspectCasualtyWidget : SCR_InfoDisplayExtended +{ + //------------------------------------------------------------------------------------------------ + //! Gather and update data of target character into widget + override void UpdateWidgetData() + { + super.UpdateWidgetData(); + + if (!m_Target || !m_wCasualtyInspectWidget) + return; + + SCR_InventoryDamageInfoUI damageInfoUI = SCR_InventoryDamageInfoUI.Cast(m_wCasualtyInspectWidget.FindHandler(SCR_InventoryDamageInfoUI)); + if (!damageInfoUI) + return; + + SCR_CharacterDamageManagerComponent damageManager = SCR_CharacterDamageManagerComponent.Cast(m_Target.FindComponent(SCR_CharacterDamageManagerComponent)); + if (!damageManager) + return; + + ACE_Medical_EBloodState bloodState = damageManager.GetBloodHitZone().GetDamageState(); + string bloodText; + + if (bloodState > ACE_Medical_EBloodState.NORMAL) + { + switch (bloodState) + { + case ACE_Medical_EBloodState.CLASS_1_HEMORRHAGE: { bloodText = "#ACE_Medical-BloodState_Class1"; break; } + case ACE_Medical_EBloodState.CLASS_2_HEMORRHAGE: { bloodText = "#ACE_Medical-BloodState_Class2"; break; } + case ACE_Medical_EBloodState.CLASS_3_HEMORRHAGE: { bloodText = "#ACE_Medical-BloodState_Class3"; break; } + case ACE_Medical_EBloodState.CLASS_4_HEMORRHAGE: { bloodText = "#ACE_Medical-BloodState_Class4"; break; } + } + } + + damageInfoUI.ACE_Medical_SetBloodStateVisible(bloodState > ACE_Medical_EBloodState.NORMAL, bloodText); + } +} diff --git a/addons/medical_circulation/scripts/Game/ACE_Medical_Circulation/UserActions/ACE_Medical_AmmoniumCarbonateUserAction.c b/addons/medical_circulation/scripts/Game/ACE_Medical_Circulation/UserActions/ACE_Medical_AmmoniumCarbonateUserAction.c new file mode 100644 index 000000000..303f0fcf9 --- /dev/null +++ b/addons/medical_circulation/scripts/Game/ACE_Medical_Circulation/UserActions/ACE_Medical_AmmoniumCarbonateUserAction.c @@ -0,0 +1,27 @@ +//------------------------------------------------------------------------------------------------ +class ACE_Medical_AmmoniumCarbonateUserAction : SCR_HealingUserAction +{ + //------------------------------------------------------------------------------------------------ + override bool CanBePerformedScript(IEntity user) + { + // Medic character + ChimeraCharacter userCharacter = ChimeraCharacter.Cast(user); + if (!userCharacter) + return false; + + SCR_ConsumableItemComponent consumableComponent = GetConsumableComponent(userCharacter); + if (!consumableComponent) + return false; + + int reason; + if (!consumableComponent.GetConsumableEffect().CanApplyEffect(GetOwner(), userCharacter, reason)) + { + if (reason == SCR_EConsumableFailReason.ALREADY_APPLIED) + SetCannotPerformReason(m_sAlreadyApplied); + + return false; + } + + return true; + } +} diff --git a/addons/medical_circulation/scripts/Game/ACE_Medical_Circulation/UserActions/ACE_Medical_CPRUserAction.c b/addons/medical_circulation/scripts/Game/ACE_Medical_Circulation/UserActions/ACE_Medical_CPRUserAction.c new file mode 100644 index 000000000..db7e480fc --- /dev/null +++ b/addons/medical_circulation/scripts/Game/ACE_Medical_Circulation/UserActions/ACE_Medical_CPRUserAction.c @@ -0,0 +1,157 @@ +//------------------------------------------------------------------------------------------------ +class ACE_Medical_CPRUserAction : ScriptedUserAction +{ + protected static const ref array CPR_PERFORMER_ANGLES = {90, -90}; + protected static const ref array CPR_PERFORMER_OFFSETS = {{-0.3, 0, -0.8}, {0.3, 0, -0.8}}; + protected static const vector CPR_PERFORMER_BB_OFFSET = {0, 0.45, 0}; + protected static const vector CPR_PERFORMER_BB_HALF_EXTENDS = {0.15, 0.15, 0.15}; + + //------------------------------------------------------------------------------------------------ + //! Can this action be shown in the UI to the provided user entity? + override bool CanBeShownScript(IEntity user) + { + if (!super.CanBeShownScript(user)) + return false; + + SCR_ChimeraCharacter userChar = SCR_ChimeraCharacter.Cast(user); + if (!userChar) + return false; + + if (userChar.IsInVehicle()) + return false; + + CharacterControllerComponent userController = userChar.GetCharacterController(); + if (!userController || userController.GetLifeState() != ECharacterLifeState.ALIVE) + return false; + + if (userController.IsSwimming() || userController.IsFalling()) + return false; + + SCR_ChimeraCharacter ownerChar = SCR_ChimeraCharacter.Cast(GetOwner()); + if (!ownerChar) + return false; + + if (ownerChar.IsInVehicle()) + return false; + + CharacterControllerComponent ownerController = ownerChar.GetCharacterController(); + if (!ownerController) + return false; + + if (ownerController.GetLifeState() != ECharacterLifeState.INCAPACITATED) + return false; + + CharacterAnimationComponent ownerAnimation = ownerChar.GetAnimationComponent(); + if (!ownerAnimation) + return false; + + if (ownerAnimation.IsRagdollActive()) + return false; + + ACE_Medical_VitalsComponent vitalsComponent = ACE_Medical_VitalsComponent.Cast(ownerChar.FindComponent(ACE_Medical_VitalsComponent)); + if (!vitalsComponent) + false; + + if (vitalsComponent.IsCPRPerformed()) + return false; + + return true; + } + + //------------------------------------------------------------------------------------------------ + //! Block action if position is obstructed + override bool CanBePerformedScript(IEntity user) + { + if (!super.CanBePerformedScript(user)) + return false; + + SCR_ChimeraCharacter ownerChar = SCR_ChimeraCharacter.Cast(GetOwner()); + if (!ownerChar) + return false; + + SCR_CharacterControllerComponent ownerController = SCR_CharacterControllerComponent.Cast(ownerChar.GetCharacterController()); + if (!ownerController) + return false; + + if (ownerController.ACE_Medical_GetUnconsciousPose() != ACE_Medical_EUnconsciousPose.BACK) + { + SetCannotPerformReason("#ACE_Medical-FailReason_NotOnBack"); + return false; + } + + TraceOBB trace = new TraceOBB(); + trace.Exclude = user; + vector transform[4]; + GetEntryTransform(transform, ownerChar, user); + + for (int i = 0; i < 3; i++) + { + trace.Mat[i] = transform[i]; + } + + trace.Maxs = CPR_PERFORMER_BB_HALF_EXTENDS; + trace.Mins = -CPR_PERFORMER_BB_HALF_EXTENDS; + trace.Start = transform[3] + CPR_PERFORMER_BB_OFFSET; + + if (GetGame().GetWorld().TracePosition(trace, TraceObstructionCallback) < 0) + { + SetCannotPerformReason("#AR-UserAction_SeatObstructed"); + return false; + } + + return true; + } + + //------------------------------------------------------------------------------------------------ + //! Return the transform for where the user will do CPR from + protected void GetEntryTransform(out vector transform[4], IEntity owner, IEntity user) + { + vector userPos = user.GetOrigin(); + vector bestTransform[4]; + + // Get best orientation to perform CPR + for (int i = 0; i < CPR_PERFORMER_ANGLES.Count(); i++) + { + owner.GetWorldTransform(transform); + vector angles = Math3D.MatrixToAngles(transform); + angles[0] = angles[0] + CPR_PERFORMER_ANGLES[i]; + Math3D.AnglesToMatrix(angles, transform); + transform[3] = transform[3] + CPR_PERFORMER_OFFSETS[i].Multiply3(transform); + + if (vector.DistanceSqXZ(userPos, transform[3]) < vector.DistanceSqXZ(userPos, bestTransform[3])) + bestTransform = transform; + } + + transform = bestTransform; + } + + //------------------------------------------------------------------------------------------------ + //! Ignore inventory items + protected bool TraceObstructionCallback(IEntity entity) + { + return !InventoryItemComponent.Cast(entity.FindComponent(InventoryItemComponent)); + } + + //------------------------------------------------------------------------------------------------ + override void PerformAction(IEntity pOwnerEntity, IEntity pUserEntity) + { + // Check on server that in fact no one is performing CPR + ACE_Medical_VitalsComponent vitalsComponent = ACE_Medical_VitalsComponent.Cast(pOwnerEntity.FindComponent(ACE_Medical_VitalsComponent)); + if (!vitalsComponent || vitalsComponent.IsCPRPerformed()) + return; + + vector transform[4]; + GetEntryTransform(transform, pOwnerEntity, pUserEntity); + + ACE_Medical_CPRHelperCompartment helper = ACE_Medical_CPRHelperCompartment.Cast(ACE_AnimationTools.AnimateWithHelperCompartment(ACE_EAnimationHelperID.CPR, SCR_ChimeraCharacter.Cast(pUserEntity), transform)); + if (helper) + helper.SetPatient(SCR_ChimeraCharacter.Cast(pOwnerEntity)); + } + + //------------------------------------------------------------------------------------------------ + //! Clients should not run the action + override bool CanBroadcastScript() + { + return false; + } +} diff --git a/addons/medical_circulation/scripts/Game/ACE_Medical_Circulation/UserActions/ACE_Medical_CheckVitalsUserAction.c b/addons/medical_circulation/scripts/Game/ACE_Medical_Circulation/UserActions/ACE_Medical_CheckVitalsUserAction.c new file mode 100644 index 000000000..923764ff6 --- /dev/null +++ b/addons/medical_circulation/scripts/Game/ACE_Medical_Circulation/UserActions/ACE_Medical_CheckVitalsUserAction.c @@ -0,0 +1,74 @@ +//------------------------------------------------------------------------------------------------ +class ACE_Medical_CheckVitalsUserAction : ScriptedUserAction +{ + [Attribute(uiwidget: UIWidgets.SearchComboBox, desc: "Type of the notification", enums: ParamEnumArray.FromEnum(ENotification))] + protected ENotification m_eNotificationType; + + protected SCR_ChimeraCharacter m_pOwner; + + //------------------------------------------------------------------------------------------------ + //! Called when object is initialized and registered to actions manager + override void Init(IEntity pOwnerEntity, GenericComponent pManagerComponent) + { + m_pOwner = SCR_ChimeraCharacter.Cast(pOwnerEntity); + } + + //------------------------------------------------------------------------------------------------ + //! Can this action be shown in the UI to the provided user entity? + override bool CanBeShownScript(IEntity user) + { + if (!super.CanBeShownScript(user)) + return false; + + SCR_ChimeraCharacter userChar = SCR_ChimeraCharacter.Cast(user); + if (!userChar) + return false; + + CharacterControllerComponent userController = userChar.GetCharacterController(); + if (!userController) + return false; + + if (userController.IsSwimming() || userController.IsFalling() || userController.IsGadgetInHands()) + return false; + + CharacterControllerComponent ownerController = m_pOwner.GetCharacterController(); + if (!ownerController) + return false; + + if (ownerController.GetLifeState() != ECharacterLifeState.INCAPACITATED) + return false; + + CharacterAnimationComponent ownerAnimation = m_pOwner.GetAnimationComponent(); + if (!ownerAnimation) + return false; + + if (ownerAnimation.IsRagdollActive()) + return false; + + return true; + } + + //------------------------------------------------------------------------------------------------ + //! Called when someone tries to perform the continuous action, user entity is typically character + override void PerformAction(IEntity pOwnerEntity, IEntity pUserEntity) + { + super.PerformAction(pOwnerEntity, pUserEntity); + + PlayerController playerController = GetGame().GetPlayerController(); + if (!playerController) + return; + + ACE_Medical_NetworkComponent networkComponent = ACE_Medical_NetworkComponent.Cast(playerController.FindComponent(ACE_Medical_NetworkComponent)); + if (!networkComponent) + return; + + networkComponent.RequestPatientStateNotification(m_eNotificationType, SCR_ChimeraCharacter.Cast(pOwnerEntity)); + } + + //------------------------------------------------------------------------------------------------ + //! Should only be executed on the local user + override bool HasLocalEffectOnlyScript() + { + return true; + } +} diff --git a/addons/medical_circulation/scripts/Game/ACE_Medical_Circulation/UserActions/SCR_InspectCasualtyUserAction.c b/addons/medical_circulation/scripts/Game/ACE_Medical_Circulation/UserActions/SCR_InspectCasualtyUserAction.c new file mode 100644 index 000000000..bfb28cacf --- /dev/null +++ b/addons/medical_circulation/scripts/Game/ACE_Medical_Circulation/UserActions/SCR_InspectCasualtyUserAction.c @@ -0,0 +1,29 @@ +//------------------------------------------------------------------------------------------------ +modded class SCR_InspectCasualtyUserAction : ScriptedUserAction +{ + //------------------------------------------------------------------------------------------------ + //! Make action available when pain hit zone is damaged or vitals are lowered + override bool CanBeShownScript(IEntity user) + { + if (super.CanBeShownScript(user)) + return true; + + ChimeraCharacter ownerChar = ChimeraCharacter.Cast(GetOwner()); + if (!ownerChar) + return false; + + SCR_CharacterDamageManagerComponent damageManager = SCR_CharacterDamageManagerComponent.Cast(ownerChar.GetDamageManager()); + if (!damageManager) + return false; + + ACE_Medical_PainHitZone painHZ = damageManager.ACE_Medical_GetPainHitZone(); + if (painHZ && painHZ.GetDamageState() != EDamageState.UNDAMAGED) + return true; + + ACE_Medical_VitalsComponent vitalsComponent = ACE_Medical_VitalsComponent.Cast(ownerChar.FindComponent(ACE_Medical_VitalsComponent)); + if (vitalsComponent && vitalsComponent.GetVitalStateID() != ACE_Medical_EVitalStateID.STABLE) + return true; + + return false; + } +} diff --git a/addons/medical_circulation/scripts/Game/ACE_Medical_Circulation/generated/HitZone/EDamageType.c b/addons/medical_circulation/scripts/Game/ACE_Medical_Circulation/generated/HitZone/EDamageType.c new file mode 100644 index 000000000..c0826b3b3 --- /dev/null +++ b/addons/medical_circulation/scripts/Game/ACE_Medical_Circulation/generated/HitZone/EDamageType.c @@ -0,0 +1,5 @@ +//------------------------------------------------------------------------------------------------ +modded enum EDamageType +{ + ACE_MEDICAL_HYPOXIA +} diff --git a/addons/medical_circulation/scripts/Game/ACE_Medical_Medication/Components/ACE_Medical_MedicationComponent.c b/addons/medical_circulation/scripts/Game/ACE_Medical_Medication/Components/ACE_Medical_MedicationComponent.c new file mode 100644 index 000000000..a53e961f2 --- /dev/null +++ b/addons/medical_circulation/scripts/Game/ACE_Medical_Medication/Components/ACE_Medical_MedicationComponent.c @@ -0,0 +1,134 @@ +//------------------------------------------------------------------------------------------------ +class ACE_Medical_MedicationComponentClass : ScriptComponentClass +{ +} + +//------------------------------------------------------------------------------------------------ +//! Updates to vitals are mostly server side right now +//! Clients can request values for vitals via ACE_Medical_NetworkComponent +//! TO DO: Inherit from ACE_Medical_BaseComponent once systems support inheritance +class ACE_Medical_MedicationComponent : ScriptComponent +{ + protected ref array m_aDrugs = {}; + protected ref array> m_aDoses = {}; + + [RplProp()] + protected ref array m_aLogMessageTimes = {}; + [RplProp()] + protected ref array m_aLogMessages = {}; + [RplProp()] + protected ref array m_aLogMessageAuthors = {}; + protected const int MAX_NUM_LOG_ENTRIES = 8; + + //------------------------------------------------------------------------------------------------ + void AddMedication(ACE_Medical_Dose dose) + { + ACE_Medical_EDrugType drug = dose.GetDrugType(); + dose.SetAdministrationTime(); + + ACE_Medical_MedicationSystem system = ACE_Medical_MedicationSystem.GetInstance(GetOwner().GetWorld()); + if (system && m_aDrugs.IsEmpty()) + system.Register(SCR_ChimeraCharacter.Cast(GetOwner())); + + int idx = m_aDrugs.Find(drug); + if (idx >= 0) + { + m_aDoses[idx].Insert(dose); + } + else + { + m_aDrugs.Insert(drug); + m_aDoses.Insert({dose}); + } + } + + //------------------------------------------------------------------------------------------------ + void GetMedications(out array drugs, out array> doses) + { + drugs = m_aDrugs; + doses = m_aDoses; + } + + //------------------------------------------------------------------------------------------------ + void AddLogEntry(string message, int authorID = -1) + { + float timeOfDay = 24 * GetGame().GetClock().GetTimeOfDay(); + RplDo_AddLogEntryBroadcast(timeOfDay, message, authorID); + Rpc(RplDo_AddLogEntryBroadcast, timeOfDay, message, authorID); + } + + //------------------------------------------------------------------------------------------------ + [RplRpc(RplChannel.Reliable, RplRcver.Broadcast)] + protected void RplDo_AddLogEntryBroadcast(float time, string message, int authorID) + { + if (m_aLogMessages.Count() >= MAX_NUM_LOG_ENTRIES) + { + m_aLogMessageTimes.RemoveOrdered(0); + m_aLogMessages.RemoveOrdered(0); + m_aLogMessageAuthors.RemoveOrdered(0); + } + + m_aLogMessageTimes.Insert(time); + m_aLogMessages.Insert(message); + + string authorName = GetGame().GetPlayerManager().GetPlayerName(authorID); + if (authorName.IsEmpty()) + authorName = "N/A"; + + m_aLogMessageAuthors.Insert(authorName); + } + + //------------------------------------------------------------------------------------------------ + void GetLogData(out array times, out array messages, out array authors) + { + times = m_aLogMessageTimes; + messages = m_aLogMessages; + authors = m_aLogMessageAuthors + } + + //------------------------------------------------------------------------------------------------ + string GetInfoText() + { + array medicationTexts = {}; + medicationTexts.Reserve(m_aLogMessageTimes.Count()); + + for (int i = m_aLogMessageTimes.Count() - 1; i >= 0; i--) + { + int hours = Math.Floor(m_aLogMessageTimes[i]); + int minutes = Math.Round(60 * (m_aLogMessageTimes[i] - hours)); + medicationTexts.Insert(string.Format("%1:%2 %3 (%4)", hours, minutes, m_aLogMessages[i], m_aLogMessageAuthors[i])); + } + + return SCR_StringHelper.Join("\n", medicationTexts); + } + + //------------------------------------------------------------------------------------------------ + //! Clears the body of all drugs and effects + void Clear() + { + m_aDrugs.Clear(); + m_aDoses.Clear(); + + ACE_Medical_Medication_Settings settings = ACE_SettingsHelperT.GetModSettings(); + if (!settings || !settings) + return; + + foreach (ACE_Medical_DrugEffectConfig effect : settings.m_aPharmacodynamicsConfigs) + { + effect.ClearEffect(new ACE_Medical_CharacterContext(SCR_ChimeraCharacter.Cast(GetOwner()))); + } + } + + //------------------------------------------------------------------------------------------------ + override protected void OnDelete(IEntity owner) + { + super.OnDelete(owner); + + if (!GetGame().InPlayMode() || !Replication.IsServer()) + return; + + ACE_Medical_MedicationSystem system = ACE_Medical_MedicationSystem.GetInstance(owner.GetWorld()); + if (system) + system.Unregister(SCR_ChimeraCharacter.Cast(owner)); + } +} diff --git a/addons/medical_circulation/scripts/Game/ACE_Medical_Medication/Components/Damage/SCR_CharacterDamageManagerComponent.c b/addons/medical_circulation/scripts/Game/ACE_Medical_Medication/Components/Damage/SCR_CharacterDamageManagerComponent.c new file mode 100644 index 000000000..a3412b656 --- /dev/null +++ b/addons/medical_circulation/scripts/Game/ACE_Medical_Medication/Components/Damage/SCR_CharacterDamageManagerComponent.c @@ -0,0 +1,25 @@ +//------------------------------------------------------------------------------------------------ +modded class SCR_CharacterDamageManagerComponent : SCR_DamageManagerComponent +{ + //----------------------------------------------------------------------------------------------------------- + //! Clear medication when fully healed (e.g. by GM) + override void FullHeal(bool ignoreHealingDOT = true) + { + super.FullHeal(ignoreHealingDOT); + + ACE_Medical_MedicationComponent medicationComponent = ACE_Medical_MedicationComponent.Cast(GetOwner().FindComponent(ACE_Medical_MedicationComponent)); + if (medicationComponent) + medicationComponent.Clear(); + } + + //----------------------------------------------------------------------------------------------------------- + //! Unregister from medical systems when killed + override void ACE_Medical_OnKilled() + { + super.ACE_Medical_OnKilled(); + + ACE_Medical_MedicationSystem system = ACE_Medical_MedicationSystem.GetInstance(GetOwner().GetWorld()); + if (system) + system.Unregister(SCR_ChimeraCharacter.Cast(GetOwner())); + } +} diff --git a/addons/medical_circulation/scripts/Game/ACE_Medical_Medication/Components/Gadgets/ACE_Medical_ConsumableAmmoniumCarbonate.c b/addons/medical_circulation/scripts/Game/ACE_Medical_Medication/Components/Gadgets/ACE_Medical_ConsumableAmmoniumCarbonate.c new file mode 100644 index 000000000..b18eff87c --- /dev/null +++ b/addons/medical_circulation/scripts/Game/ACE_Medical_Medication/Components/Gadgets/ACE_Medical_ConsumableAmmoniumCarbonate.c @@ -0,0 +1,66 @@ +//! Epinephrine effect: Heals resilience hit zone +[BaseContainerProps()] +class ACE_Medical_ConsumableAmmoniumCarbonate : SCR_ConsumableEffectHealthItems +{ + //------------------------------------------------------------------------------------------------ + //! Can always be applied in advanced medical + override bool CanApplyEffect(notnull IEntity target, notnull IEntity user, out SCR_EConsumableFailReason failReason) + { + return true; + } + + //------------------------------------------------------------------------------------------------ + //! Can always be applied in advanced medical + override bool CanApplyEffectToHZ(notnull IEntity target, notnull IEntity user, ECharacterHitZoneGroup group, out SCR_EConsumableFailReason failReason = SCR_EConsumableFailReason.NONE) + { + return true; + } + + //------------------------------------------------------------------------------------------------ + //! Add chance for applying effect + override void ApplyEffect(notnull IEntity target, notnull IEntity user, IEntity item, ItemUseParameters animParams) + { + SCR_ChimeraCharacter targetChar = SCR_ChimeraCharacter.Cast(target); + if (!targetChar) + return; + + // Has only effect when vitals are stable + ACE_Medical_VitalsComponent vitalsComponent = ACE_Medical_VitalsComponent.Cast(targetChar.FindComponent(ACE_Medical_VitalsComponent)); + if (!vitalsComponent || vitalsComponent.GetVitalStateID() != ACE_Medical_EVitalStateID.STABLE) + return; + + SCR_CharacterDamageManagerComponent damageManager = SCR_CharacterDamageManagerComponent.Cast(targetChar.GetDamageManager()); + if (!damageManager) + return; + + float scale = damageManager.ACE_Medical_GetResilienceRegenScale(); + + ACE_Medical_Circulation_Settings settings = ACE_SettingsHelperT.GetModSettings();; + if (!settings) + return; + + // TO DO: Add time of last attempt as a factor to prevent spamming to become meta + if (Math.RandomFloat(0, 1) > Math.Map(scale, 0, settings.m_fMaxRevivalResilienceRecoveryScale, settings.m_fAmmoniumCarbonateSuccessChanceMin, settings.m_fAmmoniumCarbonateSuccessChanceMax)) + return; + + super.ApplyEffect(target, user, item, animParams); + + ACE_Medical_MedicationComponent medicationComponent = ACE_Medical_MedicationComponent.Cast(target.FindComponent(ACE_Medical_MedicationComponent)); + if (!medicationComponent) + return; + + InventoryItemComponent itemComponent = InventoryItemComponent.Cast(item.FindComponent(InventoryItemComponent)); + if (!itemComponent) + return; + + if (Replication.IsServer()) + medicationComponent.AddLogEntry(itemComponent.GetUIInfo().GetName(), GetGame().GetPlayerManager().GetPlayerIdFromControlledEntity(user)); + } + + //------------------------------------------------------------------------------------------------ + //! Set consumable type in ctor + void ACE_Medical_ConsumableAmmoniumCarbonate() + { + m_eConsumableType = SCR_EConsumableType.ACE_MEDICAL_AMMONIUM_CARBONATE; + } +} diff --git a/addons/medical_circulation/scripts/Game/ACE_Medical_Medication/Components/Gadgets/ACE_Medical_ConsumableMedication.c b/addons/medical_circulation/scripts/Game/ACE_Medical_Medication/Components/Gadgets/ACE_Medical_ConsumableMedication.c new file mode 100644 index 000000000..1f7810a81 --- /dev/null +++ b/addons/medical_circulation/scripts/Game/ACE_Medical_Medication/Components/Gadgets/ACE_Medical_ConsumableMedication.c @@ -0,0 +1,52 @@ +//------------------------------------------------------------------------------------------------ +[BaseContainerProps()] +class ACE_Medical_ConsumableMedication : SCR_ConsumableEffectHealthItems +{ + [Attribute(uiwidget: UIWidgets.SearchComboBox, desc: "Type of device thad delivers the drug", enums: ParamEnumArray.FromEnum(SCR_EConsumableType))] + protected SCR_EConsumableType m_eDeviceType; + + [Attribute(desc: "Configuration of the doses that gets administered")] + protected ref array m_Doses; + + //------------------------------------------------------------------------------------------------ + //! Can always be applied in advanced medical + override bool CanApplyEffect(notnull IEntity target, notnull IEntity user, out SCR_EConsumableFailReason failReason) + { + return true; + } + + //------------------------------------------------------------------------------------------------ + //! Can always be applied in advanced medical + override bool CanApplyEffectToHZ(notnull IEntity target, notnull IEntity user, ECharacterHitZoneGroup group, out SCR_EConsumableFailReason failReason = SCR_EConsumableFailReason.NONE) + { + return true; + } + + //------------------------------------------------------------------------------------------------ + override void ApplyEffect(notnull IEntity target, notnull IEntity user, IEntity item, ItemUseParameters animParams) + { + if (!Replication.IsServer()) + return; + + ACE_Medical_MedicationComponent medicationComponent = ACE_Medical_MedicationComponent.Cast(target.FindComponent(ACE_Medical_MedicationComponent)); + if (!medicationComponent) + return; + + foreach (ACE_Medical_Dose dose : m_Doses) + { + medicationComponent.AddMedication(dose); + } + + InventoryItemComponent itemComponent = InventoryItemComponent.Cast(item.FindComponent(InventoryItemComponent)); + if (!itemComponent) + return; + + medicationComponent.AddLogEntry(itemComponent.GetUIInfo().GetName(), GetGame().GetPlayerManager().GetPlayerIdFromControlledEntity(user)); + } + + //------------------------------------------------------------------------------------------------ + void ACE_Medical_ConsumableMedication() + { + m_eConsumableType = m_eDeviceType; + } +} diff --git a/addons/medical_circulation/scripts/Game/ACE_Medical_Medication/Components/Gadgets/Dose/ACE_Medical_Bolus.c b/addons/medical_circulation/scripts/Game/ACE_Medical_Medication/Components/Gadgets/Dose/ACE_Medical_Bolus.c new file mode 100644 index 000000000..33dff4178 --- /dev/null +++ b/addons/medical_circulation/scripts/Game/ACE_Medical_Medication/Components/Gadgets/Dose/ACE_Medical_Bolus.c @@ -0,0 +1,30 @@ +//------------------------------------------------------------------------------------------------ +//! Drug should follow the kinetics of a IV bolus +class ACE_Medical_Bolus : ACE_Medical_Dose +{ + // TO DO: Sample concentration from a gaussian distribution for randomization + [Attribute(desc: "Administered concentration [nM]")] + protected float m_fConcentrationNM; + + //------------------------------------------------------------------------------------------------ + override float ComputeConcentration(ACE_Medical_PharmacokineticsConfig config) + { + float time = GetElapsedTime(); + float concentration = config.m_fActivationRateConstant / (config.m_fActivationRateConstant - config.m_fDeactivationRateConstant); + concentration *= ACE_Math.Exp(-config.m_fDeactivationRateConstant * time) - ACE_Math.Exp(-config.m_fActivationRateConstant * time); + concentration *= GetAdministeredConcentration(); + + // 1 / k_a is the mean lifetime of the precursor state, so we do expiration checks after this + if (time > 1 / config.m_fActivationRateConstant) + m_bIsExpired = concentration < EXPIRED_DOSE_PERCENTAGE * GetAdministeredConcentration(); + + return concentration; + } + + //------------------------------------------------------------------------------------------------ + //! Administered concentration [nM] + float GetAdministeredConcentration() + { + return m_fConcentrationNM; + } +} diff --git a/addons/medical_circulation/scripts/Game/ACE_Medical_Medication/Components/Gadgets/Dose/ACE_Medical_Dose.c b/addons/medical_circulation/scripts/Game/ACE_Medical_Medication/Components/Gadgets/Dose/ACE_Medical_Dose.c new file mode 100644 index 000000000..b95d5cae2 --- /dev/null +++ b/addons/medical_circulation/scripts/Game/ACE_Medical_Medication/Components/Gadgets/Dose/ACE_Medical_Dose.c @@ -0,0 +1,44 @@ +//------------------------------------------------------------------------------------------------ +class ACE_Medical_Dose : ScriptAndConfig +{ + [Attribute(uiwidget: UIWidgets.SearchComboBox, desc: "Type of administered drug", enums: ParamEnumArray.FromEnum(ACE_Medical_EDrugType))] + protected ACE_Medical_EDrugType m_eDrugType; + + protected int m_iAdministrationTimeMS; + protected bool m_bIsExpired = false; + + protected static const float EXPIRED_DOSE_PERCENTAGE = 0.01; // Concentration at which dose is considered expired [percentage of initial] + + //------------------------------------------------------------------------------------------------ + //! Computes the current concentration of this dose based on the administration time and the + //! passed config for the pharamockinetics + float ComputeConcentration(ACE_Medical_PharmacokineticsConfig config); + + //------------------------------------------------------------------------------------------------ + //! Get the type of the drug administered by this dose + ACE_Medical_EDrugType GetDrugType() + { + return m_eDrugType; + } + + //------------------------------------------------------------------------------------------------ + //! Sets administration time to current time + void SetAdministrationTime() + { + m_iAdministrationTimeMS = System.GetTickCount(); + } + + //------------------------------------------------------------------------------------------------ + //! Time passed since dose was administered [s] + float GetElapsedTime() + { + return System.GetTickCount(m_iAdministrationTimeMS) / 1000; + } + + //------------------------------------------------------------------------------------------------ + //! Return true when the dose's concentration has dropped so low that it should be considered expired + bool IsExpired() + { + return m_bIsExpired; + } +} diff --git a/addons/medical_circulation/scripts/Game/ACE_Medical_Medication/Components/Gadgets/Dose/ACE_Medical_Infusion.c b/addons/medical_circulation/scripts/Game/ACE_Medical_Medication/Components/Gadgets/Dose/ACE_Medical_Infusion.c new file mode 100644 index 000000000..08982d1bb --- /dev/null +++ b/addons/medical_circulation/scripts/Game/ACE_Medical_Medication/Components/Gadgets/Dose/ACE_Medical_Infusion.c @@ -0,0 +1,52 @@ +//------------------------------------------------------------------------------------------------ +//! Drug should follow the kinetics of a IV infusion +class ACE_Medical_Infusion : ACE_Medical_Dose +{ + [Attribute(desc: "Infusion rate [nM/s]")] + protected float m_fInfusionRate; + + [Attribute(desc: "Duration of infusion [s]")] + protected float m_fInfusionDurationS; + + protected bool m_bIsStopped = false; + + //------------------------------------------------------------------------------------------------ + override float ComputeConcentration(ACE_Medical_PharmacokineticsConfig config) + { + float time = GetElapsedTime(); + if (time > m_fInfusionDurationS) + m_bIsStopped = true; + + float concentration = m_fInfusionRate / config.m_fDeactivationRateConstant; + + if (m_bIsStopped) + concentration *= ACE_Math.Exp(-config.m_fDeactivationRateConstant * time); + else + concentration *= 1 - ACE_Math.Exp(-config.m_fDeactivationRateConstant * time); + + if (time > m_fInfusionDurationS) + m_bIsExpired = concentration < EXPIRED_DOSE_PERCENTAGE * m_fInfusionRate / config.m_fDeactivationRateConstant; + + return concentration; + } + + //------------------------------------------------------------------------------------------------ + void Stop() + { + m_bIsStopped = true; + } + + //------------------------------------------------------------------------------------------------ + //! Infusion duraction in nM/s + float GetInfusionRate() + { + return m_fInfusionRate; + } + + //------------------------------------------------------------------------------------------------ + //! Infusion duraction in seconds + float GetInfusionDuration() + { + return m_fInfusionDurationS; + } +} diff --git a/addons/medical_circulation/scripts/Game/ACE_Medical_Medication/Components/Gadgets/SCR_ConsumableEffectBase.c b/addons/medical_circulation/scripts/Game/ACE_Medical_Medication/Components/Gadgets/SCR_ConsumableEffectBase.c new file mode 100644 index 000000000..13505ffcc --- /dev/null +++ b/addons/medical_circulation/scripts/Game/ACE_Medical_Medication/Components/Gadgets/SCR_ConsumableEffectBase.c @@ -0,0 +1,11 @@ +//------------------------------------------------------------------------------------------------ +//! Type of consumable gadget +//! TO DO: Remove old duplicates +modded enum SCR_EConsumableType +{ + ACE_MEDICAL_METOPROLOL_INJECTOR, + ACE_MEDICAL_AMMONIUM_CARBONATE, + ACE_MEDICAL_EPINEPHRINE_INJECTOR, + ACE_MEDICAL_NALOXONE_INJECTOR, + ACE_MEDICAL_PHENYLEPHRINE_INJECTOR +} diff --git a/addons/medical_circulation/scripts/Game/ACE_Medical_Medication/Diag/ArmaReforgerScripted.c b/addons/medical_circulation/scripts/Game/ACE_Medical_Medication/Diag/ArmaReforgerScripted.c new file mode 100644 index 000000000..d1f4ccd99 --- /dev/null +++ b/addons/medical_circulation/scripts/Game/ACE_Medical_Medication/Diag/ArmaReforgerScripted.c @@ -0,0 +1,21 @@ +#ifdef ENABLE_DIAG +//------------------------------------------------------------------------------------------------ +modded class ArmaReforgerScripted : ChimeraGame +{ + //------------------------------------------------------------------------------------------------ + override bool OnGameStart() + { + DiagMenu.RegisterBool(SCR_DebugMenuID.ACE_MEDICAL_DEBUGUI_MENU_MEDICATION_DEBUG, "", "Debug medication", "ACE Medical"); + return super.OnGameStart(); + } + + //------------------------------------------------------------------------------------------------ + override void OnUpdate(BaseWorld world, float timeslice) + { + super.OnUpdate(world, timeslice); + + if (DiagMenu.GetBool(SCR_DebugMenuID.ACE_MEDICAL_DEBUGUI_MENU_MEDICATION_DEBUG)) + ACE_Medical_MedicationSystem.GetInstance(world).OnDiag(timeslice); + } +} +#endif diff --git a/addons/medical_circulation/scripts/Game/ACE_Medical_Medication/Diag/SCR_DebugMenuID.c b/addons/medical_circulation/scripts/Game/ACE_Medical_Medication/Diag/SCR_DebugMenuID.c new file mode 100644 index 000000000..116336105 --- /dev/null +++ b/addons/medical_circulation/scripts/Game/ACE_Medical_Medication/Diag/SCR_DebugMenuID.c @@ -0,0 +1,5 @@ +//------------------------------------------------------------------------------------------------ +modded enum SCR_DebugMenuID +{ + ACE_MEDICAL_DEBUGUI_MENU_MEDICATION_DEBUG +} diff --git a/addons/medical_circulation/scripts/Game/ACE_Medical_Medication/Drugs/ACE_Medical_EDrugType.c b/addons/medical_circulation/scripts/Game/ACE_Medical_Medication/Drugs/ACE_Medical_EDrugType.c new file mode 100644 index 000000000..82b65b139 --- /dev/null +++ b/addons/medical_circulation/scripts/Game/ACE_Medical_Medication/Drugs/ACE_Medical_EDrugType.c @@ -0,0 +1,9 @@ +//------------------------------------------------------------------------------------------------ +enum ACE_Medical_EDrugType +{ + EPINEPHRINE, + METOPROLOL, + MORPHINE, + NALOXONE, + PHENYLEPHRINE +} diff --git a/addons/medical_circulation/scripts/Game/ACE_Medical_Medication/Drugs/ACE_Medical_PharmacodynamicsConfig.c b/addons/medical_circulation/scripts/Game/ACE_Medical_Medication/Drugs/ACE_Medical_PharmacodynamicsConfig.c new file mode 100644 index 000000000..622a5eeb8 --- /dev/null +++ b/addons/medical_circulation/scripts/Game/ACE_Medical_Medication/Drugs/ACE_Medical_PharmacodynamicsConfig.c @@ -0,0 +1,55 @@ +//------------------------------------------------------------------------------------------------ +[BaseContainerProps(), SCR_BaseContainerCustomTitleEnum(ACE_Medical_EDrugType, "m_eType")] +class ACE_Medical_PharmacodynamicsConfig +{ + [Attribute(uiwidget: UIWidgets.SearchComboBox, desc: "Type of the medication", enums: ParamEnumArray.FromEnum(ACE_Medical_EDrugType))] + ACE_Medical_EDrugType m_eType; + + [Attribute(desc: "Concentration at which the half maximum effect is reached [nM]")] + float m_fEC50; + + [Attribute(defvalue: "1", desc: "Hill coefficient", params: "0 inf")] + float m_fGamma; + + [Attribute(desc: "Configs for synergistic effects on this drug effect")] + ref array m_aSynergistConfigs; + + [Attribute(desc: "Configs for antagonistic effects on this drug effect")] + ref array m_aAntagonistConfigs; + + //------------------------------------------------------------------------------------------------ + float ComputeChi(map concentrations) + { + float concentration + if (!concentrations.Find(m_eType, concentration)) + return 0; + + float chi = concentration / m_fEC50; + + if (m_aSynergistConfigs) + { + float synergistChiSum = 1; + + foreach (ACE_Medical_PharmacodynamicsConfig synergistConfig : m_aSynergistConfigs) + { + synergistChiSum += synergistConfig.ComputeChi(concentrations); + } + + chi *= synergistChiSum; + } + + if (m_aAntagonistConfigs) + { + float anatagonistChiSum = 1; + + foreach (ACE_Medical_PharmacodynamicsConfig antagonistConfig : m_aAntagonistConfigs) + { + anatagonistChiSum += antagonistConfig.ComputeChi(concentrations); + } + + chi /= anatagonistChiSum; + } + + return Math.Pow(chi, m_fGamma); + } +} diff --git a/addons/medical_circulation/scripts/Game/ACE_Medical_Medication/Drugs/ACE_Medical_PharmacokineticsConfig.c b/addons/medical_circulation/scripts/Game/ACE_Medical_Medication/Drugs/ACE_Medical_PharmacokineticsConfig.c new file mode 100644 index 000000000..e3fdef8a8 --- /dev/null +++ b/addons/medical_circulation/scripts/Game/ACE_Medical_Medication/Drugs/ACE_Medical_PharmacokineticsConfig.c @@ -0,0 +1,13 @@ +//------------------------------------------------------------------------------------------------ +[BaseContainerProps(), SCR_BaseContainerCustomTitleEnum(ACE_Medical_EDrugType, "m_eType")] +class ACE_Medical_PharmacokineticsConfig +{ + [Attribute(uiwidget: UIWidgets.SearchComboBox, desc: "Type of the medication", enums: ParamEnumArray.FromEnum(ACE_Medical_EDrugType))] + ACE_Medical_EDrugType m_eType; + + [Attribute(desc: "Rate constant for the activation of the drug [1/s]", precision: 8, params: "0 inf")] + float m_fActivationRateConstant; + + [Attribute(desc: "Rate constant for the deactivation of the drug [1/s]", precision: 8, params: "0 inf")] + float m_fDeactivationRateConstant; +} diff --git a/addons/medical_circulation/scripts/Game/ACE_Medical_Medication/Drugs/DrugEffects/ACE_Medical_BloodFlowScaleDrugEffect.c b/addons/medical_circulation/scripts/Game/ACE_Medical_Medication/Drugs/DrugEffects/ACE_Medical_BloodFlowScaleDrugEffect.c new file mode 100644 index 000000000..a32ffe389 --- /dev/null +++ b/addons/medical_circulation/scripts/Game/ACE_Medical_Medication/Drugs/DrugEffects/ACE_Medical_BloodFlowScaleDrugEffect.c @@ -0,0 +1,23 @@ +//------------------------------------------------------------------------------------------------ +class ACE_Medical_BloodFlowScaleDrugEffect : ACE_Medical_HillDrugEffectConfig +{ + //------------------------------------------------------------------------------------------------ + override void ApplyEffect(ACE_Medical_CharacterContext targetContext, map concentrations) + { + targetContext.m_pDamageManager.ACE_Medical_SetBloodFlowScale(1 - ComputeEffect(concentrations)); + } + + //------------------------------------------------------------------------------------------------ + override void ClearEffect(ACE_Medical_CharacterContext targetContext) + { + targetContext.m_pDamageManager.ACE_Medical_SetBloodFlowScale(1); + } + +#ifdef ENABLE_DIAG + //------------------------------------------------------------------------------------------------ + override void OnDiag(ACE_Medical_CharacterContext targetContext, float timeSlice) + { + DbgUI.Text(string.Format("- Blood flow scale: %1", targetContext.m_pDamageManager.ACE_Medical_GetBloodFlowScale())); + } +#endif +} diff --git a/addons/medical_circulation/scripts/Game/ACE_Medical_Medication/Drugs/DrugEffects/ACE_Medical_DrugEffectConfig.c b/addons/medical_circulation/scripts/Game/ACE_Medical_Medication/Drugs/DrugEffects/ACE_Medical_DrugEffectConfig.c new file mode 100644 index 000000000..4f66f76c6 --- /dev/null +++ b/addons/medical_circulation/scripts/Game/ACE_Medical_Medication/Drugs/DrugEffects/ACE_Medical_DrugEffectConfig.c @@ -0,0 +1,21 @@ +//------------------------------------------------------------------------------------------------ +class ACE_Medical_DrugEffectConfig : ScriptAndConfig +{ + [Attribute(desc: "Pharmacodynamics config for all drugs with this effect")] + ref array m_aDrugConfigs; + + //------------------------------------------------------------------------------------------------ + void ApplyEffect(ACE_Medical_CharacterContext targetContext, map concentrations); + + //------------------------------------------------------------------------------------------------ + //! Remove effect from target + void ClearEffect(ACE_Medical_CharacterContext targetContext); + + //------------------------------------------------------------------------------------------------ + protected float ComputeEffect(map concentrations); + +#ifdef ENABLE_DIAG + //------------------------------------------------------------------------------------------------ + void OnDiag(ACE_Medical_CharacterContext targetContext, float timeSlice); +#endif +} diff --git a/addons/medical_circulation/scripts/Game/ACE_Medical_Medication/Drugs/DrugEffects/ACE_Medical_HeartRateEffect.c b/addons/medical_circulation/scripts/Game/ACE_Medical_Medication/Drugs/DrugEffects/ACE_Medical_HeartRateEffect.c new file mode 100644 index 000000000..79210d62e --- /dev/null +++ b/addons/medical_circulation/scripts/Game/ACE_Medical_Medication/Drugs/DrugEffects/ACE_Medical_HeartRateEffect.c @@ -0,0 +1,23 @@ +//------------------------------------------------------------------------------------------------ +class ACE_Medical_HeartRateEffect : ACE_Medical_LinearDrugEffectConfig +{ + //------------------------------------------------------------------------------------------------ + override void ApplyEffect(ACE_Medical_CharacterContext targetContext, map concentrations) + { + targetContext.m_pVitals.SetHeartRateMedicationAdjustment(ComputeEffect(concentrations)); + } + + //------------------------------------------------------------------------------------------------ + override void ClearEffect(ACE_Medical_CharacterContext targetContext) + { + targetContext.m_pVitals.SetHeartRateMedicationAdjustment(0); + } + +#ifdef ENABLE_DIAG + //------------------------------------------------------------------------------------------------ + override void OnDiag(ACE_Medical_CharacterContext targetContext, float timeSlice) + { + DbgUI.Text(string.Format("- HR: %1 bpm", targetContext.m_pVitals.GetHeartRateMedicationAdjustment())); + } +#endif +} diff --git a/addons/medical_circulation/scripts/Game/ACE_Medical_Medication/Drugs/DrugEffects/ACE_Medical_HillDrugEffectConfig.c b/addons/medical_circulation/scripts/Game/ACE_Medical_Medication/Drugs/DrugEffects/ACE_Medical_HillDrugEffectConfig.c new file mode 100644 index 000000000..3ccc7b520 --- /dev/null +++ b/addons/medical_circulation/scripts/Game/ACE_Medical_Medication/Drugs/DrugEffects/ACE_Medical_HillDrugEffectConfig.c @@ -0,0 +1,13 @@ +//------------------------------------------------------------------------------------------------ +class ACE_Medical_HillDrugEffectConfig : ACE_Medical_LinearDrugEffectConfig +{ + [Attribute(defvalue: "1", desc: "Maximum possible effect of this drug")] + protected float m_fMaxEffect; + + //------------------------------------------------------------------------------------------------ + //! Apply hill to sum of chi + override float ComputeEffect(map concentrations) + { + return m_fMaxEffect * ACE_Math.Hill(super.ComputeEffect(concentrations)); + } +} diff --git a/addons/medical_circulation/scripts/Game/ACE_Medical_Medication/Drugs/DrugEffects/ACE_Medical_LinearDrugEffectConfig.c b/addons/medical_circulation/scripts/Game/ACE_Medical_Medication/Drugs/DrugEffects/ACE_Medical_LinearDrugEffectConfig.c new file mode 100644 index 000000000..24cd846e4 --- /dev/null +++ b/addons/medical_circulation/scripts/Game/ACE_Medical_Medication/Drugs/DrugEffects/ACE_Medical_LinearDrugEffectConfig.c @@ -0,0 +1,17 @@ +//------------------------------------------------------------------------------------------------ +class ACE_Medical_LinearDrugEffectConfig : ACE_Medical_DrugEffectConfig +{ + //------------------------------------------------------------------------------------------------ + //! Sum of chi + override float ComputeEffect(map concentrations) + { + float chiSum = 0; + + foreach (ACE_Medical_PharmacodynamicsConfig config : m_aDrugConfigs) + { + chiSum += config.ComputeChi(concentrations); + } + + return chiSum; + } +} diff --git a/addons/medical_circulation/scripts/Game/ACE_Medical_Medication/Drugs/DrugEffects/ACE_Medical_PainSuppressionDrugEffect.c b/addons/medical_circulation/scripts/Game/ACE_Medical_Medication/Drugs/DrugEffects/ACE_Medical_PainSuppressionDrugEffect.c new file mode 100644 index 000000000..8d59149de --- /dev/null +++ b/addons/medical_circulation/scripts/Game/ACE_Medical_Medication/Drugs/DrugEffects/ACE_Medical_PainSuppressionDrugEffect.c @@ -0,0 +1,23 @@ +//------------------------------------------------------------------------------------------------ +class ACE_Medical_PainSuppressionDrugEffect : ACE_Medical_HillDrugEffectConfig +{ + //------------------------------------------------------------------------------------------------ + override void ApplyEffect(ACE_Medical_CharacterContext targetContext, map concentrations) + { + targetContext.m_pDamageManager.ACE_Medical_SetPainSuppression(ComputeEffect(concentrations)); + } + + //------------------------------------------------------------------------------------------------ + override void ClearEffect(ACE_Medical_CharacterContext targetContext) + { + targetContext.m_pDamageManager.ACE_Medical_SetPainSuppression(0); + } + +#ifdef ENABLE_DIAG + //------------------------------------------------------------------------------------------------ + override void OnDiag(ACE_Medical_CharacterContext targetContext, float timeSlice) + { + DbgUI.Text(string.Format("- Pain suppression: %1 %", targetContext.m_pDamageManager.ACE_Medical_GetPainSuppression())); + } +#endif +} diff --git a/addons/medical_circulation/scripts/Game/ACE_Medical_Medication/Drugs/DrugEffects/ACE_Medical_ReviveSuccessDrugEffect.c b/addons/medical_circulation/scripts/Game/ACE_Medical_Medication/Drugs/DrugEffects/ACE_Medical_ReviveSuccessDrugEffect.c new file mode 100644 index 000000000..2351ebaaf --- /dev/null +++ b/addons/medical_circulation/scripts/Game/ACE_Medical_Medication/Drugs/DrugEffects/ACE_Medical_ReviveSuccessDrugEffect.c @@ -0,0 +1,23 @@ +//------------------------------------------------------------------------------------------------ +class ACE_Medical_ReviveSuccessDrugEffect : ACE_Medical_HillDrugEffectConfig +{ + //------------------------------------------------------------------------------------------------ + override void ApplyEffect(ACE_Medical_CharacterContext targetContext, map concentrations) + { + targetContext.m_pVitals.SetReviveSuccessCheckTimerScale(ComputeEffect(concentrations) + 1); + } + + //------------------------------------------------------------------------------------------------ + override void ClearEffect(ACE_Medical_CharacterContext targetContext) + { + targetContext.m_pVitals.SetReviveSuccessCheckTimerScale(1); + } + +#ifdef ENABLE_DIAG + //------------------------------------------------------------------------------------------------ + override void OnDiag(ACE_Medical_CharacterContext targetContext, float timeSlice) + { + DbgUI.Text(string.Format("- Revive success scale: %1", targetContext.m_pVitals.GetReviveSuccessCheckTimerScale())); + } +#endif +} diff --git a/addons/medical_circulation/scripts/Game/ACE_Medical_Medication/Drugs/DrugEffects/ACE_Medical_SystemicVascularResistencDrugEffect.c b/addons/medical_circulation/scripts/Game/ACE_Medical_Medication/Drugs/DrugEffects/ACE_Medical_SystemicVascularResistencDrugEffect.c new file mode 100644 index 000000000..206f16c62 --- /dev/null +++ b/addons/medical_circulation/scripts/Game/ACE_Medical_Medication/Drugs/DrugEffects/ACE_Medical_SystemicVascularResistencDrugEffect.c @@ -0,0 +1,23 @@ +//------------------------------------------------------------------------------------------------ +class ACE_Medical_SystemicVascularResistencDrugEffect : ACE_Medical_LinearDrugEffectConfig +{ + //------------------------------------------------------------------------------------------------ + override void ApplyEffect(ACE_Medical_CharacterContext targetContext, map concentrations) + { + targetContext.m_pVitals.SetSystemicVascularResistenceMedicationAdjustment(ComputeEffect(concentrations)); + } + + //------------------------------------------------------------------------------------------------ + override void ClearEffect(ACE_Medical_CharacterContext targetContext) + { + targetContext.m_pVitals.SetSystemicVascularResistenceMedicationAdjustment(0); + } + +#ifdef ENABLE_DIAG + //------------------------------------------------------------------------------------------------ + override void OnDiag(ACE_Medical_CharacterContext targetContext, float timeSlice) + { + DbgUI.Text(string.Format("- SVR: %1", targetContext.m_pVitals.GetSystemicVascularResistenceMedicationAdjustment())); + } +#endif +} diff --git a/addons/medical_circulation/scripts/Game/ACE_Medical_Medication/Jobs/ACE_Medical_Medication_SimulationJob.c b/addons/medical_circulation/scripts/Game/ACE_Medical_Medication/Jobs/ACE_Medical_Medication_SimulationJob.c new file mode 100644 index 000000000..13b908316 --- /dev/null +++ b/addons/medical_circulation/scripts/Game/ACE_Medical_Medication/Jobs/ACE_Medical_Medication_SimulationJob.c @@ -0,0 +1,86 @@ +//------------------------------------------------------------------------------------------------ +//! TO DO: move context to ACE_IFrameJob +class ACE_Medical_Medication_SimulationJob : ACE_IContextFrameJob +{ + protected static ACE_Medical_Medication_Settings s_pSettings; + + //------------------------------------------------------------------------------------------------ + void ACE_Medical_Medication_SimulationJob() + { + if (!s_pSettings) + s_pSettings = ACE_SettingsHelperT.GetModSettings(); + } + + //------------------------------------------------------------------------------------------------ + override void OnUpdate(float timeSlice) + { + array drugs; + array> doses; + m_pContext.m_pMedication.GetMedications(drugs, doses); + map concentrations = ComputeConcentrations(drugs, doses); + ApplyEffects(concentrations); + + // Unregister once no drug is left to manage + if (drugs.IsEmpty()) + Stop(); + } + + //------------------------------------------------------------------------------------------------ + map ComputeConcentrations(inout array drugs, inout array> allDoses, bool deleteExpiredDoses = true) + { + map concentrations = new map(); + + for (int i = drugs.Count() - 1; i >= 0; i--) + { + ACE_Medical_EDrugType drug = drugs[i]; + array doses = allDoses[i]; + concentrations[drug] = ComputeConcentration(drug, doses, deleteExpiredDoses); + + // Remove drugs that have no doses left + if (deleteExpiredDoses && doses.IsEmpty()) + { + drugs.Remove(i); + allDoses.Remove(i); + } + } + + return concentrations; + } + + //------------------------------------------------------------------------------------------------ + float ComputeConcentration(ACE_Medical_EDrugType drug, inout array doses, bool deleteExpiredDoses = true) + { + ACE_Medical_PharmacokineticsConfig config = s_pSettings.GetPharmacokineticsConfig(drug); + float totalConcentration = 0; + + // TO DO: Handle IV infusions + for (int i = doses.Count() - 1; i >= 0; i--) + { + ACE_Medical_Dose dose = doses[i]; + float concentration = dose.ComputeConcentration(config); + + // Remove doses that have expired + if (deleteExpiredDoses && dose.IsExpired()) + doses.Remove(i); + else + totalConcentration += concentration; + } + + return totalConcentration; + } + + //------------------------------------------------------------------------------------------------ + void ApplyEffects(map concentrations) + { + foreach (ACE_Medical_DrugEffectConfig config : s_pSettings.m_aPharmacodynamicsConfigs) + { + config.ApplyEffect(m_pContext, concentrations); + } + } + + //------------------------------------------------------------------------------------------------ + override void CopyFrom(ACE_IFrameJob from) + { + super.CopyFrom(from); + } +} diff --git a/addons/medical_circulation/scripts/Game/ACE_Medical_Medication/Mission/ACE_MissionHeaderSettings.c b/addons/medical_circulation/scripts/Game/ACE_Medical_Medication/Mission/ACE_MissionHeaderSettings.c new file mode 100644 index 000000000..363dd8f76 --- /dev/null +++ b/addons/medical_circulation/scripts/Game/ACE_Medical_Medication/Mission/ACE_MissionHeaderSettings.c @@ -0,0 +1,18 @@ +//------------------------------------------------------------------------------------------------ +//! Add mod settings to mission header +[BaseContainerProps()] +modded class ACE_MissionHeaderSettings +{ + [Attribute()] + protected ref ACE_Medical_Medication_Settings m_ACE_Medical_Medication; + + //------------------------------------------------------------------------------------------------ + //! Applies settings from mission header to config + override void ApplyToSettingsConfig(notnull ACE_SettingsConfig config) + { + super.ApplyToSettingsConfig(config); + + if (m_ACE_Medical_Medication) + config.SetModSettings(m_ACE_Medical_Medication); + } +} diff --git a/addons/medical_circulation/scripts/Game/ACE_Medical_Medication/Settings/ACE_Medical_Medication_Settings.c b/addons/medical_circulation/scripts/Game/ACE_Medical_Medication/Settings/ACE_Medical_Medication_Settings.c new file mode 100644 index 000000000..270b15640 --- /dev/null +++ b/addons/medical_circulation/scripts/Game/ACE_Medical_Medication/Settings/ACE_Medical_Medication_Settings.c @@ -0,0 +1,22 @@ +//------------------------------------------------------------------------------------------------ +[BaseContainerProps()] +class ACE_Medical_Medication_Settings : ACE_ModSettings +{ + [Attribute(desc: "Configurations for all drugs")] + ref array m_aPharmacokineticsConfigs; + + [Attribute(desc: "Drug effect configs")] + ref array m_aPharmacodynamicsConfigs; + + //------------------------------------------------------------------------------------------------ + ACE_Medical_PharmacokineticsConfig GetPharmacokineticsConfig(ACE_Medical_EDrugType type) + { + foreach (ACE_Medical_PharmacokineticsConfig config : m_aPharmacokineticsConfigs) + { + if (config.m_eType == type) + return config; + } + + return null; + } +} diff --git a/addons/medical_circulation/scripts/Game/ACE_Medical_Medication/Systems/ACE_Medical_MedicationSystem.c b/addons/medical_circulation/scripts/Game/ACE_Medical_Medication/Systems/ACE_Medical_MedicationSystem.c new file mode 100644 index 000000000..598bed314 --- /dev/null +++ b/addons/medical_circulation/scripts/Game/ACE_Medical_Medication/Systems/ACE_Medical_MedicationSystem.c @@ -0,0 +1,93 @@ +//------------------------------------------------------------------------------------------------ +class ACE_Medical_MedicationSystem : GameSystem +{ + [Attribute()] + protected ref ACE_Medical_Medication_JobScheduler m_pScheduler; + + //------------------------------------------------------------------------------------------------ + static ACE_Medical_MedicationSystem GetInstance(ChimeraWorld world) + { + return ACE_Medical_MedicationSystem.Cast(world.FindSystem(ACE_Medical_MedicationSystem)); + } + + //------------------------------------------------------------------------------------------------ + override static void InitInfo(WorldSystemInfo outInfo) + { + super.InitInfo(outInfo); + outInfo.SetAbstract(false) + .SetUnique(true) + .SetLocation(WorldSystemLocation.Server) + .AddPoint(WorldSystemPoint.BeforeEntitiesCreated); + } + + //------------------------------------------------------------------------------------------------ + override protected void OnInit() + { + m_pScheduler.OnInit(CreateTemplateJob()); + + ACE_FrameJobSystem jobManager = ACE_FrameJobSystem.GetInstance(); + if (jobManager) + jobManager.Register(m_pScheduler, ESystemPoint.Frame); + } + + //------------------------------------------------------------------------------------------------ + protected ACE_Medical_Medication_SimulationJob CreateTemplateJob() + { + return new ACE_Medical_Medication_SimulationJob(); + } + + //------------------------------------------------------------------------------------------------ + void Register(notnull SCR_ChimeraCharacter char) + { + m_pScheduler.Register(char); + } + + //------------------------------------------------------------------------------------------------ + void Unregister(SCR_ChimeraCharacter char) + { + m_pScheduler.Unregister(char); + } + +#ifdef ENABLE_DIAG + //------------------------------------------------------------------------------------------------ + //! Show medication for target entity + override void OnDiag(float timeSlice) + { + super.OnDiag(timeSlice); + + IEntity target; + string targetType; + if (!ACE_DiagTools.GetDiagTargetCharacter(target, targetType)) + return; + + ACE_Medical_CharacterContext targetContext = new ACE_Medical_CharacterContext(SCR_ChimeraCharacter.Cast(target)); + ACE_Medical_Medication_SimulationJob job = CreateTemplateJob(); + job.SetContext(targetContext); + + DbgUI.Begin(string.Format("ACE_Medical_MedicationSystem (%1)", targetType), 700); + DbgUI.Text("Drugs:\n==============================="); + array drugs; + array> doses; + targetContext.m_pMedication.GetMedications(drugs, doses); + + foreach (ACE_Medical_EDrugType drug, float concentration : job.ComputeConcentrations(drugs, doses, deleteExpiredDoses: false)) + { + DbgUI.Text(string.Format("- %1: %2 nM", SCR_Enum.GetEnumName(ACE_Medical_EDrugType, drug), concentration)); + DbgUI.PlotLive(SCR_Enum.GetEnumName(ACE_Medical_EDrugType, drug), 500, 100, concentration, 100, 100000); + } + + ACE_Medical_Medication_Settings settings = ACE_SettingsHelperT.GetModSettings(); + if (!settings) + return; + + DbgUI.Text("\nEffects:\n==============================="); + + foreach (ACE_Medical_DrugEffectConfig effect : settings.m_aPharmacodynamicsConfigs) + { + effect.OnDiag(targetContext, timeSlice); + } + + DbgUI.End(); + } +#endif +} diff --git a/addons/medical_circulation/scripts/Game/ACE_Medical_Medication/UI/Inventory/ACE_Medical_EUIInfoType.c b/addons/medical_circulation/scripts/Game/ACE_Medical_Medication/UI/Inventory/ACE_Medical_EUIInfoType.c new file mode 100644 index 000000000..b6e5d93ad --- /dev/null +++ b/addons/medical_circulation/scripts/Game/ACE_Medical_Medication/UI/Inventory/ACE_Medical_EUIInfoType.c @@ -0,0 +1,6 @@ +//------------------------------------------------------------------------------------------------ +[EnumBitFlag()] +modded enum ACE_Medical_EUIInfoType +{ + MEDICATION +} diff --git a/addons/medical_circulation/scripts/Game/ACE_Medical_Medication/UI/Inventory/SCR_InventoryDamageInfoUI.c b/addons/medical_circulation/scripts/Game/ACE_Medical_Medication/UI/Inventory/SCR_InventoryDamageInfoUI.c new file mode 100644 index 000000000..ad284a30a --- /dev/null +++ b/addons/medical_circulation/scripts/Game/ACE_Medical_Medication/UI/Inventory/SCR_InventoryDamageInfoUI.c @@ -0,0 +1,17 @@ +//------------------------------------------------------------------------------------------------ +[EntityEditorProps(category: "GameScripted/UI/Inventory", description: "Inventory Item Info UI class")] +modded class SCR_InventoryDamageInfoUI : ScriptedWidgetComponent +{ + //------------------------------------------------------------------------------------------------ + void ACE_Medical_SetMedicationVisible(bool visible, string text) + { + if (!m_wMorphineIconWidget || !m_wMorphineTextWidget) + return; + + m_wMorphineIconWidget.LoadImageFromSet(0, m_sMedicalIconsImageSet, m_sMorphineIcon); + m_wMorphineIconWidget.SetVisible(visible); + + m_wMorphineTextWidget.SetText(text); + m_wMorphineTextWidget.SetVisible(visible); + } +} diff --git a/addons/medical_circulation/scripts/Game/ACE_Medical_Medication/UI/Inventory/SCR_InventoryHitZonePointUI.c b/addons/medical_circulation/scripts/Game/ACE_Medical_Medication/UI/Inventory/SCR_InventoryHitZonePointUI.c new file mode 100644 index 000000000..882af93b1 --- /dev/null +++ b/addons/medical_circulation/scripts/Game/ACE_Medical_Medication/UI/Inventory/SCR_InventoryHitZonePointUI.c @@ -0,0 +1,30 @@ +//------------------------------------------------------------------------------------------------ +modded class SCR_InventoryHitZonePointUI : ScriptedWidgetComponent +{ + //------------------------------------------------------------------------------------------------ + //! Add medication info to tooltip + override protected void ACE_Medical_ShowGlobalStatTooltip(Widget w, ACE_Medical_EUIInfoType type) + { + super.ACE_Medical_ShowGlobalStatTooltip(w, type); + + if (!m_DamageInfo) + return; + + if (type & ACE_Medical_EUIInfoType.MEDICATION) + m_DamageInfo.ACE_Medical_SetMedicationVisible(true, ACE_Medical_GetMedicationInfoText()); + } + + //------------------------------------------------------------------------------------------------ + string ACE_Medical_GetMedicationInfoText() + { + ChimeraCharacter char = ChimeraCharacter.Cast(GetGame().GetPlayerController().GetControlledEntity()); + if (!char) + return ""; + + ACE_Medical_MedicationComponent medicationComponent = ACE_Medical_MedicationComponent.Cast(char.FindComponent(ACE_Medical_MedicationComponent)); + if (!medicationComponent) + return ""; + + return medicationComponent.GetInfoText(); + } +} diff --git a/addons/medical_circulation/scripts/Game/ACE_Medical_Medication/UI/ScreenEffects/SCR_InspectCasualtyWidget.c b/addons/medical_circulation/scripts/Game/ACE_Medical_Medication/UI/ScreenEffects/SCR_InspectCasualtyWidget.c new file mode 100644 index 000000000..1e641bb73 --- /dev/null +++ b/addons/medical_circulation/scripts/Game/ACE_Medical_Medication/UI/ScreenEffects/SCR_InspectCasualtyWidget.c @@ -0,0 +1,35 @@ +//------------------------------------------------------------------------------------------------ +modded class SCR_InspectCasualtyWidget : SCR_InfoDisplayExtended +{ + // Maximum time in seconds for showing the window + protected const float ACE_MEDICAL_MAX_SHOW_DURATION_S = 10; + + //------------------------------------------------------------------------------------------------ + //! Gather and update data of target character into widget + override void UpdateWidgetData() + { + super.UpdateWidgetData(); + + if (!m_Target || !m_wCasualtyInspectWidget) + return; + + SCR_InventoryDamageInfoUI damageInfoUI = SCR_InventoryDamageInfoUI.Cast(m_wCasualtyInspectWidget.FindHandler(SCR_InventoryDamageInfoUI)); + if (!damageInfoUI) + return; + + ACE_Medical_MedicationComponent medicationComponent = ACE_Medical_MedicationComponent.Cast(m_Target.FindComponent(ACE_Medical_MedicationComponent)); + if (!medicationComponent) + return; + + string medicationText = medicationComponent.GetInfoText(); + damageInfoUI.ACE_Medical_SetMedicationVisible(!medicationText.IsEmpty(), medicationText); + } + + //------------------------------------------------------------------------------------------------ + //! Override window showing time + override void DisableWidget() + { + super.DisableWidget(); + m_fTimeTillClose = ACE_MEDICAL_MAX_SHOW_DURATION_S; + } +} diff --git a/addons/medical_circulation/scripts/Game/tmp/Jobs/ACE_Medical_Medication_JobScheduler.c b/addons/medical_circulation/scripts/Game/tmp/Jobs/ACE_Medical_Medication_JobScheduler.c new file mode 100644 index 000000000..a40f591dc --- /dev/null +++ b/addons/medical_circulation/scripts/Game/tmp/Jobs/ACE_Medical_Medication_JobScheduler.c @@ -0,0 +1,163 @@ +//------------------------------------------------------------------------------------------------ +//! Manual template initialized copy of +//! ACE_TemplateFrameJobScheduler +//! as workaround for: +//! - https://feedback.bistudio.com/T193122 +//! - https://feedback.bistudio.com/T193389 +[BaseContainerProps()] +class ACE_Medical_Medication_JobScheduler : ACE_IFrameJob +{ + [Attribute(defvalue: "1000", desc: "Approximate update timeout for a particular object [ms]")] + protected int m_fObjectUpdateTimeoutMS; + + [Attribute(defvalue: "10", desc: "Maximum number of entities to be updated per frame")] + protected int m_iMaxIterationsPerFrame; + + protected ref ACE_Medical_Medication_SimulationJob m_pTemplateJob; + protected ref array m_aJobs = {}; + protected ref array m_aInitialObjectsToRegister = {}; + protected ACE_FrameJobScheduler_EState m_eState = ACE_FrameJobScheduler_EState.UPDATE_QUEUE; + protected float m_fNextUpdateStartTime = 0; + protected int m_iCurrentJobIdx = 0; + protected int m_iNumMachines = 0; + + //------------------------------------------------------------------------------------------------ + //! Template is passed here rather than in ctor for usage of ACE_TemplateFrameJobScheduler in attributes + void OnInit(ACE_Medical_Medication_SimulationJob templateJob) + { + m_pTemplateJob = templateJob; + + foreach (SCR_ChimeraCharacter object : m_aInitialObjectsToRegister) + { + Register(object); + } + + m_aInitialObjectsToRegister.Clear(); + } + + //------------------------------------------------------------------------------------------------ + override void OnUpdate(float timeSlice) + { + super.OnUpdate(timeSlice); + float currentTime = GetGame().GetWorld().GetWorldTime(); + + switch (m_eState) + { + case ACE_FrameJobScheduler_EState.UPDATE_QUEUE: return UpdateQueueStep(currentTime); + case ACE_FrameJobScheduler_EState.UPDATE_OBJECTS: return UpdateObjectsStep(currentTime); + case ACE_FrameJobScheduler_EState.TIMEOUT: return TimeoutStep(currentTime); + } + } + + //------------------------------------------------------------------------------------------------ + protected void UpdateQueueStep(float currentTime) + { + m_iNumMachines = m_aJobs.Count(); + + for (int i = m_iNumMachines - 1; i >= 0; --i) + { + ACE_Medical_Medication_SimulationJob job = m_aJobs[i]; + if (job.ShouldBeStopped()) + UnregisterNow(i); + } + + m_iCurrentJobIdx = 0; + m_iNumMachines = m_aJobs.Count(); + + if (m_iNumMachines == 0) + return ToggleUpdate(false); + + m_fNextUpdateStartTime = currentTime + m_fObjectUpdateTimeoutMS; + ChangeState(ACE_FrameJobScheduler_EState.UPDATE_OBJECTS); + } + + //------------------------------------------------------------------------------------------------ + protected void UpdateObjectsStep(float currentTime) + { + for (int i = 0; i < m_iMaxIterationsPerFrame; ++i) + { + ACE_Medical_Medication_SimulationJob job = m_aJobs[m_iCurrentJobIdx]; + ACE_Medical_CharacterContext context = job.GetContext(); + + if (context.IsValid()) + job.OnUpdate((currentTime - context.m_fLastUpdateTime) / 1000); + else + job.Stop(); + + context.m_fLastUpdateTime = currentTime; + ++m_iCurrentJobIdx; + + if (m_iCurrentJobIdx >= m_iNumMachines) + return ChangeState(ACE_FrameJobScheduler_EState.TIMEOUT); + } + } + + //------------------------------------------------------------------------------------------------ + protected void TimeoutStep(float currentTime) + { + if (currentTime >= m_fNextUpdateStartTime) + ChangeState(ACE_FrameJobScheduler_EState.UPDATE_QUEUE); + } + + //------------------------------------------------------------------------------------------------ + protected void ChangeState(ACE_FrameJobScheduler_EState newState) + { + m_eState = newState; + } + + //------------------------------------------------------------------------------------------------ + void Register(SCR_ChimeraCharacter object) + { + if (!m_pTemplateJob) + { + m_aInitialObjectsToRegister.Insert(object); + return; + } + + ACE_Medical_CharacterContext context = new ACE_Medical_CharacterContext(object); + if (!context.IsValid()) + return; + + ACE_Medical_Medication_SimulationJob job = CreateJob(); + job.SetContext(context); + job.OnStart(); + m_aJobs.Insert(job); + + if (!ShouldBeUpdated()) + ToggleUpdate(true); + } + + //------------------------------------------------------------------------------------------------ + void Unregister(SCR_ChimeraCharacter object) + { + foreach (int i, ACE_Medical_Medication_SimulationJob job : m_aJobs) + { + if (job.GetContext().m_pObject == object) + { + // Delay unregistration, unless the queue isn't touched (e.g. during timeout) + if (m_eState == ACE_FrameJobScheduler_EState.TIMEOUT) + UnregisterNow(i); + else + job.Stop(); + + return; + } + } + } + + //------------------------------------------------------------------------------------------------ + protected void UnregisterNow(int machineIdx) + { + ACE_Medical_Medication_SimulationJob job = m_aJobs[machineIdx]; + m_aJobs.Remove(machineIdx); + job.OnStop(); + } + + //------------------------------------------------------------------------------------------------ + protected ACE_Medical_Medication_SimulationJob CreateJob() + { + ACE_Medical_Medication_SimulationJob instance = new ACE_Medical_Medication_SimulationJob(); + instance.CopyFrom(m_pTemplateJob); + return instance; + } +} diff --git a/addons/medical_circulation/scripts/Game/tmp/Jobs/ACE_Medical_VitalStates_JobScheduler.c b/addons/medical_circulation/scripts/Game/tmp/Jobs/ACE_Medical_VitalStates_JobScheduler.c new file mode 100644 index 000000000..676d67f8a --- /dev/null +++ b/addons/medical_circulation/scripts/Game/tmp/Jobs/ACE_Medical_VitalStates_JobScheduler.c @@ -0,0 +1,163 @@ +//------------------------------------------------------------------------------------------------ +//! Manual template initialized copy of +//! ACE_TemplateFrameJobScheduler +//! as workaround for: +//! - https://feedback.bistudio.com/T193122 +//! - https://feedback.bistudio.com/T193389 +[BaseContainerProps()] +class ACE_Medical_VitalStates_JobScheduler : ACE_IFrameJob +{ + [Attribute(defvalue: "1000", desc: "Approximate update timeout for a particular object [ms]")] + protected int m_fObjectUpdateTimeoutMS; + + [Attribute(defvalue: "10", desc: "Maximum number of entities to be updated per frame")] + protected int m_iMaxIterationsPerFrame; + + protected ref ACE_Medical_VitalStateMachine m_pTemplateJob; + protected ref array m_aJobs = {}; + protected ref array m_aInitialObjectsToRegister = {}; + protected ACE_FrameJobScheduler_EState m_eState = ACE_FrameJobScheduler_EState.UPDATE_QUEUE; + protected float m_fNextUpdateStartTime = 0; + protected int m_iCurrentJobIdx = 0; + protected int m_iNumMachines = 0; + + //------------------------------------------------------------------------------------------------ + //! Template is passed here rather than in ctor for usage of ACE_TemplateFrameJobScheduler in attributes + void OnInit(ACE_Medical_VitalStateMachine templateJob) + { + m_pTemplateJob = templateJob; + + foreach (SCR_ChimeraCharacter object : m_aInitialObjectsToRegister) + { + Register(object); + } + + m_aInitialObjectsToRegister.Clear(); + } + + //------------------------------------------------------------------------------------------------ + override void OnUpdate(float timeSlice) + { + super.OnUpdate(timeSlice); + float currentTime = GetGame().GetWorld().GetWorldTime(); + + switch (m_eState) + { + case ACE_FrameJobScheduler_EState.UPDATE_QUEUE: return UpdateQueueStep(currentTime); + case ACE_FrameJobScheduler_EState.UPDATE_OBJECTS: return UpdateObjectsStep(currentTime); + case ACE_FrameJobScheduler_EState.TIMEOUT: return TimeoutStep(currentTime); + } + } + + //------------------------------------------------------------------------------------------------ + protected void UpdateQueueStep(float currentTime) + { + m_iNumMachines = m_aJobs.Count(); + + for (int i = m_iNumMachines - 1; i >= 0; --i) + { + ACE_Medical_VitalStateMachine job = m_aJobs[i]; + if (job.ShouldBeStopped()) + UnregisterNow(i); + } + + m_iCurrentJobIdx = 0; + m_iNumMachines = m_aJobs.Count(); + + if (m_iNumMachines == 0) + return ToggleUpdate(false); + + m_fNextUpdateStartTime = currentTime + m_fObjectUpdateTimeoutMS; + ChangeState(ACE_FrameJobScheduler_EState.UPDATE_OBJECTS); + } + + //------------------------------------------------------------------------------------------------ + protected void UpdateObjectsStep(float currentTime) + { + for (int i = 0; i < m_iMaxIterationsPerFrame; ++i) + { + ACE_Medical_VitalStateMachine job = m_aJobs[m_iCurrentJobIdx]; + ACE_Medical_CharacterContext context = job.GetContext(); + + if (context.IsValid()) + job.OnUpdate((currentTime - context.m_fLastUpdateTime) / 1000); + else + job.Stop(); + + context.m_fLastUpdateTime = currentTime; + ++m_iCurrentJobIdx; + + if (m_iCurrentJobIdx >= m_iNumMachines) + return ChangeState(ACE_FrameJobScheduler_EState.TIMEOUT); + } + } + + //------------------------------------------------------------------------------------------------ + protected void TimeoutStep(float currentTime) + { + if (currentTime >= m_fNextUpdateStartTime) + ChangeState(ACE_FrameJobScheduler_EState.UPDATE_QUEUE); + } + + //------------------------------------------------------------------------------------------------ + protected void ChangeState(ACE_FrameJobScheduler_EState newState) + { + m_eState = newState; + } + + //------------------------------------------------------------------------------------------------ + void Register(SCR_ChimeraCharacter object) + { + if (!m_pTemplateJob) + { + m_aInitialObjectsToRegister.Insert(object); + return; + } + + ACE_Medical_CharacterContext context = new ACE_Medical_CharacterContext(object); + if (!context.IsValid()) + return; + + ACE_Medical_VitalStateMachine job = CreateJob(); + job.SetContext(context); + job.OnStart(); + m_aJobs.Insert(job); + + if (!ShouldBeUpdated()) + ToggleUpdate(true); + } + + //------------------------------------------------------------------------------------------------ + void Unregister(SCR_ChimeraCharacter object) + { + foreach (int i, ACE_Medical_VitalStateMachine job : m_aJobs) + { + if (job.GetContext().m_pObject == object) + { + // Delay unregistration, unless the queue isn't touched (e.g. during timeout) + if (m_eState == ACE_FrameJobScheduler_EState.TIMEOUT) + UnregisterNow(i); + else + job.Stop(); + + return; + } + } + } + + //------------------------------------------------------------------------------------------------ + protected void UnregisterNow(int machineIdx) + { + ACE_Medical_VitalStateMachine job = m_aJobs[machineIdx]; + m_aJobs.Remove(machineIdx); + job.OnStop(); + } + + //------------------------------------------------------------------------------------------------ + protected ACE_Medical_VitalStateMachine CreateJob() + { + ACE_Medical_VitalStateMachine instance = new ACE_Medical_VitalStateMachine(); + instance.CopyFrom(m_pTemplateJob); + return instance; + } +} diff --git a/addons/medical_circulation/thumbnail.png b/addons/medical_circulation/thumbnail.png new file mode 100644 index 000000000..3d4283142 Binary files /dev/null and b/addons/medical_circulation/thumbnail.png differ diff --git a/addons/medical_core/Configs/EntityCatalog/ACE_InventoryItems_EntityCatalog_Medical.conf b/addons/medical_core/Configs/EntityCatalog/ACE_InventoryItems_EntityCatalog_Medical.conf new file mode 100644 index 000000000..538bb80ab --- /dev/null +++ b/addons/medical_core/Configs/EntityCatalog/ACE_InventoryItems_EntityCatalog_Medical.conf @@ -0,0 +1,14 @@ +ACE_EntityCatalogMultiListEntry { + m_aEntities { + SCR_EntityCatalogInventoryItem "{5E110E1DDFEFF41F}" { + m_sEntityPrefab "{5B2FD067D70C1E8F}Prefabs/Items/Medicine/EpinephrineInjection/ACE_Medical_EpinephrineInjection.et" + m_aEntityDataList { + SCR_ArsenalItem "{5E110E1D8B6C3689}" { + m_eItemType HEAL + m_eItemMode CONSUMABLE + m_iSupplyCost 3 + } + } + } + } +} \ No newline at end of file diff --git a/addons/medical_core/Configs/EntityCatalog/ACE_InventoryItems_EntityCatalog_Medical.conf.meta b/addons/medical_core/Configs/EntityCatalog/ACE_InventoryItems_EntityCatalog_Medical.conf.meta new file mode 100644 index 000000000..a7d63222d --- /dev/null +++ b/addons/medical_core/Configs/EntityCatalog/ACE_InventoryItems_EntityCatalog_Medical.conf.meta @@ -0,0 +1,17 @@ +MetaFileClass { + Name "{A5E3827C546B8210}Configs/EntityCatalog/ACE_InventoryItems_EntityCatalog_Medical.conf" + Configurations { + CONFResourceClass PC { + } + CONFResourceClass XBOX_ONE : PC { + } + CONFResourceClass XBOX_SERIES : PC { + } + CONFResourceClass PS4 : PC { + } + CONFResourceClass PS5 : PC { + } + CONFResourceClass HEADLESS : PC { + } + } +} \ No newline at end of file diff --git a/addons/medical_core/Configs/EntityCatalog/FIA/InventoryItems_EntityCatalog_FIA.conf b/addons/medical_core/Configs/EntityCatalog/FIA/InventoryItems_EntityCatalog_FIA.conf deleted file mode 100644 index 0e417e519..000000000 --- a/addons/medical_core/Configs/EntityCatalog/FIA/InventoryItems_EntityCatalog_FIA.conf +++ /dev/null @@ -1,18 +0,0 @@ -SCR_EntityCatalogMultiList { - m_aMultiLists { - SCR_EntityCatalogMultiListEntry "{5C630E453BCB39DC}" { - m_aEntities { - SCR_EntityCatalogInventoryItem "{5E110E1E69A89740}" { - m_sEntityPrefab "{5B2FD067D70C1E8F}Prefabs/Items/Medicine/EpinephrineInjection/ACE_Medical_EpinephrineInjection.et" - m_aEntityDataList { - SCR_ArsenalItem "{5E110E1D8B6C3689}" { - m_eItemType HEAL - m_eItemMode CONSUMABLE - m_iSupplyCost 3 - } - } - } - } - } - } -} \ No newline at end of file diff --git a/addons/medical_core/Configs/EntityCatalog/US/InventoryItems_EntityCatalog_US.conf b/addons/medical_core/Configs/EntityCatalog/US/InventoryItems_EntityCatalog_US.conf deleted file mode 100644 index 47ab0fd2a..000000000 --- a/addons/medical_core/Configs/EntityCatalog/US/InventoryItems_EntityCatalog_US.conf +++ /dev/null @@ -1,18 +0,0 @@ -SCR_EntityCatalogMultiList { - m_aMultiLists { - SCR_EntityCatalogMultiListEntry "{5C68AD59F0753ABE}" { - m_aEntities { - SCR_EntityCatalogInventoryItem "{5E110E1DC68C3537}" { - m_sEntityPrefab "{5B2FD067D70C1E8F}Prefabs/Items/Medicine/EpinephrineInjection/ACE_Medical_EpinephrineInjection.et" - m_aEntityDataList { - SCR_ArsenalItem "{5E110E1D8B6C3689}" { - m_eItemType HEAL - m_eItemMode CONSUMABLE - m_iSupplyCost 3 - } - } - } - } - } - } -} \ No newline at end of file diff --git a/addons/medical_core/Configs/EntityCatalog/USSR/InventoryItems_EntityCatalog_USSR.conf b/addons/medical_core/Configs/EntityCatalog/USSR/InventoryItems_EntityCatalog_USSR.conf deleted file mode 100644 index 6d5868fcc..000000000 --- a/addons/medical_core/Configs/EntityCatalog/USSR/InventoryItems_EntityCatalog_USSR.conf +++ /dev/null @@ -1,18 +0,0 @@ -SCR_EntityCatalogMultiList { - m_aMultiLists { - SCR_EntityCatalogMultiListEntry "{5C68AD5F7414CA4A}" { - m_aEntities { - SCR_EntityCatalogInventoryItem "{5E110E1DDFEFF41F}" { - m_sEntityPrefab "{5B2FD067D70C1E8F}Prefabs/Items/Medicine/EpinephrineInjection/ACE_Medical_EpinephrineInjection.et" - m_aEntityDataList { - SCR_ArsenalItem "{5E110E1D8B6C3689}" { - m_eItemType HEAL - m_eItemMode CONSUMABLE - m_iSupplyCost 3 - } - } - } - } - } - } -} \ No newline at end of file diff --git a/addons/medical_core/Configs/EntityCatalog/USSR/InventoryItems_EntityCatalog_USSR.conf.meta b/addons/medical_core/Configs/EntityCatalog/USSR/InventoryItems_EntityCatalog_USSR.conf.meta deleted file mode 100644 index ec038fee9..000000000 --- a/addons/medical_core/Configs/EntityCatalog/USSR/InventoryItems_EntityCatalog_USSR.conf.meta +++ /dev/null @@ -1,17 +0,0 @@ -MetaFileClass { - Name "{C53421647C3D0D2E}Configs/EntityCatalog/USSR/InventoryItems_EntityCatalog_USSR.conf" - Configurations { - CONFResourceClass PC { - } - CONFResourceClass XBOX_ONE : PC { - } - CONFResourceClass XBOX_SERIES : PC { - } - CONFResourceClass PS4 : PC { - } - CONFResourceClass HEADLESS : PC { - } - CONFResourceClass PS5 : PC { - } - } -} \ No newline at end of file diff --git a/addons/medical_core/Language/ACE_Medical_Core_localization.ru_ru.conf b/addons/medical_core/Language/ACE_Medical_Core_localization.ru_ru.conf index 3f9a152db..1f3b6d3e3 100644 --- a/addons/medical_core/Language/ACE_Medical_Core_localization.ru_ru.conf +++ b/addons/medical_core/Language/ACE_Medical_Core_localization.ru_ru.conf @@ -23,7 +23,7 @@ StringTableRuntime { } Texts { "Medical" - "Resilience" + "Устойчивость" "Вколоть адреналин" "Не чувствует боли" "В сознании" @@ -33,14 +33,14 @@ StringTableRuntime { "Назначают пациентам без сознания." "Инъекция адреналина" "Назначают пациентам с сильной болью." - "Open medical radial menu" - "Examine patient" - "Fluid Replacement" - "Fracture management" - "Hemorrhage control" - "Medication" - "Put on back" - "Put in left recovery position" - "Put in right recovery position" + "Открыть меню медицины" + "Осмотреть пациента" + "Восполнение объёма крови" + "Лечение перелома" + "Контроль кровоизлияния" + "Медикаменты" + "Положить на спину" + "Положить на левый бок" + "Положить на правый бок" } } \ No newline at end of file diff --git a/addons/medical_core/Language/ACE_Medical_Core_localization.st b/addons/medical_core/Language/ACE_Medical_Core_localization.st index 727704f8e..99df30aa5 100644 --- a/addons/medical_core/Language/ACE_Medical_Core_localization.st +++ b/addons/medical_core/Language/ACE_Medical_Core_localization.st @@ -19,6 +19,7 @@ StringTable { Target_en_us "Resilience" Target_it_it "Resilienza" Target_de_de "Resilienz" + Target_ru_ru "Устойчивость" Target_es_es "Resiliencia" Target_ko_kr "회복력" Target_pt_br "Resiliência" @@ -197,6 +198,7 @@ StringTable { Target_fr_fr "Ouvrir le menu radial médical" Target_it_it "Apri menu medico radiale" Target_de_de "Öffne medizinisches Kreismenü" + Target_ru_ru "Открыть меню медицины" Target_es_es "Abrir menú radial médico" Target_ko_kr "원형 의료 메뉴 열기" Target_pt_br "Abrir menu médico radial" @@ -212,6 +214,7 @@ StringTable { Target_fr_fr "Examiner le patient" Target_it_it "Valuta il paziente" Target_de_de "Patient untersuchen" + Target_ru_ru "Осмотреть пациента" Target_es_es "Examinar paciente" Target_ko_kr "환자 검사" Target_pt_br "Examinar paciente" @@ -227,6 +230,7 @@ StringTable { Target_fr_fr "Remplacement du fluide" Target_it_it "Ripristino dei fluidi" Target_de_de "Volumentherapie" + Target_ru_ru "Восполнение объёма крови" Target_es_es "Reemplazar fluidos" Target_ko_kr "체액 복구" Target_pt_br "Substituir fluidos" @@ -242,6 +246,7 @@ StringTable { Target_fr_fr "Gestion des fractures" Target_it_it "Gestione delle fratture" Target_de_de "Frakturbehandlung" + Target_ru_ru "Лечение перелома" Target_es_es "Tratamiento de fracturas" Target_ko_kr "골절 관리" Target_pt_br "Tratamento de fraturas" @@ -257,6 +262,7 @@ StringTable { Target_fr_fr "Contrôle des hémorragies" Target_it_it "Controllo delle emorragie" Target_de_de "Blutstillung" + Target_ru_ru "Контроль кровоизлияния" Target_es_es "Control de hemorragia" Target_ko_kr "지혈" Target_pt_br "Controlo da hemorragia" @@ -272,6 +278,7 @@ StringTable { Target_fr_fr "Médication" Target_it_it "Farmaci" Target_de_de "Medikation" + Target_ru_ru "Медикаменты" Target_es_es "Medicación" Target_ko_kr "약물" Target_pt_br "Medicação" @@ -287,6 +294,7 @@ StringTable { Target_fr_fr "Mettre sur le dos" Target_it_it "Posiziona supino" Target_de_de "Auf den Rücken drehen" + Target_ru_ru "Положить на спину" Target_es_es "Poner de espaldas" Target_ko_kr "똑바로 눕히기" Target_pt_br "Virar de costas" @@ -302,6 +310,7 @@ StringTable { Target_fr_fr "Mettre en position de récupération gauche" Target_it_it "Posiziona in decubito laterale sinistro" Target_de_de "In linke Bewusstlosenlagerung bringen" + Target_ru_ru "Положить на левый бок" Target_es_es "Poner en posición de recuperación izquierda" Target_ko_kr "좌측으로 회복자세 교정하기" Target_pt_br "Por em posição de recuperação esquerda" @@ -317,6 +326,7 @@ StringTable { Target_fr_fr "Mettre en position de récupération droite" Target_it_it "Posiziona in decubito laterale destro" Target_de_de "In rechte Bewusstlosenlagerung bringen" + Target_ru_ru "Положить на правый бок" Target_es_es "Poner en posición de recuperación derecha" Target_ko_kr "우측으로 회복자세 교정하기" Target_pt_br "Por em posição de recuperação direita" diff --git a/addons/medical_core/scripts/Game/@ACE_Medical_Core/UI/Inventory/ACE_Medical_EUIInfoType.c b/addons/medical_core/scripts/Game/@ACE_Medical_Core/UI/Inventory/ACE_Medical_EUIInfoType.c new file mode 100644 index 000000000..974b409eb --- /dev/null +++ b/addons/medical_core/scripts/Game/@ACE_Medical_Core/UI/Inventory/ACE_Medical_EUIInfoType.c @@ -0,0 +1,5 @@ +//------------------------------------------------------------------------------------------------ +[EnumBitFlag()] +enum ACE_Medical_EUIInfoType +{ +} diff --git a/addons/medical_core/scripts/Game/@ACE_Medical_Core/UI/Inventory/SCR_InventoryHitZonePointUI.c b/addons/medical_core/scripts/Game/@ACE_Medical_Core/UI/Inventory/SCR_InventoryHitZonePointUI.c new file mode 100644 index 000000000..5f1d52cef --- /dev/null +++ b/addons/medical_core/scripts/Game/@ACE_Medical_Core/UI/Inventory/SCR_InventoryHitZonePointUI.c @@ -0,0 +1,63 @@ +//------------------------------------------------------------------------------------------------ +//! Add more extensible implementation of ShowVirtualHZInfo for tooltips of new global stats +modded class SCR_InventoryHitZonePointUI : ScriptedWidgetComponent +{ + [Attribute(desc: "Medical info type for tooltip", uiwidget: UIWidgets.Flags, enumType: ACE_Medical_EUIInfoType)] + protected ACE_Medical_EUIInfoType m_eACE_Medical_TooltipInfoType; + + //------------------------------------------------------------------------------------------------ + //! Create tooltip + //! Override this to add specific info to m_DamageInfo associated with type + protected void ACE_Medical_ShowGlobalStatTooltip(Widget w, ACE_Medical_EUIInfoType type) + { + Widget localInfoWidget; + if (!m_DamageInfo) + { + SCR_InventoryMenuUI inventoryMenuUI = GetInventoryMenuUI(); + if (!inventoryMenuUI) + return; + + localInfoWidget = GetGame().GetWorkspace().CreateWidgets(DAMAGE_INFO, inventoryMenuUI.GetRootWidget()); + if (!localInfoWidget) + return; + + localInfoWidget.SetVisible(true); + localInfoWidget.SetOpacity(0); + + localInfoWidget.AddHandler(new SCR_InventoryDamageInfoUI()); + m_DamageInfo = SCR_InventoryDamageInfoUI.Cast(localInfoWidget.FindHandler(SCR_InventoryDamageInfoUI)); + } + + if (!m_DamageInfo) + return; + + m_DamageInfo.SetName(""); + + //callLater is here because the widget needs to be created before size can be determined and location can be set + GetGame().GetCallqueue().CallLater(EnableVirtualHZInfoWidget, 300, false, localInfoWidget, w); + } + + //------------------------------------------------------------------------------------------------ + //! Show tooltip + override bool OnMouseEnter(Widget w, int x, int y) + { + super.OnMouseEnter(w, x, y); + + if (m_eACE_Medical_TooltipInfoType > 0) + ACE_Medical_ShowGlobalStatTooltip(w, m_eACE_Medical_TooltipInfoType); + + return false; + } + + //------------------------------------------------------------------------------------------------ + //! Hide tooltip + override bool OnMouseLeave(Widget w, Widget enterW, int x, int y) + { + super.OnMouseLeave(w, enterW, x, y); + + if (m_eACE_Medical_TooltipInfoType > 0) + HideVirtualHZInfo(); + + return false; + } +} diff --git a/addons/medical_core/scripts/Game/ACE_Medical_Reposition/UserActions/ACE_Medical_RepositionUserAction.c b/addons/medical_core/scripts/Game/ACE_Medical_Reposition/UserActions/ACE_Medical_RepositionUserAction.c index 4bb51a09a..f18292b7d 100644 --- a/addons/medical_core/scripts/Game/ACE_Medical_Reposition/UserActions/ACE_Medical_RepositionUserAction.c +++ b/addons/medical_core/scripts/Game/ACE_Medical_Reposition/UserActions/ACE_Medical_RepositionUserAction.c @@ -36,15 +36,15 @@ class ACE_Medical_RepositionUserAction : ScriptedUserAction if (!ownerController) return false; - if (!ownerController.IsUnconscious() || ownerController.ACE_Medical_GetUnconsciousPose() == m_eUnconsciousPose) + if (ownerController.GetLifeState() != ECharacterLifeState.INCAPACITATED || ownerController.ACE_Medical_GetUnconsciousPose() == m_eUnconsciousPose) return false; CharacterAnimationComponent ownerAnimComponent = ownerChar.GetAnimationComponent(); if (!ownerAnimComponent) return false; - if (!ownerAnimComponent || ownerAnimComponent.IsRagdollActive()) - return false; + if (ownerAnimComponent.IsRagdollActive()) + return false; return true; } @@ -60,6 +60,22 @@ class ACE_Medical_RepositionUserAction : ScriptedUserAction if (!ownerController) return; + // ensure target is still incapacitated + if (ownerController.GetLifeState() != ECharacterLifeState.INCAPACITATED) + return; + + // ensure current pose is not the target one + if (ownerController.ACE_Medical_GetUnconsciousPose() == m_eUnconsciousPose) + return; + + // mirror vehicle/animation safety server-side + if (ownerChar.IsInVehicle()) + return; + + CharacterAnimationComponent ownerAnimComponent = ownerChar.GetAnimationComponent(); + if (!ownerAnimComponent || ownerAnimComponent.IsRagdollActive()) + return; + ownerController.ACE_Medical_Reposition(m_eUnconsciousPose); } diff --git a/addons/tactical_ladder/Configs/EntityCatalog/ACE_InventoryItems_EntityCatalog_Equipment.conf b/addons/tactical_ladder/Configs/EntityCatalog/ACE_InventoryItems_EntityCatalog_Equipment.conf new file mode 100644 index 000000000..f3b8d6f39 --- /dev/null +++ b/addons/tactical_ladder/Configs/EntityCatalog/ACE_InventoryItems_EntityCatalog_Equipment.conf @@ -0,0 +1,13 @@ +ACE_EntityCatalogMultiListEntry { + m_aEntities { + SCR_EntityCatalogInventoryItem "{62F93B32BC86C49C}" { + m_sEntityPrefab "{62F304402A707F68}Prefabs/Items/Equipment/TacticalLadder/ACE_TacticalLadder.et" + m_aEntityDataList { + SCR_ArsenalItem "{62F30440549B386D}" { + m_eItemType EQUIPMENT + m_iSupplyCost 30 + } + } + } + } +} \ No newline at end of file diff --git a/addons/tactical_ladder/Configs/EntityCatalog/ACE_InventoryItems_EntityCatalog_Equipment.conf.meta b/addons/tactical_ladder/Configs/EntityCatalog/ACE_InventoryItems_EntityCatalog_Equipment.conf.meta new file mode 100644 index 000000000..28b784c60 --- /dev/null +++ b/addons/tactical_ladder/Configs/EntityCatalog/ACE_InventoryItems_EntityCatalog_Equipment.conf.meta @@ -0,0 +1,17 @@ +MetaFileClass { + Name "{0AFC873567388CDE}Configs/EntityCatalog/ACE_InventoryItemsBase.conf" + Configurations { + CONFResourceClass PC { + } + CONFResourceClass XBOX_ONE : PC { + } + CONFResourceClass XBOX_SERIES : PC { + } + CONFResourceClass PS4 : PC { + } + CONFResourceClass PS5 : PC { + } + CONFResourceClass HEADLESS : PC { + } + } +} \ No newline at end of file diff --git a/addons/tactical_ladder/Configs/EntityCatalog/FIA/FIA_InventoryItems.conf b/addons/tactical_ladder/Configs/EntityCatalog/FIA/FIA_InventoryItems.conf deleted file mode 100644 index e780f238a..000000000 --- a/addons/tactical_ladder/Configs/EntityCatalog/FIA/FIA_InventoryItems.conf +++ /dev/null @@ -1,17 +0,0 @@ -SCR_EntityCatalogMultiList { - m_aMultiLists { - SCR_EntityCatalogMultiListEntry "{5C630E453BCB39DC}" { - m_aEntities { - SCR_EntityCatalogInventoryItem "{62F93B316FA2BAD0}" { - m_sEntityPrefab "{62F304402A707F68}Prefabs/Items/Equipment/TacticalLadder/ACE_TacticalLadder.et" - m_aEntityDataList { - SCR_ArsenalItem "{62F30440549B386D}" { - m_eItemType EQUIPMENT - m_iSupplyCost 30 - } - } - } - } - } - } -} \ No newline at end of file diff --git a/addons/tactical_ladder/Configs/EntityCatalog/US/InventoryItems_EntityCatalog_US.conf b/addons/tactical_ladder/Configs/EntityCatalog/US/InventoryItems_EntityCatalog_US.conf deleted file mode 100644 index c1ba01f3d..000000000 --- a/addons/tactical_ladder/Configs/EntityCatalog/US/InventoryItems_EntityCatalog_US.conf +++ /dev/null @@ -1,17 +0,0 @@ -SCR_EntityCatalogMultiList { - m_aMultiLists { - SCR_EntityCatalogMultiListEntry "{5C68AD59F0753ABE}" { - m_aEntities { - SCR_EntityCatalogInventoryItem "{62F304402A707F68}" { - m_sEntityPrefab "{62F304402A707F68}Prefabs/Items/Equipment/TacticalLadder/ACE_TacticalLadder.et" - m_aEntityDataList { - SCR_ArsenalItem "{62F30440549B386D}" { - m_eItemType EQUIPMENT - m_iSupplyCost 30 - } - } - } - } - } - } -} \ No newline at end of file diff --git a/addons/tactical_ladder/Configs/EntityCatalog/US/InventoryItems_EntityCatalog_US.conf.meta b/addons/tactical_ladder/Configs/EntityCatalog/US/InventoryItems_EntityCatalog_US.conf.meta deleted file mode 100644 index 185e41b20..000000000 --- a/addons/tactical_ladder/Configs/EntityCatalog/US/InventoryItems_EntityCatalog_US.conf.meta +++ /dev/null @@ -1,17 +0,0 @@ -MetaFileClass { - Name "{5F7EC52FC40A03E2}Configs/EntityCatalog/US/InventoryItems_EntityCatalog_US.conf" - Configurations { - CONFResourceClass PC { - } - CONFResourceClass XBOX_ONE : PC { - } - CONFResourceClass XBOX_SERIES : PC { - } - CONFResourceClass PS4 : PC { - } - CONFResourceClass PS5 : PC { - } - CONFResourceClass HEADLESS : PC { - } - } -} \ No newline at end of file diff --git a/addons/tactical_ladder/Configs/EntityCatalog/USSR/USSR_InventoryItems.conf b/addons/tactical_ladder/Configs/EntityCatalog/USSR/USSR_InventoryItems.conf deleted file mode 100644 index 01388cc24..000000000 --- a/addons/tactical_ladder/Configs/EntityCatalog/USSR/USSR_InventoryItems.conf +++ /dev/null @@ -1,17 +0,0 @@ -SCR_EntityCatalogMultiList { - m_aMultiLists { - SCR_EntityCatalogMultiListEntry "{5C68AD5F7414CA4A}" { - m_aEntities { - SCR_EntityCatalogInventoryItem "{62F93B32BC86C49C}" { - m_sEntityPrefab "{62F304402A707F68}Prefabs/Items/Equipment/TacticalLadder/ACE_TacticalLadder.et" - m_aEntityDataList { - SCR_ArsenalItem "{62F30440549B386D}" { - m_eItemType EQUIPMENT - m_iSupplyCost 30 - } - } - } - } - } - } -} \ No newline at end of file diff --git a/addons/tactical_periscope/Configs/EntityCatalog/ACE_InventoryItems_EntityCatalog_Equipment.conf b/addons/tactical_periscope/Configs/EntityCatalog/ACE_InventoryItems_EntityCatalog_Equipment.conf new file mode 100644 index 000000000..61b093fcd --- /dev/null +++ b/addons/tactical_periscope/Configs/EntityCatalog/ACE_InventoryItems_EntityCatalog_Equipment.conf @@ -0,0 +1,13 @@ +ACE_EntityCatalogMultiListEntry { + m_aEntities { + SCR_EntityCatalogInventoryItem "{64A4F8C560780ED7}" { + m_sEntityPrefab "{452112928EC197AD}Prefabs/Items/Equipment/Periscope/ACE_TacticalPeriscope.et" + m_aEntityDataList { + SCR_ArsenalItem "{64A4F8C50A157DCF}" { + m_eItemType EQUIPMENT + m_iSupplyCost 15 + } + } + } + } +} \ No newline at end of file diff --git a/addons/tactical_periscope/Configs/EntityCatalog/ACE_InventoryItems_EntityCatalog_Equipment.conf.meta b/addons/tactical_periscope/Configs/EntityCatalog/ACE_InventoryItems_EntityCatalog_Equipment.conf.meta new file mode 100644 index 000000000..28b784c60 --- /dev/null +++ b/addons/tactical_periscope/Configs/EntityCatalog/ACE_InventoryItems_EntityCatalog_Equipment.conf.meta @@ -0,0 +1,17 @@ +MetaFileClass { + Name "{0AFC873567388CDE}Configs/EntityCatalog/ACE_InventoryItemsBase.conf" + Configurations { + CONFResourceClass PC { + } + CONFResourceClass XBOX_ONE : PC { + } + CONFResourceClass XBOX_SERIES : PC { + } + CONFResourceClass PS4 : PC { + } + CONFResourceClass PS5 : PC { + } + CONFResourceClass HEADLESS : PC { + } + } +} \ No newline at end of file diff --git a/addons/tactical_periscope/Configs/EntityCatalog/FIA/FIA_InventoryItems.conf b/addons/tactical_periscope/Configs/EntityCatalog/FIA/FIA_InventoryItems.conf deleted file mode 100644 index 11dab6311..000000000 --- a/addons/tactical_periscope/Configs/EntityCatalog/FIA/FIA_InventoryItems.conf +++ /dev/null @@ -1,17 +0,0 @@ -SCR_EntityCatalogMultiList { - m_aMultiLists { - SCR_EntityCatalogMultiListEntry "{5C630E453BCB39DC}" { - m_aEntities { - SCR_EntityCatalogInventoryItem "{64A4F8C577C079CA}" { - m_sEntityPrefab "{452112928EC197AD}Prefabs/Items/Equipment/Periscope/ACE_TacticalPeriscope.et" - m_aEntityDataList { - SCR_ArsenalItem "{64A4F8C50A157DCF}" { - m_eItemType EQUIPMENT - m_iSupplyCost 15 - } - } - } - } - } - } -} \ No newline at end of file diff --git a/addons/tactical_periscope/Configs/EntityCatalog/US/InventoryItems_EntityCatalog_US.conf b/addons/tactical_periscope/Configs/EntityCatalog/US/InventoryItems_EntityCatalog_US.conf deleted file mode 100644 index 01523e1f4..000000000 --- a/addons/tactical_periscope/Configs/EntityCatalog/US/InventoryItems_EntityCatalog_US.conf +++ /dev/null @@ -1,17 +0,0 @@ -SCR_EntityCatalogMultiList { - m_aMultiLists { - SCR_EntityCatalogMultiListEntry "{5C68AD59F0753ABE}" { - m_aEntities { - SCR_EntityCatalogInventoryItem "{64A4F8C5108615E4}" { - m_sEntityPrefab "{452112928EC197AD}Prefabs/Items/Equipment/Periscope/ACE_TacticalPeriscope.et" - m_aEntityDataList { - SCR_ArsenalItem "{64A4F8C50A157DCF}" { - m_eItemType EQUIPMENT - m_iSupplyCost 15 - } - } - } - } - } - } -} \ No newline at end of file diff --git a/addons/tactical_periscope/Configs/EntityCatalog/US/InventoryItems_EntityCatalog_US.conf.meta b/addons/tactical_periscope/Configs/EntityCatalog/US/InventoryItems_EntityCatalog_US.conf.meta deleted file mode 100644 index 185e41b20..000000000 --- a/addons/tactical_periscope/Configs/EntityCatalog/US/InventoryItems_EntityCatalog_US.conf.meta +++ /dev/null @@ -1,17 +0,0 @@ -MetaFileClass { - Name "{5F7EC52FC40A03E2}Configs/EntityCatalog/US/InventoryItems_EntityCatalog_US.conf" - Configurations { - CONFResourceClass PC { - } - CONFResourceClass XBOX_ONE : PC { - } - CONFResourceClass XBOX_SERIES : PC { - } - CONFResourceClass PS4 : PC { - } - CONFResourceClass PS5 : PC { - } - CONFResourceClass HEADLESS : PC { - } - } -} \ No newline at end of file diff --git a/addons/tactical_periscope/Configs/EntityCatalog/USSR/InventoryItems_EntityCatalog_USSR.conf b/addons/tactical_periscope/Configs/EntityCatalog/USSR/InventoryItems_EntityCatalog_USSR.conf deleted file mode 100644 index bcdb0a0a7..000000000 --- a/addons/tactical_periscope/Configs/EntityCatalog/USSR/InventoryItems_EntityCatalog_USSR.conf +++ /dev/null @@ -1,17 +0,0 @@ -SCR_EntityCatalogMultiList { - m_aMultiLists { - SCR_EntityCatalogMultiListEntry "{5C68AD5F7414CA4A}" { - m_aEntities { - SCR_EntityCatalogInventoryItem "{64A4F8C560780ED7}" { - m_sEntityPrefab "{452112928EC197AD}Prefabs/Items/Equipment/Periscope/ACE_TacticalPeriscope.et" - m_aEntityDataList { - SCR_ArsenalItem "{64A4F8C50A157DCF}" { - m_eItemType EQUIPMENT - m_iSupplyCost 15 - } - } - } - } - } - } -} \ No newline at end of file diff --git a/addons/tactical_periscope/Configs/EntityCatalog/USSR/InventoryItems_EntityCatalog_USSR.conf.meta b/addons/tactical_periscope/Configs/EntityCatalog/USSR/InventoryItems_EntityCatalog_USSR.conf.meta deleted file mode 100644 index 44514319b..000000000 --- a/addons/tactical_periscope/Configs/EntityCatalog/USSR/InventoryItems_EntityCatalog_USSR.conf.meta +++ /dev/null @@ -1,17 +0,0 @@ -MetaFileClass { - Name "{C53421647C3D0D2E}Configs/EntityCatalog/USSR/InventoryItems_EntityCatalog_USSR.conf" - Configurations { - CONFResourceClass PC { - } - CONFResourceClass XBOX_ONE : PC { - } - CONFResourceClass XBOX_SERIES : PC { - } - CONFResourceClass PS4 : PC { - } - CONFResourceClass PS5 : PC { - } - CONFResourceClass HEADLESS : PC { - } - } -} \ No newline at end of file