50 Commits

Author SHA1 Message Date
0abbcf5843 update 2026-06-07 21:25:41 +07:00
7409fec2a3 Update 2026-06-07 21:23:48 +07:00
e0a2aeaed8 update 2026-06-07 21:17:51 +07:00
54ddd924d9 Update 2026-06-07 20:24:36 +07:00
b177fc7a76 Update 2026-06-07 20:04:33 +07:00
6af1c8bf20 Update 2026-06-07 19:41:43 +07:00
696d091efa Update 2026-06-07 18:21:10 +07:00
dfa0e720ac Updater 2026-06-07 17:48:09 +07:00
de55110b19 Update 2026-06-07 17:38:45 +07:00
f70ddddf65 Update 2026-06-06 09:19:46 +07:00
75b005c691 update UI lose 2026-06-06 02:51:35 +07:00
3b24075a71 update 2026-06-06 02:36:43 +07:00
e7d8439412 linh tinh 2026-06-06 02:34:35 +07:00
af2713a00e Complete Update NPC AI 2026-06-06 02:03:22 +07:00
316a3f7760 Update 2026-06-06 00:54:47 +07:00
78692b6820 Merge branch 'main' of https://scove-vault.duckdns.org/scove/HALLUCINATION 2026-06-06 00:39:34 +07:00
9540528203 được sơ sơ 2026-06-06 00:37:41 +07:00
manhduyhoang90
a1e82db378 Merge branch 'main' of https://scove-vault.duckdns.org/scove/HALLUCINATION 2026-06-06 00:36:26 +07:00
manhduyhoang90
71d590d584 add background 2026-06-06 00:35:11 +07:00
e5a2fcfc44 Merge branch 'main' of https://scove-vault.duckdns.org/scove/HALLUCINATION 2026-06-06 00:33:23 +07:00
7409b0ca18 Update 2026-06-06 00:33:07 +07:00
manhduyhoang90
df6b8625c5 Merge branch 'main' of https://scove-vault.duckdns.org/scove/HALLUCINATION 2026-06-06 00:29:37 +07:00
manhduyhoang90
a7e07a007f Update ui 2026-06-06 00:25:02 +07:00
0580dd22b3 Merge branch 'main' of https://scove-vault.duckdns.org/scove/HALLUCINATION 2026-06-06 00:07:57 +07:00
6b4e3f1271 Update 2026-06-06 00:07:42 +07:00
manhduyhoang90
7e45faec11 Merge branch 'main' of https://scove-vault.duckdns.org/scove/HALLUCINATION 2026-06-06 00:02:35 +07:00
manhduyhoang90
763f933c2e update UI 2026-06-06 00:00:27 +07:00
948a338191 Merge branch 'main' of https://scove-vault.duckdns.org/scove/HALLUCINATION 2026-06-05 23:28:07 +07:00
19abc0b019 commit 2026-06-05 23:27:21 +07:00
1064683542 Merge branch 'main' of https://scove-vault.duckdns.org/scove/HALLUCINATION 2026-06-05 23:26:49 +07:00
3ca7816874 update 2026-06-05 23:25:56 +07:00
manhduyhoang90
f761a53194 Merge branch 'main' of https://scove-vault.duckdns.org/scove/HALLUCINATION 2026-06-05 23:20:11 +07:00
manhduyhoang90
e92d06ed54 Update:EnemyAI, KamikazeAI 2026-06-05 23:18:29 +07:00
09ca35dd35 Merge branch 'main' of https://scove-vault.duckdns.org/scove/HALLUCINATION 2026-06-05 22:54:39 +07:00
c14d3c3a95 Update 2026-06-05 22:54:37 +07:00
manhduyhoang90
7dd6b9ac20 Merge branch 'main' of https://scove-vault.duckdns.org/scove/HALLUCINATION 2026-06-05 22:54:03 +07:00
manhduyhoang90
8e40d215d6 Update EnemyAI.cs 2026-06-05 22:53:48 +07:00
6f7c4a22b3 Merge branch 'main' of https://scove-vault.duckdns.org/scove/HALLUCINATION 2026-06-05 22:38:46 +07:00
a7fa0f9356 update 2026-06-05 22:38:32 +07:00
373c4c885e Merge branch 'main' of https://scove-vault.duckdns.org/scove/HALLUCINATION 2026-06-05 22:34:48 +07:00
67e78d1413 updaye 2026-06-05 22:34:41 +07:00
manhduyhoang90
9c66433e4e Update AI 2026-06-05 22:24:16 +07:00
manhduyhoang90
c03f78b557 Update AI 2026-06-05 21:43:41 +07:00
98806b862d update 2026-06-05 21:24:41 +07:00
91183760fb npc talk 2026-06-05 18:46:19 +07:00
manhduyhoang90
7f7139612d Merge branch 'main' of https://scove-vault.duckdns.org/scove/HALLUCINATION 2026-06-05 17:16:23 +07:00
manhduyhoang90
7e489f0243 try me bitch 2026-06-05 17:16:11 +07:00
b15883a1e7 update 2026-06-05 16:38:25 +07:00
a6110a814c ahahahahahah 2026-06-05 16:26:04 +07:00
024cc4fc69 ahaha 2026-06-05 16:06:59 +07:00
132 changed files with 12514 additions and 5316 deletions

File diff suppressed because one or more lines are too long

View File

@@ -2,10 +2,10 @@
/shelf/
/workspace.xml
# Rider ignored files
/.idea.BABA_YAGA.iml
/modules.xml
/projectSettingsUpdater.xml
/.idea.HALLUCINATE.iml
/contentModel.xml
/projectSettingsUpdater.xml
# Ignored default folder with query files
/queries/
# Datasource local storage ignored files

135
.idea/.idea.BABA_YAGA/.idea/workspace.xml generated Normal file
View File

@@ -0,0 +1,135 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="AutoImportSettings">
<option name="autoReloadType" value="SELECTIVE" />
</component>
<component name="ChangeListManager">
<list default="true" id="d308d1cb-09fc-4331-ba20-00f7b43d1576" name="Changes" comment="">
<change beforePath="$PROJECT_DIR$/BABA_YAGA_Updater/sections/10_footer.md" beforeDir="false" afterPath="$PROJECT_DIR$/BABA_YAGA_Updater/sections/10_footer.md" afterDir="false" />
</list>
<option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" />
<option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
<option name="LAST_RESOLUTION" value="IGNORE" />
</component>
<component name="EmbeddingIndexingInfo">
<option name="cachedIndexableFilesCount" value="2" />
<option name="fileBasedEmbeddingIndicesEnabled" value="true" />
</component>
<component name="Git.Settings">
<option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
</component>
<component name="McpProjectServerCommands">
<commands />
<urls />
</component>
<component name="ProjectColorInfo">{
&quot;associatedIndex&quot;: 0
}</component>
<component name="ProjectId" id="3EntV1tfxFOvIa4cn84mOGJGhnc" />
<component name="ProjectViewState">
<option name="hideEmptyMiddlePackages" value="true" />
<option name="showLibraryContents" value="true" />
</component>
<component name="PropertiesComponent">{
&quot;keyToString&quot;: {
&quot;ModuleVcsDetector.initialDetectionPerformed&quot;: &quot;true&quot;,
&quot;RunOnceActivity.MCP Project settings loaded&quot;: &quot;true&quot;,
&quot;RunOnceActivity.ShowReadmeOnStart&quot;: &quot;true&quot;,
&quot;RunOnceActivity.TerminalTabsStorage.copyFrom.TerminalArrangementManager.252&quot;: &quot;true&quot;,
&quot;RunOnceActivity.git.unshallow&quot;: &quot;true&quot;,
&quot;RunOnceActivity.typescript.service.memoryLimit.init&quot;: &quot;true&quot;,
&quot;com.intellij.ml.llm.matterhorn.ej.ui.settings.DefaultModelSelectionForGA.v1&quot;: &quot;true&quot;,
&quot;git-widget-placeholder&quot;: &quot;main&quot;,
&quot;junie.onboarding.icon.badge.shown&quot;: &quot;true&quot;,
&quot;node.js.detected.package.eslint&quot;: &quot;true&quot;,
&quot;node.js.detected.package.tslint&quot;: &quot;true&quot;,
&quot;node.js.selected.package.eslint&quot;: &quot;(autodetect)&quot;,
&quot;node.js.selected.package.tslint&quot;: &quot;(autodetect)&quot;,
&quot;nodejs_package_manager_path&quot;: &quot;npm&quot;,
&quot;to.speed.mode.migration.done&quot;: &quot;true&quot;,
&quot;vue.rearranger.settings.migration&quot;: &quot;true&quot;
}
}</component>
<component name="RunManager" selected="Attach to Unity Editor.Attach to Unity Editor">
<configuration name="Start Unity" type="RunUnityExe" factoryName="Unity Executable">
<option name="EXE_PATH" value="C:\Program Files\Unity\Hub\Editor\6000.3.10f1\Editor\Unity.exe" />
<option name="PROGRAM_PARAMETERS" value="-projectPath D:\Learning_Progress\Projects\BABA_YAGA -debugCodeOptimization" />
<option name="WORKING_DIRECTORY" value="D:\Learning_Progress\Projects\BABA_YAGA" />
<option name="PASS_PARENT_ENVS" value="1" />
<option name="ENV_FILE_PATHS" value="" />
<option name="REDIRECT_INPUT_PATH" value="" />
<option name="MIXED_MODE_DEBUG" value="0" />
<method v="2" />
</configuration>
<configuration name="Unit Tests (batch mode)" type="RunUnityExe" factoryName="Unity Executable">
<option name="EXE_PATH" value="C:\Program Files\Unity\Hub\Editor\6000.3.10f1\Editor\Unity.exe" />
<option name="PROGRAM_PARAMETERS" value="-runTests -batchmode -projectPath D:\Learning_Progress\Projects\BABA_YAGA -testResults Logs/results.xml -logFile Logs/Editor.log -testPlatform EditMode -debugCodeOptimization" />
<option name="WORKING_DIRECTORY" value="D:\Learning_Progress\Projects\BABA_YAGA" />
<option name="PASS_PARENT_ENVS" value="1" />
<option name="ENV_FILE_PATHS" value="" />
<option name="REDIRECT_INPUT_PATH" value="" />
<option name="MIXED_MODE_DEBUG" value="0" />
<method v="2" />
</configuration>
<configuration name="Attach to Unity Editor" type="UNITY_DEBUG_RUN_CONFIGURATION" factoryName="Unity Debug" show_console_on_std_err="false" show_console_on_std_out="false" port="50000" address="localhost" useMixedMode="false">
<option name="allowRunningInParallel" value="false" />
<option name="listenPortForConnections" value="false" />
<option name="pid" />
<option name="projectPathOnTarget" />
<option name="runtimes">
<list />
</option>
<option name="selectedOptions">
<list />
</option>
<method v="2" />
</configuration>
<configuration name="Attach to" type="UnityDevicePlayer" factoryName="UnityAttachToDevicePlayer">
<method v="2" />
</configuration>
</component>
<component name="TaskManager">
<task active="true" id="Default" summary="Default task">
<changelist id="d308d1cb-09fc-4331-ba20-00f7b43d1576" name="Changes" comment="" />
<created>1780826181670</created>
<option name="number" value="Default" />
<option name="presentableId" value="Default" />
<updated>1780826181670</updated>
<workItem from="1780826183468" duration="14868000" />
<workItem from="1780842142322" duration="182000" />
</task>
<servers />
</component>
<component name="TypeScriptGeneratedFilesManager">
<option name="version" value="3" />
</component>
<component name="UnityProjectConfiguration" hasMinimizedUI="true" />
<component name="UnityProjectDiscoverer">
<option name="hasUnityReference" value="true" />
<option name="unityProject" value="true" />
<option name="unityProjectFolder" value="true" />
</component>
<component name="UnityUnitTestConfiguration" currentTestLauncher="Both" />
<component name="VcsManagerConfiguration">
<option name="CLEAR_INITIAL_COMMIT_MESSAGE" value="true" />
</component>
<component name="XDebuggerManager">
<breakpoint-manager>
<breakpoints>
<breakpoint enabled="true" type="DotNet_Exception_Breakpoints">
<properties exception="System.OperationCanceledException" breakIfHandledByOtherCode="false" displayValue="System.OperationCanceledException" />
<option name="timeStamp" value="1" />
</breakpoint>
<breakpoint enabled="true" type="DotNet_Exception_Breakpoints">
<properties exception="System.Threading.Tasks.TaskCanceledException" breakIfHandledByOtherCode="false" displayValue="System.Threading.Tasks.TaskCanceledException" />
<option name="timeStamp" value="2" />
</breakpoint>
<breakpoint enabled="true" type="DotNet_Exception_Breakpoints">
<properties exception="System.Threading.ThreadAbortException" breakIfHandledByOtherCode="false" displayValue="System.Threading.ThreadAbortException" />
<option name="timeStamp" value="3" />
</breakpoint>
</breakpoints>
</breakpoint-manager>
</component>
</project>

View File

@@ -1,9 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Encoding" addBOMForNewFiles="with BOM under Windows, with no BOM otherwise">
<file url="file://$PROJECT_DIR$/Assets/Scripts/Elo_System_Spec.txt" charset="ISO-8859-1" />
<file url="file://$PROJECT_DIR$/Assets/Scripts/GameSetup/Maze/Crawler.cs" charset="ISO-8859-1" />
<file url="file://$PROJECT_DIR$/Assets/Scripts/GameSetup/Maze/Extensions.cs" charset="ISO-8859-1" />
<file url="file://$PROJECT_DIR$/Assets/Scripts/GameSetup/Maze/Wilsons.cs" charset="ISO-8859-1" />
</component>
</project>

View File

@@ -1,232 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="AutoImportSettings">
<option name="autoReloadType" value="SELECTIVE" />
</component>
<component name="ChangeListManager">
<list default="true" id="f9183c68-daf0-43b8-be4c-fad79983f91b" name="Changes" comment="">
<change beforePath="$PROJECT_DIR$/.idea/.idea.HALLUCINATE/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/.idea.HALLUCINATE/.idea/workspace.xml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Assets/Fonts/BitcountSingleInk-VariableFont_CRSV,ELSH,ELXP,SZP1,SZP2,XPN1,XPN2,YPN1,YPN2,slnt,wght SDF.asset" beforeDir="false" afterPath="$PROJECT_DIR$/Assets/Fonts/BitcountSingleInk-VariableFont_CRSV,ELSH,ELXP,SZP1,SZP2,XPN1,XPN2,YPN1,YPN2,slnt,wght SDF.asset" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Assets/Prefabs/NPC/xNPC.prefab" beforeDir="false" afterPath="$PROJECT_DIR$/Assets/Prefabs/NPC/xNPC.prefab" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Assets/Scripts/AI NPC/EnemyAI.cs" beforeDir="false" afterPath="$PROJECT_DIR$/Assets/Scripts/AI NPC/EnemyAI.cs" afterDir="false" />
</list>
<option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" />
<option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
<option name="LAST_RESOLUTION" value="IGNORE" />
</component>
<component name="EmbeddingIndexingInfo">
<option name="cachedIndexableFilesCount" value="77" />
<option name="fileBasedEmbeddingIndicesEnabled" value="true" />
</component>
<component name="Git.Settings">
<option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
</component>
<component name="HighlightingSettingsPerFile">
<setting file="file://$PROJECT_DIR$/Assets/InventoryData.json" root0="FORCE_HIGHLIGHTING" />
<setting file="file://$PROJECT_DIR$/Assets/Scripts/Audio/AudioManager.cs" root0="FORCE_HIGHLIGHTING" />
<setting file="file://$PROJECT_DIR$/Assets/Scripts/Network/BasicSpawner.cs" root0="FORCE_HIGHLIGHTING" />
<setting file="file://$PROJECT_DIR$/Assets/Scripts/UI/LobbyController.cs" root0="FORCE_HIGHLIGHTING" />
<setting file="file://$PROJECT_DIR$/Assets/Third Parties/Photon/Fusion/Editor/Fusion.Unity.Editor.cs" root0="SKIP_HIGHLIGHTING" />
<setting file="file://$PROJECT_DIR$/Assets/UI/MainPanelSettings.asset" root0="FORCE_HIGHLIGHTING" />
<setting file="file://$PROJECT_DIR$/Library/PackageCache/com.unity.render-pipelines.core@04ab0eefa0c3/Editor/Utilities/LocalizationHelper.cs" root0="SKIP_HIGHLIGHTING" />
<setting file="file://$PROJECT_DIR$/Library/PackageCache/com.unity.timeline@7f8b2fb101b6/Editor/Localization/Localization.cs" root0="SKIP_HIGHLIGHTING" />
<setting file="file://$PROJECT_DIR$/Library/PackageCache/com.unity.ugui@bb329a87fcdc/Runtime/UGUI/EventSystem/EventSystem.cs" root0="SKIP_HIGHLIGHTING" />
<setting file="file://$PROJECT_DIR$/Library/PackageCache/com.wooshii.foldericons@201a18f355d3/FolderIcons/Editor/FolderIcons.cs" root0="SKIP_HIGHLIGHTING" />
</component>
<component name="McpProjectServerCommands">
<commands />
<urls />
</component>
<component name="MetaFilesCheckinStateConfiguration" checkMetaFiles="true" />
<component name="ProblemsViewState">
<option name="selectedTabId" value="CurrentFile" />
</component>
<component name="ProjectColorInfo">{
&quot;associatedIndex&quot;: 4
}</component>
<component name="ProjectId" id="3BU6ZYP0raS9lWcA2Qy4TxVBVes" />
<component name="ProjectViewState">
<option name="hideEmptyMiddlePackages" value="true" />
<option name="showLibraryContents" value="true" />
</component>
<component name="PropertiesComponent">{
&quot;keyToString&quot;: {
&quot;ModuleVcsDetector.initialDetectionPerformed&quot;: &quot;true&quot;,
&quot;RunOnceActivity.MCP Project settings loaded&quot;: &quot;true&quot;,
&quot;RunOnceActivity.ShowReadmeOnStart&quot;: &quot;true&quot;,
&quot;RunOnceActivity.TerminalTabsStorage.copyFrom.TerminalArrangementManager.252&quot;: &quot;true&quot;,
&quot;RunOnceActivity.git.unshallow&quot;: &quot;true&quot;,
&quot;RunOnceActivity.typescript.service.memoryLimit.init&quot;: &quot;true&quot;,
&quot;com.intellij.ml.llm.matterhorn.ej.ui.settings.DefaultModelSelectionForGA.v1&quot;: &quot;true&quot;,
&quot;git-widget-placeholder&quot;: &quot;main&quot;,
&quot;junie.onboarding.icon.badge.shown&quot;: &quot;true&quot;,
&quot;node.js.detected.package.eslint&quot;: &quot;true&quot;,
&quot;node.js.detected.package.tslint&quot;: &quot;true&quot;,
&quot;node.js.selected.package.eslint&quot;: &quot;(autodetect)&quot;,
&quot;node.js.selected.package.tslint&quot;: &quot;(autodetect)&quot;,
&quot;nodejs_package_manager_path&quot;: &quot;npm&quot;,
&quot;settings.editor.selected.configurable&quot;: &quot;editor.preferences.completion&quot;,
&quot;to.speed.mode.migration.done&quot;: &quot;true&quot;,
&quot;vue.rearranger.settings.migration&quot;: &quot;true&quot;
}
}</component>
<component name="RunManager" selected="Attach to Unity Editor.Attach to Unity Editor">
<configuration name="Standalone Player" type="RunUnityExe" factoryName="Unity Executable">
<option name="EXE_PATH" value="$PROJECT_DIR$/Build\HALLUCINATE.exe" />
<option name="PROGRAM_PARAMETERS" value="" />
<option name="WORKING_DIRECTORY" value="D:\BAI MUTIPLAY" />
<option name="PASS_PARENT_ENVS" value="1" />
<option name="ENV_FILE_PATHS" value="" />
<option name="REDIRECT_INPUT_PATH" value="" />
<option name="MIXED_MODE_DEBUG" value="0" />
<method v="2" />
</configuration>
<configuration name="Start Unity" type="RunUnityExe" factoryName="Unity Executable">
<option name="EXE_PATH" value="C:\Program Files\Unity\Hub\Editor\6000.3.10f1\Editor\Unity.exe" />
<option name="PROGRAM_PARAMETERS" value="-projectPath E:\Learning_Progress\Projects\HALLUCINATE -debugCodeOptimization" />
<option name="WORKING_DIRECTORY" value="E:\Learning_Progress\Projects\HALLUCINATE" />
<option name="PASS_PARENT_ENVS" value="1" />
<option name="ENV_FILE_PATHS" value="" />
<option name="REDIRECT_INPUT_PATH" value="" />
<option name="MIXED_MODE_DEBUG" value="0" />
<method v="2" />
</configuration>
<configuration name="Unit Tests (batch mode)" type="RunUnityExe" factoryName="Unity Executable">
<option name="EXE_PATH" value="C:\Program Files\Unity\Hub\Editor\6000.3.10f1\Editor\Unity.exe" />
<option name="PROGRAM_PARAMETERS" value="-runTests -batchmode -projectPath E:\Learning_Progress\Projects\HALLUCINATE -testResults Logs/results.xml -logFile Logs/Editor.log -testPlatform EditMode -debugCodeOptimization" />
<option name="WORKING_DIRECTORY" value="E:\Learning_Progress\Projects\HALLUCINATE" />
<option name="PASS_PARENT_ENVS" value="1" />
<option name="ENV_FILE_PATHS" value="" />
<option name="REDIRECT_INPUT_PATH" value="" />
<option name="MIXED_MODE_DEBUG" value="0" />
<method v="2" />
</configuration>
<configuration name="Attach to Unity Editor" type="UNITY_DEBUG_RUN_CONFIGURATION" factoryName="Unity Debug" show_console_on_std_err="false" show_console_on_std_out="false" port="50000" address="localhost" useMixedMode="false">
<option name="allowRunningInParallel" value="false" />
<option name="listenPortForConnections" value="false" />
<option name="pid" />
<option name="projectPathOnTarget" />
<option name="runtimes">
<list />
</option>
<option name="selectedOptions">
<list />
</option>
<method v="2" />
</configuration>
<configuration name="Attach to" type="UnityDevicePlayer" factoryName="UnityAttachToDevicePlayer">
<method v="2" />
</configuration>
</component>
<component name="TaskManager">
<task active="true" id="Default" summary="Default task">
<changelist id="f9183c68-daf0-43b8-be4c-fad79983f91b" name="Changes" comment="" />
<created>1774531360140</created>
<option name="number" value="Default" />
<option name="presentableId" value="Default" />
<updated>1774531360140</updated>
<workItem from="1774531363039" duration="637000" />
<workItem from="1774584797007" duration="56000" />
<workItem from="1774584869078" duration="12146000" />
<workItem from="1774667976147" duration="2000" />
<workItem from="1774800709148" duration="3094000" />
<workItem from="1774803886905" duration="118000" />
<workItem from="1774804030241" duration="2187000" />
<workItem from="1774840339107" duration="4306000" />
<workItem from="1774882297975" duration="4578000" />
<workItem from="1774961115405" duration="11806000" />
<workItem from="1774977520102" duration="3069000" />
<workItem from="1775097804358" duration="1044000" />
<workItem from="1775100366425" duration="2192000" />
<workItem from="1775106342316" duration="15040000" />
<workItem from="1775313757656" duration="8722000" />
<workItem from="1776130728673" duration="7161000" />
<workItem from="1776255558934" duration="1896000" />
<workItem from="1776780627914" duration="11380000" />
<workItem from="1776848005294" duration="47000" />
<workItem from="1776910642766" duration="2290000" />
<workItem from="1776940053256" duration="13616000" />
<workItem from="1777113431258" duration="10253000" />
<workItem from="1777150520438" duration="58000" />
<workItem from="1777150592854" duration="4699000" />
<workItem from="1777181837663" duration="1519000" />
<workItem from="1777269364664" duration="40284000" />
<workItem from="1777373072815" duration="1852000" />
<workItem from="1777376778745" duration="10727000" />
<workItem from="1777392719306" duration="13382000" />
<workItem from="1777443280908" duration="5223000" />
<workItem from="1777484328779" duration="32427000" />
<workItem from="1777568077522" duration="8613000" />
<workItem from="1777604072510" duration="12724000" />
<workItem from="1777629255838" duration="2209000" />
<workItem from="1777631506531" duration="2333000" />
<workItem from="1777639175483" duration="9746000" />
<workItem from="1777652919998" duration="1890000" />
<workItem from="1777732628340" duration="74000" />
<workItem from="1777732739619" duration="808000" />
<workItem from="1777818351880" duration="313000" />
<workItem from="1777991464807" duration="4843000" />
<workItem from="1779019500395" duration="11374000" />
<workItem from="1779293096539" duration="3004000" />
<workItem from="1779962085481" duration="671000" />
<workItem from="1780000221080" duration="1566000" />
<workItem from="1780139911301" duration="1008000" />
<workItem from="1780140952531" duration="441000" />
<workItem from="1780141455151" duration="159000" />
<workItem from="1780141729457" duration="9450000" />
<workItem from="1780364354282" duration="4357000" />
<workItem from="1780409218377" duration="9852000" />
<workItem from="1780494322686" duration="643000" />
<workItem from="1780633654231" duration="7070000" />
</task>
<servers />
</component>
<component name="TypeScriptGeneratedFilesManager">
<option name="version" value="3" />
</component>
<component name="UnityCheckinConfiguration" checkUnsavedScenes="true" />
<component name="UnityProjectConfiguration" hasMinimizedUI="true" />
<component name="UnityProjectDiscoverer">
<option name="hasUnityReference" value="true" />
<option name="unityProject" value="true" />
<option name="unityProjectFolder" value="true" />
</component>
<component name="UnityUnitTestConfiguration" currentTestLauncher="Both" />
<component name="Vcs.Log.Tabs.Properties">
<option name="TAB_STATES">
<map>
<entry key="MAIN">
<value>
<State />
</value>
</entry>
</map>
</option>
</component>
<component name="VcsManagerConfiguration">
<option name="CLEAR_INITIAL_COMMIT_MESSAGE" value="true" />
</component>
<component name="XDebuggerManager">
<breakpoint-manager>
<breakpoints>
<breakpoint enabled="true" type="DotNet_Exception_Breakpoints">
<properties exception="System.OperationCanceledException" breakIfHandledByOtherCode="false" displayValue="System.OperationCanceledException" />
<option name="timeStamp" value="1" />
</breakpoint>
<breakpoint enabled="true" type="DotNet_Exception_Breakpoints">
<properties exception="System.Threading.Tasks.TaskCanceledException" breakIfHandledByOtherCode="false" displayValue="System.Threading.Tasks.TaskCanceledException" />
<option name="timeStamp" value="2" />
</breakpoint>
<breakpoint enabled="true" type="DotNet_Exception_Breakpoints">
<properties exception="System.Threading.ThreadAbortException" breakIfHandledByOtherCode="false" displayValue="System.Threading.ThreadAbortException" />
<option name="timeStamp" value="3" />
</breakpoint>
</breakpoints>
</breakpoint-manager>
</component>
<component name="XSLT-Support.FileAssociations.UIState">
<expand />
<select />
</component>
</project>

View File

@@ -1,15 +0,0 @@
# Default ignored files
/shelf/
/workspace.xml
# Rider ignored files
/projectSettingsUpdater.xml
/contentModel.xml
/modules.xml
/.idea.HALLUCINATION.iml
# Ignored default folder with query files
/queries/
# Datasource local storage ignored files
/dataSources/
/dataSources.local.xml
# Editor-based HTTP Client requests
/httpRequests/

View File

@@ -100,8 +100,7 @@ BlendTree:
m_Name: Idle
m_Childs:
- serializedVersion: 2
m_Motion: {fileID: 5908583710877457969, guid: 009c43c371cbf974f860ee540816fa3d,
type: 3}
m_Motion: {fileID: 5908583710877457969, guid: 009c43c371cbf974f860ee540816fa3d, type: 3}
m_Threshold: -0.5
m_Position: {x: 0, y: 0}
m_TimeScale: 1
@@ -117,8 +116,7 @@ BlendTree:
m_DirectBlendParameter: InputHorizontal
m_Mirror: 0
- serializedVersion: 2
m_Motion: {fileID: 5908583710877457969, guid: 009c43c371cbf974f860ee540816fa3d,
type: 3}
m_Motion: {fileID: 5908583710877457969, guid: 009c43c371cbf974f860ee540816fa3d, type: 3}
m_Threshold: 0.5
m_Position: {x: 0, y: 0}
m_TimeScale: -1
@@ -738,8 +736,7 @@ BlendTree:
m_Name: CroouchIdleAiming
m_Childs:
- serializedVersion: 2
m_Motion: {fileID: -2893743026720447327, guid: 009c43c371cbf974f860ee540816fa3d,
type: 3}
m_Motion: {fileID: -2893743026720447327, guid: 009c43c371cbf974f860ee540816fa3d, type: 3}
m_Threshold: -0.5
m_Position: {x: 0, y: 0}
m_TimeScale: 1
@@ -755,8 +752,7 @@ BlendTree:
m_DirectBlendParameter: InputHorizontal
m_Mirror: 0
- serializedVersion: 2
m_Motion: {fileID: -2893743026720447327, guid: 009c43c371cbf974f860ee540816fa3d,
type: 3}
m_Motion: {fileID: -2893743026720447327, guid: 009c43c371cbf974f860ee540816fa3d, type: 3}
m_Threshold: 0.5
m_Position: {x: 0, y: 0}
m_TimeScale: -1
@@ -942,8 +938,7 @@ AnimatorState:
m_MirrorParameterActive: 0
m_CycleOffsetParameterActive: 0
m_TimeParameterActive: 0
m_Motion: {fileID: 6273134904810983842, guid: 632f8ebe81a772e4998224dabbbf836b,
type: 3}
m_Motion: {fileID: 6273134904810983842, guid: 632f8ebe81a772e4998224dabbbf836b, type: 3}
m_Tag:
m_SpeedParameter:
m_MirrorParameter:
@@ -1066,8 +1061,7 @@ BlendTree:
m_Name: CrouchIdle
m_Childs:
- serializedVersion: 2
m_Motion: {fileID: -2893743026720447327, guid: 009c43c371cbf974f860ee540816fa3d,
type: 3}
m_Motion: {fileID: -2893743026720447327, guid: 009c43c371cbf974f860ee540816fa3d, type: 3}
m_Threshold: -0.5
m_Position: {x: 0, y: 0}
m_TimeScale: 2
@@ -1083,8 +1077,7 @@ BlendTree:
m_DirectBlendParameter: InputHorizontal
m_Mirror: 0
- serializedVersion: 2
m_Motion: {fileID: -2893743026720447327, guid: 009c43c371cbf974f860ee540816fa3d,
type: 3}
m_Motion: {fileID: -2893743026720447327, guid: 009c43c371cbf974f860ee540816fa3d, type: 3}
m_Threshold: 0.5
m_Position: {x: 0, y: 0}
m_TimeScale: -2
@@ -1371,8 +1364,7 @@ BlendTree:
m_Name: Blend Tree
m_Childs:
- serializedVersion: 2
m_Motion: {fileID: 6944727830613845018, guid: f63fbd0ba70f1554c9dc5f893ff28546,
type: 3}
m_Motion: {fileID: 6944727830613845018, guid: f63fbd0ba70f1554c9dc5f893ff28546, type: 3}
m_Threshold: -170
m_Position: {x: 0, y: 0}
m_TimeScale: 1
@@ -1380,8 +1372,7 @@ BlendTree:
m_DirectBlendParameter: InputHorizontal
m_Mirror: 0
- serializedVersion: 2
m_Motion: {fileID: 5927633979316069339, guid: f63fbd0ba70f1554c9dc5f893ff28546,
type: 3}
m_Motion: {fileID: 5927633979316069339, guid: f63fbd0ba70f1554c9dc5f893ff28546, type: 3}
m_Threshold: -90
m_Position: {x: 0, y: 0}
m_TimeScale: 1
@@ -1389,8 +1380,7 @@ BlendTree:
m_DirectBlendParameter: InputHorizontal
m_Mirror: 0
- serializedVersion: 2
m_Motion: {fileID: 7173170133434809738, guid: f63fbd0ba70f1554c9dc5f893ff28546,
type: 3}
m_Motion: {fileID: 7173170133434809738, guid: f63fbd0ba70f1554c9dc5f893ff28546, type: 3}
m_Threshold: 0
m_Position: {x: 0, y: 0}
m_TimeScale: 1
@@ -1398,8 +1388,7 @@ BlendTree:
m_DirectBlendParameter: InputHorizontal
m_Mirror: 0
- serializedVersion: 2
m_Motion: {fileID: -4636754764438762427, guid: f63fbd0ba70f1554c9dc5f893ff28546,
type: 3}
m_Motion: {fileID: -4636754764438762427, guid: f63fbd0ba70f1554c9dc5f893ff28546, type: 3}
m_Threshold: 90
m_Position: {x: 0, y: 0}
m_TimeScale: 1
@@ -1407,8 +1396,7 @@ BlendTree:
m_DirectBlendParameter: InputHorizontal
m_Mirror: 0
- serializedVersion: 2
m_Motion: {fileID: -606276786794296147, guid: f63fbd0ba70f1554c9dc5f893ff28546,
type: 3}
m_Motion: {fileID: -606276786794296147, guid: f63fbd0ba70f1554c9dc5f893ff28546, type: 3}
m_Threshold: 170
m_Position: {x: 0, y: 0}
m_TimeScale: 1
@@ -14728,14 +14716,17 @@ AnimatorStateMachine:
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: Base Layer
m_ChildStates: []
m_ChildStates:
- serializedVersion: 1
m_State: {fileID: 4416801500611958025}
m_Position: {x: -358.64734, y: -43.860413, z: 0}
m_ChildStateMachines:
- serializedVersion: 1
m_StateMachine: {fileID: 1107191697213795204}
m_Position: {x: -288, y: -120, z: 0}
- serializedVersion: 1
m_StateMachine: {fileID: 1107822795797827924}
m_Position: {x: -288, y: -180, z: 0}
m_Position: {x: -290, y: -180, z: 0}
- serializedVersion: 1
m_StateMachine: {fileID: 2678945455928377032}
m_Position: {x: -290, y: -240, z: 0}
@@ -20946,8 +20937,7 @@ BlendTree:
m_Name: Bow_Idle
m_Childs:
- serializedVersion: 2
m_Motion: {fileID: -744450954914381049, guid: 009c43c371cbf974f860ee540816fa3d,
type: 3}
m_Motion: {fileID: -744450954914381049, guid: 009c43c371cbf974f860ee540816fa3d, type: 3}
m_Threshold: -0.5
m_Position: {x: 0, y: 0}
m_TimeScale: 2
@@ -20963,8 +20953,7 @@ BlendTree:
m_DirectBlendParameter: InputHorizontal
m_Mirror: 0
- serializedVersion: 2
m_Motion: {fileID: -744450954914381049, guid: 009c43c371cbf974f860ee540816fa3d,
type: 3}
m_Motion: {fileID: -744450954914381049, guid: 009c43c371cbf974f860ee540816fa3d, type: 3}
m_Threshold: 0.5
m_Position: {x: 0, y: 0}
m_TimeScale: -2
@@ -33694,7 +33683,7 @@ AnimatorStateMachine:
m_ChildStates:
- serializedVersion: 1
m_State: {fileID: 1102974793704474096}
m_Position: {x: 264, y: 168, z: 0}
m_Position: {x: 260, y: 170, z: 0}
- serializedVersion: 1
m_State: {fileID: 1102332861771149508}
m_Position: {x: 260, y: 70, z: 0}
@@ -33710,7 +33699,7 @@ AnimatorStateMachine:
m_AnyStatePosition: {x: 48, y: 168, z: 0}
m_EntryPosition: {x: 50, y: 120, z: 0}
m_ExitPosition: {x: 504, y: 120, z: 0}
m_ParentStateMachinePosition: {x: 24, y: -24, z: 0}
m_ParentStateMachinePosition: {x: 30, y: -20, z: 0}
m_DefaultState: {fileID: 1102332861771149508}
--- !u!1107 &1107815003637627098
AnimatorStateMachine:
@@ -35894,8 +35883,7 @@ BlendTree:
m_Name: Crouch Idle
m_Childs:
- serializedVersion: 2
m_Motion: {fileID: -2893743026720447327, guid: 009c43c371cbf974f860ee540816fa3d,
type: 3}
m_Motion: {fileID: -2893743026720447327, guid: 009c43c371cbf974f860ee540816fa3d, type: 3}
m_Threshold: -0.5
m_Position: {x: 0, y: 0}
m_TimeScale: 2
@@ -35911,8 +35899,7 @@ BlendTree:
m_DirectBlendParameter: InputHorizontal
m_Mirror: 0
- serializedVersion: 2
m_Motion: {fileID: -2893743026720447327, guid: 009c43c371cbf974f860ee540816fa3d,
type: 3}
m_Motion: {fileID: -2893743026720447327, guid: 009c43c371cbf974f860ee540816fa3d, type: 3}
m_Threshold: 0.5
m_Position: {x: 0, y: 0}
m_TimeScale: -2
@@ -36272,6 +36259,32 @@ AnimatorStateTransition:
m_InterruptionSource: 0
m_OrderedInterruption: 1
m_CanTransitionToSelf: 1
--- !u!1102 &4416801500611958025
AnimatorState:
serializedVersion: 6
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: TestRun
m_Speed: 1
m_CycleOffset: 0
m_Transitions: []
m_StateMachineBehaviours: []
m_Position: {x: 50, y: 50, z: 0}
m_IKOnFeet: 0
m_WriteDefaultValues: 1
m_Mirror: 0
m_SpeedParameterActive: 0
m_MirrorParameterActive: 0
m_CycleOffsetParameterActive: 0
m_TimeParameterActive: 0
m_Motion: {fileID: 7400012, guid: 37c6cfe59f56e8a4799011397a870a8b, type: 3}
m_Tag:
m_SpeedParameter:
m_MirrorParameter:
m_CycleOffsetParameter:
m_TimeParameter:
--- !u!1101 &4602781940129309487
AnimatorStateTransition:
m_ObjectHideFlags: 1
@@ -36478,8 +36491,7 @@ BlendTree:
m_Name: Idle Aiming
m_Childs:
- serializedVersion: 2
m_Motion: {fileID: -5495367200724739231, guid: 009c43c371cbf974f860ee540816fa3d,
type: 3}
m_Motion: {fileID: -5495367200724739231, guid: 009c43c371cbf974f860ee540816fa3d, type: 3}
m_Threshold: -0.5
m_Position: {x: 0, y: 0}
m_TimeScale: 2
@@ -36487,8 +36499,7 @@ BlendTree:
m_DirectBlendParameter: InputHorizontal
m_Mirror: 0
- serializedVersion: 2
m_Motion: {fileID: -5495367200724739231, guid: 009c43c371cbf974f860ee540816fa3d,
type: 3}
m_Motion: {fileID: -5495367200724739231, guid: 009c43c371cbf974f860ee540816fa3d, type: 3}
m_Threshold: -0.2
m_Position: {x: 0, y: 0}
m_TimeScale: 0.5
@@ -36504,8 +36515,7 @@ BlendTree:
m_DirectBlendParameter: InputHorizontal
m_Mirror: 0
- serializedVersion: 2
m_Motion: {fileID: -5495367200724739231, guid: 009c43c371cbf974f860ee540816fa3d,
type: 3}
m_Motion: {fileID: -5495367200724739231, guid: 009c43c371cbf974f860ee540816fa3d, type: 3}
m_Threshold: 0.2
m_Position: {x: 0, y: 0}
m_TimeScale: -0.5
@@ -36513,8 +36523,7 @@ BlendTree:
m_DirectBlendParameter: InputHorizontal
m_Mirror: 0
- serializedVersion: 2
m_Motion: {fileID: -5495367200724739231, guid: 009c43c371cbf974f860ee540816fa3d,
type: 3}
m_Motion: {fileID: -5495367200724739231, guid: 009c43c371cbf974f860ee540816fa3d, type: 3}
m_Threshold: 0.5
m_Position: {x: 0, y: 0}
m_TimeScale: -2
@@ -36682,8 +36691,7 @@ BlendTree:
m_Name: Holding Melee Idle
m_Childs:
- serializedVersion: 2
m_Motion: {fileID: -5508357832084655506, guid: 009c43c371cbf974f860ee540816fa3d,
type: 3}
m_Motion: {fileID: -5508357832084655506, guid: 009c43c371cbf974f860ee540816fa3d, type: 3}
m_Threshold: -1
m_Position: {x: 0, y: 0}
m_TimeScale: 1
@@ -36699,8 +36707,7 @@ BlendTree:
m_DirectBlendParameter: InputHorizontal
m_Mirror: 0
- serializedVersion: 2
m_Motion: {fileID: -5508357832084655506, guid: 009c43c371cbf974f860ee540816fa3d,
type: 3}
m_Motion: {fileID: -5508357832084655506, guid: 009c43c371cbf974f860ee540816fa3d, type: 3}
m_Threshold: 1
m_Position: {x: 0, y: 0}
m_TimeScale: -1

View File

@@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: ea7d09efcbeafdd4690e2b2b3236d043
guid: ebed31fbd0a3be4499c2fe54022858b7
folderAsset: yes
DefaultImporter:
externalObjects: {}

View File

@@ -0,0 +1,23 @@
fileFormatVersion: 2
guid: 5a569249b0485d347a698461b0334585
AudioImporter:
externalObjects: {}
serializedVersion: 8
defaultSettings:
serializedVersion: 2
loadType: 0
sampleRateSetting: 0
sampleRateOverride: 44100
compressionFormat: 1
quality: 1
conversionMode: 0
preloadAudioData: 0
platformSettingOverrides: {}
forceToMono: 0
normalize: 1
loadInBackground: 0
ambisonic: 0
3D: 1
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -57,7 +57,7 @@ AudioMixerGroupController:
m_Send: 00000000000000000000000000000000
m_Effects:
- {fileID: -5864968286415327506}
m_UserColorIndex: 0
m_UserColorIndex: 3
m_Mute: 0
m_Solo: 0
m_BypassEffects: 0
@@ -76,7 +76,15 @@ AudioMixerController:
m_SuspendThreshold: -80
m_EnableSuspend: 1
m_UpdateMode: 0
m_ExposedParameters: []
m_ExposedParameters:
- guid: 9d220dd29b931844f8bf0cabe811b681
name: MasterVolume
- guid: bf1d95a6c9abe924fa3d98795325cc1b
name: MusicVolume
- guid: 27be8a879c26ddd4585dbedff31a33e3
name: SFXVolume
- guid: 6b8a96f21df846741a0036e2a182ec15
name: UIVolume
m_AudioMixerGroupViews:
- guids:
- f31c09d88c9703d4aae5faeb43b19082
@@ -104,7 +112,7 @@ AudioMixerGroupController:
m_Send: 00000000000000000000000000000000
m_Effects:
- {fileID: 24400004}
m_UserColorIndex: 0
m_UserColorIndex: 1
m_Mute: 0
m_Solo: 0
m_BypassEffects: 0
@@ -148,7 +156,7 @@ AudioMixerGroupController:
m_Send: 00000000000000000000000000000000
m_Effects:
- {fileID: -8884289898024163737}
m_UserColorIndex: 0
m_UserColorIndex: 2
m_Mute: 0
m_Solo: 0
m_BypassEffects: 0
@@ -167,7 +175,7 @@ AudioMixerGroupController:
m_Send: 00000000000000000000000000000000
m_Effects:
- {fileID: -4762669937127778309}
m_UserColorIndex: 0
m_UserColorIndex: 4
m_Mute: 0
m_Solo: 0
m_BypassEffects: 0

View File

@@ -0,0 +1,71 @@
using UnityEngine;
using UnityEditor;
using System.Diagnostics;
using System.IO;
public class ReadmeUpdater : EditorWindow
{
private const string PythonScriptPath = "BABA_YAGA_Updater/main.py";
private const string VenvPythonPath = "BABA_YAGA_Updater/.venv/Scripts/python.exe";
private const string UpdaterDir = "BABA_YAGA_Updater";
[MenuItem("BABA YAGA/Update README")]
public static void UpdateReadme()
{
string projectRoot = Directory.GetParent(Application.dataPath).FullName;
string fullVenvPath = Path.Combine(projectRoot, VenvPythonPath);
string fullScriptPath = Path.Combine(projectRoot, PythonScriptPath);
string workingDir = Path.Combine(projectRoot, UpdaterDir);
if (!File.Exists(fullVenvPath))
{
UnityEngine.Debug.LogError($"[README Updater] Python venv not found at: {fullVenvPath}. Please ensure the .venv is set up in BABA_YAGA_Updater.");
return;
}
UnityEngine.Debug.Log("[README Updater] Starting update process...");
ProcessStartInfo startInfo = new ProcessStartInfo
{
FileName = fullVenvPath,
Arguments = $"\"{fullScriptPath}\"",
WorkingDirectory = workingDir,
UseShellExecute = false,
RedirectStandardOutput = true,
RedirectStandardError = true,
StandardOutputEncoding = System.Text.Encoding.UTF8,
StandardErrorEncoding = System.Text.Encoding.UTF8,
CreateNoWindow = true
};
// Force Python to use UTF-8 for IO to handle emojis
startInfo.EnvironmentVariables["PYTHONIOENCODING"] = "utf-8";
using (Process process = Process.Start(startInfo))
{
using (StreamReader reader = process.StandardOutput)
{
string result = reader.ReadToEnd();
if (!string.IsNullOrEmpty(result))
UnityEngine.Debug.Log($"[README Updater] Output:\n{result}");
}
using (StreamReader reader = process.StandardError)
{
string errors = reader.ReadToEnd();
if (!string.IsNullOrEmpty(errors))
UnityEngine.Debug.LogError($"[README Updater] Errors:\n{errors}");
}
process.WaitForExit();
if (process.ExitCode == 0)
{
UnityEngine.Debug.Log("🎉 [README Updater] README.md successfully updated!");
}
else
{
UnityEngine.Debug.LogError($"[README Updater] Process exited with code {process.ExitCode}");
}
}
}
}

View File

@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: ae55b686282bc5248a82e3164817a074

View File

@@ -5218,9 +5218,9 @@ Material:
- _OutlineWidth: 0
- _PerspectiveFilter: 0.875
- _Reflectivity: 10
- _ScaleRatioA: 1
- _ScaleRatioB: 1
- _ScaleRatioC: 1
- _ScaleRatioA: 0.9
- _ScaleRatioB: 0.73125
- _ScaleRatioC: 0.73125
- _ScaleX: 1
- _ScaleY: 1
- _ShaderFlags: 0

144
Assets/Materials/skubox.mat Normal file
View File

@@ -0,0 +1,144 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &-6888318783798700149
MonoBehaviour:
m_ObjectHideFlags: 11
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: d0353a89b1f911e48b9e16bdc9f2e058, type: 3}
m_Name:
m_EditorClassIdentifier: Unity.RenderPipelines.Universal.Editor::UnityEditor.Rendering.Universal.AssetVersion
version: 10
--- !u!21 &2100000
Material:
serializedVersion: 8
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: skubox
m_Shader: {fileID: 108, guid: 0000000000000000f000000000000000, type: 0}
m_Parent: {fileID: 0}
m_ModifiedSerializedProperties: 0
m_ValidKeywords: []
m_InvalidKeywords:
- _MAPPING_LATITUDE_LONGITUDE_LAYOUT
m_LightmapFlags: 4
m_EnableInstancingVariants: 0
m_DoubleSidedGI: 0
m_CustomRenderQueue: -1
stringTagMap: {}
disabledShaderPasses:
- MOTIONVECTORS
m_LockedProperties:
m_SavedProperties:
serializedVersion: 3
m_TexEnvs:
- _BaseMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _BumpMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _DetailAlbedoMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _DetailMask:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _DetailNormalMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _EmissionMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _MainTex:
m_Texture: {fileID: 2800000, guid: f6c8ebeb4fbe2954ba666fb8de1138f1, type: 3}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _MetallicGlossMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _OcclusionMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _ParallaxMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _SpecGlossMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- unity_Lightmaps:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- unity_LightmapsInd:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- unity_ShadowMasks:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
m_Ints: []
m_Floats:
- _AddPrecomputedVelocity: 0
- _AlphaClip: 0
- _AlphaToMask: 0
- _Blend: 0
- _BlendModePreserveSpecular: 1
- _BumpScale: 1
- _ClearCoatMask: 0
- _ClearCoatSmoothness: 0
- _Cull: 2
- _Cutoff: 0.5
- _DetailAlbedoMapScale: 1
- _DetailNormalMapScale: 1
- _DstBlend: 0
- _DstBlendAlpha: 0
- _EnvironmentReflections: 1
- _Exposure: 1
- _GlossMapScale: 0
- _Glossiness: 0
- _GlossyReflections: 0
- _ImageType: 0
- _Layout: 0
- _Mapping: 1
- _Metallic: 0
- _MirrorOnBack: 0
- _OcclusionStrength: 1
- _Parallax: 0.005
- _QueueOffset: 0
- _ReceiveShadows: 1
- _Rotation: 0
- _Smoothness: 0.5
- _SmoothnessTextureChannel: 0
- _SpecularHighlights: 1
- _SrcBlend: 1
- _SrcBlendAlpha: 1
- _Surface: 0
- _WorkflowMode: 1
- _XRMotionVectorsPass: 1
- _ZWrite: 1
m_Colors:
- _BaseColor: {r: 1, g: 1, b: 1, a: 1}
- _Color: {r: 1, g: 1, b: 1, a: 1}
- _EmissionColor: {r: 0, g: 0, b: 0, a: 1}
- _SpecColor: {r: 0.19999996, g: 0.19999996, b: 0.19999996, a: 1}
- _Tint: {r: 0.5, g: 0.5, b: 0.5, a: 0.5}
m_BuildTextureStacks: []
m_AllowLocking: 1

View File

@@ -1,8 +1,8 @@
fileFormatVersion: 2
guid: 921c5d99d764f7e4184745c7ab001a30
folderAsset: yes
DefaultImporter:
guid: 7adfd3fc58213974581401c16602cb05
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 2100000
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -37,6 +37,7 @@ Material:
disabledShaderPasses:
- MOTIONVECTORS
- DepthOnly
- SHADOWCASTER
m_LockedProperties:
m_SavedProperties:
serializedVersion: 3
@@ -66,7 +67,7 @@ Material:
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _MainTex:
m_Texture: {fileID: 0}
m_Texture: {fileID: 2800000, guid: 2b09e034ca4296047993ed266a80d617, type: 3}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _MetallicGlossMap:

View File

@@ -132,7 +132,7 @@ Material:
- _ZWrite: 1
m_Colors:
- _BaseColor: {r: 0.066176444, g: 0.066176444, b: 0.066176444, a: 0.9338235}
- _Color: {r: 1, g: 1, b: 1, a: 1}
- _Color: {r: 0.06617642, g: 0.06617642, b: 0.06617642, a: 0.9338235}
- _EmissionColor: {r: 0, g: 0, b: 0, a: 1}
- _SpecColor: {r: 0.19999996, g: 0.19999996, b: 0.19999996, a: 1}
m_BuildTextureStacks: []

View File

@@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: c862e7051fa82514e8cb688cd9667d93
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: ed59a5af28246c141afd7603a3a94af3
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: 2fdd0acc5f279f54299e93076a7ad92d
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: da4f77c9ec1cc314ca268a68c1441354
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: 2c2915ce8b97ca744bfd4f5ea2471af1
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: f934eecf73f7e0e438ff1a0fffa1893e
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -14,6 +14,7 @@ GameObject:
- component: {fileID: 6087599376744356948}
- component: {fileID: 3563399533700019190}
- component: {fileID: 681314853465352057}
- component: {fileID: 4042483058127329834}
m_Layer: 0
m_Name: KamikazeAI
m_TagString: Untagged
@@ -155,3 +156,41 @@ MonoBehaviour:
patrolRadius: 12
patrolWaitTime: 2
explosionEffectPrefab: {fileID: 8568474719719117872, guid: 39bf32dcd9299df4ca44fd10a817eda4, type: 3}
--- !u!114 &4042483058127329834
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6425756872251228809}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: f56a83ea88140fa4f869bb2f7ffdb184, type: 3}
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::Invector.vHealthController
openCloseEvents: 0
openCloseWindow: 1
selectedToolbar: 0
_isDead: 1
_currentHealth: 0
isImmortal: 0
fillHealthOnStart: 1
_maxHealth: 100
_healthRecovery: 0
_healthRecoveryDelay: 0
checkHealthEvents: []
_onStartReceiveDamage:
m_PersistentCalls:
m_Calls: []
_onReceiveDamage:
m_PersistentCalls:
m_Calls: []
_onDead:
m_PersistentCalls:
m_Calls: []
onChangeHealth:
m_PersistentCalls:
m_Calls: []
onResetHealth:
m_PersistentCalls:
m_Calls: []

View File

@@ -88,6 +88,7 @@ GameObject:
- component: {fileID: 7721795325225879236}
- component: {fileID: 1194338186308686302}
- component: {fileID: 1620994605374968907}
- component: {fileID: 3045503552244378433}
m_Layer: 5
m_Name: Canvas
m_TagString: Untagged
@@ -102,7 +103,7 @@ RectTransform:
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3381350595760429543}
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalRotation: {x: 0, y: -1, z: 0, w: 0}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
@@ -110,7 +111,7 @@ RectTransform:
- {fileID: 6775114823217050358}
- {fileID: 2685789783496722106}
m_Father: {fileID: 6442306242859885696}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_LocalEulerAnglesHint: {x: 0, y: -180, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 0, y: 0}
m_AnchoredPosition: {x: 0, y: 2.09}
@@ -191,6 +192,21 @@ CanvasGroup:
m_Interactable: 1
m_BlocksRaycasts: 1
m_IgnoreParentGroups: 0
--- !u!114 &3045503552244378433
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3381350595760429543}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: ea510cea4b9ed1547ae4725a2ded949a, type: 3}
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::Hallucinate.UI.ChatBubble
textDisplay: {fileID: 4454520411962799200}
canvasGroup: {fileID: 1620994605374968907}
bubbleRect: {fileID: 6775114823217050358}
--- !u!1 &5687887011233860168
GameObject:
m_ObjectHideFlags: 0
@@ -219,7 +235,7 @@ Transform:
m_GameObject: {fileID: 5687887011233860168}
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0.041, y: 1.5, z: -0.007}
m_LocalPosition: {x: 0.041, y: 1.5, z: 0.595}
m_LocalScale: {x: 0.05, y: 0.05, z: 0.05}
m_ConstrainProportionsScale: 1
m_Children: []
@@ -299,10 +315,10 @@ BoxCollider:
m_LayerOverridePriority: 0
m_IsTrigger: 0
m_ProvidesContacts: 0
m_Enabled: 1
m_Enabled: 0
serializedVersion: 3
m_Size: {x: 1, y: 1, z: 1}
m_Center: {x: 0, y: 0, z: 0}
m_Size: {x: 1, y: 1, z: 1.2136346}
m_Center: {x: 0, y: 0, z: -0.106817186}
--- !u!1 &6192986059782212342
GameObject:
m_ObjectHideFlags: 0
@@ -452,10 +468,14 @@ GameObject:
- component: {fileID: 8272839718325411334}
- component: {fileID: 5770331367975928816}
- component: {fileID: 4112854993683970537}
- component: {fileID: 3240800621832008763}
- component: {fileID: 8239948856752686218}
- component: {fileID: 6469822191588635990}
- component: {fileID: 9027690817715396964}
- component: {fileID: 2252266660326254214}
- component: {fileID: 4329414276869835007}
m_Layer: 0
m_Name: xNPC
m_TagString: Untagged
m_TagString: Enemy
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
@@ -491,26 +511,40 @@ MonoBehaviour:
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::EnemyAI
player: {fileID: 0}
viewAngle: 90
viewRadius: 20
targetLayerMask:
serializedVersion: 2
m_Bits: 0
obstacleLayerMask:
serializedVersion: 2
m_Bits: 0
patrolPoints: []
moveSpeed: 3
chaseSpeed: 5
moveSpeed: 5
rotateSpeed: 20
patrolWaitTime: 2
patrolSpeed: 2
patrolRadius: 100
playerHasArtifact: 0
isAggroedBySound: 0
laserPrefab: {fileID: 3965388737199864462, guid: fbec2b501d70daa4c9cb481ba53fc0b8, type: 3}
firePoint: {fileID: 5863061020199015852}
minShootDelay: 1
maxShootDelay: 3
rotateSpeed: 50
dodgeForce: 8
maxShootDelay: 5
dodgeForce: 3
dodgeDuration: 0.5
dodgeCooldown: 3
dodgeCooldown: 2
isPanicking: 0
isEnraged: 0
panicHealthThreshold: 40
regenRate: 2
regenDelay: 2
minStrafeDuration: 0.5
maxStrafeDuration: 2.2
maxSpreadAngle: 10
burstInterval: 0.12
approachWeight: 0.35
minCombatDistance: 5
npcName: Guard
persona: You are a grumpy guard protecting gold.
talkRange: 5
talkCooldown: 30
isTalking: 0
suspicionLevel: 0
investigationThreshold: 30
alertNeighborsThreshold: 70
alertRange: 20
--- !u!195 &5770331367975928816
NavMeshAgent:
m_ObjectHideFlags: 0
@@ -560,7 +594,7 @@ Rigidbody:
m_Interpolate: 0
m_Constraints: 112
m_CollisionDetection: 0
--- !u!114 &3240800621832008763
--- !u!114 &8239948856752686218
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
@@ -569,12 +603,113 @@ MonoBehaviour:
m_GameObject: {fileID: 7522161431095319480}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: ea510cea4b9ed1547ae4725a2ded949a, type: 3}
m_Script: {fileID: 11500000, guid: 210b37cfe4a84a34a91d0a9e58856a60, type: 3}
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::Hallucinate.UI.ChatBubble
textDisplay: {fileID: 4454520411962799200}
canvasGroup: {fileID: 1620994605374968907}
bubbleRect: {fileID: 6775114823217050358}
m_EditorClassIdentifier: Assembly-CSharp::FieldOfView
viewAngle: 90
viewRadius: 20
obstacleLayerMask:
serializedVersion: 2
m_Bits: 128
targetLayerMask:
serializedVersion: 2
m_Bits: 256
canSeePlayer: 0
lastKnownPlayerPosition: {x: 0, y: 0, z: 0}
--- !u!114 &6469822191588635990
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 7522161431095319480}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 35bba55c2a743d042ab1fff35e29db50, type: 3}
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::AnimatorAI
forceGrounded: 1
movementBoost: 1.5
dampTime: 0.1
--- !u!136 &9027690817715396964
CapsuleCollider:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 7522161431095319480}
m_Material: {fileID: 0}
m_IncludeLayers:
serializedVersion: 2
m_Bits: 0
m_ExcludeLayers:
serializedVersion: 2
m_Bits: 0
m_LayerOverridePriority: 0
m_IsTrigger: 1
m_ProvidesContacts: 0
m_Enabled: 1
serializedVersion: 2
m_Radius: 0.4324358
m_Height: 1.8474874
m_Direction: 1
m_Center: {x: 0, y: 0.92911196, z: 0.11156863}
--- !u!114 &2252266660326254214
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 7522161431095319480}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: f56a83ea88140fa4f869bb2f7ffdb184, type: 3}
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::Invector.vHealthController
openCloseEvents: 0
openCloseWindow: 1
selectedToolbar: 0
_isDead: 1
_currentHealth: 0
isImmortal: 0
fillHealthOnStart: 1
_maxHealth: 100
_healthRecovery: 0
_healthRecoveryDelay: 0
checkHealthEvents: []
_onStartReceiveDamage:
m_PersistentCalls:
m_Calls: []
_onReceiveDamage:
m_PersistentCalls:
m_Calls: []
_onDead:
m_PersistentCalls:
m_Calls: []
onChangeHealth:
m_PersistentCalls:
m_Calls: []
onResetHealth:
m_PersistentCalls:
m_Calls: []
--- !u!114 &4329414276869835007
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 7522161431095319480}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 9d3efef3ad62cd548b0f85eb11858ed1, type: 3}
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::Invector.vHitDamageParticle
openCloseEvents: 0
openCloseWindow: 1
selectedToolbar: 0
defaultDamageEffects:
- {fileID: 120346, guid: b8f2fe1ee1a01724cb72f5b0e6bd2eef, type: 3}
customDamageEffects: []
--- !u!1001 &7561534673732472622
PrefabInstance:
m_ObjectHideFlags: 0
@@ -601,7 +736,7 @@ PrefabInstance:
objectReference: {fileID: 0}
- target: {fileID: 400132, guid: f32cd9f795c1282478d3bc3fbd8b2831, type: 3}
propertyPath: m_LocalRotation.w
value: 0
value: 1
objectReference: {fileID: 0}
- target: {fileID: 400132, guid: f32cd9f795c1282478d3bc3fbd8b2831, type: 3}
propertyPath: m_LocalRotation.x
@@ -609,7 +744,7 @@ PrefabInstance:
objectReference: {fileID: 0}
- target: {fileID: 400132, guid: f32cd9f795c1282478d3bc3fbd8b2831, type: 3}
propertyPath: m_LocalRotation.y
value: -1
value: 0
objectReference: {fileID: 0}
- target: {fileID: 400132, guid: f32cd9f795c1282478d3bc3fbd8b2831, type: 3}
propertyPath: m_LocalRotation.z
@@ -621,7 +756,7 @@ PrefabInstance:
objectReference: {fileID: 0}
- target: {fileID: 400132, guid: f32cd9f795c1282478d3bc3fbd8b2831, type: 3}
propertyPath: m_LocalEulerAnglesHint.y
value: -180
value: 0
objectReference: {fileID: 0}
- target: {fileID: 400132, guid: f32cd9f795c1282478d3bc3fbd8b2831, type: 3}
propertyPath: m_LocalEulerAnglesHint.z
@@ -630,18 +765,18 @@ PrefabInstance:
- target: {fileID: 9500000, guid: f32cd9f795c1282478d3bc3fbd8b2831, type: 3}
propertyPath: m_Avatar
value:
objectReference: {fileID: 9000000, guid: 340f99b8334a14c4a8a01dce6e1e5348, type: 3}
objectReference: {fileID: 9000000, guid: f32cd9f795c1282478d3bc3fbd8b2831, type: 3}
- target: {fileID: 9500000, guid: f32cd9f795c1282478d3bc3fbd8b2831, type: 3}
propertyPath: m_Controller
value:
objectReference: {fileID: 9100000, guid: 87885946b43e2d1449e1d5aa2042f8a8, type: 2}
- target: {fileID: 9500000, guid: f32cd9f795c1282478d3bc3fbd8b2831, type: 3}
propertyPath: m_UpdateMode
value: 1
value: 0
objectReference: {fileID: 0}
- target: {fileID: 9500000, guid: f32cd9f795c1282478d3bc3fbd8b2831, type: 3}
propertyPath: m_AnimatePhysics
value: 1
value: 0
objectReference: {fileID: 0}
m_RemovedComponents: []
m_RemovedGameObjects: []

View File

@@ -4197,6 +4197,11 @@ MonoBehaviour:
_spawnParticle: 1
_spawnStepMark: 1
_useTriggerEnter: 1
emitAINoise: 1
aiNoiseRange: 10
npcLayer:
serializedVersion: 2
m_Bits: 0
leftFootTrigger: {fileID: 11408204}
rightFootTrigger: {fileID: 11477308}
currentStep: {fileID: 0}

File diff suppressed because it is too large Load Diff

View File

@@ -27,12 +27,13 @@ Transform:
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1178214796800900241}
serializedVersion: 2
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: 0, y: 0.076, z: 0.124}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 1804537267582578112}
m_RootOrder: 2
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!135 &1178214796804358001
SphereCollider:
@@ -42,9 +43,17 @@ SphereCollider:
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1178214796800900241}
m_Material: {fileID: 0}
m_IncludeLayers:
serializedVersion: 2
m_Bits: 0
m_ExcludeLayers:
serializedVersion: 2
m_Bits: 0
m_LayerOverridePriority: 0
m_IsTrigger: 1
m_ProvidesContacts: 0
m_Enabled: 1
serializedVersion: 2
serializedVersion: 3
m_Radius: 0.5
m_Center: {x: 0, y: 0, z: 0}
--- !u!114 &1178214796806424509
@@ -83,6 +92,7 @@ MonoBehaviour:
inputDelay: 0.1
playAnimationWhileHoldingButton: 1
doubleButtomTime: 0.25
canDoAction: 1
actionName: Action
actionTag: Action
disableOnStart: 0
@@ -96,6 +106,7 @@ MonoBehaviour:
customCameraState: Default
playAnimation:
crossFadeTransition: 0.25
animatorLayer: 0
endActionManualy: 0
endExitTimeAnimation: 0.8
animatorActionState: 0
@@ -238,6 +249,7 @@ MonoBehaviour:
m_PersistentCalls:
m_Calls:
- m_Target: {fileID: 1178214796800926091}
m_TargetAssemblyTypeName:
m_MethodName: SetActive
m_Mode: 6
m_Arguments:
@@ -252,6 +264,7 @@ MonoBehaviour:
m_PersistentCalls:
m_Calls:
- m_Target: {fileID: 1178214796800926091}
m_TargetAssemblyTypeName:
m_MethodName: SetActive
m_Mode: 6
m_Arguments:
@@ -262,6 +275,9 @@ MonoBehaviour:
m_StringArgument:
m_BoolArgument: 0
m_CallState: 2
OnCancelAction:
m_PersistentCalls:
m_Calls: []
targetEquipPoint:
twoHandWeapon: 1
weapon: {fileID: 1804537267582261728}
@@ -271,6 +287,7 @@ MonoBehaviour:
m_PersistentCalls:
m_Calls:
- m_Target: {fileID: 1178214796800926091}
m_TargetAssemblyTypeName:
m_MethodName: SetActive
m_Mode: 6
m_Arguments:
@@ -282,6 +299,7 @@ MonoBehaviour:
m_BoolArgument: 0
m_CallState: 2
- m_Target: {fileID: 1830727322889391579}
m_TargetAssemblyTypeName:
m_MethodName: set_enabled
m_Mode: 6
m_Arguments:
@@ -296,6 +314,7 @@ MonoBehaviour:
m_PersistentCalls:
m_Calls:
- m_Target: {fileID: 1830727322889391579}
m_TargetAssemblyTypeName:
m_MethodName: set_enabled
m_Mode: 6
m_Arguments:
@@ -344,6 +363,7 @@ MonoBehaviour:
m_PersistentCalls:
m_Calls:
- m_Target: {fileID: 8342309185592125983}
m_TargetAssemblyTypeName:
m_MethodName: SetActive
m_Mode: 6
m_Arguments:
@@ -355,6 +375,7 @@ MonoBehaviour:
m_BoolArgument: 0
m_CallState: 2
- m_Target: {fileID: 1770855500603019112}
m_TargetAssemblyTypeName:
m_MethodName: InstantiateObject
m_Mode: 1
m_Arguments:
@@ -371,6 +392,7 @@ MonoBehaviour:
m_PersistentCalls:
m_Calls:
- m_Target: {fileID: 8342309185592125983}
m_TargetAssemblyTypeName:
m_MethodName: SetActive
m_Mode: 6
m_Arguments:
@@ -387,6 +409,7 @@ MonoBehaviour:
m_PersistentCalls:
m_Calls:
- m_Target: {fileID: 0}
m_TargetAssemblyTypeName:
m_MethodName: SetActive
m_Mode: 6
m_Arguments:
@@ -425,9 +448,9 @@ RectTransform:
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 1178214796814376033}
m_RootOrder: 2
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0.5}
m_AnchorMax: {x: 0, y: 0.5}
@@ -457,6 +480,7 @@ MonoBehaviour:
m_Material: {fileID: 2100000, guid: a33be1e1efa8ca14286b77d062313a4e, type: 2}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
@@ -502,10 +526,10 @@ RectTransform:
m_LocalRotation: {x: -0, y: -0, z: -0.2619354, w: 0.9650854}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 0.0013280489, y: 0.0013280488, z: 0.0013280488}
m_ConstrainProportionsScale: 0
m_Children:
- {fileID: 1178214796814376033}
m_Father: {fileID: 1804537267582578112}
m_RootOrder: 1
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 0, y: 0}
@@ -529,7 +553,9 @@ Canvas:
m_OverrideSorting: 0
m_OverridePixelPerfect: 0
m_SortingBucketNormalizedSize: 0
m_VertexColorAlwaysGammaSpace: 0
m_AdditionalShaderChannelsFlag: 25
m_UpdateRectTransformForStandalone: 0
m_SortingLayerID: 0
m_SortingOrder: 0
m_TargetDisplay: 0
@@ -555,6 +581,7 @@ MonoBehaviour:
m_FallbackScreenDPI: 96
m_DefaultSpriteDPI: 96
m_DynamicPixelsPerUnit: 1
m_PresetInfoIsWorld: 0
--- !u!114 &1178214796806402205
MonoBehaviour:
m_ObjectHideFlags: 0
@@ -636,9 +663,9 @@ RectTransform:
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 1178214796814376033}
m_RootOrder: 0
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 1}
@@ -668,6 +695,7 @@ MonoBehaviour:
m_Material: {fileID: 2100000, guid: a33be1e1efa8ca14286b77d062313a4e, type: 2}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
@@ -715,12 +743,12 @@ RectTransform:
m_LocalRotation: {x: 0, y: -1, z: 0, w: 0.00000041723246}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children:
- {fileID: 1178214796814260335}
- {fileID: 1178214796814260911}
- {fileID: 1178214796814384871}
m_Father: {fileID: 1178214796814369163}
m_RootOrder: 0
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 1}
@@ -750,6 +778,7 @@ MonoBehaviour:
m_Material: {fileID: 2100000, guid: a33be1e1efa8ca14286b77d062313a4e, type: 2}
m_Color: {r: 0, g: 0, b: 0, a: 0.627451}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
@@ -780,6 +809,7 @@ MonoBehaviour:
m_PersistentCalls:
m_Calls:
- m_Target: {fileID: 1178214796800906329}
m_TargetAssemblyTypeName:
m_MethodName: SetActive
m_Mode: 6
m_Arguments:
@@ -791,6 +821,7 @@ MonoBehaviour:
m_BoolArgument: 0
m_CallState: 2
- m_Target: {fileID: 1178214796801013577}
m_TargetAssemblyTypeName:
m_MethodName: SetActive
m_Mode: 6
m_Arguments:
@@ -808,6 +839,7 @@ MonoBehaviour:
m_PersistentCalls:
m_Calls:
- m_Target: {fileID: 1178214796800906329}
m_TargetAssemblyTypeName:
m_MethodName: SetActive
m_Mode: 6
m_Arguments:
@@ -819,6 +851,7 @@ MonoBehaviour:
m_BoolArgument: 1
m_CallState: 2
- m_Target: {fileID: 1178214796801013577}
m_TargetAssemblyTypeName:
m_MethodName: SetActive
m_Mode: 6
m_Arguments:
@@ -857,9 +890,9 @@ RectTransform:
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 1178214796814376033}
m_RootOrder: 1
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0.5}
m_AnchorMax: {x: 0, y: 0.5}
@@ -889,6 +922,7 @@ MonoBehaviour:
m_Material: {fileID: 2100000, guid: a33be1e1efa8ca14286b77d062313a4e, type: 2}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
@@ -903,40 +937,12 @@ MonoBehaviour:
m_FillOrigin: 0
m_UseSpriteMesh: 0
m_PixelsPerUnitMultiplier: 1
--- !u!54 &5753856815630206312
Rigidbody:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1804537267582261728}
serializedVersion: 2
m_Mass: 1
m_Drag: 0
m_AngularDrag: 0.05
m_UseGravity: 1
m_IsKinematic: 0
m_Interpolate: 0
m_Constraints: 0
m_CollisionDetection: 0
--- !u!65 &6470183431665213616
BoxCollider:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1804537267582261728}
m_Material: {fileID: 13400000, guid: c77abc477d4de2a4197e1f08cebc364e, type: 2}
m_IsTrigger: 0
m_Enabled: 1
serializedVersion: 2
m_Size: {x: 0.11955705, y: 0.17964685, z: 0.85108244}
m_Center: {x: -0.0013062507, y: 0.054864466, z: 0.13716096}
--- !u!1001 &1804537267582149120
PrefabInstance:
m_ObjectHideFlags: 0
serializedVersion: 2
m_Modification:
serializedVersion: 3
m_TransformParent: {fileID: 0}
m_Modifications:
- target: {fileID: 130016, guid: 95173cd142940384c81611787936f938, type: 3}
@@ -991,20 +997,32 @@ PrefabInstance:
propertyPath: m_LocalEulerAnglesHint.z
value: 0
objectReference: {fileID: 0}
- target: {fileID: 11429992, guid: 95173cd142940384c81611787936f938, type: 3}
propertyPath: selectedToolbar
value: 2
objectReference: {fileID: 0}
m_RemovedComponents:
- {fileID: 114382262437889658, guid: 95173cd142940384c81611787936f938, type: 3}
- {fileID: 3978637271864031997, guid: 95173cd142940384c81611787936f938, type: 3}
m_RemovedGameObjects: []
m_AddedGameObjects:
- targetCorrespondingSourceObject: {fileID: 430016, guid: 95173cd142940384c81611787936f938, type: 3}
insertIndex: -1
addedObject: {fileID: 1178214796814369163}
- targetCorrespondingSourceObject: {fileID: 430016, guid: 95173cd142940384c81611787936f938, type: 3}
insertIndex: -1
addedObject: {fileID: 1178214796800604863}
m_AddedComponents:
- targetCorrespondingSourceObject: {fileID: 130016, guid: 95173cd142940384c81611787936f938, type: 3}
insertIndex: -1
addedObject: {fileID: 5753856815630206312}
- targetCorrespondingSourceObject: {fileID: 130016, guid: 95173cd142940384c81611787936f938, type: 3}
insertIndex: -1
addedObject: {fileID: 6470183431665213616}
m_SourcePrefab: {fileID: 100100000, guid: 95173cd142940384c81611787936f938, type: 3}
--- !u!4 &1804537267582578112 stripped
Transform:
m_CorrespondingSourceObject: {fileID: 430016, guid: 95173cd142940384c81611787936f938,
type: 3}
m_PrefabInstance: {fileID: 1804537267582149120}
m_PrefabAsset: {fileID: 0}
--- !u!114 &1770855500603019112 stripped
MonoBehaviour:
m_CorrespondingSourceObject: {fileID: 114937068035861864, guid: 95173cd142940384c81611787936f938,
type: 3}
m_CorrespondingSourceObject: {fileID: 114937068035861864, guid: 95173cd142940384c81611787936f938, type: 3}
m_PrefabInstance: {fileID: 1804537267582149120}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
@@ -1013,15 +1031,66 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: de8c6f6fb33efc547afa68f68e220d74, type: 3}
m_Name:
m_EditorClassIdentifier:
--- !u!1 &8342309185592125983 stripped
GameObject:
m_CorrespondingSourceObject: {fileID: 7696325297335060511, guid: 95173cd142940384c81611787936f938,
type: 3}
m_PrefabInstance: {fileID: 1804537267582149120}
m_PrefabAsset: {fileID: 0}
--- !u!1 &1804537267582261728 stripped
GameObject:
m_CorrespondingSourceObject: {fileID: 130016, guid: 95173cd142940384c81611787936f938,
type: 3}
m_CorrespondingSourceObject: {fileID: 130016, guid: 95173cd142940384c81611787936f938, type: 3}
m_PrefabInstance: {fileID: 1804537267582149120}
m_PrefabAsset: {fileID: 0}
--- !u!54 &5753856815630206312
Rigidbody:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1804537267582261728}
serializedVersion: 5
m_Mass: 1
m_LinearDamping: 0
m_AngularDamping: 0.05
m_CenterOfMass: {x: 0, y: 0, z: 0}
m_InertiaTensor: {x: 1, y: 1, z: 1}
m_InertiaRotation: {x: 0, y: 0, z: 0, w: 1}
m_IncludeLayers:
serializedVersion: 2
m_Bits: 0
m_ExcludeLayers:
serializedVersion: 2
m_Bits: 0
m_ImplicitCom: 1
m_ImplicitTensor: 1
m_UseGravity: 1
m_IsKinematic: 0
m_Interpolate: 0
m_Constraints: 0
m_CollisionDetection: 0
--- !u!65 &6470183431665213616
BoxCollider:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1804537267582261728}
m_Material: {fileID: 13400000, guid: c77abc477d4de2a4197e1f08cebc364e, type: 2}
m_IncludeLayers:
serializedVersion: 2
m_Bits: 0
m_ExcludeLayers:
serializedVersion: 2
m_Bits: 0
m_LayerOverridePriority: 0
m_IsTrigger: 0
m_ProvidesContacts: 0
m_Enabled: 1
serializedVersion: 3
m_Size: {x: 0.11955705, y: 0.17964685, z: 0.85108244}
m_Center: {x: -0.0013062507, y: 0.054864466, z: 0.13716096}
--- !u!4 &1804537267582578112 stripped
Transform:
m_CorrespondingSourceObject: {fileID: 430016, guid: 95173cd142940384c81611787936f938, type: 3}
m_PrefabInstance: {fileID: 1804537267582149120}
m_PrefabAsset: {fileID: 0}
--- !u!1 &8342309185592125983 stripped
GameObject:
m_CorrespondingSourceObject: {fileID: 7696325297335060511, guid: 95173cd142940384c81611787936f938, type: 3}
m_PrefabInstance: {fileID: 1804537267582149120}
m_PrefabAsset: {fileID: 0}

View File

@@ -1,34 +1,5 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!54 &4054124028099797856
Rigidbody:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4881589711078705830}
serializedVersion: 2
m_Mass: 1
m_Drag: 0
m_AngularDrag: 0.05
m_UseGravity: 1
m_IsKinematic: 0
m_Interpolate: 0
m_Constraints: 0
m_CollisionDetection: 0
--- !u!65 &7941838468431302446
BoxCollider:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4881589711078705830}
m_Material: {fileID: 13400000, guid: c77abc477d4de2a4197e1f08cebc364e, type: 2}
m_IsTrigger: 0
m_Enabled: 1
serializedVersion: 2
m_Size: {x: 0.12160286, y: 0.2082051, z: 0.32264447}
m_Center: {x: 0.021650568, y: 0.006185949, z: 0.103613794}
--- !u!1 &7903731139681717537
GameObject:
m_ObjectHideFlags: 0
@@ -55,12 +26,13 @@ Transform:
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 7903731139681717537}
serializedVersion: 2
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: 0, y: 0.056, z: 0.087}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 4881589711078555334}
m_RootOrder: 2
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!135 &7903731139668604497
SphereCollider:
@@ -70,9 +42,17 @@ SphereCollider:
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 7903731139681717537}
m_Material: {fileID: 0}
m_IncludeLayers:
serializedVersion: 2
m_Bits: 0
m_ExcludeLayers:
serializedVersion: 2
m_Bits: 0
m_LayerOverridePriority: 0
m_IsTrigger: 1
m_ProvidesContacts: 0
m_Enabled: 1
serializedVersion: 2
serializedVersion: 3
m_Radius: 0.5
m_Center: {x: 0, y: 0, z: 0}
--- !u!114 &7903731139670676279
@@ -111,6 +91,7 @@ MonoBehaviour:
inputDelay: 0.1
playAnimationWhileHoldingButton: 1
doubleButtomTime: 0.25
canDoAction: 1
actionName: Action
actionTag: Action
disableOnStart: 0
@@ -124,6 +105,7 @@ MonoBehaviour:
customCameraState: Default
playAnimation:
crossFadeTransition: 0.25
animatorLayer: 0
endActionManualy: 0
endExitTimeAnimation: 0.8
animatorActionState: 0
@@ -266,6 +248,7 @@ MonoBehaviour:
m_PersistentCalls:
m_Calls:
- m_Target: {fileID: 7903731139681943551}
m_TargetAssemblyTypeName:
m_MethodName: SetActive
m_Mode: 6
m_Arguments:
@@ -280,6 +263,7 @@ MonoBehaviour:
m_PersistentCalls:
m_Calls:
- m_Target: {fileID: 7903731139681943551}
m_TargetAssemblyTypeName:
m_MethodName: SetActive
m_Mode: 6
m_Arguments:
@@ -290,6 +274,9 @@ MonoBehaviour:
m_StringArgument:
m_BoolArgument: 0
m_CallState: 2
OnCancelAction:
m_PersistentCalls:
m_Calls: []
targetEquipPoint:
twoHandWeapon: 1
weapon: {fileID: 4881589711078705830}
@@ -299,6 +286,7 @@ MonoBehaviour:
m_PersistentCalls:
m_Calls:
- m_Target: {fileID: 7903731139681943551}
m_TargetAssemblyTypeName:
m_MethodName: SetActive
m_Mode: 6
m_Arguments:
@@ -356,12 +344,12 @@ RectTransform:
m_LocalRotation: {x: 0, y: -1, z: 0, w: 0.00000041723246}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children:
- {fileID: 7903731139695343497}
- {fileID: 7903731139695326533}
- {fileID: 7903731139695282545}
m_Father: {fileID: 7903731139695313889}
m_RootOrder: 0
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 1}
@@ -391,6 +379,7 @@ MonoBehaviour:
m_Material: {fileID: 2100000, guid: a33be1e1efa8ca14286b77d062313a4e, type: 2}
m_Color: {r: 0, g: 0, b: 0, a: 0.627451}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
@@ -421,6 +410,7 @@ MonoBehaviour:
m_PersistentCalls:
m_Calls:
- m_Target: {fileID: 7903731139681958997}
m_TargetAssemblyTypeName:
m_MethodName: SetActive
m_Mode: 6
m_Arguments:
@@ -432,6 +422,7 @@ MonoBehaviour:
m_BoolArgument: 0
m_CallState: 2
- m_Target: {fileID: 7903731139681936937}
m_TargetAssemblyTypeName:
m_MethodName: SetActive
m_Mode: 6
m_Arguments:
@@ -449,6 +440,7 @@ MonoBehaviour:
m_PersistentCalls:
m_Calls:
- m_Target: {fileID: 7903731139681958997}
m_TargetAssemblyTypeName:
m_MethodName: SetActive
m_Mode: 6
m_Arguments:
@@ -460,6 +452,7 @@ MonoBehaviour:
m_BoolArgument: 1
m_CallState: 2
- m_Target: {fileID: 7903731139681936937}
m_TargetAssemblyTypeName:
m_MethodName: SetActive
m_Mode: 6
m_Arguments:
@@ -498,9 +491,9 @@ RectTransform:
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 7903731139695298027}
m_RootOrder: 0
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 1}
@@ -530,6 +523,7 @@ MonoBehaviour:
m_Material: {fileID: 2100000, guid: a33be1e1efa8ca14286b77d062313a4e, type: 2}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
@@ -576,9 +570,9 @@ RectTransform:
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 7903731139695298027}
m_RootOrder: 1
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0.5}
m_AnchorMax: {x: 0, y: 0.5}
@@ -608,6 +602,7 @@ MonoBehaviour:
m_Material: {fileID: 2100000, guid: a33be1e1efa8ca14286b77d062313a4e, type: 2}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
@@ -653,10 +648,10 @@ RectTransform:
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 0.0013280489, y: 0.0013280488, z: 0.0013280488}
m_ConstrainProportionsScale: 0
m_Children:
- {fileID: 7903731139695298027}
m_Father: {fileID: 4881589711078555334}
m_RootOrder: 1
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 0, y: 0}
@@ -680,7 +675,9 @@ Canvas:
m_OverrideSorting: 0
m_OverridePixelPerfect: 0
m_SortingBucketNormalizedSize: 0
m_VertexColorAlwaysGammaSpace: 0
m_AdditionalShaderChannelsFlag: 25
m_UpdateRectTransformForStandalone: 0
m_SortingLayerID: 0
m_SortingOrder: 0
m_TargetDisplay: 0
@@ -706,6 +703,7 @@ MonoBehaviour:
m_FallbackScreenDPI: 96
m_DefaultSpriteDPI: 96
m_DynamicPixelsPerUnit: 1
m_PresetInfoIsWorld: 0
--- !u!114 &7903731139670638581
MonoBehaviour:
m_ObjectHideFlags: 0
@@ -787,9 +785,9 @@ RectTransform:
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 7903731139695298027}
m_RootOrder: 2
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0.5}
m_AnchorMax: {x: 0, y: 0.5}
@@ -819,6 +817,7 @@ MonoBehaviour:
m_Material: {fileID: 2100000, guid: a33be1e1efa8ca14286b77d062313a4e, type: 2}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
@@ -838,6 +837,7 @@ PrefabInstance:
m_ObjectHideFlags: 0
serializedVersion: 2
m_Modification:
serializedVersion: 3
m_TransformParent: {fileID: 0}
m_Modifications:
- target: {fileID: 170828, guid: a0ef3c70b27799d409935f45a6537bb0, type: 3}
@@ -892,19 +892,88 @@ PrefabInstance:
propertyPath: m_LocalEulerAnglesHint.z
value: 0
objectReference: {fileID: 0}
- target: {fileID: 11470846, guid: a0ef3c70b27799d409935f45a6537bb0, type: 3}
propertyPath: hitLayer.m_Bits
value: 4294967295
objectReference: {fileID: 0}
- target: {fileID: 11470846, guid: a0ef3c70b27799d409935f45a6537bb0, type: 3}
propertyPath: selectedToolbar
value: 2
objectReference: {fileID: 0}
m_RemovedComponents:
- {fileID: 114790386807353386, guid: a0ef3c70b27799d409935f45a6537bb0, type: 3}
- {fileID: 114554122684540132, guid: a0ef3c70b27799d409935f45a6537bb0, type: 3}
m_RemovedGameObjects: []
m_AddedGameObjects:
- targetCorrespondingSourceObject: {fileID: 470828, guid: a0ef3c70b27799d409935f45a6537bb0, type: 3}
insertIndex: -1
addedObject: {fileID: 7903731139695313889}
- targetCorrespondingSourceObject: {fileID: 470828, guid: a0ef3c70b27799d409935f45a6537bb0, type: 3}
insertIndex: -1
addedObject: {fileID: 7903731139681598825}
m_AddedComponents:
- targetCorrespondingSourceObject: {fileID: 170828, guid: a0ef3c70b27799d409935f45a6537bb0, type: 3}
insertIndex: -1
addedObject: {fileID: 4054124028099797856}
- targetCorrespondingSourceObject: {fileID: 170828, guid: a0ef3c70b27799d409935f45a6537bb0, type: 3}
insertIndex: -1
addedObject: {fileID: 7941838468431302446}
m_SourcePrefab: {fileID: 100100000, guid: a0ef3c70b27799d409935f45a6537bb0, type: 3}
--- !u!4 &4881589711078555334 stripped
Transform:
m_CorrespondingSourceObject: {fileID: 470828, guid: a0ef3c70b27799d409935f45a6537bb0,
type: 3}
m_CorrespondingSourceObject: {fileID: 470828, guid: a0ef3c70b27799d409935f45a6537bb0, type: 3}
m_PrefabInstance: {fileID: 4881589711078871530}
m_PrefabAsset: {fileID: 0}
--- !u!1 &4881589711078705830 stripped
GameObject:
m_CorrespondingSourceObject: {fileID: 170828, guid: a0ef3c70b27799d409935f45a6537bb0,
type: 3}
m_CorrespondingSourceObject: {fileID: 170828, guid: a0ef3c70b27799d409935f45a6537bb0, type: 3}
m_PrefabInstance: {fileID: 4881589711078871530}
m_PrefabAsset: {fileID: 0}
--- !u!54 &4054124028099797856
Rigidbody:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4881589711078705830}
serializedVersion: 5
m_Mass: 1
m_LinearDamping: 0
m_AngularDamping: 0.05
m_CenterOfMass: {x: 0, y: 0, z: 0}
m_InertiaTensor: {x: 1, y: 1, z: 1}
m_InertiaRotation: {x: 0, y: 0, z: 0, w: 1}
m_IncludeLayers:
serializedVersion: 2
m_Bits: 0
m_ExcludeLayers:
serializedVersion: 2
m_Bits: 0
m_ImplicitCom: 1
m_ImplicitTensor: 1
m_UseGravity: 1
m_IsKinematic: 0
m_Interpolate: 0
m_Constraints: 0
m_CollisionDetection: 0
--- !u!65 &7941838468431302446
BoxCollider:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4881589711078705830}
m_Material: {fileID: 13400000, guid: c77abc477d4de2a4197e1f08cebc364e, type: 2}
m_IncludeLayers:
serializedVersion: 2
m_Bits: 0
m_ExcludeLayers:
serializedVersion: 2
m_Bits: 0
m_LayerOverridePriority: 0
m_IsTrigger: 0
m_ProvidesContacts: 0
m_Enabled: 1
serializedVersion: 3
m_Size: {x: 0.12160286, y: 0.2082051, z: 0.32264447}
m_Center: {x: 0.021650568, y: 0.006185949, z: 0.103613794}

View File

@@ -25,12 +25,13 @@ Transform:
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 105388}
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0.049999997, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 422732}
m_RootOrder: 0
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!33 &3302298
MeshFilter:
@@ -51,10 +52,17 @@ MeshRenderer:
m_CastShadows: 1
m_ReceiveShadows: 1
m_DynamicOccludee: 1
m_StaticShadowCaster: 0
m_MotionVectors: 1
m_LightProbeUsage: 1
m_ReflectionProbeUsage: 1
m_RayTracingMode: 2
m_RayTraceProcedural: 0
m_RayTracingAccelStructBuildFlagsOverride: 0
m_RayTracingAccelStructBuildFlags: 1
m_SmallMeshCulling: 1
m_ForceMeshLod: -1
m_MeshLodSelectionBias: 0
m_RenderingLayerMask: 1
m_RendererPriority: 0
m_Materials:
@@ -76,9 +84,12 @@ MeshRenderer:
m_AutoUVMaxDistance: 0.5
m_AutoUVMaxAngle: 89
m_LightmapParameters: {fileID: 0}
m_GlobalIlluminationMeshLod: 0
m_SortingLayerID: 0
m_SortingLayer: 0
m_SortingOrder: 0
m_MaskInteraction: 0
m_AdditionalVertexStreams: {fileID: 0}
--- !u!1 &115092
GameObject:
m_ObjectHideFlags: 0
@@ -105,16 +116,17 @@ Transform:
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 115092}
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0.59600043, y: 0.23841888, z: -5.476}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children:
- {fileID: 422732}
- {fileID: 480898}
- {fileID: 488976}
- {fileID: 22488062}
m_Father: {fileID: 0}
m_RootOrder: 0
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!136 &13688376
CapsuleCollider:
@@ -124,8 +136,17 @@ CapsuleCollider:
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 115092}
m_Material: {fileID: 0}
m_IncludeLayers:
serializedVersion: 2
m_Bits: 0
m_ExcludeLayers:
serializedVersion: 2
m_Bits: 0
m_LayerOverridePriority: 0
m_IsTrigger: 1
m_ProvidesContacts: 0
m_Enabled: 1
serializedVersion: 2
m_Radius: 0.35
m_Height: 1.08
m_Direction: 1
@@ -143,12 +164,13 @@ MonoBehaviour:
m_Name:
m_EditorClassIdentifier:
openCloseEvents: 0
openCloseWindow: 0
selectedToolbar: 0
openCloseWindow: 1
selectedToolbar: 4
inputType: 0
actionInput:
useInput: 1
isAxisInUse: 0
isUnityInput: 0
keyboard: E
keyboardAxis: 0
joystick: A
@@ -165,6 +187,7 @@ MonoBehaviour:
inputDelay: 0.1
playAnimationWhileHoldingButton: 1
doubleButtomTime: 0.25
canDoAction: 1
actionName: Action
actionTag: Action
disableOnStart: 0
@@ -177,11 +200,12 @@ MonoBehaviour:
destroyDelay: 0
customCameraState: Default
playAnimation:
crossFadeTransition: 0.25
animatorLayer: 0
endActionManualy: 0
endExitTimeAnimation: 0.8
animatorActionState: 0
resetAnimatorActionState: 1
useAnimatorMatchTarget: 1
matchTarget: {fileID: 0}
avatarTarget: 0
useLocalX: 0
@@ -285,10 +309,6 @@ MonoBehaviour:
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
matchPos: {x: 0, y: 0, z: 0}
matchRot: 0
startMatchTarget: 0
endMatchTarget: 0
onPressActionDelay: 0
OnPressActionInput:
m_PersistentCalls:
@@ -315,6 +335,7 @@ MonoBehaviour:
m_PersistentCalls:
m_Calls:
- m_Target: {fileID: 128644}
m_TargetAssemblyTypeName:
m_MethodName: SetActive
m_Mode: 6
m_Arguments:
@@ -332,6 +353,7 @@ MonoBehaviour:
m_PersistentCalls:
m_Calls:
- m_Target: {fileID: 128644}
m_TargetAssemblyTypeName:
m_MethodName: SetActive
m_Mode: 6
m_Arguments:
@@ -348,6 +370,9 @@ MonoBehaviour:
OnInvalidate:
m_PersistentCalls:
m_Calls: []
OnCancelAction:
m_PersistentCalls:
m_Calls: []
itemListData: {fileID: 11400000, guid: 1493f9d9326e8014494b8cb04de38f25, type: 2}
onCollectDelay: 0
textDelay: 0.25
@@ -400,12 +425,13 @@ Transform:
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 121230}
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 422732}
m_RootOrder: 1
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!33 &3398494
MeshFilter:
@@ -426,10 +452,17 @@ MeshRenderer:
m_CastShadows: 1
m_ReceiveShadows: 1
m_DynamicOccludee: 1
m_StaticShadowCaster: 0
m_MotionVectors: 1
m_LightProbeUsage: 1
m_ReflectionProbeUsage: 1
m_RayTracingMode: 2
m_RayTraceProcedural: 0
m_RayTracingAccelStructBuildFlagsOverride: 0
m_RayTracingAccelStructBuildFlags: 1
m_SmallMeshCulling: 1
m_ForceMeshLod: -1
m_MeshLodSelectionBias: 0
m_RenderingLayerMask: 1
m_RendererPriority: 0
m_Materials:
@@ -451,9 +484,12 @@ MeshRenderer:
m_AutoUVMaxDistance: 0.5
m_AutoUVMaxAngle: 89
m_LightmapParameters: {fileID: 0}
m_GlobalIlluminationMeshLod: 0
m_SortingLayerID: 0
m_SortingLayer: 0
m_SortingOrder: 0
m_MaskInteraction: 0
m_AdditionalVertexStreams: {fileID: 0}
--- !u!1 &127422
GameObject:
m_ObjectHideFlags: 0
@@ -479,12 +515,13 @@ Transform:
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 127422}
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0.049999997, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 488976}
m_RootOrder: 0
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!33 &3382610
MeshFilter:
@@ -505,10 +542,17 @@ MeshRenderer:
m_CastShadows: 1
m_ReceiveShadows: 1
m_DynamicOccludee: 1
m_StaticShadowCaster: 0
m_MotionVectors: 1
m_LightProbeUsage: 1
m_ReflectionProbeUsage: 1
m_RayTracingMode: 2
m_RayTraceProcedural: 0
m_RayTracingAccelStructBuildFlagsOverride: 0
m_RayTracingAccelStructBuildFlags: 1
m_SmallMeshCulling: 1
m_ForceMeshLod: -1
m_MeshLodSelectionBias: 0
m_RenderingLayerMask: 1
m_RendererPriority: 0
m_Materials:
@@ -530,9 +574,12 @@ MeshRenderer:
m_AutoUVMaxDistance: 0.5
m_AutoUVMaxAngle: 89
m_LightmapParameters: {fileID: 0}
m_GlobalIlluminationMeshLod: 0
m_SortingLayerID: 0
m_SortingLayer: 0
m_SortingOrder: 0
m_MaskInteraction: 0
m_AdditionalVertexStreams: {fileID: 0}
--- !u!1 &128644
GameObject:
m_ObjectHideFlags: 0
@@ -563,10 +610,10 @@ RectTransform:
m_LocalRotation: {x: 0, y: -1.4210853e-14, z: -0.0000003258414, w: -1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 0.000713446, y: 0.00071344554, z: 0.00071344554}
m_ConstrainProportionsScale: 0
m_Children:
- {fileID: 22482840}
m_Father: {fileID: 479482}
m_RootOrder: 3
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 0, y: 0}
@@ -590,7 +637,9 @@ Canvas:
m_OverrideSorting: 0
m_OverridePixelPerfect: 0
m_SortingBucketNormalizedSize: 0
m_VertexColorAlwaysGammaSpace: 0
m_AdditionalShaderChannelsFlag: 25
m_UpdateRectTransformForStandalone: 0
m_SortingLayerID: 0
m_SortingOrder: 0
m_TargetDisplay: 0
@@ -616,6 +665,7 @@ MonoBehaviour:
m_FallbackScreenDPI: 96
m_DefaultSpriteDPI: 96
m_DynamicPixelsPerUnit: 1
m_PresetInfoIsWorld: 0
--- !u!114 &11473088
MonoBehaviour:
m_ObjectHideFlags: 0
@@ -673,14 +723,15 @@ Transform:
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 128768}
serializedVersion: 2
m_LocalRotation: {x: 0, y: -0.707106, z: 0, w: 0.7071076}
m_LocalPosition: {x: -0.009500027, y: 0.51312, z: 0.013957024}
m_LocalScale: {x: 2.086288, y: 2.44284, z: 2.0862887}
m_ConstrainProportionsScale: 0
m_Children:
- {fileID: 492078}
- {fileID: 474350}
m_Father: {fileID: 479482}
m_RootOrder: 1
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1 &131120
GameObject:
@@ -705,14 +756,15 @@ Transform:
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 131120}
serializedVersion: 2
m_LocalRotation: {x: 0, y: -0.707106, z: 0, w: 0.7071076}
m_LocalPosition: {x: -0.00950098, y: 0.51312, z: -0.15503883}
m_LocalScale: {x: 2.086288, y: 2.44284, z: 2.0862887}
m_ConstrainProportionsScale: 0
m_Children:
- {fileID: 448248}
- {fileID: 450808}
m_Father: {fileID: 479482}
m_RootOrder: 0
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1 &139748
GameObject:
@@ -739,12 +791,13 @@ Transform:
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 139748}
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0.049999997, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 480898}
m_RootOrder: 0
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!33 &3373558
MeshFilter:
@@ -765,10 +818,17 @@ MeshRenderer:
m_CastShadows: 1
m_ReceiveShadows: 1
m_DynamicOccludee: 1
m_StaticShadowCaster: 0
m_MotionVectors: 1
m_LightProbeUsage: 1
m_ReflectionProbeUsage: 1
m_RayTracingMode: 2
m_RayTraceProcedural: 0
m_RayTracingAccelStructBuildFlagsOverride: 0
m_RayTracingAccelStructBuildFlags: 1
m_SmallMeshCulling: 1
m_ForceMeshLod: -1
m_MeshLodSelectionBias: 0
m_RenderingLayerMask: 1
m_RendererPriority: 0
m_Materials:
@@ -790,9 +850,12 @@ MeshRenderer:
m_AutoUVMaxDistance: 0.5
m_AutoUVMaxAngle: 89
m_LightmapParameters: {fileID: 0}
m_GlobalIlluminationMeshLod: 0
m_SortingLayerID: 0
m_SortingLayer: 0
m_SortingOrder: 0
m_MaskInteraction: 0
m_AdditionalVertexStreams: {fileID: 0}
--- !u!1 &152304
GameObject:
m_ObjectHideFlags: 0
@@ -818,12 +881,13 @@ Transform:
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 152304}
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 488976}
m_RootOrder: 1
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!33 &3344262
MeshFilter:
@@ -844,10 +908,17 @@ MeshRenderer:
m_CastShadows: 1
m_ReceiveShadows: 1
m_DynamicOccludee: 1
m_StaticShadowCaster: 0
m_MotionVectors: 1
m_LightProbeUsage: 1
m_ReflectionProbeUsage: 1
m_RayTracingMode: 2
m_RayTraceProcedural: 0
m_RayTracingAccelStructBuildFlagsOverride: 0
m_RayTracingAccelStructBuildFlags: 1
m_SmallMeshCulling: 1
m_ForceMeshLod: -1
m_MeshLodSelectionBias: 0
m_RenderingLayerMask: 1
m_RendererPriority: 0
m_Materials:
@@ -869,9 +940,12 @@ MeshRenderer:
m_AutoUVMaxDistance: 0.5
m_AutoUVMaxAngle: 89
m_LightmapParameters: {fileID: 0}
m_GlobalIlluminationMeshLod: 0
m_SortingLayerID: 0
m_SortingLayer: 0
m_SortingOrder: 0
m_MaskInteraction: 0
m_AdditionalVertexStreams: {fileID: 0}
--- !u!1 &154240
GameObject:
m_ObjectHideFlags: 0
@@ -900,9 +974,9 @@ RectTransform:
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 22482840}
m_RootOrder: 2
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0.5}
m_AnchorMax: {x: 0, y: 0.5}
@@ -932,6 +1006,7 @@ MonoBehaviour:
m_Material: {fileID: 2100000, guid: a33be1e1efa8ca14286b77d062313a4e, type: 2}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
@@ -971,12 +1046,13 @@ Transform:
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 164052}
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 480898}
m_RootOrder: 1
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!33 &3359494
MeshFilter:
@@ -997,10 +1073,17 @@ MeshRenderer:
m_CastShadows: 1
m_ReceiveShadows: 1
m_DynamicOccludee: 1
m_StaticShadowCaster: 0
m_MotionVectors: 1
m_LightProbeUsage: 1
m_ReflectionProbeUsage: 1
m_RayTracingMode: 2
m_RayTraceProcedural: 0
m_RayTracingAccelStructBuildFlagsOverride: 0
m_RayTracingAccelStructBuildFlags: 1
m_SmallMeshCulling: 1
m_ForceMeshLod: -1
m_MeshLodSelectionBias: 0
m_RenderingLayerMask: 1
m_RendererPriority: 0
m_Materials:
@@ -1022,9 +1105,12 @@ MeshRenderer:
m_AutoUVMaxDistance: 0.5
m_AutoUVMaxAngle: 89
m_LightmapParameters: {fileID: 0}
m_GlobalIlluminationMeshLod: 0
m_SortingLayerID: 0
m_SortingLayer: 0
m_SortingOrder: 0
m_MaskInteraction: 0
m_AdditionalVertexStreams: {fileID: 0}
--- !u!1 &164286
GameObject:
m_ObjectHideFlags: 0
@@ -1053,9 +1139,9 @@ RectTransform:
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 22482840}
m_RootOrder: 0
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 1}
@@ -1085,6 +1171,7 @@ MonoBehaviour:
m_Material: {fileID: 2100000, guid: a33be1e1efa8ca14286b77d062313a4e, type: 2}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
@@ -1132,12 +1219,12 @@ RectTransform:
m_LocalRotation: {x: -0.000000003090828, y: -1, z: -0.000000028749422, w: 0.00000044703478}
m_LocalPosition: {x: 0, y: 0, z: -0.0020311438}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children:
- {fileID: 22489296}
- {fileID: 22497104}
- {fileID: 22432168}
m_Father: {fileID: 22488062}
m_RootOrder: 0
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 1}
@@ -1167,6 +1254,7 @@ MonoBehaviour:
m_Material: {fileID: 2100000, guid: a33be1e1efa8ca14286b77d062313a4e, type: 2}
m_Color: {r: 0, g: 0, b: 0, a: 0.627451}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
@@ -1197,6 +1285,7 @@ MonoBehaviour:
m_PersistentCalls:
m_Calls:
- m_Target: {fileID: 154240}
m_TargetAssemblyTypeName:
m_MethodName: SetActive
m_Mode: 6
m_Arguments:
@@ -1208,6 +1297,7 @@ MonoBehaviour:
m_BoolArgument: 0
m_CallState: 2
- m_Target: {fileID: 196296}
m_TargetAssemblyTypeName:
m_MethodName: SetActive
m_Mode: 6
m_Arguments:
@@ -1225,6 +1315,7 @@ MonoBehaviour:
m_PersistentCalls:
m_Calls:
- m_Target: {fileID: 154240}
m_TargetAssemblyTypeName:
m_MethodName: SetActive
m_Mode: 6
m_Arguments:
@@ -1236,6 +1327,7 @@ MonoBehaviour:
m_BoolArgument: 1
m_CallState: 2
- m_Target: {fileID: 196296}
m_TargetAssemblyTypeName:
m_MethodName: SetActive
m_Mode: 6
m_Arguments:
@@ -1269,14 +1361,15 @@ Transform:
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 187208}
serializedVersion: 2
m_LocalRotation: {x: 0, y: -0.707106, z: 0, w: 0.7071076}
m_LocalPosition: {x: -0.009499073, y: 0.51312, z: 0.18504047}
m_LocalScale: {x: 2.086288, y: 2.44284, z: 2.0862887}
m_ConstrainProportionsScale: 0
m_Children:
- {fileID: 451406}
- {fileID: 438440}
m_Father: {fileID: 479482}
m_RootOrder: 2
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1 &196296
GameObject:
@@ -1306,9 +1399,9 @@ RectTransform:
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 22482840}
m_RootOrder: 1
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0.5}
m_AnchorMax: {x: 0, y: 0.5}
@@ -1338,6 +1431,7 @@ MonoBehaviour:
m_Material: {fileID: 2100000, guid: a33be1e1efa8ca14286b77d062313a4e, type: 2}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:

View File

@@ -31,7 +31,6 @@ RectTransform:
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 22430624}
m_RootOrder: 2
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0.5}
m_AnchorMax: {x: 0, y: 0.5}
@@ -101,13 +100,13 @@ Transform:
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 117034}
serializedVersion: 2
m_LocalRotation: {x: -0.2588187, y: 0, z: 0, w: 0.96592593}
m_LocalPosition: {x: -0.0133, y: 0.5573, z: -0.0121}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 405752}
m_RootOrder: 0
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!33 &3352832
MeshFilter:
@@ -134,6 +133,11 @@ MeshRenderer:
m_ReflectionProbeUsage: 1
m_RayTracingMode: 2
m_RayTraceProcedural: 0
m_RayTracingAccelStructBuildFlagsOverride: 0
m_RayTracingAccelStructBuildFlags: 1
m_SmallMeshCulling: 1
m_ForceMeshLod: -1
m_MeshLodSelectionBias: 0
m_RenderingLayerMask: 1
m_RendererPriority: 0
m_Materials:
@@ -156,9 +160,11 @@ MeshRenderer:
m_AutoUVMaxDistance: 0.5
m_AutoUVMaxAngle: 89
m_LightmapParameters: {fileID: 0}
m_GlobalIlluminationMeshLod: 0
m_SortingLayerID: 0
m_SortingLayer: 0
m_SortingOrder: 0
m_MaskInteraction: 0
m_AdditionalVertexStreams: {fileID: 0}
--- !u!1 &125278
GameObject:
@@ -194,7 +200,6 @@ RectTransform:
m_Children:
- {fileID: 22430624}
m_Father: {fileID: 405752}
m_RootOrder: 1
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 0, y: 0}
@@ -218,7 +223,9 @@ Canvas:
m_OverrideSorting: 0
m_OverridePixelPerfect: 0
m_SortingBucketNormalizedSize: 0
m_VertexColorAlwaysGammaSpace: 0
m_AdditionalShaderChannelsFlag: 25
m_UpdateRectTransformForStandalone: 0
m_SortingLayerID: 0
m_SortingOrder: 0
m_TargetDisplay: 0
@@ -310,7 +317,6 @@ RectTransform:
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 22430624}
m_RootOrder: 0
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 1}
@@ -390,7 +396,6 @@ RectTransform:
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 22430624}
m_RootOrder: 1
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0.5}
m_AnchorMax: {x: 0, y: 0.5}
@@ -470,7 +475,6 @@ RectTransform:
- {fileID: 22490896}
- {fileID: 22451678}
m_Father: {fileID: 22475414}
m_RootOrder: 0
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 1}
@@ -611,6 +615,7 @@ Transform:
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 199660}
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0.39214686, y: 0.2389014, z: -20.878284}
m_LocalScale: {x: 1, y: 1, z: 1}
@@ -619,7 +624,6 @@ Transform:
- {fileID: 463598}
- {fileID: 22475414}
m_Father: {fileID: 0}
m_RootOrder: 0
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!136 &13694850
CapsuleCollider:
@@ -629,8 +633,17 @@ CapsuleCollider:
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 199660}
m_Material: {fileID: 0}
m_IncludeLayers:
serializedVersion: 2
m_Bits: 0
m_ExcludeLayers:
serializedVersion: 2
m_Bits: 0
m_LayerOverridePriority: 0
m_IsTrigger: 1
m_ProvidesContacts: 0
m_Enabled: 1
serializedVersion: 2
m_Radius: 0.35
m_Height: 1.08
m_Direction: 1
@@ -648,8 +661,8 @@ MonoBehaviour:
m_Name:
m_EditorClassIdentifier:
openCloseEvents: 0
openCloseWindow: 0
selectedToolbar: 0
openCloseWindow: 1
selectedToolbar: 2
inputType: 0
actionInput:
useInput: 1
@@ -867,11 +880,15 @@ MonoBehaviour:
name:
amount: 1
attributes:
- name: 0
value: 1
- name: 2
value: 36
isOpen: 0
isBool: 0
changeAttributes: 0
- name: 6
value: 8
isOpen: 0
isBool: 0
changeAttributes: 1
autoEquip: 1
addToEquipArea: 1
indexArea: 0

View File

@@ -14,6 +14,7 @@ GameObject:
- component: {fileID: 411349647056113735}
- component: {fileID: 2417107839128453854}
- component: {fileID: 6433774282585127385}
- component: {fileID: -8021594009672363794}
m_Layer: 0
m_Name: "_LazerPr\u1ECDectile"
m_TagString: Untagged
@@ -31,8 +32,8 @@ Transform:
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0.69, z: 0.267}
m_LocalScale: {x: 0.1, y: 0.1, z: 0.1}
m_ConstrainProportionsScale: 0
m_LocalScale: {x: 0.05, y: 0.05, z: 0.05}
m_ConstrainProportionsScale: 1
m_Children: []
m_Father: {fileID: 0}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
@@ -108,7 +109,7 @@ SphereCollider:
serializedVersion: 2
m_Bits: 0
m_LayerOverridePriority: 0
m_IsTrigger: 0
m_IsTrigger: 1
m_ProvidesContacts: 0
m_Enabled: 1
serializedVersion: 3
@@ -245,5 +246,34 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: 4e4f602386d4d484ea7a2a3b0c19ac21, type: 3}
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::LaserProjectile
speed: 5
lifeTime: 5
speed: 70
lifeTime: 2
damageAmount: 10
hitSound: Laser_Hit
--- !u!54 &-8021594009672363794
Rigidbody:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3965388737199864462}
serializedVersion: 5
m_Mass: 1
m_LinearDamping: 0
m_AngularDamping: 0.05
m_CenterOfMass: {x: 0, y: 0, z: 0}
m_InertiaTensor: {x: 1, y: 1, z: 1}
m_InertiaRotation: {x: 0, y: 0, z: 0, w: 1}
m_IncludeLayers:
serializedVersion: 2
m_Bits: 0
m_ExcludeLayers:
serializedVersion: 2
m_Bits: 0
m_ImplicitCom: 1
m_ImplicitTensor: 1
m_UseGravity: 1
m_IsKinematic: 1
m_Interpolate: 0
m_Constraints: 112
m_CollisionDetection: 1

View File

@@ -17,27 +17,27 @@ MonoBehaviour:
Clip: {fileID: 8300000, guid: fecdee2673ce2f542a3db1a8b56d1571, type: 3}
DefaultVolume: 1
DefaultPitch: 1
MixerGroup: {fileID: 0}
MixerGroup: {fileID: 24300002, guid: a622ceda579315442bd0a82d6626974c, type: 2}
- Name: UI_Warning
Clip: {fileID: 8300000, guid: 32b49cf6b9e2e8e408663785554c3e75, type: 3}
DefaultVolume: 1
DefaultPitch: 1
MixerGroup: {fileID: 0}
MixerGroup: {fileID: 24300002, guid: a622ceda579315442bd0a82d6626974c, type: 2}
- Name: UI_Click
Clip: {fileID: 8300000, guid: 30f85fcee050492448db7f91217910b3, type: 3}
DefaultVolume: 1
DefaultPitch: 1
MixerGroup: {fileID: 0}
MixerGroup: {fileID: 24300002, guid: a622ceda579315442bd0a82d6626974c, type: 2}
- Name: Item_Pickup
Clip: {fileID: 8300000, guid: b1ae905972eed154497f5454b22ba711, type: 3}
DefaultVolume: 1
DefaultPitch: 1
MixerGroup: {fileID: 0}
MixerGroup: {fileID: 24300002, guid: a622ceda579315442bd0a82d6626974c, type: 2}
- Name: Enemy_Alert
Clip: {fileID: 8300000, guid: d5f9671eecb70364f8282999c81d8295, type: 3}
DefaultVolume: 1
DefaultPitch: 1
MixerGroup: {fileID: 0}
MixerGroup: {fileID: 24300002, guid: a622ceda579315442bd0a82d6626974c, type: 2}
- Name: Enemy_Shoot
Clip: {fileID: 8300000, guid: de0b7f47746d51f48b733b64b307540e, type: 3}
DefaultVolume: 1
@@ -47,14 +47,14 @@ MonoBehaviour:
Clip: {fileID: 8300000, guid: e14cb014b8c41bf4a98768f2e4b4c1d7, type: 3}
DefaultVolume: 1
DefaultPitch: 1
MixerGroup: {fileID: 0}
MixerGroup: {fileID: 24300002, guid: a622ceda579315442bd0a82d6626974c, type: 2}
- Name: NPC_Interact
Clip: {fileID: 8300000, guid: 6d36adcf33e186c4cbe64a4c149e138f, type: 3}
DefaultVolume: 1
DefaultPitch: 1
MixerGroup: {fileID: 0}
MixerGroup: {fileID: 24300002, guid: a622ceda579315442bd0a82d6626974c, type: 2}
- Name: NPC_Response
Clip: {fileID: 8300000, guid: 7c266b12aa7ed1a49bf7ea0889d32302, type: 3}
DefaultVolume: 1
DefaultPitch: 1
MixerGroup: {fileID: 0}
MixerGroup: {fileID: 24300002, guid: a622ceda579315442bd0a82d6626974c, type: 2}

View File

@@ -12,12 +12,6 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: 1adabc1ae49fd3c44a36cc9152ebb0f9, type: 3}
m_Name: Fragment Grenade
m_EditorClassIdentifier:
itemsToCraft:
- item: {fileID: 0}
amount: 3
- item: {fileID: 0}
amount: 1
price: 0
id: 26
description: Fragment Grenade
type: 0
@@ -27,8 +21,7 @@ MonoBehaviour:
maxStack: 6
amount: 0
originalObject: {fileID: 170736, guid: c221411e499bdd94f90413254abf7860, type: 3}
dropObject: {fileID: 4018256157275831458, guid: a04c9098c7a452447912f6c5069bd095,
type: 3}
dropObject: {fileID: 4018256157275831458, guid: a04c9098c7a452447912f6c5069bd095, type: 3}
attributes: []
isInEquipArea: 0
isEquiped: 0
@@ -58,12 +51,6 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: 1adabc1ae49fd3c44a36cc9152ebb0f9, type: 3}
m_Name: Molotov
m_EditorClassIdentifier:
itemsToCraft:
- item: {fileID: 0}
amount: 3
- item: {fileID: 0}
amount: 1
price: 0
id: 27
description: Molotov
type: 0
@@ -72,10 +59,8 @@ MonoBehaviour:
createNewItem: 1
maxStack: 6
amount: 0
originalObject: {fileID: 4687494058105681854, guid: 356e6f81e6f18534ba6b80a6d008642a,
type: 3}
dropObject: {fileID: 4018256157275831458, guid: c37d3b92b2a9da3468bc2a821919c0ca,
type: 3}
originalObject: {fileID: 4687494058105681854, guid: 356e6f81e6f18534ba6b80a6d008642a, type: 3}
dropObject: {fileID: 4018256157275831458, guid: c37d3b92b2a9da3468bc2a821919c0ca, type: 3}
attributes: []
isInEquipArea: 0
isEquiped: 0
@@ -150,8 +135,6 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: 1adabc1ae49fd3c44a36cc9152ebb0f9, type: 3}
m_Name: Sniper Ammo
m_EditorClassIdentifier:
itemsToCraft: []
price: 0
id: 19
description:
type: 3
@@ -191,8 +174,6 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: 1adabc1ae49fd3c44a36cc9152ebb0f9, type: 3}
m_Name: RPG Ammo
m_EditorClassIdentifier:
itemsToCraft: []
price: 0
id: 18
description:
type: 3
@@ -232,8 +213,6 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: 1adabc1ae49fd3c44a36cc9152ebb0f9, type: 3}
m_Name: Handgun Ammo
m_EditorClassIdentifier:
itemsToCraft: []
price: 0
id: 14
description:
type: 3
@@ -273,8 +252,6 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: 1adabc1ae49fd3c44a36cc9152ebb0f9, type: 3}
m_Name: RPG
m_EditorClassIdentifier:
itemsToCraft: []
price: 0
id: 16
description: Very destructive
type: 2
@@ -322,8 +299,6 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: 1adabc1ae49fd3c44a36cc9152ebb0f9, type: 3}
m_Name: Sniper
m_EditorClassIdentifier:
itemsToCraft: []
price: 0
id: 15
description: Attached with a scope
type: 2
@@ -371,8 +346,6 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: 1adabc1ae49fd3c44a36cc9152ebb0f9, type: 3}
m_Name: Shotgun Shells
m_EditorClassIdentifier:
itemsToCraft: []
price: 0
id: 17
description: Shotgun Ammo
type: 3
@@ -412,8 +385,6 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: 1adabc1ae49fd3c44a36cc9152ebb0f9, type: 3}
m_Name: Shotgun
m_EditorClassIdentifier:
itemsToCraft: []
price: 0
id: 12
description: Tactical Shotgun
type: 2
@@ -461,8 +432,6 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: 1adabc1ae49fd3c44a36cc9152ebb0f9, type: 3}
m_Name: Rifle Ammo
m_EditorClassIdentifier:
itemsToCraft: []
price: 0
id: 13
description:
type: 3
@@ -502,8 +471,6 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: 1adabc1ae49fd3c44a36cc9152ebb0f9, type: 3}
m_Name: Great Shield
m_EditorClassIdentifier:
itemsToCraft: []
price: 0
id: 9
description: 'Great Shield
@@ -516,10 +483,8 @@ MonoBehaviour:
createNewItem: 1
maxStack: 1
amount: 0
originalObject: {fileID: 1000012874595254, guid: d4ca9135af96d5142987a1f1427b099a,
type: 3}
dropObject: {fileID: 8587624101741613191, guid: e26f928aabf2af048b7def78ec83a486,
type: 3}
originalObject: {fileID: 1000012874595254, guid: d4ca9135af96d5142987a1f1427b099a, type: 3}
dropObject: {fileID: 8587624101741613191, guid: e26f928aabf2af048b7def78ec83a486, type: 3}
attributes:
- name: 3
value: 0
@@ -561,8 +526,6 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: 1adabc1ae49fd3c44a36cc9152ebb0f9, type: 3}
m_Name: Short Katana
m_EditorClassIdentifier:
itemsToCraft: []
price: 0
id: 1
description: Melee Weapon
type: 1
@@ -571,10 +534,8 @@ MonoBehaviour:
createNewItem: 1
maxStack: 1
amount: 0
originalObject: {fileID: 1000011247033104, guid: 43ec053b9c111644e80b4ddb5f535508,
type: 3}
dropObject: {fileID: 3314097323225006234, guid: 0f2c84cd3287333448744ce0451196cd,
type: 3}
originalObject: {fileID: 1000011247033104, guid: 43ec053b9c111644e80b4ddb5f535508, type: 3}
dropObject: {fileID: 3314097323225006234, guid: 0f2c84cd3287333448744ce0451196cd, type: 3}
attributes:
- name: 2
value: 25
@@ -620,8 +581,6 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: 1adabc1ae49fd3c44a36cc9152ebb0f9, type: 3}
m_Name: Great Sword
m_EditorClassIdentifier:
itemsToCraft: []
price: 0
id: 7
description: Melee Weapon
type: 1
@@ -630,10 +589,8 @@ MonoBehaviour:
createNewItem: 1
maxStack: 1
amount: 0
originalObject: {fileID: 1000014209087140, guid: d03b45803e637bb4fb00a1ca9030d66e,
type: 3}
dropObject: {fileID: 4500584118820961459, guid: eca1e51be6676704dbb7f23b4947883b,
type: 3}
originalObject: {fileID: 1000014209087140, guid: d03b45803e637bb4fb00a1ca9030d66e, type: 3}
dropObject: {fileID: 4500584118820961459, guid: eca1e51be6676704dbb7f23b4947883b, type: 3}
attributes:
- name: 2
value: 30
@@ -679,8 +636,6 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: 1adabc1ae49fd3c44a36cc9152ebb0f9, type: 3}
m_Name: Great Katana
m_EditorClassIdentifier:
itemsToCraft: []
price: 0
id: 8
description: Melee Weapon
type: 1
@@ -689,10 +644,8 @@ MonoBehaviour:
createNewItem: 1
maxStack: 1
amount: 0
originalObject: {fileID: 1000013423493360, guid: 6bbee781522ce5243a02bf72cd914cf5,
type: 3}
dropObject: {fileID: 2197774501603174495, guid: 7dcfb29ec0c968041b99dd41d13cec28,
type: 3}
originalObject: {fileID: 1000013423493360, guid: 6bbee781522ce5243a02bf72cd914cf5, type: 3}
dropObject: {fileID: 2197774501603174495, guid: 7dcfb29ec0c968041b99dd41d13cec28, type: 3}
attributes:
- name: 2
value: 25
@@ -738,8 +691,6 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: 1adabc1ae49fd3c44a36cc9152ebb0f9, type: 3}
m_Name: Assault Rifle
m_EditorClassIdentifier:
itemsToCraft: []
price: 0
id: 11
description: Attached with a Scope
type: 2
@@ -795,8 +746,6 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: 1adabc1ae49fd3c44a36cc9152ebb0f9, type: 3}
m_Name: Small Shield
m_EditorClassIdentifier:
itemsToCraft: []
price: 0
id: 6
description: 'Small Shield
@@ -807,10 +756,8 @@ MonoBehaviour:
createNewItem: 1
maxStack: 1
amount: 0
originalObject: {fileID: 1000010116632662, guid: 2232bbcc5a195274c9744c2c6352e910,
type: 3}
dropObject: {fileID: 862192267840601332, guid: d07ef1bfe3f5bf4469394a9c723bbbc1,
type: 3}
originalObject: {fileID: 1000010116632662, guid: 2232bbcc5a195274c9744c2c6352e910, type: 3}
dropObject: {fileID: 862192267840601332, guid: d07ef1bfe3f5bf4469394a9c723bbbc1, type: 3}
attributes:
- name: 3
value: 0
@@ -852,8 +799,6 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: 1adabc1ae49fd3c44a36cc9152ebb0f9, type: 3}
m_Name: Handgun
m_EditorClassIdentifier:
itemsToCraft: []
price: 0
id: 10
description: Semi-Automatic Pistol
type: 2
@@ -901,12 +846,6 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: 1adabc1ae49fd3c44a36cc9152ebb0f9, type: 3}
m_Name: Health Up Potion
m_EditorClassIdentifier:
itemsToCraft:
- item: {fileID: 0}
amount: 3
- item: {fileID: 0}
amount: 1
price: 0
id: 5
description: Increases the MaxHealth
type: 0
@@ -950,8 +889,6 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: 1adabc1ae49fd3c44a36cc9152ebb0f9, type: 3}
m_Name: Axe
m_EditorClassIdentifier:
itemsToCraft: []
price: 0
id: 0
description: Melee Weapon
type: 1
@@ -960,10 +897,8 @@ MonoBehaviour:
createNewItem: 1
maxStack: 1
amount: 0
originalObject: {fileID: 1000010725870802, guid: 0cf98a7633e41834ba19e8626f1ceadc,
type: 3}
dropObject: {fileID: 880292917891664030, guid: 4ce32edaf6024884898e95f24f9f763a,
type: 3}
originalObject: {fileID: 1000010725870802, guid: 0cf98a7633e41834ba19e8626f1ceadc, type: 3}
dropObject: {fileID: 880292917891664030, guid: 4ce32edaf6024884898e95f24f9f763a, type: 3}
attributes:
- name: 3
value: 35
@@ -1009,12 +944,6 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: 1adabc1ae49fd3c44a36cc9152ebb0f9, type: 3}
m_Name: Stamina Up Potion
m_EditorClassIdentifier:
itemsToCraft:
- item: {fileID: 0}
amount: 1
- item: {fileID: 0}
amount: 3
price: 0
id: 4
description: Increases the MaxStamina
type: 0
@@ -1058,8 +987,6 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: 1adabc1ae49fd3c44a36cc9152ebb0f9, type: 3}
m_Name: Short Sword
m_EditorClassIdentifier:
itemsToCraft: []
price: 0
id: 3
description: Melee Weapon
type: 1
@@ -1068,10 +995,8 @@ MonoBehaviour:
createNewItem: 1
maxStack: 1
amount: 0
originalObject: {fileID: 1000012884940116, guid: 5dc53aa14e78ec54fbf2281c1abb7f47,
type: 3}
dropObject: {fileID: 819158048279699071, guid: 0f25b0bc9b7934840b324072cedb3325,
type: 3}
originalObject: {fileID: 1000012884940116, guid: 5dc53aa14e78ec54fbf2281c1abb7f47, type: 3}
dropObject: {fileID: 819158048279699071, guid: 0f25b0bc9b7934840b324072cedb3325, type: 3}
attributes:
- name: 2
value: 15
@@ -1117,12 +1042,6 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: 1adabc1ae49fd3c44a36cc9152ebb0f9, type: 3}
m_Name: Health Potion
m_EditorClassIdentifier:
itemsToCraft:
- item: {fileID: 0}
amount: 3
- item: {fileID: 0}
amount: 1
price: 0
id: 2
description: Recover Health
type: 0
@@ -1166,8 +1085,6 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: 1adabc1ae49fd3c44a36cc9152ebb0f9, type: 3}
m_Name: vRifle Shooter Edition
m_EditorClassIdentifier:
itemsToCraft: []
price: 0
id: 22
description: Special Edition attached with Grenade Launcher
type: 2
@@ -1176,8 +1093,7 @@ MonoBehaviour:
createNewItem: 1
maxStack: 1
amount: 0
originalObject: {fileID: 1262530654451378, guid: 33cb40cfd0904344d8306765a5600135,
type: 3}
originalObject: {fileID: 1262530654451378, guid: 33cb40cfd0904344d8306765a5600135, type: 3}
dropObject: {fileID: 1530631430177172, guid: 1e6c72f3eacde6c4fa1f5824e22ce56c, type: 3}
attributes:
- name: 2
@@ -1224,8 +1140,6 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: 1adabc1ae49fd3c44a36cc9152ebb0f9, type: 3}
m_Name: KeyCard Red
m_EditorClassIdentifier:
itemsToCraft: []
price: 0
id: 23
description: Open Red Doors
type: 0
@@ -1265,8 +1179,6 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: 1adabc1ae49fd3c44a36cc9152ebb0f9, type: 3}
m_Name: Dual Swords
m_EditorClassIdentifier:
itemsToCraft: []
price: 0
id: 24
description: Melee Weapon
type: 1
@@ -1275,10 +1187,8 @@ MonoBehaviour:
createNewItem: 1
maxStack: 1
amount: 0
originalObject: {fileID: 1000012884940116, guid: f0df66e0950da4642afce9f6382ab231,
type: 3}
dropObject: {fileID: 5960025752436353048, guid: 25e7bf6c702446e47bbc7ce3a6aaaeb5,
type: 3}
originalObject: {fileID: 1000012884940116, guid: f0df66e0950da4642afce9f6382ab231, type: 3}
dropObject: {fileID: 5960025752436353048, guid: 25e7bf6c702446e47bbc7ce3a6aaaeb5, type: 3}
attributes:
- name: 2
value: 10
@@ -1324,8 +1234,6 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: 1adabc1ae49fd3c44a36cc9152ebb0f9, type: 3}
m_Name: Arrows
m_EditorClassIdentifier:
itemsToCraft: []
price: 0
id: 21
description: Arrows to use with Bow
type: 3
@@ -1365,8 +1273,6 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: 1adabc1ae49fd3c44a36cc9152ebb0f9, type: 3}
m_Name: vBow
m_EditorClassIdentifier:
itemsToCraft: []
price: 0
id: 20
description: Bow and Arrow
type: 4
@@ -1375,8 +1281,7 @@ MonoBehaviour:
createNewItem: 0
maxStack: 1
amount: 0
originalObject: {fileID: 1112735122421166, guid: adec6ca436555694f9b67251716d6768,
type: 3}
originalObject: {fileID: 1112735122421166, guid: adec6ca436555694f9b67251716d6768, type: 3}
dropObject: {fileID: 1000012655258636, guid: cf28841817afdab4c8060f470a322c37, type: 3}
attributes:
- name: 6
@@ -1411,8 +1316,6 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: 1adabc1ae49fd3c44a36cc9152ebb0f9, type: 3}
m_Name: Buletproof Vest
m_EditorClassIdentifier:
itemsToCraft: []
price: 0
id: 25
description: Buletproof Vest
type: 6
@@ -1452,12 +1355,6 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: 1adabc1ae49fd3c44a36cc9152ebb0f9, type: 3}
m_Name: Smoke Grenade
m_EditorClassIdentifier:
itemsToCraft:
- item: {fileID: 0}
amount: 3
- item: {fileID: 0}
amount: 1
price: 0
id: 28
description: Smoke Grenade
type: 0
@@ -1466,10 +1363,8 @@ MonoBehaviour:
createNewItem: 1
maxStack: 6
amount: 0
originalObject: {fileID: 2275447201054405111, guid: e82c600a04131f842b97ae50bebfd25d,
type: 3}
dropObject: {fileID: 4018256157275831458, guid: 83a0af047816b1e44b48e9b37982ccba,
type: 3}
originalObject: {fileID: 2275447201054405111, guid: e82c600a04131f842b97ae50bebfd25d, type: 3}
dropObject: {fileID: 4018256157275831458, guid: 83a0af047816b1e44b48e9b37982ccba, type: 3}
attributes: []
isInEquipArea: 0
isEquiped: 0
@@ -1499,12 +1394,6 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: 1adabc1ae49fd3c44a36cc9152ebb0f9, type: 3}
m_Name: Stun Grenade
m_EditorClassIdentifier:
itemsToCraft:
- item: {fileID: 0}
amount: 3
- item: {fileID: 0}
amount: 1
price: 0
id: 29
description: Stun Grenade
type: 0
@@ -1513,10 +1402,8 @@ MonoBehaviour:
createNewItem: 1
maxStack: 6
amount: 0
originalObject: {fileID: 2275447201054405111, guid: df29a1ce804661b4d91e53c7c6e7e384,
type: 3}
dropObject: {fileID: 4018256157275831458, guid: 092023529ae5aa0488c373ee62d54549,
type: 3}
originalObject: {fileID: 2275447201054405111, guid: df29a1ce804661b4d91e53c7c6e7e384, type: 3}
dropObject: {fileID: 4018256157275831458, guid: 092023529ae5aa0488c373ee62d54549, type: 3}
attributes: []
isInEquipArea: 0
isEquiped: 0

File diff suppressed because one or more lines are too long

View File

@@ -1,16 +1,163 @@
using UnityEngine;
using UnityEngine.AI;
using Invector;
using Invector.vEventSystems;
using System.Collections;
using System.Collections.Generic;
public class AnimatorAI : MonoBehaviour
public class AnimatorAI : MonoBehaviour, vIAnimatorStateInfoController
{
// Start is called once before the first execution of Update after the MonoBehaviour is created
void Start()
protected Animator animator;
protected NavMeshAgent agent;
protected vHealthController healthController;
protected EnemyAI enemyAI;
protected KamikazeAI kamikazeAI;
[Header("Force Settings")]
public bool forceGrounded = true;
public float movementBoost = 1.2f;
public float dampTime = 0.1f;
public vAnimatorStateInfos animatorStateInfos { get; protected set; }
#region Animator Parameters
protected vAnimatorParameter isDead, isGrounded, isStrafing, isSprinting, isAiming;
protected vAnimatorParameter verticalVelocity, horizontalVelocity, inputMagnitude;
protected vAnimatorParameter groundDistance, moveSet_ID, attackID, triggerReaction, resetState;
#endregion
protected Vector3 lastPosition;
protected float currentV, currentH, currentMagnitude, calculatedSpeed;
protected virtual void Awake()
{
animator = GetComponentInChildren<Animator>();
if (animator == null) animator = GetComponentInParent<Animator>();
agent = GetComponent<NavMeshAgent>();
if (agent == null) agent = GetComponentInParent<NavMeshAgent>();
healthController = GetComponentInChildren<vHealthController>();
enemyAI = GetComponent<EnemyAI>();
kamikazeAI = GetComponent<KamikazeAI>();
if (animator)
{
animator.applyRootMotion = false;
animator.updateMode = AnimatorUpdateMode.Normal;
// Reset all layers initially to prevent T-Pose
for (int i = 1; i < animator.layerCount; i++) animator.SetLayerWeight(i, 0f);
animatorStateInfos = new vAnimatorStateInfos(animator);
InitializeParameters();
Debug.Log($"<color=green>[AnimSystem]</color> Đã kích hoạt trên {gameObject.name}");
}
lastPosition = transform.position;
}
// Update is called once per frame
void Update()
protected virtual void OnEnable() { this.Register(); }
protected virtual void OnDisable() { this.UnRegister(); }
protected virtual void InitializeParameters()
{
isDead = ValidateAndInit("isDead");
isGrounded = ValidateAndInit("isGrounded");
if (!isGrounded.isValid) isGrounded = ValidateAndInit("IsGrounded");
isStrafing = ValidateAndInit("IsStrafing");
isSprinting = ValidateAndInit("IsSprinting");
isAiming = ValidateAndInit("IsAiming");
verticalVelocity = ValidateAndInit("InputVertical");
horizontalVelocity = ValidateAndInit("InputHorizontal");
inputMagnitude = ValidateAndInit("InputMagnitude");
groundDistance = ValidateAndInit("GroundDistance");
moveSet_ID = ValidateAndInit("MoveSet_ID");
attackID = ValidateAndInit("AttackID");
triggerReaction = ValidateAndInit("TriggerReaction");
resetState = ValidateAndInit("ResetState");
}
private vAnimatorParameter ValidateAndInit(string pName) => new vAnimatorParameter(animator, pName);
protected virtual void Update()
{
if (animator == null || agent == null) return;
UpdateMovementParameters();
UpdateCombatParameters();
}
protected virtual void UpdateMovementParameters()
{
SetBool(isGrounded, forceGrounded);
SetFloat(groundDistance, 0f);
Vector3 delta = transform.position - lastPosition;
calculatedSpeed = delta.magnitude / Time.deltaTime;
lastPosition = transform.position;
Vector3 localVel = transform.InverseTransformDirection(delta / Time.deltaTime);
float maxS = (enemyAI) ? enemyAI.moveSpeed : (kamikazeAI ? agent.speed : 3f);
if (maxS <= 0) maxS = 3f;
float targetV = (localVel.z / maxS) * movementBoost;
float targetH = (localVel.x / maxS) * movementBoost;
currentV = Mathf.Lerp(currentV, targetV, 10f * Time.deltaTime);
currentH = Mathf.Lerp(currentH, targetH, 10f * Time.deltaTime);
currentMagnitude = new Vector2(currentH, currentV).magnitude;
// ÉP GIÁ TRỊ VÀO ANIMATOR
SetFloat(verticalVelocity, currentV);
SetFloat(horizontalVelocity, currentH);
SetFloat(inputMagnitude, currentMagnitude);
}
protected virtual void UpdateCombatParameters()
{
// 1. Kiểm tra trạng thái AI
bool isShooting = (enemyAI && enemyAI.IsShootingBurst);
bool hasArtifact = (enemyAI && enemyAI.playerHasArtifact);
// 2. Cập nhật MoveSet và Aiming
SetInt(moveSet_ID, hasArtifact ? 1 : 0);
SetBool(isAiming, hasArtifact);
SetBool(isStrafing, hasArtifact);
// 3. Xử lý BẮN SÚNG (Layer 6 trong Animator của bạn)
if (isShooting)
{
// Bật Layer bắn súng lên 1 (Smooth)
animator.SetLayerWeight(6, Mathf.Lerp(animator.GetLayerWeight(6), 1f, 15f * Time.deltaTime));
SetInt(attackID, 1); // Kích hoạt animation bắn trong Blend Tree của Layer 6
}
else
{
// Tắt Layer bắn súng về 0
animator.SetLayerWeight(6, Mathf.Lerp(animator.GetLayerWeight(6), 0f, 10f * Time.deltaTime));
SetInt(attackID, 0);
}
if (enemyAI && enemyAI.IsDodging) SetAnimatorTrigger(triggerReaction);
}
#region Helpers
protected void SetBool(vAnimatorParameter p, bool v) { if (p.isValid) animator.SetBool(p, v); }
protected void SetFloat(vAnimatorParameter p, float v) { if (p.isValid) animator.SetFloat(p, v, dampTime, Time.deltaTime); }
protected void SetInt(vAnimatorParameter p, int v) { if (p.isValid) animator.SetInteger(p, v); }
public void SetAnimatorTrigger(vAnimatorParameter trigger)
{
if (trigger.isValid) StartCoroutine(SetTriggerRoutine(trigger));
}
private IEnumerator SetTriggerRoutine(int targetHash)
{
animator.SetTrigger(targetHash);
yield return new WaitForSeconds(0.1f);
animator.ResetTrigger(targetHash);
}
#endregion
}

View File

@@ -1,16 +1,47 @@
using Invector;
using UnityEngine;
public class AutoDestroy : MonoBehaviour
{
// Start is called once before the first execution of Update after the MonoBehaviour is created
public int damageAmount = 30;
void Start()
{
Destroy(gameObject,2f);
}
// Update is called once per frame
void Update()
private void OnTriggerEnter(Collider other)
{
// Debug: Log tên và tag của bất cứ thứ gì đạn chạm vào
Debug.Log(
$"Laser collided with: {other.name} | Tag: {other.tag} | Layer: {LayerMask.LayerToName(other.gameObject.layer)}");
// Kiểm tra nếu trúng Player
if (other.CompareTag("Player") || other.GetComponentInParent<vIHealthController>() != null)
{
var healthController = other.GetComponentInParent<vIHealthController>();
if (healthController != null)
{
Debug.Log(
$"<color=red>HIT PLAYER!</color> Found health controller on {healthController.gameObject.name}. Applying {damageAmount} damage.");
var damage = new vDamage(damageAmount);
damage.sender = transform;
damage.hitPosition = transform.position;
healthController.TakeDamage(damage);
}
// Luôn phá hủy đạn khi trúng Player
Impact();
}
}
private void Impact()
{
// Phá hủy đạn ngay lập tức
Destroy(gameObject);
}
}

View File

@@ -14,13 +14,19 @@ namespace Hallucinate.UI
private void Awake()
{
mainCameraTransform = Camera.main.transform;
canvasGroup.alpha = 0;
gameObject.SetActive(false);
if (canvasGroup != null) canvasGroup.alpha = 0;
// gameObject.SetActive(false); // Bỏ dòng này để tránh tắt nhầm NPC gốc
}
private void LateUpdate()
{
// Tìm Camera nếu chưa có (Tránh lỗi Null nếu Camera chưa spawn hoặc bị xóa)
if (mainCameraTransform == null)
{
if (Camera.main != null) mainCameraTransform = Camera.main.transform;
else return;
}
// Billboard effect
transform.LookAt(transform.position + mainCameraTransform.rotation * Vector3.forward, mainCameraTransform.rotation * Vector3.up);
}

View File

@@ -0,0 +1,133 @@
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
namespace Hallucinate.AI
{
public class ConversationManager : MonoBehaviour
{
public static ConversationManager Instance { get; private set; }
[Header("Settings")]
public int maxSimultaneousConversations = 3;
public float maxConversationDuration = 120f; // 2 minutes
private List<ConversationSession> activeSessions = new List<ConversationSession>();
private void Awake()
{
if (Instance == null) Instance = this;
else Destroy(gameObject);
}
public bool CanStartConversation()
{
return activeSessions.Count < maxSimultaneousConversations;
}
public void StartConversation(EnemyAI initiator, EnemyAI responder)
{
if (!CanStartConversation()) return;
ConversationSession session = new ConversationSession(initiator, responder, maxConversationDuration);
activeSessions.Add(session);
StartCoroutine(RunConversation(session));
}
private IEnumerator RunConversation(ConversationSession session)
{
Debug.Log($"<color=cyan>[ConvManager]</color> Starting: {session.initiator.npcName} & {session.responder.npcName}");
// Phase 1: Initiator speaks
bool phase1Complete = false;
session.RequestDialogue(session.initiator, (success) => phase1Complete = true);
float startTime = Time.time;
while (!phase1Complete && Time.time < startTime + 10f) yield return null;
if (phase1Complete && !session.isInterrupted)
{
yield return new WaitForSeconds(4f); // Reading time
// Phase 2: Responder speaks
bool phase2Complete = false;
session.RequestDialogue(session.responder, (success) => phase2Complete = true);
float phase2StartTime = Time.time;
while (!phase2Complete && Time.time < phase2StartTime + 10f) yield return null;
}
yield return new WaitForSeconds(4f);
EndConversation(session);
}
public void EndConversation(ConversationSession session)
{
if (activeSessions.Contains(session))
{
session.Cleanup();
activeSessions.Remove(session);
Debug.Log($"<color=cyan>[ConvManager]</color> Ended session. Active: {activeSessions.Count}");
}
}
public void InterruptConversation(EnemyAI npc)
{
ConversationSession session = activeSessions.Find(s => s.initiator == npc || s.responder == npc);
if (session != null)
{
session.isInterrupted = true;
EndConversation(session);
}
}
}
public class ConversationSession
{
public EnemyAI initiator;
public EnemyAI responder;
public float durationLimit;
public bool isInterrupted;
public ConversationSession(EnemyAI initiator, EnemyAI responder, float limit)
{
this.initiator = initiator;
this.responder = responder;
this.durationLimit = limit;
initiator.isTalking = true;
responder.isTalking = true;
// Set references for Gizmos and Facing
initiator.SetTalkingPartner(responder);
responder.SetTalkingPartner(initiator);
}
public void RequestDialogue(EnemyAI speaker, Action<bool> callback)
{
if (isInterrupted) { callback?.Invoke(false); return; }
EnemyAI listener = (speaker == initiator) ? responder : initiator;
// Face each other
speaker.FaceTarget(listener.transform.position);
listener.FaceTarget(speaker.transform.position);
string prompt = $"You are {speaker.npcName} talking to {listener.npcName}. Previous context: None. " +
"Keep it natural and short.";
GeminiService.Instance.GetResponse(speaker.persona, prompt, (json) => {
if (isInterrupted) { callback?.Invoke(false); return; }
speaker.ProcessDialogueResult(json);
callback?.Invoke(true);
});
}
public void Cleanup()
{
if (initiator != null) initiator.isTalking = false;
if (responder != null) responder.isTalking = false;
}
}
}

View File

@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: ebf63e5e8f429234b89a746833c4ca4e

View File

@@ -1,12 +1,28 @@
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;
using UnityEngine.AI;
using System.Linq;
using UnityEngine.InputSystem;
using Invector;
using Invector.vCharacterController;
using Random = UnityEngine.Random;
[Serializable]
public class DialogueResult
{
public string text;
public float speedMod;
public float suspicionMod;
public float aggressionMod; // Ảnh hưởng delay bắn (0.1 -> 1.0)
public float braveryMod; // Ảnh hưởng ngưỡng Panic
public float healthMod; // Hồi máu hoặc mất máu tâm lý
}
[RequireComponent(typeof(NavMeshAgent))]
[RequireComponent(typeof(Rigidbody))]
[RequireComponent(typeof(FieldOfView))]
[RequireComponent(typeof(vHealthController))]
public class EnemyAI : MonoBehaviour
{
[Header("References")]
@@ -14,229 +30,414 @@ public class EnemyAI : MonoBehaviour
private NavMeshAgent agent;
private Rigidbody rb;
private FieldOfView fov;
private Collider mainCollider;
private vHealthController health;
[Header("Movement & Rotation")]
[Header("Movement Settings")]
public float moveSpeed = 3f;
public float rotateSpeed = 50f;
public float rotateSpeed = 10f;
[Header("Patrol Waypoints")]
public Transform[] patrolPoints;
public float patrolWaitTime = 2f;
private int currentPatrolIndex = 0;
private float currentWaitTime;
[Header("Patrol Settings")]
public float patrolWaitTime = 2f;
private float currentWaitTime = 0f;
public float patrolSpeed = 2.5f;
public float patrolRadius = 12f;
private Vector3 startPosition;
[Header("Artifact State")]
[Header("Combat State")]
public bool playerHasArtifact;
[Header("Laser Weapon")]
public bool isAggroedBySound;
public GameObject laserPrefab;
public Transform firePoint;
public float minShootDelay = 1f;
public float maxShootDelay = 3f;
public float minShootDelay = 1.8f; // Tăng nhẹ delay để đỡ khó
public float maxShootDelay = 4.0f;
private float nextShootTime;
[Header("Conversation")]
[Header("Dodge Settings")]
public float dodgeForce = 8f;
public float dodgeDuration = 0.2f;
public float dodgeCooldown = 2.0f; // Tăng cooldown né đòn
private bool isDodging = false;
private float nextDodgeTime = 0f;
[Header("Advanced AI States")]
public bool isPanicking = false;
public bool isEnraged = false;
public float panicHealthThreshold = 50f; // Chạy ngược lại khi < 50% máu
public float regenRate = 1.5f;
public float regenDelay = 5f;
private float lastDamageTime;
[Header("Personality (Randomized)")]
private float personalApproachWeight;
private float personalMinCombatDistance;
private float personalBurstMax;
private float personalStrafeIntensity;
[Header("Artifact Combat Upgrades")]
public float minStrafeDuration = 0.5f;
public float maxStrafeDuration = 2.2f;
public float maxSpreadAngle = 7f;
public float burstInterval = 0.15f;
public float approachWeight = 0.35f;
public float minCombatDistance = 5.0f;
private float nextStrafeChangeTime;
private int strafeDirectionSign = 1;
private bool isShootingBurst = false;
public bool IsDodging => isDodging;
public bool IsShootingBurst => isShootingBurst;
[Header("Conversation Settings")]
public string npcName = "Guard";
public string persona = "You are a grumpy guard protecting gold.";
public float talkRange = 4f;
public float talkCooldown = 30f;
[TextArea] public string persona = "You are a bored security guard.";
public float talkRange = 12f;
public float talkCooldown = 60f;
private float lastTalkTime;
private bool isTalking;
public bool isTalking;
private EnemyAI talkingPartner;
private Hallucinate.UI.ChatBubble chatBubble;
[Header("Dodge Settings (Rigidbody)")]
public float dodgeForce = 8f;
public float dodgeDuration = 0.25f;
public float dodgeCooldown = 1.5f;
private bool isDodging = false;
private float nextDodgeTime;
[Header("Suspicion Settings")]
public float suspicionLevel = 0f;
public float investigationThreshold = 30f;
public float alertNeighborsThreshold = 70f;
public float alertRange = 30f;
public Node rootNode;
// Gốc của Cây hành vi
public Node behaviorTreeRoot;
private void Start()
void Start()
{
agent = GetComponent<NavMeshAgent>();
rb = GetComponent<Rigidbody>();
fov = GetComponent<FieldOfView>();
chatBubble = GetComponentInChildren<Hallucinate.UI.ChatBubble>(true);
mainCollider = GetComponent<Collider>();
health = GetComponent<vHealthController>();
agent.speed = moveSpeed;
// Tự động tìm tất cả điểm PatrolPoint trong Map
patrolPoints = GameObject.FindGameObjectsWithTag("PatrolPoint")
.Select(go => go.transform).ToArray();
// RANDOM TÍNH CÁCH
personalApproachWeight = Random.Range(0.2f, 0.7f);
personalMinCombatDistance = Random.Range(3f, 8f);
personalBurstMax = Random.Range(2, 5);
personalStrafeIntensity = Random.Range(0.5f, 1.5f);
// Cấu hình Rigidbody để không bị đổ ngã khi va chạm vật lý thông thường
rb.isKinematic = true;
rb.freezeRotation = true;
health.onReceiveDamage.AddListener(OnReceiveDamage);
health.onDead.AddListener(OnDead);
FindPlayer();
InitBehaviorTree();
}
private void Update()
{
if (player == null) FindPlayer();
// Thực thi cây hành vi liên tục mỗi khung hình
behaviorTreeRoot?.Evaluate();
}
private void FindPlayer()
{
GameObject playerObj = GameObject.FindGameObjectWithTag("Player");
if (playerObj != null) player = playerObj.transform;
}
private void InitBehaviorTree()
{
// Ưu tiên số 1: Kiểm tra và thực hiện né đòn
var dodgeNode = new TaskNode(CheckAndActionDodge);
// Ưu tiên số 2: Có cổ vật -> Đứng lại tập trung bắn hạ
var laserSequence = new Sequence(new List<Node>
if (gameObject.layer == LayerMask.NameToLayer("Default"))
{
new TaskNode(CheckHasArtifact),
new TaskNode(ActionFocusAndShoot)
});
// Ưu tiên số 3: Tương tác tầm nhìn (Đuổi theo hoặc Đi kiểm tra vết tích)
var trackingSelector = new Selector(new List<Node>
{
// Nhìn thấy trực tiếp -> dí theo
new Sequence(new List<Node> { new TaskNode(CheckCanSeePlayer), new TaskNode(ActionChasePlayer) }),
// Mất dấu -> đi đến vị trí cuối cùng để điều tra
new Sequence(new List<Node> { new TaskNode(CheckHasInvestigateTarget), new TaskNode(ActionInvestigate) })
});
// Ưu tiên số 4: Gần NPC khác -> nói chuyện (Mới)
var talkSequence = new Sequence(new List<Node>
{
new TaskNode(CheckCanTalkToNPC),
new TaskNode(ActionTalk)
});
// Ưu tiên số 5: Mặc định đi tuần tra vòng quanh Map
var patrolNode = new TaskNode(ActionPatrol);
// Tạo cây tổng hợp theo thứ tự ưu tiên từ trên xuống dưới
behaviorTreeRoot = new Selector(new List<Node>
{
dodgeNode,
laserSequence,
trackingSelector,
talkSequence,
patrolNode
});
}
#region CONDITIONS & COMPOSITE NODES
private NodeState CheckAndActionDodge()
{
if (isDodging) return NodeState.Running;
// ĐIỀU KIỆN NÉ: Phải nhìn thấy Player VÀ Player nhấn chuột trái VÀ hết cooldown né
if (fov.canSeePlayer && Input.GetMouseButtonDown(0) && Time.time >= nextDodgeTime)
{
StartCoroutine(DodgeRollRoutine());
nextDodgeTime = Time.time + dodgeCooldown;
return NodeState.Running;
int enemyLayer = LayerMask.NameToLayer("Enemy");
if (enemyLayer != -1)
{
gameObject.layer = enemyLayer;
Debug.Log($"[AI {npcName}] Đã chuyển sang Layer: Enemy");
}
else
{
Debug.LogWarning($"[AI {npcName}] CẢNH BÁO: Không tìm thấy Layer 'Enemy' trong Project! Hãy tạo Layer 'Enemy' để súng có thể bắn trúng.");
}
}
rb.isKinematic = true;
rb.freezeRotation = true;
startPosition = transform.position;
if (player == null)
{
GameObject playerObj = GameObject.FindGameObjectWithTag("Player");
if (playerObj != null) player = playerObj.transform;
}
InitTree();
}
void InitTree()
{
var dodgeSequence = new Sequence(new List<Node> { new TaskNode(CheckDodgeConditions), new TaskNode(ActionDodge) });
var panicSequence = new Sequence(new List<Node> { new TaskNode(CheckPanicConditions), new TaskNode(ActionRetreat) }); // Thay Panic bằng Retreat
var laserSequence = new Sequence(new List<Node> { new TaskNode(CheckCombatConditions), new TaskNode(ActionFocusAndShoot) });
var chaseSequence = new Sequence(new List<Node> { new TaskNode(CheckCanSeePlayer), new TaskNode(ActionChasePlayer) });
var investigateSequence = new Sequence(new List<Node> { new TaskNode(CheckHasInvestigateTarget), new TaskNode(ActionInvestigate) });
var talkSequence = new Sequence(new List<Node> { new TaskNode(CheckCanTalkToNPC), new TaskNode(ActionTalk) });
var patrolAction = new TaskNode(ActionPatrol);
rootNode = new Selector(new List<Node>
{
dodgeSequence,
panicSequence,
laserSequence,
chaseSequence,
investigateSequence,
talkSequence,
patrolAction
});
}
void Update()
{
if (player == null || health.isDead) return;
if (mainCollider != null && !mainCollider.enabled) mainCollider.enabled = true;
HandleHealthRegen();
suspicionLevel = Mathf.Max(0, suspicionLevel - Time.deltaTime * 0.5f);
if (suspicionLevel <= 0f && !isEnraged) isAggroedBySound = false;
if (!isTalking && !isDodging && !isPanicking && agent.isStopped)
agent.isStopped = false;
rootNode?.Evaluate();
}
private void HandleHealthRegen()
{
if (Time.time > lastDamageTime + regenDelay && health.currentHealth < health.maxHealth)
{
float currentRegenSpeed = regenRate;
float healthPercent = (float)health.currentHealth / health.maxHealth;
// Tăng tốc hồi máu khi máu cực thấp (< 25%)
if (healthPercent < 0.25f)
currentRegenSpeed *= 4f;
else if (healthPercent < 0.5f)
currentRegenSpeed *= 2f;
health.AddHealth((int)(currentRegenSpeed * Time.deltaTime));
}
}
#region HEALTH EVENTS
private void OnReceiveDamage(vDamage damage)
{
lastDamageTime = Time.time;
isAggroedBySound = true;
suspicionLevel = 100f;
StopConversation();
// PHẢN ỨNG TỨC THÌ: Alert toàn bộ lân cận
AlertNeighbors(damage.hitPosition);
// PHẢN ỨNG TỨC THÌ: Reset delay bắn để phản công nhanh hoặc né
nextShootTime = Time.time + 0.5f;
// Né đòn Elden Ring (Tăng tỉ lệ né khi trúng dame)
if (Time.time > nextDodgeTime && !isDodging && Random.value < 0.7f)
{
StartCoroutine(DodgeRollRoutine());
}
// Tự động Enrage nếu bị dồn vào đường cùng (nhưng đồng thời vẫn có thể bỏ chạy nếu không phẫn nộ)
if (health.currentHealth < health.maxHealth * 0.2f && !isEnraged)
{
EnterEnrageMode();
}
}
private void OnDead(GameObject killer)
{
Debug.Log($"<color=black>[AI {npcName}] DIED.</color>");
// 1. Vô hiệu hóa va chạm và di chuyển ngay lập tức
if (mainCollider != null) mainCollider.enabled = false;
agent.enabled = false;
// 2. Kích hoạt Enrage cho đồng đội xung quanh
Collider[] hitColliders = Physics.OverlapSphere(transform.position, alertRange);
foreach (var hit in hitColliders)
{
EnemyAI ally = hit.GetComponentInParent<EnemyAI>();
if (ally != null && ally != this) ally.EnterEnrageMode();
}
// 3. Tự hủy sau 3 giây (để kịp chạy animation chết hoặc hiệu ứng)
Destroy(gameObject, 3f);
this.enabled = false;
}
public void EnterEnrageMode()
{
if (isEnraged) return;
isEnraged = true;
isPanicking = false;
moveSpeed *= 1.3f; // Giảm nhẹ buff speed
minShootDelay *= 0.6f;
maxShootDelay *= 0.6f;
if (chatBubble != null) chatBubble.Show("I'LL TAKE YOU DOWN WITH ME!", 2f);
}
#endregion
#region CONDITIONS
private NodeState CheckDodgeConditions()
{
if (isDodging) return NodeState.Success;
// Tự né khi thấy Player đang bắn
if (fov != null && fov.canSeePlayer && Mouse.current.leftButton.isPressed && Time.time > nextDodgeTime)
return NodeState.Success;
return NodeState.Failure;
}
private NodeState CheckPanicConditions()
{
if (isEnraged) return NodeState.Failure; // Đang điên thì không sợ, chiến đến chết
// Nếu máu dưới ngưỡng thiết lập (ví dụ 50%), kích hoạt trạng thái tháo chạy
if (health.currentHealth < (health.maxHealth * (panicHealthThreshold / 100f)))
{
return NodeState.Success;
}
isPanicking = false;
return NodeState.Failure;
}
private NodeState CheckCombatConditions()
{
bool shouldCombat = playerHasArtifact || isAggroedBySound || isEnraged;
if (shouldCombat) StopConversation();
return shouldCombat ? NodeState.Success : NodeState.Failure;
}
private NodeState CheckCanSeePlayer()
{
bool canSee = fov != null && fov.canSeePlayer;
if (canSee) { StopConversation(); AlertNeighbors(transform.position); suspicionLevel = 100; }
return canSee ? NodeState.Success : NodeState.Failure;
}
private NodeState CheckHasInvestigateTarget()
{
if (fov != null && fov.lastKnownPlayerPosition != Vector3.zero && suspicionLevel > investigationThreshold)
return NodeState.Success;
return NodeState.Failure;
}
private NodeState CheckCanTalkToNPC()
{
if (playerHasArtifact || fov.canSeePlayer) return NodeState.Failure;
if (Time.time < lastTalkTime + talkCooldown) return NodeState.Failure;
if (isTalking) return NodeState.Success;
if (playerHasArtifact || isAggroedBySound || isEnraged || (fov != null && fov.canSeePlayer)) return NodeState.Failure;
if (Time.time < lastTalkTime + talkCooldown || isTalking) return NodeState.Failure;
if (Hallucinate.AI.ConversationManager.Instance == null || !Hallucinate.AI.ConversationManager.Instance.CanStartConversation()) return NodeState.Failure;
// Tìm NPC gần nhất
Collider[] hitColliders = Physics.OverlapSphere(transform.position, talkRange);
foreach (var hit in hitColliders)
{
if (hit.gameObject != gameObject && hit.CompareTag("Enemy"))
if (hit.gameObject == gameObject) continue;
EnemyAI other = hit.GetComponentInParent<EnemyAI>();
if (other != null && !other.isTalking && !other.isEnraged)
{
EnemyAI other = hit.GetComponent<EnemyAI>();
if (other != null && !other.isTalking && Time.time >= other.lastTalkTime + talkCooldown)
if (gameObject.GetInstanceID() < other.gameObject.GetInstanceID())
{
talkingPartner = other;
Hallucinate.AI.ConversationManager.Instance.StartConversation(this, other);
return NodeState.Success;
}
}
}
return NodeState.Failure;
}
private NodeState CheckHasArtifact()
{
if (playerHasArtifact) StopConversation();
return playerHasArtifact ? NodeState.Success : NodeState.Failure;
}
private NodeState CheckCanSeePlayer()
{
if (fov.canSeePlayer) StopConversation();
return fov.canSeePlayer ? NodeState.Success : NodeState.Failure;
}
private NodeState CheckHasInvestigateTarget()
{
return fov.lastKnownPlayerPosition != Vector3.zero ? NodeState.Success : NodeState.Failure;
}
#endregion
#region ACTIONS
// Coroutine xử lý né bằng lực đẩy Rigidbody một cách thực tế
private IEnumerator DodgeRollRoutine()
public void HearNoise(Vector3 location, float volume)
{
isDodging = true;
agent.enabled = false; // Tắt định vị NavMesh để nhường quyền cho Vật lý
rb.isKinematic = false; // Bật chế độ vật lý động để nhận lực lực đẩy
suspicionLevel += volume * 20f;
if (fov != null) fov.lastKnownPlayerPosition = location;
if (suspicionLevel >= investigationThreshold) isAggroedBySound = true;
if (suspicionLevel >= alertNeighborsThreshold) AlertNeighbors(location);
StopConversation();
}
// Tính toán hướng né: Vuông góc với hướng nhìn của Player (Tránh sang trái hoặc phải)
Vector3 directionToPlayer = (player.position - transform.position).normalized;
Vector3 perpendicularDir = new Vector3(-directionToPlayer.z, 0, directionToPlayer.x);
public void AlertNeighbors(Vector3 threatPos)
{
Collider[] hitColliders = Physics.OverlapSphere(transform.position, alertRange);
foreach (var hit in hitColliders)
{
EnemyAI neighbor = hit.GetComponentInParent<EnemyAI>();
if (neighbor != null && neighbor != this)
{
neighbor.TriggerCombatAlert(threatPos);
}
}
}
public void TriggerCombatAlert(Vector3 sourceLocation)
{
if (isEnraged) return;
suspicionLevel = 100f;
isAggroedBySound = true;
if (fov != null) fov.lastKnownPlayerPosition = sourceLocation;
StopConversation();
}
// Hành động tháo chạy khi máu thấp
private NodeState ActionRetreat()
{
isPanicking = true;
agent.isStopped = false;
agent.speed = moveSpeed * 1.3f; // Chạy nhanh hơn bình thường để thoát thân
// Chọn ngẫu nhiên trái hoặc phải
Vector3 dodgeDirection = (Random.Range(0, 2) == 0 ? perpendicularDir : -perpendicularDir).normalized;
// Tính toán hướng ngược lại với Player
Vector3 retreatDir = (transform.position - player.position).normalized;
Vector3 targetPos = transform.position + retreatDir * 15f + Random.insideUnitSphere * 5f;
if (!agent.pathPending && agent.remainingDistance < 1f)
{
NavMeshHit hit;
if (NavMesh.SamplePosition(targetPos, out hit, 10f, 1))
{
agent.SetDestination(hit.position);
}
}
// Tác dụng lực đẩy Impulse tức thì
rb.AddForce(dodgeDirection * dodgeForce, ForceMode.Impulse);
if (chatBubble != null && Random.value < 0.005f) chatBubble.Show("I NEED TO RECOVER!", 1.5f);
yield return new WaitForSeconds(dodgeDuration);
// Khi máu đã hồi phục trên 50%, dừng chạy và quay lại tấn công
if (health.currentHealth >= health.maxHealth * 0.5f)
{
isPanicking = false;
return NodeState.Success;
}
// Kết thúc né: Trả lại quyền điều khiển cho NavMeshAgent
rb.linearVelocity = Vector3.zero; // Cú pháp chuẩn của Unity 6 (thay cho rb.velocity)
rb.isKinematic = true;
agent.enabled = true;
isDodging = false;
return NodeState.Running;
}
private NodeState ActionTalk()
{
if (isTalking) { agent.isStopped = true; return NodeState.Running; }
return NodeState.Failure;
}
private void StopConversation()
{
if (isTalking && Hallucinate.AI.ConversationManager.Instance != null)
{
Hallucinate.AI.ConversationManager.Instance.InterruptConversation(this);
}
}
private NodeState ActionPatrol()
{
if (patrolPoints.Length == 0) return NodeState.Failure;
Debug.Log("Patrolling...");
isPanicking = false;
agent.isStopped = false;
agent.speed = moveSpeed * 0.6f; // Đi tuần tra chậm rãi quay theo hướng đi tự động của NavMesh
agent.SetDestination(patrolPoints[currentPatrolIndex].position);
agent.speed = patrolSpeed;
if (!agent.pathPending && agent.remainingDistance <= agent.stoppingDistance)
{
currentWaitTime += Time.deltaTime;
if (currentWaitTime >= patrolWaitTime)
{
currentPatrolIndex = (currentPatrolIndex + 1) % patrolPoints.Length;
currentWaitTime = 0f;
Vector3 randomDest = startPosition + Random.insideUnitSphere * patrolRadius;
NavMeshHit hit;
if (NavMesh.SamplePosition(randomDest, out hit, patrolRadius, 1)) agent.SetDestination(hit.position);
currentWaitTime = 0f;
}
}
return NodeState.Running;
@@ -244,131 +445,159 @@ public class EnemyAI : MonoBehaviour
private NodeState ActionChasePlayer()
{
Debug.Log("Chasing Player!");
isPanicking = false;
agent.isStopped = false;
agent.speed = moveSpeed; // Chạy nhanh hết tốc lực
agent.speed = moveSpeed;
agent.SetDestination(player.position);
return NodeState.Running;
}
private NodeState ActionInvestigate()
{
Debug.Log("Investigating Last Position...");
agent.isStopped = false;
agent.speed = moveSpeed * 0.8f;
agent.speed = moveSpeed * 0.7f;
agent.SetDestination(fov.lastKnownPlayerPosition);
if (!agent.pathPending && agent.remainingDistance <= agent.stoppingDistance)
if (Vector3.Distance(transform.position, fov.lastKnownPlayerPosition) < 1.5f)
{
// Đến nơi rồi mà không thấy ai, xóa vị trí cuối cùng để quay lại tuần tra
fov.lastKnownPlayerPosition = Vector3.zero;
return NodeState.Success;
currentWaitTime += Time.deltaTime;
if (currentWaitTime > 3f) { fov.lastKnownPlayerPosition = Vector3.zero; return NodeState.Success; }
}
return NodeState.Running;
}
private NodeState ActionFocusAndShoot()
{
Debug.Log("Focus and Shoot!");
agent.isStopped = true; // Dừng di chuyển để đứng ngắm bắn cố định
isPanicking = false;
if (player == null) return NodeState.Failure;
if (agent.hasPath) agent.ResetPath();
agent.isStopped = false;
// Tự xoay người hướng thẳng về phía Player
Vector3 dir = player.position - transform.position;
dir.y = 0f;
if (dir != Vector3.zero)
Vector3 targetPos = player.position;
if (!playerHasArtifact && fov != null && !fov.canSeePlayer && fov.lastKnownPlayerPosition != Vector3.zero)
targetPos = fov.lastKnownPlayerPosition;
Vector3 bodyDir = (targetPos - transform.position);
bodyDir.y = 0f;
if (bodyDir != Vector3.zero)
transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.LookRotation(bodyDir), rotateSpeed * Time.deltaTime);
if (Time.time >= nextStrafeChangeTime)
{
Quaternion targetRotation = Quaternion.LookRotation(dir);
transform.rotation = Quaternion.Slerp(transform.rotation, targetRotation, rotateSpeed * Time.deltaTime);
strafeDirectionSign = new int[] { -1, 1, 0 }[Random.Range(0, 3)];
nextStrafeChangeTime = Time.time + Random.Range(minStrafeDuration, maxStrafeDuration);
}
// Đếm ngược thời gian bắn ngẫu nhiên
if (Time.time >= nextShootTime)
Vector3 moveDir = Vector3.zero;
if (strafeDirectionSign != 0 && bodyDir != Vector3.zero)
{
ShootLaser();
Vector3 normal = bodyDir.normalized;
moveDir = new Vector3(-normal.z, 0, normal.x) * strafeDirectionSign * personalStrafeIntensity;
float dist = Vector3.Distance(transform.position, targetPos);
if (dist > personalMinCombatDistance) moveDir += normal * personalApproachWeight;
}
if (moveDir != Vector3.zero)
{
agent.speed = moveSpeed * (isEnraged ? 1f : 0.75f);
agent.Move(moveDir.normalized * agent.speed * Time.deltaTime);
}
if (firePoint != null)
firePoint.rotation = Quaternion.LookRotation((targetPos + Vector3.up * 1f) - firePoint.position);
if (Time.time >= nextShootTime && !isShootingBurst)
{
int burstCount = Random.Range(1, (int)personalBurstMax + (isEnraged ? 2 : 0));
StartCoroutine(ShootBurstRoutine(burstCount));
nextShootTime = Time.time + Random.Range(minShootDelay, maxShootDelay);
}
return NodeState.Running;
}
private void ShootLaser()
private IEnumerator ShootBurstRoutine(int bulletCount)
{
if (laserPrefab == null || firePoint == null) return;
Instantiate(laserPrefab, firePoint.position, firePoint.rotation);
isShootingBurst = true;
for (int i = 0; i < bulletCount; i++)
{
if (laserPrefab == null || firePoint == null) break;
float spread = isEnraged ? maxSpreadAngle * 0.5f : maxSpreadAngle;
Quaternion rot = firePoint.rotation * Quaternion.Euler(Random.Range(-spread, spread), Random.Range(-spread, spread), 0f);
Instantiate(laserPrefab, firePoint.position, rot);
yield return new WaitForSeconds(isEnraged ? burstInterval * 0.7f : burstInterval);
}
isShootingBurst = false;
}
private NodeState ActionTalk()
private NodeState ActionDodge()
{
if (talkingPartner == null) return NodeState.Failure;
if (!isTalking)
{
isTalking = true;
agent.isStopped = true;
// Xoay về phía bạn
FaceTarget(talkingPartner.transform.position);
// Bắt đầu hội thoại qua Gemini
StartNPCConversation();
}
if (!isDodging) StartCoroutine(DodgeRollRoutine());
return NodeState.Running;
}
private void StartNPCConversation()
private IEnumerator DodgeRollRoutine()
{
string prompt = $"You are {npcName}. You are talking to your fellow guard {talkingPartner.npcName}. " +
"Keep it short (1 sentence). Topic: gold security or complaining about work.";
isDodging = true;
agent.enabled = false;
rb.isKinematic = false;
if (mainCollider != null) mainCollider.enabled = true;
Hallucinate.AI.GeminiService.Instance.GetResponse(persona, prompt, (response) => {
if (chatBubble != null) chatBubble.Show(response);
// Hẹn giờ kết thúc hội thoại
Invoke(nameof(EndConversation), 5f);
});
Vector3 dir = (player.position - transform.position).normalized;
Vector3 perp = new Vector3(-dir.z, 0, dir.x) * (Random.value > 0.5f ? 1 : -1);
rb.AddForce(perp * (isEnraged ? dodgeForce * 1.3f : dodgeForce), ForceMode.Impulse);
// Thông báo cho bạn diễn cũng dừng lại để "nghe"
talkingPartner.OnPartnerTalked(this);
yield return new WaitForSeconds(dodgeDuration);
rb.linearVelocity = Vector3.zero;
rb.isKinematic = true;
agent.enabled = true;
nextDodgeTime = Time.time + (isEnraged ? dodgeCooldown * 0.6f : dodgeCooldown);
isDodging = false;
}
public void OnPartnerTalked(EnemyAI partner)
public void ProcessDialogueResult(string json)
{
isTalking = true;
talkingPartner = partner;
agent.isStopped = true;
FaceTarget(partner.transform.position);
// Chờ bạn nói xong mới phản hồi
Invoke(nameof(EndConversation), 6f);
}
private void EndConversation()
{
isTalking = false;
lastTalkTime = Time.time;
if (agent != null) agent.isStopped = false;
talkingPartner = null;
}
private void StopConversation()
{
if (!isTalking) return;
CancelInvoke(nameof(EndConversation));
EndConversation();
if (chatBubble != null) chatBubble.Show("Suỵt! Có gì đó không ổn...", 2f);
}
private void FaceTarget(Vector3 targetPos)
{
Vector3 dir = targetPos - transform.position;
dir.y = 0;
if (dir != Vector3.zero)
try
{
transform.rotation = Quaternion.LookRotation(dir);
DialogueResult result = JsonUtility.FromJson<DialogueResult>(json);
if (chatBubble != null) chatBubble.Show(result.text);
// Áp dụng modifiers từ Gemini
moveSpeed = Mathf.Clamp(moveSpeed + result.speedMod, 1f, 8f);
suspicionLevel = Mathf.Clamp(suspicionLevel + result.suspicionMod, 0, 100);
// Modifier hung hãn: giảm delay bắn (max 50%)
minShootDelay = Mathf.Clamp(minShootDelay * (1f - result.aggressionMod), 0.5f, 5f);
maxShootDelay = Mathf.Clamp(maxShootDelay * (1f - result.aggressionMod), 1f, 10f);
// Modifier can đảm: thay đổi ngưỡng panic
panicHealthThreshold = Mathf.Clamp(panicHealthThreshold - result.braveryMod, 0, 80);
// Modifier máu
if (result.healthMod != 0)
{
health.AddHealth((int)result.healthMod);
}
lastTalkTime = Time.time;
Debug.Log($"[AI {npcName}] Gemini influence: Speed:{result.speedMod}, Aggro:{result.aggressionMod}, Bravery:{result.braveryMod}");
}
catch { if (chatBubble != null) chatBubble.Show(json); }
}
public void SetTalkingPartner(EnemyAI partner) { talkingPartner = partner; }
public void FaceTarget(Vector3 pos)
{
Vector3 dir = (pos - transform.position);
dir.y = 0;
if (dir != Vector3.zero) transform.rotation = Quaternion.LookRotation(dir);
}
#endregion
}
private void OnDrawGizmos()
{
Gizmos.color = isEnraged ? Color.red : Color.green;
Gizmos.DrawWireSphere(transform.position, alertRange);
}
}

View File

@@ -21,9 +21,21 @@ namespace Hallucinate.AI
public class GeminiService : MonoBehaviour
{
public static GeminiService Instance { get; private set; }
private int activeRequests = 0;
private const int MAX_CONCURRENT_REQUESTS = 5;
[SerializeField] private string apiKey = "AQ.Ab8RN6I2hU_p8yHiPNNHtWzYBiLugbPP22gC6lzTWaYEWj4v0g"; // Replace with your key
[SerializeField] private string geminiURL = "https://generativelanguage.googleapis.com/v1beta/models/gemini-flash-latest:generateContent";
[SerializeField] private string[] apiKeys = { "YOUR_KEY_1", "YOUR_KEY_2" };
private int currentKeyIndex = 0;
[SerializeField] private string geminiURL = "https://generativelanguage.googleapis.com/v1beta/models/gemini-1.5-flash:generateContent";
private float nextRequestTime = 0f;
private string[] fallbackDialogues = {
"{ \"text\": \"Nice weather, isn't it?\", \"speedMod\": 0.0, \"suspicionMod\": -5.0, \"aggressionMod\": 0.0, \"braveryMod\": 0.0, \"healthMod\": 0.0 }",
"{ \"text\": \"Did you hear something? Probably just a rat.\", \"speedMod\": 0.0, \"suspicionMod\": 2.0, \"aggressionMod\": 0.1, \"braveryMod\": -5.0, \"healthMod\": 0.0 }",
"{ \"text\": \"I'm so tired of this shift.\", \"speedMod\": -0.2, \"suspicionMod\": 0.0, \"aggressionMod\": -0.1, \"braveryMod\": 5.0, \"healthMod\": 0.0 }",
"{ \"text\": \"You looks strong, I should be careful.\", \"speedMod\": 0.1, \"suspicionMod\": 5.0, \"aggressionMod\": -0.2, \"braveryMod\": 10.0, \"healthMod\": 0.0 }"
};
private void Awake()
{
@@ -31,19 +43,58 @@ namespace Hallucinate.AI
else { Destroy(gameObject); }
}
private string GetNextKey()
{
if (apiKeys == null || apiKeys.Length == 0) return "";
string key = apiKeys[currentKeyIndex];
currentKeyIndex = (currentKeyIndex + 1) % apiKeys.Length;
return key;
}
public void GetResponse(string persona, string prompt, Action<string> onComplete)
{
if (Time.time < nextRequestTime)
{
Debug.LogWarning("[Gemini] API is cooling down. Using fallback.");
onComplete?.Invoke(fallbackDialogues[UnityEngine.Random.Range(0, fallbackDialogues.Length)]);
return;
}
if (activeRequests >= MAX_CONCURRENT_REQUESTS)
{
onComplete?.Invoke(fallbackDialogues[UnityEngine.Random.Range(0, fallbackDialogues.Length)]);
return;
}
StartCoroutine(PostRequest(persona, prompt, onComplete));
}
private IEnumerator PostRequest(string persona, string prompt, Action<string> onComplete)
{
activeRequests++;
string jsonInstruction = " Respond ONLY with a JSON object: { " +
"'text': 'dialogue content', " +
"'speedMod': 0.0 (change movement speed), " +
"'suspicionMod': 0.0 (change suspicion level), " +
"'aggressionMod': 0.0 (0.1 to 0.5 makes NPC shoot faster, negative makes them slower), " +
"'braveryMod': 0.0 (positive makes them less likely to panic, negative makes them scared), " +
"'healthMod': 0.0 (positive heals NPC, negative damages them) " +
"}. Keep values realistic.";
string escapedPersona = persona.Replace("\"", "\\\"");
string escapedPrompt = prompt.Replace("\"", "\\\"");
var jsonBody = $@"{{
""systemInstruction"": {{""parts"": [{{ ""text"": ""{persona}"" }}]}},
""contents"": [{{""parts"": [{{ ""text"": ""{prompt}"" }}]}}]
""systemInstruction"": {{""parts"": [{{ ""text"": ""{escapedPersona} {jsonInstruction}"" }}]}},
""contents"": [{{""parts"": [{{ ""text"": ""{escapedPrompt}"" }}]}}],
""generationConfig"": {{
""maxOutputTokens"": 150,
""temperature"": 0.8,
""responseMimeType"": ""application/json""
}}
}}";
var requestURL = $"{geminiURL}?key={apiKey}";
var requestURL = $"{geminiURL}?key={GetNextKey()}";
using (var request = new UnityWebRequest(requestURL, "POST"))
{
@@ -56,21 +107,24 @@ namespace Hallucinate.AI
if (request.result == UnityWebRequest.Result.Success)
{
try
var response = JsonUtility.FromJson<GeminiResponse>(request.downloadHandler.text);
if (response?.candidates?.Length > 0 && response.candidates[0].content?.parts?.Length > 0)
{
var response = JsonUtility.FromJson<GeminiResponse>(request.downloadHandler.text);
if (response?.candidates != null && response.candidates.Length > 0)
{
onComplete?.Invoke(response.candidates[0].content.parts[0].text);
}
onComplete?.Invoke(response.candidates[0].content.parts[0].text);
}
catch (Exception e) { Debug.LogError($"[Gemini] JSON Parse Error: {e.Message}"); }
}
else
{
Debug.LogError($"[Gemini] API Error: {request.error}");
if (request.responseCode == 429)
{
nextRequestTime = Time.time + 60f;
}
onComplete?.Invoke(fallbackDialogues[UnityEngine.Random.Range(0, fallbackDialogues.Length)]);
}
}
activeRequests--;
}
}
}

View File

@@ -0,0 +1,28 @@
using UnityEngine;
using Hallucinate.AI;
public class GeminiTest : MonoBehaviour
{
void Start()
{
Debug.Log("<color=cyan>[Gemini Test]</color> Bắt đầu kiểm tra kết nối API...");
if (GeminiService.Instance == null)
{
Debug.LogError("<color=red>[Gemini Test]</color> Không tìm thấy GeminiService Instance! Hãy đảm bảo bạn đã kéo script GeminiService vào một GameObject trong Scene.");
return;
}
string testPersona = "Bạn là một robot kiểm tra hệ thống.";
string testPrompt = "Chào bạn, nếu bạn nhận được tin nhắn này, hãy trả lời: 'Kết nối Gemini thành công!'";
GeminiService.Instance.GetResponse(testPersona, testPrompt, (response) => {
string finalMsg = response;
try {
DialogueResult result = JsonUtility.FromJson<DialogueResult>(response);
finalMsg = result.text;
} catch { }
Debug.Log($"<color=green>[Gemini Test] Phản hồi từ API:</color> {finalMsg}");
});
}
}

View File

@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: e61a7aa4c1a936a43a97cf67a6e6a559

View File

@@ -67,12 +67,17 @@ public class GerminiNPC : MonoBehaviour
string prompt = $"Ta muốn bán cho ông món đồ này: {playerHeldItem}";
Hallucinate.AI.GeminiService.Instance.GetResponse(npcPersona, prompt, (response) => {
Debug.Log($"<color=green>Tom:</color> {response}");
string finalMsg = response;
try {
DialogueResult result = JsonUtility.FromJson<DialogueResult>(response);
finalMsg = result.text;
} catch { }
Debug.Log($"<color=green>Tom:</color> {finalMsg}");
AudioManager.Instance?.Play(responseSound, position: transform.position);
// Nếu có ChatBubble gắn kèm thì hiển thị luôn
var bubble = GetComponentInChildren<Hallucinate.UI.ChatBubble>(true);
if (bubble != null) bubble.Show(response);
if (bubble != null) bubble.Show(finalMsg);
});
yield break;

View File

@@ -106,7 +106,7 @@ public class KamikazeAI : MonoBehaviour
// HÀM TUẦN TRA NGẪU NHIÊN MỚI
private NodeState ActionRandomPatrol()
{
Debug.Log("Wandering randomly...");
// Debug.Log("Wandering randomly...");
agent.isStopped = false;
agent.speed = patrolSpeed;

View File

@@ -1,36 +1,85 @@
using System;
using UnityEngine;
using Hallucinate.Audio;
using Invector;
public class LaserProjectile : MonoBehaviour
{
public float speed = 5f;
public float speed = 15f; // Tăng tốc độ đạn để cảm giác mượt hơn
public float lifeTime = 5f;
public int damageAmount = 10;
[Header("Audio")]
public string hitSound = "Laser_Hit";
private void Start()
{
// Tự hủy sau một khoảng thời gian nếu không trúng gì
Destroy(gameObject, lifeTime);
}
private void Update()
{
transform.position +=
transform.forward *
speed *
Time.deltaTime;
// Di chuyển đạn
transform.position += transform.forward * speed * Time.deltaTime;
}
private void OnTriggerEnter(Collider other)
{
if (other.CompareTag("Player"))
// Debug: Log tên và tag của bất cứ thứ gì đạn chạm vào
Debug.Log($"Laser collided with: {other.name} | Tag: {other.tag} | Layer: {LayerMask.LayerToName(other.gameObject.layer)}");
// 1. Kiểm tra nếu trúng Player hoặc đối tượng có Health
var healthController = other.GetComponentInParent<vIHealthController>();
if (other.CompareTag("Player") || healthController != null)
{
Debug.Log("Player Hit");
if (healthController != null)
{
Debug.Log($"<color=red>HIT PLAYER!</color> Applying {damageAmount} damage.");
var damage = new vDamage(damageAmount);
damage.sender = transform;
damage.hitPosition = transform.position;
healthController.TakeDamage(damage);
}
Impact();
return;
}
AudioManager.Instance?.Play(hitSound, position: transform.position);
// KIỂM TRA LAYER "GROUND"
if (other.gameObject.layer == LayerMask.NameToLayer("Ground"))
{
Debug.Log("<color=yellow>Laser hit GROUND layer.</color>");
Impact();
return;
}
// Phá hủy đạn nếu trúng tường, sàn nhà (mọi thứ không phải trigger khác)
Destroy(gameObject);
// 2. Phá hủy đạn nếu trúng Ground, Tường, hoặc bất kỳ vật thể đặc nào (không phải Trigger)
if (!other.isTrigger)
{
Debug.Log($"Laser hit solid object: {other.name} (Ground/Obstacle). Destroying.");
Impact();
}
}
private void OnCollisionEnter(Collision other)
{
if (other.gameObject.layer == LayerMask.NameToLayer("Ground") || other.gameObject.tag == "Ground")
{
Impact();
return;
}
}
private void Impact()
{
// Chạy âm thanh
AudioManager.Instance?.Play(hitSound, position: transform.position);
// Phá hủy đạn ngay lập tức
Destroy(gameObject);
}
}

View File

@@ -0,0 +1,32 @@
using UnityEngine;
namespace Hallucinate.AI
{
public class NoiseEmitter : MonoBehaviour
{
[Header("Settings")]
public float defaultNoiseRange = 10f;
public LayerMask npcLayer;
public void EmitNoise(float volumeMultiplier = 1f)
{
float range = defaultNoiseRange * volumeMultiplier;
Collider[] hitColliders = Physics.OverlapSphere(transform.position, range, npcLayer);
foreach (var hit in hitColliders)
{
EnemyAI npc = hit.GetComponentInParent<EnemyAI>();
if (npc != null)
{
npc.HearNoise(transform.position, volumeMultiplier);
}
}
}
private void OnDrawGizmosSelected()
{
Gizmos.color = new Color(1, 1, 0, 0.3f);
Gizmos.DrawWireSphere(transform.position, defaultNoiseRange);
}
}
}

View File

@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 67d06596d1741d34594e4a68adcaf257

View File

@@ -1,16 +0,0 @@
using UnityEngine;
public class RagNPC : MonoBehaviour
{
// Start is called once before the first execution of Update after the MonoBehaviour is created
void Start()
{
}
// Update is called once per frame
void Update()
{
}
}

View File

@@ -1,2 +0,0 @@
fileFormatVersion: 2
guid: 30cdc86fe97fa95428a4b31052cfb22f

View File

@@ -1,44 +1,53 @@
using UnityEngine;
using UnityEngine.SceneManagement;
using System.Collections;
using Hallucinate.Audio; // Import namespace for AudioManager
using Hallucinate.Audio;
public class FinishGate : MonoBehaviour
{
[Header("Cài đặt UI Chính")]
public GameObject winPanel;
public GameObject warningUI; // Thông báo "Bạn chưa nhặt rương nào!"
public GameObject losePanel; // Bảng Lose
public GameObject welcomeUI; // THÔNG BÁO 1: "Chào mừng!"
public GameObject warningUI; // THÔNG BÁO 2: "Bạn chưa nhặt rương nào!"
[Header("Cài đặt Sao trên HUD (Giao diện chính)")]
[Header("Cài đặt Sao trên HUD")]
public GameObject hudStar1;
public GameObject hudStar2;
public GameObject hudStar3;
[Header("Cài đặt Sao trên Bảng Win (Kết thúc)")]
[Header("Cài đặt Sao trên Bảng Win")]
public GameObject winStar1;
public GameObject winStar2;
public GameObject winStar3;
[Header("Cài đặt Âm thanh")]
public string winSound = "UI_Win";
public string loseSound = "UI_Lose"; // Âm thanh thua
public string warningSound = "UI_Warning";
public string clickSound = "UI_Click";
[Header("Cấu hình Tag")]
public string playerTag = "Player";
private bool hasEnteredOnce = false; // Theo dõi lần chạm cổng đầu tiên
private void Start()
{
Time.timeScale = 1f;
if (winPanel != null) winPanel.SetActive(false);
if (losePanel != null) losePanel.SetActive(false);
if (welcomeUI != null) welcomeUI.SetActive(false);
if (warningUI != null) warningUI.SetActive(false);
// Ẩn tất cả sao lúc bắt đầu
UpdateStarsUI(0);
UpdateWinStarsUI(0);
}
private void OnTriggerEnter(Collider other)
{
if (other.CompareTag("Check"))
if (other.CompareTag(playerTag))
{
PlayerInventory player = other.GetComponentInChildren<PlayerInventory>();
if (player == null) player = other.GetComponentInParent<PlayerInventory>();
@@ -47,55 +56,81 @@ public class FinishGate : MonoBehaviour
{
if (player.treasuresCollected > 0)
{
Debug.Log($"<color=green>[Gate]</color> VỀ ĐÍCH! Kết thúc màn chơi với {player.treasuresCollected} sao.");
WinGame(player.treasuresCollected);
}
else
{
Debug.Log("<color=yellow>[Gate]</color> Bạn chưa nhặt rương nào, hãy đi tìm rương trước khi về.");
StopAllCoroutines();
StartCoroutine(ShowTempUI(warningUI));
// Nếu là lần đầu tiên -> Hiện Welcome. Nếu là lần sau -> Hiện Warning.
if (!hasEnteredOnce)
{
hasEnteredOnce = true;
StartCoroutine(ShowTempUI(welcomeUI));
}
else
{
StartCoroutine(ShowTempUI(warningUI));
}
}
}
}
}
// Hàm public để TreasureItem có thể gọi cập nhật HUD ngay khi nhặt
public void UpdateStarsUI(int count)
{
if (hudStar1) hudStar1.SetActive(count >= 1);
if (hudStar2) hudStar2.SetActive(count >= 2);
if (hudStar3) hudStar3.SetActive(count >= 3);
if (hudStar1 != null) hudStar1.SetActive(count >= 1);
if (hudStar2 != null) hudStar2.SetActive(count >= 2);
if (hudStar3 != null) hudStar3.SetActive(count >= 3);
}
void UpdateWinStarsUI(int count)
private void UpdateWinStarsUI(int count)
{
if (winStar1) winStar1.SetActive(count >= 1);
if (winStar2) winStar2.SetActive(count >= 2);
if (winStar3) winStar3.SetActive(count >= 3);
if (winStar1 != null) winStar1.SetActive(count >= 1);
if (winStar2 != null) winStar2.SetActive(count >= 2);
if (winStar3 != null) winStar3.SetActive(count >= 3);
}
void WinGame(int count)
private void WinGame(int count)
{
if (winPanel != null)
{
winPanel.SetActive(true);
UpdateWinStarsUI(count); // Hiện số sao tương ứng trên bảng kết thúc
UpdateWinStarsUI(count);
}
AudioManager.PlayGlobal(winSound); // Chạy âm thanh thắng cuộc
AudioManager.PlayGlobal(winSound);
Time.timeScale = 0f;
Cursor.lockState = CursorLockMode.None;
Cursor.visible = true;
}
IEnumerator ShowTempUI(GameObject ui)
public void LoseGame()
{
if (losePanel != null)
{
losePanel.SetActive(true);
}
AudioManager.PlayGlobal(loseSound);
Time.timeScale = 0f;
Cursor.lockState = CursorLockMode.None;
Cursor.visible = true;
}
private IEnumerator ShowTempUI(GameObject ui)
{
if (ui == null) yield break;
// Tắt tất cả UI tạm thời khác trước khi bật cái mới để tránh đè chữ
if (welcomeUI != null) welcomeUI.SetActive(false);
if (warningUI != null) warningUI.SetActive(false);
ui.SetActive(true);
if (ui == warningUI) AudioManager.PlayGlobal(warningSound); // Chạy âm thanh cảnh báo
if (ui == warningUI)
{
AudioManager.PlayGlobal(warningSound);
}
yield return new WaitForSeconds(3f);
ui.SetActive(false);
@@ -103,17 +138,17 @@ public class FinishGate : MonoBehaviour
public void RestartGame()
{
AudioManager.PlayGlobal(clickSound); // Âm thanh click nút
AudioManager.PlayGlobal(clickSound);
Time.timeScale = 1f;
SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex);
}
public void QuitGame()
{
AudioManager.PlayGlobal(clickSound); // Âm thanh click nút
AudioManager.PlayGlobal(clickSound);
Application.Quit();
#if UNITY_EDITOR
UnityEditor.EditorApplication.isPlaying = false;
#endif
}
}
}

View File

@@ -1,52 +1,55 @@
using UnityEngine;
using System.Collections;
using Hallucinate.Audio;
using Hallucinate.Audio;
public class TreasureItem : MonoBehaviour
{
[Header("Cài đặt UI thông báo")]
public GameObject notificationText; // Text "Đã nhặt Cổ vật"
[Tooltip("Kéo Text 'Đã nhặt được cổ vật hãy trốn thoát ra khỏi đây' vào đây")]
public GameObject notificationText;
[Header("Cài đặt Âm thanh")]
public string pickupSound = "Item_Pickup";
[Header("Cấu hình Tag")]
public string playerTag = "Player";
private bool isCollected = false;
private void Start()
{
if (notificationText != null)
{
notificationText.SetActive(false);
}
}
private void OnTriggerEnter(Collider other)
{
if (other.CompareTag("Player"))
if (!isCollected && other.CompareTag(playerTag))
{
PlayerInventory player = other.GetComponentInChildren<PlayerInventory>();
if (player == null) player = other.GetComponentInParent<PlayerInventory>();
if (player != null)
{
// 1. Tăng số lượng rương đang giữ
isCollected = true;
player.treasuresCollected++;
Debug.Log($"<color=cyan>[Chest]</color> NHẶT THÀNH CÔNG! Số rương hiện tại: {player.treasuresCollected}");
// 2. Cập nhật sao trên HUD ngay lập tức (Tìm FinishGate để mượn hàm update)
FinishGate gate = Object.FindAnyObjectByType<FinishGate>();
if (gate != null)
{
gate.UpdateStarsUI(player.treasuresCollected);
}
// 3. Kích hoạt trạng thái truy đuổi cho toàn bộ Enemy AI
SetEnemiesAlertState(true);
// 4. Chạy âm thanh nhặt đồ
if (AudioManager.Instance != null)
{
AudioManager.Instance.Play(pickupSound, position: transform.position);
}
if (notificationText != null)
{
StopAllCoroutines();
StartCoroutine(ShowNotification());
}
// Biến mất rương
gameObject.SetActive(false);
StartCoroutine(HandlePickupRoutine());
}
}
}
@@ -56,14 +59,38 @@ public class TreasureItem : MonoBehaviour
EnemyAI[] allEnemies = Object.FindObjectsByType<EnemyAI>(FindObjectsSortMode.None);
foreach (EnemyAI enemy in allEnemies)
{
enemy.playerHasArtifact = state;
if (enemy != null) enemy.playerHasArtifact = state;
}
}
IEnumerator ShowNotification()
private IEnumerator HandlePickupRoutine()
{
notificationText.SetActive(true);
yield return new WaitForSeconds(2f);
notificationText.SetActive(false);
HideTreasureModel();
if (notificationText != null)
{
notificationText.SetActive(true);
}
yield return new WaitForSeconds(3f); // Tăng lên 3s để người chơi kịp đọc dòng chữ dài
if (notificationText != null)
{
notificationText.SetActive(false);
}
gameObject.SetActive(false);
}
}
private void HideTreasureModel()
{
Collider col = GetComponent<Collider>();
if (col != null) col.enabled = false;
MeshRenderer[] renderers = GetComponentsInChildren<MeshRenderer>();
foreach (MeshRenderer r in renderers)
{
r.enabled = false;
}
}
}

View File

@@ -12,4 +12,4 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: 2f22f37f63bcec14080b11ce5e381ce6, type: 3}
m_Name: vEditorStartupPrefs
m_EditorClassIdentifier:
displayWelcomeScreen: 1
displayWelcomeScreen: 0

View File

@@ -98,6 +98,13 @@ namespace Invector.vCharacterController
private void OnDead(GameObject arg0)
{
ShowText("You are Dead!");
// Gọi hàm LoseGame từ script FinishGate khi người chơi chết
FinishGate gate = Object.FindAnyObjectByType<FinishGate>();
if (gate != null)
{
gate.LoseGame();
}
}
public virtual void UpdateHUD(vThirdPersonController cc)

View File

@@ -318,6 +318,14 @@ namespace Invector.vCharacterController
currentStaminaRecoveryDelay = 2f;
}
public override void TakeDamage(vDamage damage)
{
Debug.Log($"Player TakeDamage called. Damage: {damage.damageValue}. Current Health before: {currentHealth}");
base.TakeDamage(damage);
Debug.Log($"Player Health after: {currentHealth}");
// Additional logic for player-specific damage handling can be added here
}
#region Check Action Triggers

View File

@@ -38,6 +38,13 @@ namespace Invector
EditorGUILayout.PropertyField(serializedObject.FindProperty("_useTriggerEnter"));
serializedObject.FindProperty("debugTextureName").boolValue = EditorGUILayout.Toggle("Debug Texture Name", serializedObject.FindProperty("debugTextureName").boolValue);
GUILayout.BeginVertical("box");
GUILayout.Box("AI Noise Settings", GUILayout.ExpandWidth(true));
EditorGUILayout.PropertyField(serializedObject.FindProperty("emitAINoise"));
EditorGUILayout.PropertyField(serializedObject.FindProperty("aiNoiseRange"));
EditorGUILayout.PropertyField(serializedObject.FindProperty("npcLayer"));
GUILayout.EndVertical();
if (serializedObject.FindProperty("animationType").enumValueIndex == (int)AnimationType.Humanoid)
{
GUILayout.BeginHorizontal("box");

View File

@@ -13,19 +13,24 @@ Material:
m_ModifiedSerializedProperties: 0
m_ValidKeywords:
- _COLOROVERLAY_ON
- _DISTORTION_ON
- _FADING_ON
- _FLIPBOOKBLENDING_ON
- _SOFTPARTICLES_ON
- _SURFACE_TYPE_TRANSPARENT
m_InvalidKeywords:
- EFFECT_BUMP
- _ALPHABLEND_ON
- _FLIPBOOKBLENDING_OFF
- _REQUIRE_UV2
m_LightmapFlags: 0
m_EnableInstancingVariants: 0
m_DoubleSidedGI: 0
m_CustomRenderQueue: -1
m_CustomRenderQueue: 3000
stringTagMap:
RenderType: Opaque
disabledShaderPasses: []
RenderType: Transparent
disabledShaderPasses:
- DepthOnly
- SHADOWCASTER
m_LockedProperties:
m_SavedProperties:
serializedVersion: 3
@@ -88,8 +93,8 @@ Material:
- _DistortionEnabled: 1
- _DistortionStrength: 1
- _DistortionStrengthScaled: 0.1
- _DstBlend: 0
- _DstBlendAlpha: 0
- _DstBlend: 10
- _DstBlendAlpha: 10
- _EmissionEnabled: 1
- _FlipbookBlending: 1
- _FlipbookMode: 1
@@ -108,11 +113,11 @@ Material:
- _SoftParticlesFarFadeDistance: 1
- _SoftParticlesNearFadeDistance: 0
- _SpecularHighlights: 1
- _SrcBlend: 1
- _SrcBlend: 5
- _SrcBlendAlpha: 1
- _Surface: 1
- _UVSec: 0
- _ZWrite: 1
- _ZWrite: 0
m_Colors:
- _BaseColor: {r: 1, g: 1, b: 1, a: 1}
- _BaseColorAddSubDiff: {r: 0, g: 0, b: 0, a: 0}
@@ -121,7 +126,7 @@ Material:
- _ColorAddSubDiff: {r: 1, g: 0, b: 0, a: 0}
- _EmisColor: {r: 1, g: 1, b: 1, a: 1}
- _EmissionColor: {r: 0.31132078, g: 0.31132078, b: 0.31132078, a: 1}
- _SoftParticleFadeParams: {r: 0, g: 0, b: 0, a: 0}
- _SoftParticleFadeParams: {r: 0, g: 1, b: 0, a: 0}
- _TintColor: {r: 1, g: 1, b: 1, a: 1}
m_BuildTextureStacks: []
m_AllowLocking: 1

View File

@@ -20,6 +20,11 @@ namespace Invector
public bool SpawnParticle { get { return _spawnParticle; } set { _spawnParticle = value; } }
public bool SpawnStepMark { get { return _spawnStepMark; } set { _spawnStepMark = value; } }
[Header("AI Noise Settings")]
public bool emitAINoise = true;
public float aiNoiseRange = 10f;
public LayerMask npcLayer;
protected int surfaceIndex = 0;
protected Terrain terrain;
protected TerrainCollider terrainCollider;
@@ -248,6 +253,37 @@ namespace Invector
currentFootStep.spawnParticleEffect = SpawnParticle;
currentFootStep.spawnStepMarkEffect = SpawnStepMark;
SpawnSurfaceEffect(currentFootStep);
if (emitAINoise) EmitAINoise();
}
}
protected virtual void EmitAINoise()
{
float currentRange = aiNoiseRange;
float currentVolume = Volume;
// Kiểm tra trạng thái ngồi từ Animator
Animator anim = GetComponent<Animator>();
if (anim != null)
{
// Nếu đang ngồi (IsCrouching = true), giảm 50% vùng phát hiện và âm lượng
if (anim.GetBool("IsCrouching"))
{
currentRange *= 0.5f;
currentVolume *= 0.5f;
}
}
// Tìm tất cả Collider trong bán kính tiếng động thuộc Layer NPC
Collider[] hitColliders = Physics.OverlapSphere(transform.position, currentRange, npcLayer);
foreach (var hit in hitColliders)
{
var npc = hit.GetComponentInParent<EnemyAI>();
if (npc != null)
{
npc.HearNoise(transform.position, currentVolume);
}
}
}

View File

@@ -51,6 +51,9 @@ namespace Invector.vShooter
{
AddTrailPosition();
}
// Log diagnostic: Kiểm tra Layer mà đạn có thể bắn trúng
Debug.Log($"<color=cyan>PROJECTILE SPAWNED:</color> HitLayer Mask: {hitLayer.value}. Đảm bảo Layer của Enemy nằm trong mask này.");
}
protected virtual void Update()
@@ -61,6 +64,7 @@ namespace Invector.vShooter
transform.rotation = Quaternion.LookRotation(_rigidBody.linearVelocity.normalized, transform.up);
}
// Thực hiện raycast để kiểm tra va chạm
if (Physics.Linecast(previousPosition, transform.position + transform.forward * 0.5f, out hitInfo, hitLayer))
{
if (!hitInfo.collider)
@@ -98,17 +102,39 @@ namespace Invector.vShooter
damage.hitPosition = hitInfo.point;
damage.receiver = hitInfo.collider.transform;
damage.force = transform.forward * damage.damageValue * forceMultiplier;
if (damage.damageValue > 0)
{
onPassDamage.Invoke(damage);
hitInfo.collider.gameObject.ApplyDamage(damage, damage.sender ? damage.sender.GetComponent<vIMeleeFighter>() : null);
// 1. Log khi trúng bất cứ thứ gì
Debug.Log($"<color=yellow>PROJECTILE HIT:</color> {hitInfo.collider.name} | Tag: {hitInfo.collider.tag} | Layer: {LayerMask.LayerToName(hitInfo.collider.gameObject.layer)}");
// 2. Tìm đối tượng nhận sát thương (ưu tiên tìm ở cha nếu trúng collider con)
var damageReceiver = hitInfo.collider.gameObject.GetComponentInParent<vIDamageReceiver>();
if (damageReceiver != null)
{
if (hitInfo.collider.CompareTag("Enemy") || damageReceiver.gameObject.CompareTag("Enemy"))
{
Debug.Log($"<color=green>APPLYING DAMAGE TO ENEMY:</color> {damageReceiver.gameObject.name}. Damage: {damage.damageValue}");
}
// Gửi sát thương đến đối tượng tìm thấy
damageReceiver.gameObject.ApplyDamage(damage, damage.sender ? damage.sender.GetComponent<vIMeleeFighter>() : null);
}
else
{
Debug.LogWarning($"<color=orange>NO DAMAGE RECEIVER FOUND</color> on {hitInfo.collider.name} or its parents. Đảm bảo Enemy có component vHealthController.");
}
}
var rigb = hitInfo.collider.gameObject.GetComponent<Rigidbody>();
if (rigb)
if (rigb && !rigb.isKinematic)
{
rigb.AddForce(transform.forward * damage.damageValue * forceMultiplier, ForceMode.Impulse);
// GIẢM LỰC ĐẨY: Chỉ dùng 10% lực để NPC không bị bay quá xa
float realisticForce = (damage.damageValue * forceMultiplier) * 0.1f;
rigb.AddForce(transform.forward * realisticForce, ForceMode.Impulse);
}
startPosition = transform.position;
@@ -268,8 +294,20 @@ namespace Invector.vShooter
}
}
}
else
else
{
// DIAGNOSTIC X-RAY: Kiểm tra xem có trúng cái gì mà bị HitLayer cấm không?
RaycastHit diagHit;
if (Physics.Linecast(previousPosition, transform.position + transform.forward * 0.5f, out diagHit, ~0)) // ~0 là tất cả layer
{
if (diagHit.collider.CompareTag("Enemy") || diagHit.collider.name.Contains("Guard") || diagHit.collider.GetComponentInParent<EnemyAI>() != null)
{
Debug.LogError($"<color=red>LAYER BLOCK DETECTED!</color> Đạn vừa bay xuyên qua {diagHit.collider.name}. " +
$"Đối tượng này ở Layer: {LayerMask.LayerToName(diagHit.collider.gameObject.layer)} ({diagHit.collider.gameObject.layer}). " +
$"NHƯNG súng của bạn đang dùng HitLayer Mask: {hitLayer.value}, không bao gồm layer này!");
}
}
if (debugTrajetory)
{
Debug.DrawLine(transform.position, previousPosition, debugColor, 10f);
@@ -277,7 +315,8 @@ namespace Invector.vShooter
}
previousPosition = transform.position;
}

View File

@@ -242,6 +242,21 @@ namespace Invector.vShooter
#endregion
#region Protected Methods
protected virtual void Start()
{
// TỰ ĐỘNG SỬA LỖI LAYER: Đảm bảo súng luôn có thể bắn trúng Enemy
int enemyLayer = LayerMask.NameToLayer("Enemy");
if (enemyLayer != -1)
{
// Cưỡng bức thêm Layer Enemy vào mask (Dùng toán tử bit OR)
hitLayer.value |= (1 << enemyLayer);
Debug.Log($"<color=green>[WEAPON AUTO-FIX]</color> {gameObject.name} hiện đã có thể bắn trúng Layer 'Enemy' (Mask mới: {hitLayer.value}).");
}
else
{
Debug.LogError("<color=red>[WEAPON ERROR]</color> Bạn chưa tạo Layer tên là 'Enemy' trong Project Settings > Tags and Layers!");
}
}
protected virtual void OnDestroy()
{
@@ -256,6 +271,14 @@ namespace Invector.vShooter
{
ShootBullet(startPoint, endPoint);
ShotEffect();
// Gửi tín hiệu tiếng súng cho toàn bộ AI lân cận
var hitColliders = Physics.OverlapSphere(muzzle.position, 50f);
foreach (var hit in hitColliders)
{
var ai = hit.GetComponentInParent<EnemyAI>();
if (ai != null) ai.TriggerCombatAlert(muzzle.position);
}
}
public virtual Vector3 Dispersion(Vector3 aim, float dispersion)
{
@@ -297,11 +320,32 @@ namespace Invector.vShooter
protected virtual void ShootBullet(Vector3 startPoint, Vector3 endPoint)
{
// TỰ ĐỘNG SỬA LỖI LAYER (Cưỡng bức mỗi khi bắn):
int enemyLayer = LayerMask.NameToLayer("Enemy");
if (enemyLayer != -1)
{
// Ép thêm Layer Enemy vào mask nếu nó bị thiếu
if ((hitLayer.value & (1 << enemyLayer)) == 0)
{
hitLayer.value |= (1 << enemyLayer);
Debug.Log($"<color=orange>[WEAPON FORCE-FIX]</color> Đã cưỡng bức thêm Layer 'Enemy' vào {gameObject.name} khi bắn.");
}
}
var dir = endPoint - startPoint;
//StartCoroutine(DebugDispersion(startPoint, endPoint));
var rotation = Quaternion.LookRotation(dir);
GameObject bulletObject = null;
var velocityChanged = 0f;
if (projectile == null)
{
Debug.LogError($"<color=red>WEAPON ERROR:</color> No Projectile Prefab assigned to {gameObject.name}!");
return;
}
Debug.Log($"<color=white>WEAPON SHOOT:</color> Spawning projectile. HitLayer: {hitLayer.value}");
if (dispersion > 0 && projectile)
{
for (int i = 0; i < projectilesPerShot; i++)
@@ -311,6 +355,12 @@ namespace Invector.vShooter
bulletObject = Instantiate(projectile, startPoint, spreadRotation);
var pCtrl = bulletObject.GetComponent<vProjectileControl>();
if (pCtrl == null)
{
Debug.LogError($"<color=red>PROJECTILE ERROR:</color> {projectile.name} does not have vProjectileControl script!");
continue;
}
if (pCtrl.debugTrajetory && i == 0)
{
startPoint.DebugPoint(Color.red, 10, 0.1f);
@@ -338,6 +388,13 @@ namespace Invector.vShooter
{
bulletObject = Instantiate(projectile, startPoint, rotation);
var pCtrl = bulletObject.GetComponent<vProjectileControl>();
if (pCtrl == null)
{
Debug.LogError($"<color=red>PROJECTILE ERROR:</color> {projectile.name} does not have vProjectileControl script!");
return;
}
if (pCtrl.debugTrajetory)
{
startPoint.DebugPoint(Color.red, 10, 0.1f);

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 MiB

View File

@@ -0,0 +1,130 @@
fileFormatVersion: 2
guid: f6c8ebeb4fbe2954ba666fb8de1138f1
TextureImporter:
internalIDToNameTable: []
externalObjects: {}
serializedVersion: 13
mipmaps:
mipMapMode: 0
enableMipMap: 0
sRGBTexture: 1
linearTexture: 0
fadeOut: 0
borderMipMap: 0
mipMapsPreserveCoverage: 0
alphaTestReferenceValue: 0.5
mipMapFadeDistanceStart: 1
mipMapFadeDistanceEnd: 3
bumpmap:
convertToNormalMap: 0
externalNormalMap: 0
heightScale: 0.25
normalMapFilter: 0
flipGreenChannel: 0
isReadable: 0
streamingMipmaps: 0
streamingMipmapsPriority: 0
vTOnly: 0
ignoreMipmapLimit: 0
grayScaleToAlpha: 0
generateCubemap: 6
cubemapConvolution: 0
seamlessCubemap: 0
textureFormat: 1
maxTextureSize: 2048
textureSettings:
serializedVersion: 2
filterMode: 0
aniso: 1
mipBias: 0
wrapU: 1
wrapV: 1
wrapW: 0
nPOTScale: 0
lightmap: 0
compressionQuality: 50
spriteMode: 1
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spritePixelsToUnits: 100
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spriteGenerateFallbackPhysicsShape: 1
alphaUsage: 1
alphaIsTransparency: 1
spriteTessellationDetail: -1
textureType: 8
textureShape: 1
singleChannelComponent: 0
flipbookRows: 1
flipbookColumns: 1
maxTextureSizeSet: 0
compressionQualitySet: 0
textureFormatSet: 0
ignorePngGamma: 0
applyGammaDecoding: 0
swizzle: 50462976
cookieLightType: 0
platformSettings:
- serializedVersion: 4
buildTarget: DefaultTexturePlatform
maxTextureSize: 16384
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: Standalone
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: Android
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
spriteSheet:
serializedVersion: 2
sprites: []
outline: []
customData:
physicsShape: []
bones: []
spriteID: 5e97eb03825dee720800000000000000
internalID: 0
vertices: []
indices:
edges: []
weights: []
secondaryTextures: []
spriteCustomMetadata:
entries: []
nameFileIdTable: {}
mipmapLimitGroupName:
pSDRemoveMatte: 0
userData:
assetBundleName:
assetBundleVariant:

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

10
BABA_YAGA_Updater/.gitignore vendored Normal file
View File

@@ -0,0 +1,10 @@
.env
credentials.json
token.json
__pycache__/
*.py[cod]
*$py.class
.venv/
venv/
ENV/
env/

View File

@@ -0,0 +1,21 @@
import os
from dotenv import load_dotenv
# Load .env file if it exists
load_dotenv()
class Settings:
# Google Sheets Configuration
SPREADSHEET_ID = os.getenv("SPREADSHEET_ID", "")
SHEET_RANGE = os.getenv("SHEET_RANGE", "Sheet1!A2:E") # Default range
CREDENTIALS_FILE = os.getenv("CREDENTIALS_FILE", "credentials.json")
TOKEN_FILE = os.getenv("TOKEN_FILE", "token.json")
# README Configuration
README_PATH = os.getenv("README_PATH", "../README.md")
# Section Markers
START_MARKER = "<!-- START_UPDATES -->"
END_MARKER = "<!-- END_UPDATES -->"
settings = Settings()

View File

@@ -0,0 +1,15 @@
from pydantic import BaseModel
from typing import Optional
class Task(BaseModel):
phase: str
task_id: str
task_name: str
assignee: str
start_date: str
end_date: str
progress_val: str
status: str
class ProgressReport(BaseModel):
tasks: list[Task]

73
BABA_YAGA_Updater/main.py Normal file
View File

@@ -0,0 +1,73 @@
import sys
import os
from services.gsheet_client import GSheetClient
from mappers.sheet_mapper import SheetMapper
from mappers.markdown_builder import MarkdownBuilder
from services.readme_editor import ReadmeEditor
from config.settings import settings
def main():
try:
print("🚀 Starting README Update Process...")
# 1. Fetch data from Google Sheets
client = GSheetClient()
raw_rows = client.fetch_data()
if not raw_rows:
print("⚠️ No data found in the spreadsheet or error occurred.")
return
# 2. Map raw rows to Core Models
report = SheetMapper.map_rows_to_report(raw_rows)
print(f"✅ Data fetched: {len(report.tasks)} tasks parsed.")
# 3. Prepare Dynamic Content
markdown_table = MarkdownBuilder.build_table(report)
progress_summary = MarkdownBuilder.build_team_progress(report)
# 4. First, update the local section files with the new dynamic data
print("🔧 Injecting data into local sections...")
editor = ReadmeEditor()
# Inject progress into 08_team_standards.md
editor.inject_content_between_markers(
"sections/08_team_standards.md",
progress_summary,
"<!-- START_PROGRESS -->",
"<!-- END_PROGRESS -->"
)
# Inject task table into 07_roadmap.md (or whichever section has the marker)
# Note: Your main README markers were originally in 07_roadmap or similar
editor.inject_content_between_markers(
"sections/07_roadmap.md",
markdown_table,
"<!-- START_UPDATES -->",
"<!-- END_UPDATES -->"
)
# 5. Aggregate all sections into one big README content
print("📚 Aggregating all sections from 00 to 10...")
all_sections_content = ""
section_files = sorted([f for f in os.listdir("sections") if f.endswith(".md")])
for filename in section_files:
file_path = os.path.join("sections", filename)
with open(file_path, "r", encoding="utf-8") as f:
all_sections_content += f.read() + "\n\n---\n\n"
# 6. Update the ROOT README.md (../README.md)
print(f"📄 Updating Root README.md at: {settings.README_PATH}")
root_editor = ReadmeEditor(file_path=settings.README_PATH)
if root_editor.update_whole_readme(all_sections_content):
print("🎉 Root README.md successfully updated from all sections!")
else:
print("❌ Failed to update Root README.md.")
except Exception as e:
print(f"💥 An unexpected error occurred: {e}")
sys.exit(1)
if __name__ == "__main__":
main()

View File

@@ -0,0 +1,115 @@
from core.models import ProgressReport, Task
class MarkdownBuilder:
@staticmethod
def _parse_progress(p_val: str) -> int:
if p_val == "1":
return 100
try:
return int(p_val.replace("%", ""))
except:
return 0
@staticmethod
def _get_status_badge(status: str) -> str:
s = status.upper().strip()
if "COMPLETED" in s:
return "![Completed](https://img.shields.io/badge/-COMPLETED-2ea44f?style=flat-square)"
if "DURING" in s or "PROCESS" in s:
return "![In Progress](https://img.shields.io/badge/-IN_PROGRESS-005cc5?style=flat-square)"
if "NOT STARTED" in s:
return "![Not Started](https://img.shields.io/badge/-NOT_STARTED-6a737d?style=flat-square)"
return f"`{status}`"
@staticmethod
def build_table(report: ProgressReport) -> str:
if not report.tasks:
return "_No tasks found._"
header = "| Phase | ID | Task | Assignee | Timeline | Progress | Status |\n"
separator = "| :--- | :--- | :--- | :--- | :--- | :--- | :--- |\n"
rows = []
current_phase = ""
for task in report.tasks:
phase_display = f"**{task.phase}**" if task.phase != current_phase else ""
current_phase = task.phase
badge = MarkdownBuilder._get_status_badge(task.status)
prog_val = MarkdownBuilder._parse_progress(task.progress_val)
filled = prog_val // 10
bar = "" * filled + "" * (10 - filled)
rows.append(
f"| {phase_display} | `{task.task_id}` | {task.task_name} | `{task.assignee}` | {task.start_date} - {task.end_date} | `{bar} {prog_val}%` | {badge} |"
)
return header + separator + "\n".join(rows)
@staticmethod
def build_team_progress(report: ProgressReport) -> str:
if not report.tasks:
return ""
phases = {}
for t in report.tasks:
if t.phase not in phases:
phases[t.phase] = []
phases[t.phase].append(t)
total_tasks = len(report.tasks)
completed = len([t for t in report.tasks if "COMPLETED" in t.status.upper()])
in_progress = len([t for t in report.tasks if "DURING" in t.status.upper()])
avg_progress = sum(MarkdownBuilder._parse_progress(t.progress_val) for t in report.tasks) / total_tasks
# Build phase rows — NO leading spaces (prevents GitHub treating them as code blocks)
phase_rows_html = ""
colors = ["#B026FF", "#33CCFF", "#FF3333", "#FFD700"]
for i, (name, t_list) in enumerate(phases.items()):
p_total = len(t_list)
p_done = len([t for t in t_list if "COMPLETED" in t.status.upper()])
p_avg = sum(MarkdownBuilder._parse_progress(t.progress_val) for t in t_list) / p_total
color = colors[i % len(colors)]
# Key fix: use textwrap.dedent-style — keep lines flush left, no indentation
phase_rows_html += (
f'<tr>'
f'<td colspan="2" style="padding-top:10px;font-size:12px;color:#EEE;">'
f'<table width="100%" border="0" cellpadding="0" cellspacing="0">'
f'<tr><td align="left">{name}</td><td align="right">{p_avg:.0f}% ({p_done}/{p_total})</td></tr>'
f'</table>'
f'<div style="width:100%;background:#222;height:6px;border-radius:3px;overflow:hidden;margin-top:4px;">'
f'<div style="width:{p_avg}%;background:{color};height:100%;"></div>'
f'</div>'
f'</td>'
f'</tr>'
)
# Entire dashboard on as few lines as possible — no indented lines
dashboard = (
'<div align="center">'
'<table width="100%" border="0" cellpadding="0" cellspacing="0" style="background:#0D1117;border:1px solid #30363D;border-radius:8px;">'
'<tr>'
'<td width="40%" align="center" valign="middle" style="padding:25px;border-right:1px solid #30363D;">'
'<img src="https://api.iconify.design/lucide/target.svg?color=%23FFD700" width="32" height="32"/>'
f'<div style="margin:10px 0 5px 0;color:#FFD700;font-size:12px;letter-spacing:1px;font-weight:bold;">SYSTEM READINESS</div>'
f'<div style="font-size:48px;font-weight:800;color:#FFF;margin:5px 0;">{avg_progress:.1f}%</div>'
'<table border="0" cellpadding="0" cellspacing="0" style="margin-top:15px;">'
'<tr>'
f'<td align="center" style="padding:0 10px;"><div style="color:#2ea44f;font-size:16px;font-weight:bold;">{completed}</div><div style="color:#8B949E;font-size:9px;">DONE</div></td>'
f'<td style="border-left:1px solid #30363D;padding:0 10px;" align="center"><div style="color:#005cc5;font-size:16px;font-weight:bold;">{in_progress}</div><div style="color:#8B949E;font-size:9px;">ACTIVE</div></td>'
f'<td style="border-left:1px solid #30363D;padding:0 10px;" align="center"><div style="color:#8B949E;font-size:16px;font-weight:bold;">{total_tasks - completed - in_progress}</div><div style="color:#8B949E;font-size:9px;">BACKLOG</div></td>'
'</tr>'
'</table>'
'</td>'
'<td width="60%" valign="top" style="padding:20px;">'
'<div style="color:#8B949E;font-size:11px;text-transform:uppercase;letter-spacing:1px;font-weight:bold;margin-bottom:10px;">Phase Breakdown</div>'
f'<table width="100%" border="0" cellpadding="0" cellspacing="0">{phase_rows_html}</table>'
'</td>'
'</tr>'
'</table>'
'</div>'
)
return dashboard

View File

@@ -0,0 +1,34 @@
from core.models import Task, ProgressReport
class SheetMapper:
@staticmethod
def map_rows_to_report(rows: list[list]) -> ProgressReport:
tasks = []
current_phase = "General"
for row in rows:
if not row or len(row) < 2:
continue
# Detect Phase row (e.g. Row 1: ['', 'Phase 1: ...'])
# Phase rows usually have few columns or column 2/3 is empty
if len(row) <= 2 or (len(row) > 2 and row[2] == ""):
if row[1] and "Phase" in row[1]:
current_phase = row[1].strip()
continue
# Detect Task row (e.g. Row 2: ['', '1.1', 'Task Name', ...])
if len(row) >= 10:
task = Task(
phase=current_phase,
task_id=row[1],
task_name=row[2],
assignee=row[3],
start_date=row[4],
end_date=row[5],
progress_val=row[8],
status=row[9]
)
tasks.append(task)
return ProgressReport(tasks=tasks)

View File

@@ -0,0 +1,5 @@
google-api-python-client
google-auth-httplib2
google-auth-oauthlib
python-dotenv
pydantic

View File

@@ -0,0 +1,107 @@
<div align="center">
<!-- ANIMATED BANNER (Sử dụng SVG Pulse hoặc GIF) -->
<p align="center">
<img src="https://scove-vault.duckdns.org/files/api/public/dl/S8eQwp-Y" alt="Animated Header" />
</p>
### ⚡ THE ASYMMETRIC PSYCHOLOGICAL SURVIVAL ENGINE
**"Thị giác là một lời nói dối. Bóng tối là sự thật duy nhất."**
<p align="center">
<img src="https://img.shields.io/badge/VERSION-6000.3.10f1_LTS-white?style=for-the-badge&logo=unity&logoColor=black" />
<img src="https://img.shields.io/badge/NETWORKING-PHOTON_FUSION-0055FF?style=for-the-badge&logo=purescript&logoColor=white" />
<img src="https://img.shields.io/badge/STATUS-ACTIVE_DEVELOPMENT-FFD700?style=for-the-badge&logo=pulse&logoColor=black" />
</p>
---
<!-- GRID LAYOUT CHO CÁC CHỈ SỐ DỰ ÁN -->
<table border="0" cellpadding="0" cellspacing="0" align="center">
<tr style="border: none;">
<td align="center" style="border: none; padding: 20px;">
<img src="https://api.iconify.design/lucide/brain-circuit.svg?color=%23FF3333" width="40" height="40"><br>
<strong>Cognitive War</strong><br><small>Tâm lý chiến</small>
</td>
<td align="center" style="border: none; padding: 20px;">
<img src="https://api.iconify.design/lucide/audio-lines.svg?color=%2333FF33" width="40" height="40"><br>
<strong>Spatial Audio</strong><br><small>Âm thanh 3D</small>
</td>
<td align="center" style="border: none; padding: 20px;">
<img src="https://api.iconify.design/lucide/expand.svg?color=%2333CCFF" width="40" height="40"><br>
<strong>Procedural Maze</strong><br><small>Mê cung vô tận</small>
</td>
</tr>
</table>
---
</div>
## <img src="https://api.iconify.design/lucide/eye.svg?color=%23FF3333&flip=horizontal" width="28" height="28" style="vertical-align: middle;"> Tầm nhìn Dự án (Project Vision)
<div align="center">
<img src="https://scove-vault.duckdns.org/files/api/public/dl/clQLry_-" width="100%" style="border-radius: 10px; border: 1px solid #333;">
</div>
> **BABA_YAGA** không chỉ là một trò chơi; nó là một thí nghiệm về sự cô lập. Dự án được xây dựng trên triết lý **"High-Stakes Hide & Seek"**, nơi mỗi giây im lặng đều mang trọng lượng ngàn cân.
### 💠 Các Trụ Cột Cốt Lõi (Core Pillars)
- 🎛️ **Minimalist UI (The "Invisible" HUD):** Chúng tôi loại bỏ mọi rào cản giữa người chơi và môi trường. Không thanh máu, không bản đồ con. Mọi thông tin đều được phản hồi qua nhịp tim, nhịp thở và độ mờ của tầm nhìn.
- 🔊 **Spatial Audio Positioning:** Âm thanh là vũ khí. Seeker phải học cách "nhìn bằng tai", trong khi Trapper có thể sử dụng tiếng động giả để điều hướng con mồi vào bẫy.
- 💡 **Dynamic Lighting & Shadow Manipulation:** Ánh sáng trong BABA_YAGA là một tài nguyên hữu hạn. Việc bật đèn pin có thể giúp bạn thấy đường, nhưng đồng thời biến bạn thành một ngọn hải đăng cho kẻ đi săn.
---
<div align="center">
### <img src="https://api.iconify.design/lucide/command.svg?color=%23FFFFFF" width="22" height="22" style="vertical-align: middle;"> DANH MỤC HỆ THỐNG
<!-- TABLE OF CONTENTS 2 COLUMNS NO BORDER -->
<table border="0" cellpadding="0" cellspacing="0" style="border: none; border-collapse: collapse; width: 90%;">
<tr style="border: none;">
<td style="border: none; padding: 12px;" width="50%">
<img src="https://api.iconify.design/lucide/telescope.svg?color=%23888888" width="18" style="vertical-align: middle;"> &nbsp;
<a href="#vision" style="text-decoration: none; color: #E0E0E0; font-weight: bold;">Tầm nhìn & Triết lý</a>
</td>
<td style="border: none; padding: 12px;" width="50%">
<img src="https://api.iconify.design/lucide/box.svg?color=%23888888" width="18" style="vertical-align: middle;"> &nbsp;
<a href="#mechanics" style="text-decoration: none; color: #E0E0E0; font-weight: bold;">Cơ chế Core Gameplay</a>
</td>
</tr>
<tr style="border: none;">
<td style="border: none; padding: 12px;">
<img src="https://api.iconify.design/lucide/git-branch.svg?color=%23888888" width="18" style="vertical-align: middle;"> &nbsp;
<a href="#arch" style="text-decoration: none; color: #E0E0E0; font-weight: bold;">Kiến trúc Technical</a>
</td>
<td style="border: none; padding: 12px;">
<img src="https://api.iconify.design/lucide/network.svg?color=%23888888" width="18" style="vertical-align: middle;"> &nbsp;
<a href="#networking" style="text-decoration: none; color: #E0E0E0; font-weight: bold;">Đồng bộ Photon Fusion</a>
</td>
</tr>
<tr style="border: none;">
<td style="border: none; padding: 12px;">
<img src="https://api.iconify.design/lucide/activity.svg?color=%23888888" width="18" style="vertical-align: middle;"> &nbsp;
<a href="#comeback" style="text-decoration: none; color: #E0E0E0; font-weight: bold;">Hệ thống Adaptive Difficulty</a>
</td>
<td style="border: none; padding: 12px;">
<img src="https://api.iconify.design/lucide/map-pinned.svg?color=%23888888" width="18" style="vertical-align: middle;"> &nbsp;
<a href="#roadmap" style="text-decoration: none; color: #E0E0E0; font-weight: bold;">Lộ trình Roadmap</a>
</td>
</tr>
<tr style="border: none;">
<td style="border: none; padding: 12px;">
<img src="https://api.iconify.design/lucide/terminal.svg?color=%23888888" width="18" style="vertical-align: middle;"> &nbsp;
<a href="#install" style="text-decoration: none; color: #E0E0E0; font-weight: bold;">Hướng dẫn Triển khai</a>
</td>
<td style="border: none; padding: 12px;">
<img src="https://api.iconify.design/lucide/files.svg?color=%23888888" width="18" style="vertical-align: middle;"> &nbsp;
<a href="#folders" style="text-decoration: none; color: #E0E0E0; font-weight: bold;">Cấu trúc Workspace</a>
</td>
</tr>
</table>
---
</div>

View File

@@ -0,0 +1,46 @@
<div id="vision"></div>
## <img src="https://api.iconify.design/lucide/eye.svg?color=%23FF3333" width="28" height="28" style="vertical-align: middle;"> Tầm nhìn Dự án (Project Vision)
<div align="center">
<img src="https://scove-vault.duckdns.org/files/api/public/dl/SCjSqhKH" width="100%" style="border-radius: 12px; border: 1px solid #222; box-shadow: 0 4px 20px rgba(0,0,0,0.5); alt="Animated Header";>
<br>
<img src="https://raw.githubusercontent.com/andreasbm/readme/master/assets/lines/rainbow.png" width="100%" height="2px">
</div>
> **BABA_YAGA** được định nghĩa là một trải nghiệm **"Psychological Asymmetric Survival"**. Chúng tôi không xây dựng một trò chơi hành động nhanh, mà xây dựng một môi trường nơi **sự kiên nhẫn** là vũ khí và **tư duy logic** là chìa khóa để sống sót. Trọng tâm của dự án xoay quanh việc thao túng nhận thức của người chơi thông qua ba trụ cột kỹ thuật:
<br>
<table border="0" cellpadding="0" cellspacing="0" width="100%" style="border-collapse: collapse;">
<tr style="border: none;">
<td width="33%" align="center" style="border: none; padding: 15px; background: rgba(255,255,255,0.03); border-radius: 10px 0 0 10px;">
<img src="https://api.iconify.design/lucide/monitor-off.svg?color=%23888888" width="32" height="32" />
<br><br>
<strong>The "Zero-UI" Philosophy</strong>
<br>
<p style="font-size: 13px; color: #999;">Triệt tiêu hoàn toàn các yếu tố HUD truyền thống. Người chơi phải quan sát nhịp thở, vết máu và môi trường để tự đánh giá trạng thái nhân vật.</p>
</td>
<td width="33%" align="center" style="border: none; padding: 15px; background: rgba(255,255,255,0.05);">
<img src="https://api.iconify.design/lucide/audio-waveform.svg?color=%2344FF44" width="32" height="32" />
<br><br>
<strong>Acoustic Navigation</strong>
<br>
<p style="font-size: 13px; color: #999;">Hệ thống Spatial Audio biến âm thanh thành "bản đồ thị giác thứ hai". Tận dụng HRTF để định vị chính xác đối phương qua các tiếng động siêu nhỏ.</p>
</td>
<td width="33%" align="center" style="border: none; padding: 15px; background: rgba(255,255,255,0.03); border-radius: 0 10px 10px 0;">
<img src="https://api.iconify.design/lucide/lightbulb.svg?color=%23FFD700" width="32" height="32" />
<br><br>
<strong>Tactical Photometry</strong>
<br>
<p style="font-size: 13px; color: #999;">Ánh sáng là tài nguyên chiến thuật. Việc quản lý photon (đèn pin, nến, lửa) quyết định ranh giới giữa kẻ đi săn và con mồi.</p>
</td>
</tr>
</table>
<br>
<div align="right">
<img src="https://api.iconify.design/lucide/info.svg?color=%23555555" width="14" style="vertical-align: middle;">
<small><i>Dự án đang trong giai đoạn Technical Alpha, tập trung tối ưu hóa hệ thống Perception.</i></small>
</div>

View File

@@ -0,0 +1,158 @@
<div id="mechanics"></div>
## <img src="https://api.iconify.design/lucide/gamepad-2.svg?color=%2333CCFF" width="28" height="28" style="vertical-align: middle;"> Cơ chế Cốt lõi (Core Mechanics)
> Kiến trúc gameplay của **BABA_YAGA** được xây dựng dựa trên nguyên lý **"Thông tin Bất xứng" (Information Asymmetry)**. Hai phe tham gia không chỉ khác biệt về công cụ, mà còn trải nghiệm trò chơi ở hai chiều không gian và logic hoàn toàn trái ngược nhau.
<br>
### <img src="https://api.iconify.design/lucide/scale-3d.svg?color=%23E0E0E0" width="22" height="22" style="vertical-align: middle;"> Hệ sinh thái Bất đối xứng (The Asymmetric Paradigm)
<table width="100%" border="0" cellpadding="0" cellspacing="0" style="border-collapse: collapse; border: none;">
<!-- HEADER ROW -->
<tr>
<td width="50%" align="left" style="background: rgba(255,215,0,0.05); padding: 15px; border-radius: 8px 0 0 0; border-bottom: 2px solid rgba(255,215,0,0.3);">
<h3 style="margin: 0; color: #FFD700;">
<img src="https://api.iconify.design/lucide/footprints.svg?color=%23FFD700" width="24" style="vertical-align: middle;"> THE SEEKER
</h3>
<small style="color: #999;">Thực thể Động (Kinetic Survivor)</small>
</td>
<td width="50%" align="left" style="background: rgba(255,51,51,0.05); padding: 15px; border-radius: 0 8px 0 0; border-bottom: 2px solid rgba(255,51,51,0.3);">
<h3 style="margin: 0; color: #FF3333;">
<img src="https://api.iconify.design/lucide/cctv.svg?color=%23FF3333" width="24" style="vertical-align: middle;"> THE TRAPPER
</h3>
<small style="color: #999;">Kiến trúc sư Bóng tối (Environment Architect)</small>
</td>
</tr>
<!-- ROW 1: VAI TRÒ -->
<tr>
<td style="padding: 12px 15px; border-bottom: 1px solid rgba(255,255,255,0.05);">
<strong><img src="https://api.iconify.design/lucide/crosshair.svg?color=%23888888" width="16" style="vertical-align: middle;"> Vai trò (Role)</strong><br>
Chủ động điều hướng (Navigation), quản lý tài nguyên sinh tồn và tìm điểm Extraction Point. Phải di chuyển liên tục để tránh bị cô lập.
</td>
<td style="padding: 12px 15px; border-bottom: 1px solid rgba(255,255,255,0.05);">
<strong><img src="https://api.iconify.design/lucide/shield-ban.svg?color=%23888888" width="16" style="vertical-align: middle;"> Vai trò (Role)</strong><br>
Thiết lập hệ thống phòng ngự tĩnh, chặn luồng di chuyển (Choke points) và dồn ép tâm lý con mồi vào bẫy tử thần.
</td>
</tr>
<!-- ROW 2: TẦM NHÌN -->
<tr>
<td style="padding: 12px 15px; border-bottom: 1px solid rgba(255,255,255,0.05);">
<strong><img src="https://api.iconify.design/lucide/eye.svg?color=%23888888" width="16" style="vertical-align: middle;"> Tầm nhìn (Perception)</strong><br>
Góc nhìn thứ nhất <b>(Immersive FPS)</b>. Bị giới hạn hoàn toàn bởi bóng tối, chỉ thấy được những gì chùm sáng đèn pin quét qua.
</td>
<td style="padding: 12px 15px; border-bottom: 1px solid rgba(255,255,255,0.05);">
<strong><img src="https://api.iconify.design/lucide/monitor.svg?color=%23888888" width="16" style="vertical-align: middle;"> Tầm nhìn (Perception)</strong><br>
Góc nhìn Thượng đế <b>(Top-down / Surveillance Cams)</b>. Quản lý bản đồ qua hệ thống Heatmap và Camera an ninh đa điểm.
</td>
</tr>
<!-- ROW 3: ĐỘNG LỰC HỌC -->
<tr>
<td style="padding: 12px 15px; border-bottom: 1px solid rgba(255,255,255,0.05);">
<strong><img src="https://api.iconify.design/lucide/wind.svg?color=%23888888" width="16" style="vertical-align: middle;"> Cơ động (Mobility)</strong><br>
Tốc độ bứt tốc cao <b>(Sprinting: 9.0m/s)</b>. Khả năng tương tác vật lý trực tiếp với môi trường (Vaulting, Sliding).
</td>
<td style="padding: 12px 15px; border-bottom: 1px solid rgba(255,255,255,0.05);">
<strong><img src="https://api.iconify.design/lucide/ghost.svg?color=%23888888" width="16" style="vertical-align: middle;"> Cơ động (Mobility)</strong><br>
Tốc độ vật lý thấp, nhưng bù đắp bằng khả năng <b>Dịch chuyển Tức thời (Teleportation)</b> qua các node mạng lưới bóng tối.
</td>
</tr>
<!-- ROW 4: CÔNG CỤ -->
<tr>
<td style="padding: 12px 15px; border-radius: 0 0 0 8px;">
<strong><img src="https://api.iconify.design/lucide/wrench.svg?color=%23888888" width="16" style="vertical-align: middle;"> Khí tài (Arsenal)</strong><br>
<img src="https://img.shields.io/badge/-Flashlight-black?style=flat&logo=dcent&logoColor=white"/>
<img src="https://img.shields.io/badge/-Dash_Mechanic-black?style=flat&logo=dash&logoColor=white"/>
<img src="https://img.shields.io/badge/-Parkour_Rig-black?style=flat&logo=framer&logoColor=white"/>
</td>
<td style="padding: 12px 15px; border-radius: 0 0 8px 0;">
<strong><img src="https://api.iconify.design/lucide/server-cog.svg?color=%23888888" width="16" style="vertical-align: middle;"> Khí tài (Arsenal)</strong><br>
<img src="https://img.shields.io/badge/-Bear_Traps-black?style=flat&logo=target&logoColor=red"/>
<img src="https://img.shields.io/badge/-Decoy_Audio-black?style=flat&logo=audacity&logoColor=red"/>
<img src="https://img.shields.io/badge/-Door_Override-black?style=flat&logo=lock&logoColor=red"/>
</td>
</tr>
</table>
<br>
### <img src="https://api.iconify.design/lucide/refresh-cw.svg?color=%23E0E0E0" width="22" height="22" style="vertical-align: middle;"> Vòng lặp Gameplay & Đồng bộ Hóa (Deterministic Game Loop)
> Toàn bộ logic bên dưới được xử lý trong `FixedUpdateNetwork()` của Photon Fusion. Chúng tôi sử dụng kiến trúc **Server Reconciliation** kết hợp **Client Prediction** để đảm bảo Seeker di chuyển mượt mà (không delay), trong khi Trapper vẫn có quyền kiểm soát toàn vẹn trạng thái bản đồ (Server Authority).
*(Lưu ý kỹ thuật: Sơ đồ dưới đây đã được cấu trúc lại thuộc tính HTML bên trong để đảm bảo khả năng render không bị lỗi trên các bộ phân tích Markdown của GitHub/Gitea)*
```mermaid
graph TD
classDef initStyle fill:#1a2b3c,stroke:#33CCFF,stroke-width:2px,color:#E0E0E0;
classDef seekerStyle fill:#332200,stroke:#FFD700,stroke-width:2px,color:#FFD700;
classDef trapperStyle fill:#2b0000,stroke:#FF3333,stroke-width:2px,color:#FF3333;
classDef netStyle fill:#111111,stroke:#888888,stroke-dasharray:5 5,color:#E0E0E0;
classDef winStyle fill:#003311,stroke:#00FF55,stroke-width:3px,color:#00FF55;
classDef criticalStyle fill:#4d0000,stroke:#FF0000,stroke-width:2px,color:#FF0000;
subgraph Initialization ["1. KHỞI TẠO HỆ THỐNG (NET-SYNC)"]
A["🚀 Bắt đầu Trận đấu"] --> B{"🤝 Matchmaking\nPhoton Fusion"}
B --> C["🎭 Phân vai: Seeker vs Trapper"]
C --> D["🧩 Maze Generator\nPrims/Wilsons"]
D --> E["🏛️ Baking NavMesh & Colliders"]
E --> F["👤 Character Auto-Setup"]
F --> G["📍 Spawn Players"]
end
class A,B,C,D,E,F,G initStyle;
subgraph Active_Round ["2. VÒNG LẶP CHIẾN ĐẤU (CORE LOOP)"]
G --> Loop(["⚙️ TICK: FixedUpdateNetwork"])
subgraph Seeker_Logic ["⚡ SEEKER - POV 1st Person"]
S1["⌨️ Input: WASD/Space"] --> S2["🏃 State: Move/Dash"]
S2 --> S3{"❓ Hành động?"}
S3 -- "Sprinting" --> S4["🔊 Noise Up"]
S3 -- "Sneaking" --> S5["🔇 Noise Down"]
S3 -- "Flashlight" --> S6["🔦 Lộ vị trí"]
S4 & S5 & S6 --> S_Check{"🔍 Check Env"}
S_Check -- "Dẫm bẫy" --> S_Trap["⚠️ Bị khống chế"]
end
subgraph Trapper_Logic ["🔧 TRAPPER - Strategy View"]
T1["🖱️ Mouse Input"] --> T2["🗺️ View: Heatmap/Cams"]
T2 --> T3{"🔨 Kỹ năng?"}
T3 -- "Đặt bẫy" --> T4["💾 Sync Trap"]
T3 -- "Scan" --> T5["📡 Ping Seeker"]
T3 -- "Lock" --> T6["🚪 Khóa cửa"]
T4 & T5 & T6 --> T_Check{"👁️ Theo dõi"}
end
subgraph Network_Sync ["🌐 NETWORK SYNC LAYER"]
Loop --> NS1["⏩ Client Prediction"]
NS1 --> NS2["🔄 Server Reconciliation"]
NS2 --> NS3["📦 State Sync"]
end
end
class S1,S2,S3,S4,S5,S6,S_Check seekerStyle;
class T1,T2,T3,T4,T5,T6,T_Check trapperStyle;
class NS1,NS2,NS3,Loop netStyle;
class S_Trap criticalStyle;
subgraph Result_Logic ["3. KẾT THÚC & THƯỞNG"]
S_Check -- "Chạm Exit" --> Win_S["🏆 SEEKER THẮNG"]
T_Check -- "Bắt được Seeker" --> Win_T["🏆 TRAPPER THẮNG"]
Loop -- "Timer = 0" --> Win_T
Win_S & Win_T --> Post_Match["📊 Thống kê Match"]
Post_Match --> Buff{"⚖️ Hệ thống Adaptive"}
Buff -- "Thua liên tiếp" --> Buff_Apply["💎 Kích hoạt Comeback Buff"]
Buff_Apply --> A
end
class Win_S,Win_T winStyle;
class Post_Match,Buff,Buff_Apply initStyle;
S_Trap -.->|"Cảnh báo State"| T_Check
S4 -.->|"Phát xạ Sóng âm"| T2
T4 -.->|"Collision Vô hình"| S_Check
NS3 --> Loop
```

View File

@@ -0,0 +1,112 @@
<div id="arch"></div>
## <img src="https://api.iconify.design/lucide/cpu.svg?color=%2333CCFF" width="28" height="28" style="vertical-align: middle;"> Kiến trúc Kỹ thuật (Technical Architecture)
> Hệ thống của **BABA_YAGA** được thiết kế theo chuẩn **Modular Architecture** (Kiến trúc Module), tách biệt hoàn toàn giữa logic xử lý vật lý (Kinematics), trạng thái mạng (Net-State) và phản hồi thị giác (Visual Feedbacks). Điều này đảm bảo hiệu năng cao (High Tickrate) ngay cả trong các môi trường mê cung phức tạp.
<br>
### <img src="https://api.iconify.design/lucide/git-merge.svg?color=%23E0E0E0" width="22" height="22" style="vertical-align: middle;"> 1. Advanced Kinematic FSM & Camera Dynamics
Hệ thống điều khiển nhân vật cốt lõi được xây dựng trên mô hình **Finite State Machine (FSM)** phân cấp. Không chỉ xử lý nội suy vật lý mượt mà, hệ thống còn tích hợp trực tiếp với **Procedural Camera Dynamics** (Head-bob, Dynamic FOV, Tilt) để tạo ra sự cộng hưởng về cảm giác nhập vai, đồng thời duy trì tính đồng bộ tuyệt đối qua lớp mạng (Networking Layer).
*(Lưu ý: Sơ đồ trạng thái dưới đây đã được tối ưu hóa cho thuật toán dự đoán phía Client)*
```mermaid
stateDiagram-v2
direction TB
state "👣 KINEMATIC GROUND" as Ground {
[*] --> Idle
state Idle {
I_P: ⚓ Vel < 0.1m/s
I_C: 📈 Breathing Cam (0.5Hz)
}
Idle --> Moving : Input.mag > 0.1
state Moving {
M_P: 🚶 Speed 2-4m/s
M_C: 🎥 Head Bob (1.2Hz)
}
Moving --> Sneaking : Hold [Sneak]
state Sneaking {
Sn_P: 🔇 Acoustic Profile -50%
Sn_C: ⬇️ Collider Height Down
}
Moving --> Sprinting : Hold [Sprint]
Sneaking --> Moving : Release [Sneak]
state Sprinting {
Sp_P: ⚡ Speed > 6.5m/s
Sp_C: 🔵 Dynamic FOV Warp
}
Sprinting --> Moving : Stamina Depleted
}
state "🪶 AIRBORNE DYNAMICS" as Air {
state Jump {
J_P: ⬆️ AddForce Up
}
state Falling {
F_P: 📉 Gravity x1.5
}
state Landing {
L_P: 📐 Impact Raycast
}
Jump --> Falling : Vel.y < 0
Falling --> Landing : KCC.IsGrounded == true
}
state "🎯 UTILITY / ACTION" as Utility {
state Dashing {
D_P: 💨 Vector Burst (15m/s)
}
state Interacting {
Int_P: 🔒 Root Motion Lock
}
}
state "🌐 NET-SYNC LAYER" as Net {
state "Input Authority (Client)" as IA
state "State Authority (Server)" as SA
IA --> SA : Send Input Tick
SA --> IA : Force Reconcile
}
Ground --> Air : KCC.IsGrounded == false
Air --> Ground : OnLandEvent.Fire()
Ground --> Utility : InvokeAbility()
Utility --> Ground : Action Complete
note left of Ground
💾 Sync: KCC Velocity
🗂️ State: Networked Enum
end note
note right of Net
⚙️ Photon Fusion
🛡️ Anti-Cheat Validated
end note
```
<br>
<img src="https://api.iconify.design/lucide/radar.svg?color=%23E0E0E0" width="22" height="22" style="vertical-align: middle;"> 2. Tactical Environment Scanner & Interaction
Việc tương tác trong một môi trường bị giới hạn hoàn toàn về tầm nhìn đòi hỏi một hệ thống truy vấn không gian (Spatial Querying) cực kỳ chính xác. Chúng tôi từ chối sử dụng cơ chế Raycast điểm đơn thông thường.
<table border="0" cellpadding="0" cellspacing="0" width="100%" style="border-collapse: collapse; margin-top: 10px;">
<tr>
<td width="80px" align="center" style="background: rgba(51, 204, 255, 0.1); border-radius: 8px 0 0 8px; border-left: 3px solid #33CCFF;">
<img src="https://api.iconify.design/lucide/scan-line.svg?color=%2333CCFF" width="40" height="40">
</td>
<td style="background: rgba(255,255,255,0.03); padding: 15px; border-radius: 0 8px 8px 0;">
<h4 style="margin: 0 0 5px 0; color: #E0E0E0;">Hệ thống lõi: <code>EnvironmentScanner.cs</code></h4>
<p style="font-size: 14px; color: #999; margin: 0; line-height: 1.5;">
Sử dụng kết hợp <code>Physics.OverlapSphereNonAlloc</code> để tối ưu hóa bộ nhớ (Zero Garbage Collection) và <code>SphereCast</code> để tính toán đường đạn thể tích. Hệ thống tự động phân tích và trích xuất các đối tượng thỏa mãn đa hình <strong>Interface <code>IInteractable</code></strong>, đảm bảo người chơi có thể kích hoạt các thiết bị (Cửa, Máy phát điện, Bẫy) một cách mượt mà ngay cả khi chúng hoàn toàn chìm trong bóng tối.
</p>
</td>
</tr>
</table>

View File

@@ -0,0 +1,86 @@
## <img src="https://api.iconify.design/lucide/globe.svg?color=%2333CCFF" width="28" height="28" style="vertical-align: middle;"> Kiến trúc Mạng (Advanced Netcode Architecture)
> Để đảm bảo tính công bằng trong một tựa game mang nặng yếu tố hành động lén lút và phản xạ ngàn cân treo sợi tóc, **BABA_YAGA** sử dụng **Photon Fusion (State Sync)** làm lõi đồng bộ. Hệ thống được tinh chỉnh để mô phỏng cảm giác "Độ trễ bằng 0" (Zero-Latency Feel) thông qua kiến trúc mạng tất định (Deterministic Network).
<br>
<table width="100%" border="0" cellpadding="0" cellspacing="0" style="border-collapse: collapse; border: none;">
<tr style="border: none;">
<td width="33%" align="center" style="border: none; padding: 15px; background: rgba(51,204,255,0.05); border-radius: 8px 0 0 8px; border-bottom: 2px solid rgba(51,204,255,0.3);">
<img src="https://api.iconify.design/lucide/fast-forward.svg?color=%2333CCFF" width="28" height="28" />
<br><br>
<strong style="color: #E0E0E0;">Client-Side Prediction</strong>
<br>
<p style="font-size: 13px; color: #999; margin-top: 5px;">Mô phỏng trước các chuyển động của người chơi trên Local Client, loại bỏ hoàn toàn độ trễ Input Delay khi di chuyển hoặc lướt.</p>
</td>
<td width="33%" align="center" style="border: none; padding: 15px; background: rgba(255,51,51,0.05); border-bottom: 2px solid rgba(255,51,51,0.3);">
<img src="https://api.iconify.design/lucide/shield-check.svg?color=%23FF3333" width="28" height="28" />
<br><br>
<strong style="color: #E0E0E0;">Server Authority</strong>
<br>
<p style="font-size: 13px; color: #999; margin-top: 5px;">Máy chủ nắm quyền quyết định cuối cùng. Ngăn chặn triệt để các hành vi gian lận như Speedhack, Teleport hay thao túng Hitbox.</p>
</td>
<td width="33%" align="center" style="border: none; padding: 15px; background: rgba(255,215,0,0.05); border-radius: 0 8px 8px 0; border-bottom: 2px solid rgba(255,215,0,0.3);">
<img src="https://api.iconify.design/lucide/history.svg?color=%23FFD700" width="28" height="28" />
<br><br>
<strong style="color: #E0E0E0;">Lag Compensation</strong>
<br>
<p style="font-size: 13px; color: #999; margin-top: 5px;">Rewind trạng thái Hitbox trên Server về đúng thời điểm Client thực hiện thao tác (Ping), đảm bảo tính chính xác cho các cú vồ/bẫy.</p>
</td>
</tr>
</table>
<br>
### <img src="https://api.iconify.design/lucide/workflow.svg?color=%23E0E0E0" width="22" height="22" style="vertical-align: middle;"> Vòng xoay Dữ liệu Mạng (Network Data Flow Pipeline)
> Biểu đồ dưới đây mô tả luồng xử lý thông tin tại mỗi **Tick (Khung hình mạng)**. Việc phân tách rõ ràng giữa *Logical State* (trạng thái mạng) và *Visual Presentation* (hiển thị hình ảnh) giúp khung hình của game (FPS) không bị khóa vào Tickrate của Server.
*(Lưu ý: Các trích xuất HTML trong sơ đồ đã được chuẩn hóa để tương thích hoàn toàn với bộ phân tích Markdown)*
```mermaid
sequenceDiagram
autonumber
box rgba(51, 204, 255, 0.05) "⚡ LOCAL ENVIRONMENT (Client Auth)"
participant IR as "🖱️ Input"
participant CP as "💻 Local Player"
end
box rgba(255, 51, 51, 0.05) "👑 SERVER ENVIRONMENT (State Auth)"
participant NT as "📡 Network Layer"
participant S as "🖥️ Server Tick"
end
box rgba(255, 215, 0, 0.05) "👁️ REMOTE OBSERVERS"
participant RP as "👥 Proxies"
end
Note over IR,CP: [PHASE 1] DATA ACQUISITION
IR->>CP: OnMove / OnAbility (Raw Input)
CP->>CP: 📦 Pack NetworkInputStruct
Note over CP: [PHASE 2] FORWARD PREDICTION
CP->>CP: ⚡ Run Local Kinematics (Tick N)
CP->>NT: 📤 Transmit Input Payload
rect rgba(255, 51, 51, 0.1)
Note over NT,S: [PHASE 3] SERVER VALIDATION (Simulation)
NT->>S: Deliver UDP Packet
S->>S: 🛡️ Validate Rules & Apply Physics
S-->>NT: 📢 Broadcast State Snapshot (Tick N)
end
Note over NT,CP: [PHASE 4] RECONCILIATION PROTOCOL
NT-->>CP: State Snapshot (Global Truth)
CP->>CP: ⚖️ Check Desync (Threshold)
CP->>CP: 🔄 Snap Pos & Resimulate if Error
Note over NT,RP: [PHASE 5] PROXY INTERPOLATION
NT-->>RP: State Snapshot
RP->>RP: 〰️ Lerp Position / Rotation Smoothly
Note over CP,RP: [PHASE 6] VISUAL RENDERING
CP->>CP: 🎥 Update Local VFX / Camera Shake
RP->>RP: 👻 Update Animator & Mesh Transforms
```

View File

@@ -0,0 +1,85 @@
<div id="networking"></div>
## <img src="https://api.iconify.design/lucide/globe-2.svg?color=%2333CCFF" width="28" height="28" style="vertical-align: middle;"> Kiến trúc Netcode (Deterministic Networking)
<div align="center">
<img src="https://img.shields.io/badge/ENGINE-PHOTON_FUSION_2.0-0055FF?style=for-the-badge&logo=purescript&logoColor=white" />
<img src="https://img.shields.io/badge/TOPOLOGY-CLIENT_HOSTED_SERVER-FF3333?style=for-the-badge&logo=server&logoColor=white" />
<img src="https://img.shields.io/badge/TICKRATE-60_Hz-00FF55?style=for-the-badge&logo=activity&logoColor=black" />
</div>
> Tựa game với nhịp độ sinh tồn căng thẳng không có chỗ cho sự sai lệch (Desync). **BABA_YAGA** vận hành trên kiến trúc **State Sync (Đồng bộ Trạng thái)** kết hợp quy trình **Dự đoán phía Client (Client-Side Prediction)** và **Bù trừ Độ trễ (Lag Compensation)**, mang lại cảm giác phản hồi tức thì "Zero-Latency" ngay cả ở mức Ping 100ms+.
<br>
<table width="100%" border="0" cellpadding="0" cellspacing="0" style="border-collapse: collapse; border: none;">
<tr>
<td width="50%" style="padding: 15px; background: rgba(51,204,255,0.05); border-left: 3px solid #33CCFF; border-bottom: 1px solid rgba(255,255,255,0.05);">
<strong style="color: #33CCFF;"><img src="https://api.iconify.design/lucide/fast-forward.svg?color=%2333CCFF" width="18" style="vertical-align: middle;"> Client-Side Prediction (Dự đoán cục bộ)</strong><br>
<p style="font-size: 13px; color: #AAA; margin-top: 8px;">Người chơi nội bộ (Local Player) thực thi các lệnh di chuyển, lướt, rọi đèn pin <b>ngay lập tức</b> mà không cần đợi Server cho phép. Tạo cảm giác điều khiển mượt mà như game Offline.</p>
</td>
<td width="50%" style="padding: 15px; background: rgba(255,51,51,0.05); border-left: 3px solid #FF3333; border-bottom: 1px solid rgba(255,255,255,0.05);">
<strong style="color: #FF3333;"><img src="https://api.iconify.design/lucide/shield-check.svg?color=%23FF3333" width="18" style="vertical-align: middle;"> Server Reconciliation (Thuật toán Đối chiếu)</strong><br>
<p style="font-size: 13px; color: #AAA; margin-top: 8px;">Máy chủ vẫn nắm quyền tối thượng (Authority). Nếu Client dự đoán sai (do va chạm với bẫy hoặc bị kẹt), Server sẽ ép Client "Rollback" về trạng thái chuẩn trong tích tắc (Snap Correction).</p>
</td>
</tr>
</table>
<br>
### <img src="https://api.iconify.design/lucide/satellite-dish.svg?color=%23E0E0E0" width="22" height="22" style="vertical-align: middle;"> Network Data Flow (Luồng Đồng bộ Hóa)
> Sơ đồ biểu diễn vòng đời của một **Network Tick** từ khi người chơi nhấn phím đến khi hình ảnh được kết xuất (Render) trên màn hình của những người chơi khác.
```mermaid
sequenceDiagram
autonumber
box rgba(51, 204, 255, 0.05) "⚡ LOCAL ENVIRONMENT (Client Auth)"
participant IR as "🖱️ Input"
participant CP as "💻 Local Player"
end
box rgba(255, 51, 51, 0.05) "👑 SERVER ENVIRONMENT (State Auth)"
participant NT as "📡 Network Layer"
participant S as "🖥️ Server Tick"
end
box rgba(255, 215, 0, 0.05) "👁️ REMOTE OBSERVERS"
participant RP as "👥 Proxies"
end
Note over IR,CP: [PHASE 1] DATA ACQUISITION
IR->>CP: OnMove / OnAbility (Raw Input)
CP->>CP: 📦 Pack NetworkInputStruct
Note over CP: [PHASE 2] FORWARD PREDICTION
CP->>CP: ⚡ Run Local Kinematics (Tick N)
CP->>NT: 📤 Transmit Input Payload
rect rgba(255, 51, 51, 0.1)
Note over NT,S: [PHASE 3] SERVER VALIDATION (Simulation)
NT->>S: Deliver UDP Packet
S->>S: 🛡️ Validate Rules & Apply Physics
S-->>NT: 📢 Broadcast State Snapshot (Tick N)
end
Note over NT,CP: [PHASE 4] RECONCILIATION PROTOCOL
NT-->>CP: State Snapshot (Global Truth)
CP->>CP: ⚖️ Check Desync (Threshold)
CP->>CP: 🔄 Snap Pos & Resimulate if Error
Note over NT,RP: [PHASE 5] PROXY INTERPOLATION
NT-->>RP: State Snapshot
RP->>RP: 〰️ Lerp Position / Rotation Smoothly
Note over CP,RP: [PHASE 6] VISUAL RENDERING
CP->>CP: 🎥 Update Local VFX / Camera Shake
RP->>RP: 👻 Update Animator & Mesh Transforms
```
<br>
<div align="center">
<img src="https://api.iconify.design/lucide/shield-alert.svg?color=%23555555" width="16" style="vertical-align: middle;">
<small style="color: #888;"><i>Tất cả Logic Va chạm (Collision) và Phát hiện Âm thanh (Noise Detection) được phân tách hoàn toàn khỏi luồng Render đồ họa, ngăn chặn hiện tượng rách hình ảnh (Tearing) do lag mạng.</i></small>
</div>
```

View File

@@ -0,0 +1,130 @@
<div id="comeback"></div>
## <img src="https://api.iconify.design/lucide/scale.svg?color=%23FF3333" width="28" height="28" style="vertical-align: middle;"> Hệ thống Cân bằng Thích ứng (Tiered "Despair" Mechanics)
<div align="center">
<img src="https://raw.githubusercontent.com/andreasbm/readme/master/assets/lines/rainbow.png" width="100%" height="2px" style="filter: grayscale(100%) contrast(200%) sepia(100%) hue-rotate(300deg) saturate(500%);">
</div>
> Để duy trì trạng thái **"Căng thẳng tột độ" (High-Stakes)** đến những giây phút cuối cùng, kiến trúc của **BABA_YAGA** tích hợp một động cơ cân bằng ngầm mang tên **"Despair Mechanics"**. Khi một thực thể bị đẩy vào chuỗi thất bại liên tiếp, Mê cung sẽ bẻ cong các quy tắc vật lý và logic thông thường để ban cho họ những đặc quyền sinh tồn phi mã, tạo ra những khoảnh khắc lật kèo (Comeback) chấn động mạng lưới.
<br>
### <img src="https://api.iconify.design/lucide/trending-up.svg?color=%23E0E0E0" width="22" height="22" style="vertical-align: middle;"> Phân tầng Bù trừ theo Chuỗi Thua (Progression Hierarchy)
<table width="100%" border="0" cellpadding="0" cellspacing="0" style="border-collapse: collapse; text-align: center;">
<tr>
<td width="33%" style="padding: 15px; background: rgba(255,255,255,0.03); border-right: 2px solid #222; border-radius: 8px 0 0 8px;">
<img src="https://api.iconify.design/lucide/battery-low.svg?color=%23888888" width="32" height="32" /><br><br>
<img src="https://img.shields.io/badge/LOSS_STREAK-1_ROUND-888888?style=flat-square" /><br>
<h3 style="color: #E0E0E0; margin: 10px 0 5px 0;">TIER 1: Awakening</h3>
<p style="font-size: 12px; color: #999;">Khởi động giao thức sinh tồn cơ bản. Lựa chọn 1 Buff thụ động (Nâng cấp chỉ số Base Stats như Tốc độ / Tầm nhìn).</p>
</td>
<td width="33%" style="padding: 15px; background: rgba(255,255,255,0.05); border-right: 2px solid #222;">
<img src="https://api.iconify.design/lucide/battery-medium.svg?color=%23FF8C00" width="32" height="32" /><br><br>
<img src="https://img.shields.io/badge/LOSS_STREAK-2_ROUNDS-FF8C00?style=flat-square" /><br>
<h3 style="color: #FF8C00; margin: 10px 0 5px 0;">TIER 2: Evolution</h3>
<p style="font-size: 12px; color: #999;">Tiến hóa cơ sở hạ tầng. Nhận đồng thời 1 Kỹ năng Chủ động (Active Skill) và 1 Đặc quyền Thụ động (Passive Perk).</p>
</td>
<td width="33%" style="padding: 15px; background: rgba(255,0,0,0.05); border-radius: 0 8px 8px 0;">
<img src="https://api.iconify.design/lucide/battery-warning.svg?color=%23FF0000" width="32" height="32" /><br><br>
<img src="https://img.shields.io/badge/LOSS_STREAK-3+_ROUNDS-FF0000?style=flat-square" /><br>
<h3 style="color: #FF3333; margin: 10px 0 5px 0;">TIER 3: Manifestation</h3>
<p style="font-size: 12px; color: #999;">Ghi đè hệ thống (Override Ruleset). Kích hoạt <strong>Ultimate Skill</strong> thay đổi hoàn toàn cục diện trận đấu trong thời gian ngắn.</p>
</td>
</tr>
</table>
<br>
---
### <img src="https://api.iconify.design/lucide/fingerprint.svg?color=%23FFD700" width="24" height="24" style="vertical-align: middle;"> THE SEEKER: Thức Tỉnh Bản Năng (Survival Evolution)
Khi Seeker liên tục bị bóng tối nuốt chửng, hệ thần kinh của họ sẽ bị ép buộc tiến hóa vượt giới hạn để chống lại môi trường khắc nghiệt:
<table width="100%" border="0" cellpadding="0" cellspacing="0" style="border:collapse; border: none;">
<tr>
<td width="25%" style="padding: 12px; border-bottom: 1px solid #333; vertical-align: top;">
<img src="https://img.shields.io/badge/TIER_1-SIXTH_SENSE-FFD700?style=for-the-badge" />
</td>
<td style="padding: 12px; border-bottom: 1px solid #333; vertical-align: top;">
<strong style="color: #E0E0E0;">Acoustic Resonance (Cộng hưởng Hạ âm)</strong><br>
<span style="font-size: 14px; color: #AAA;">Kích hoạt khả năng cảm nhận tần số thấp. Seeker có thể nghe thấy nhịp tim đập dồn dập của chính mình khi Trapper tiến vào bán kính 15m, đóng vai trò như một radar sinh học mà không cần sử dụng thị giác.</span>
</td>
</tr>
<tr>
<td style="padding: 12px; border-bottom: 1px solid #333; vertical-align: top;">
<img src="https://img.shields.io/badge/TIER_2-SHADOW_STEP-FF8C00?style=for-the-badge" />
</td>
<td style="padding: 12px; border-bottom: 1px solid #333; vertical-align: top;">
<strong style="color: #E0E0E0;">Kinematic Void (Bước chân Hư vô)</strong><br>
<span style="font-size: 14px; color: #AAA;">Triệt tiêu hoàn toàn ma sát vật lý. Seeker không phát ra bất kỳ sóng âm nào (Noise Meter = 0) khi di chuyển trong 20 giây đầu tiên, cho phép thiết lập điểm mù chiến thuật (Blindspot) từ sớm.</span>
</td>
</tr>
<tr>
<td style="padding: 12px; border-bottom: 1px solid #333; vertical-align: top;">
<img src="https://img.shields.io/badge/TIER_2-TRAP_REFLEX-FF8C00?style=for-the-badge" />
</td>
<td style="padding: 12px; border-bottom: 1px solid #333; vertical-align: top;">
<strong style="color: #E0E0E0;">Neural Overdrive (Phản xạ Tột độ)</strong><br>
<span style="font-size: 14px; color: #AAA;">Có 50% cơ hội ghi đè (Bypass) cơ chế kích hoạt của bẫy cơ học đầu tiên vô tình chạm phải. Nếu bypass thành công, hệ thống bơm Adrenaline sẽ kích hoạt, cộng dồn 50% vận tốc bứt tốc trong 3 giây.</span>
</td>
</tr>
<tr>
<td style="padding: 12px; background: rgba(255,215,0,0.05); vertical-align: top;">
<img src="https://img.shields.io/badge/ULTIMATE-CHRONO_DASH-FF0000?style=for-the-badge" />
</td>
<td style="padding: 12px; background: rgba(255,215,0,0.05); vertical-align: top;">
<strong style="color: #FFD700; text-transform: uppercase;">Temporal Displacement (Phá vỡ Thời Không)</strong><br>
<span style="font-size: 14px; color: #AAA;">Trong 15 giây, thể lực (Stamina) bị khóa ở mức vô hạn. Seeker có thể <code>Dash</code> liên tục (Zero Cooldown) và đạt trạng thái <strong style="color: #FFF;">I-Frame</strong> (Miễn nhiễm khống chế). Lúc này, luật chơi đảo chiều: Seeker là kẻ săn lùng lối thoát.</span>
</td>
</tr>
</table>
<br>
---
### <img src="https://api.iconify.design/lucide/cpu.svg?color=%23FF3333" width="24" height="24" style="vertical-align: middle;"> THE TRAPPER: Hiến Tế Không Gian (Dark Rituals)
Khi Trapper để mất quyền kiểm soát, Mê cung sẽ tự động phân rã sự ổn định của nó, cấp cho Trapper quyền truy cập vào các giao thức thao túng môi trường cực hạn:
<table width="100%" border="0" cellpadding="0" cellspacing="0" style="border:collapse; border: none;">
<tr>
<td width="25%" style="padding: 12px; border-bottom: 1px solid #333; vertical-align: top;">
<img src="https://img.shields.io/badge/TIER_1-PARANOIA_ECHO-FF3333?style=for-the-badge" />
</td>
<td style="padding: 12px; border-bottom: 1px solid #333; vertical-align: top;">
<strong style="color: #E0E0E0;">Aural Hallucination (Nhiễu loạn Nhận thức)</strong><br>
<span style="font-size: 14px; color: #AAA;">Phát xạ 3 luồng tín hiệu âm thanh ảo đa hướng xung quanh Seeker. Các tín hiệu này can thiệp trực tiếp vào hệ thống Spatial Audio, tạo ảo giác về tiếng bước chân dồn dập nhằm đánh sập khả năng định vị của con mồi.</span>
</td>
</tr>
<tr>
<td style="padding: 12px; border-bottom: 1px solid #333; vertical-align: top;">
<img src="https://img.shields.io/badge/TIER_2-GLOBAL_BLACKOUT-FF8C00?style=for-the-badge" />
</td>
<td style="padding: 12px; border-bottom: 1px solid #333; vertical-align: top;">
<strong style="color: #E0E0E0;">Photon Suppression (Triệt tiêu Quang năng)</strong><br>
<span style="font-size: 14px; color: #AAA;">Hấp thụ toàn bộ ánh sáng trong khu vực. Đèn pin của Seeker sẽ bị ép vào trạng thái nhiễu loạn (Flicker) hoặc sập nguồn hoàn toàn trong 8 giây. Đây là khung cửa tử thần (Kill-window) hoàn hảo để thu hẹp khoảng cách.</span>
</td>
</tr>
<tr>
<td style="padding: 12px; border-bottom: 1px solid #333; vertical-align: top;">
<img src="https://img.shields.io/badge/TIER_2-GHOSTING-FF8C00?style=for-the-badge" />
</td>
<td style="padding: 12px; border-bottom: 1px solid #333; vertical-align: top;">
<strong style="color: #E0E0E0;">Quantum Phase (Phi vật chất hóa)</strong><br>
<span style="font-size: 14px; color: #AAA;">Tạm thời vô hiệu hóa Layer Collision của Trapper. Cấp khả năng đi xuyên qua các cánh cửa đã bị khóa mã hoặc các cấu trúc tường mỏng (Destructible Walls) trong 15 giây, bỏ qua mọi rào cản vật lý.</span>
</td>
</tr>
<tr>
<td style="padding: 12px; background: rgba(255,51,51,0.05); vertical-align: top;">
<img src="https://img.shields.io/badge/ULTIMATE-EYE_OF_ABYSS-FF0000?style=for-the-badge" />
</td>
<td style="padding: 12px; background: rgba(255,51,51,0.05); vertical-align: top;">
<strong style="color: #FF3333; text-transform: uppercase;">Abyssal Omniscience (Nhãn quan Lưỡi Hái)</strong><br>
<span style="font-size: 14px; color: #AAA;">Đồng bộ hóa trực tiếp với mạng lưới lõi của mê cung. Render vị trí thời gian thực của Seeker xuyên qua mọi vật cản (Absolute Wallhack) dưới dạng bóng tối (Silhouette) trong 20 giây. Không có góc khuất, không có lối thoát.</span>
</td>
</tr>
</table>

Some files were not shown because too many files have changed in this diff Show More