gameplay refine

1. 优化 ResolutionAdapter 的分辨率适配问题
2. 调整 SpriteCache 的资源路径拼接
3. 引入 StoryDirector 做各玩法的胶水
4. 导入和改名资源便于代码查询路径
This commit is contained in:
SepComet 2026-04-20 15:26:36 +08:00
parent cc5d8edec4
commit 0f928f6167
56 changed files with 1218 additions and 621 deletions

2
.gitignore vendored
View File

@ -98,4 +98,4 @@ crashlytics-build.properties
/Android
/bin
/.omc
/.omx

View File

@ -3,12 +3,9 @@
# int string DialogUIMode int
# 对话编号 策划备注 对话标识 对话形式 章节编号
1001 第一章介绍 Ch1_Time01 Mask 1.001
1002 第一章主流程 Ch1_Dialog_LiJie01 BottomBox 1.002
1003 第一章玩法开始前闲聊 Ch1_Dialog_Foreman01 BottomBox 1.003
1004 Ch1_Dialog_LiJie02 BottomBox 1.004
1005 Ch1_Dialog_Foreman02 BottomBox 1.005
1006 Ch1_Narrator01 BottomBox 1.006
1007 Ch1_Dialog_LiJie03 BottomBox 1.007
1002 第一章主流程 Ch1_LiJie BottomBox 1.002
1003 Ch1_Narrator01 BottomBox 1.003
1004 Ch1_Dialog_LiJie03 BottomBox 1.004
1008 Ch1_Dialog_Player01 BottomBox 1.008
1009 Ch1_Dialog_LiJie04 BottomBox 1.009
1010 Ch1_Dialog_LiJie05 BottomBox 1.01

View File

@ -4,51 +4,51 @@
# 对话行编号 策划备注 说话人Id 表情 显示人名 说话朝向 说话内容 演出效果 章节Id 对话Id
100100001 Id规则为 Time None 时间 0 元祐七年,北宋汴京。 None 1.00100001 1001.00001
100200001 第1位数为章节Id LiJie None 李诫 0 工头呢,工头呢,这是发生的什么事! None 1.00200001 1002.00001
100300001 第2-4位数为对话Id GongTou None 工头 0 李官人啊,这...,我也不知...,啊! None 1.00300001 1003.00001
100300002 第5-9位数为对话行Id GongTou None 工头 0 定是那可恶的老鼠将这木材咬了去,或是这阴雨的天气染湿了榫头...。 None 1.00300002 1003.00002
100400001 LiJie None 李诫 0 那这木制松软、一掰就弯的木材是什么,我又不是不认识, None 1.00400001 1004.00001
100400002 LiJie None 李诫 0 大殿建筑用的都是上好的楠木,那这柳木是哪里来的你解释下。 None 1.00400002 1004.00002
100500001 GongTou None 工头 0 这...定是工人中出现了偷鸡摸狗的小人,李官人大可放心, None 1.00500001 1005.00001
100500002 GongTou None 工头 0 我一定将这小人找出来...。 None 1.00500002 1005.00002
100600001 Other None 旁白 0 你是新入将作监的画图令史,今日正是你当值的第一天。 None 1.00600001 1006.00001
100700001 LiJie None 李诫 0 你便是新任的画图令史? None 1.00700001 1007.00001
100700002 LiJie None 李诫 0 来得正好。 None 1.00700002 1007.00002
100800001 Player None 玩家 0 属下正是,见过李主簿。 None 1.00800001 1008.00001
100900001 LiJie None 李诫 0 方才工地塌架,你也有所耳闻。 None 1.00900001 1009.00001
100900002 LiJie None 李诫 0 这工头竟拿柳木来替代楠木,企图瞒天过海,结果却落得如此下场, None 1.00900002 1009.00002
100900003 LiJie None 李诫 0 幸好方才无人员伤亡,才让这工头躲过一劫。 None 1.00900003 1009.00003
101000001 LiJie None 李诫 0 如今营造无尺、用料无度,劣木充良、偷工减料已成大患。 None 1.01000001 1010.00001
101000002 LiJie None 李诫 0 而我们的职责,就是尽早发现这般祸患,防止酿成更大的问题。 None 1.01000002 1010.00002
101100001 LiJie None 李诫 0 无规矩,则屋不立;无准绳,则工不正。 None 1.01100001 1011.00001
101100002 LiJie None 李诫 0 你也要牢记。 None 1.01100002 1011.00002
101200001 Player None 玩家 0 是,李主簿。 None 1.01200001 1012.00001
101300001 LiJie None 李诫 0 你既为画图令史,第一要务便是识木、辨材、熟用器具。 None 1.01300001 1013.00001
101400001 LiJie None 李诫 0 现在随我去库房,我来带你认识水准、绳墨、曲尺、方斗这些营造根本之器。 None 1.01400001 1014.00001
101500001 LiJie None 李诫 0 待你熟习测量与料例,我便亲自带你到工地监工核验,杜绝此类祸事再发。 None 1.01500001 1015.00001
101600001 Player None 玩家 0 属下遵命。 None 1.01600001 1016.00001
101700001 Other None 旁白 0 你正式踏入将作监,一段以法度正营造的历程,自此开始。 None 1.01700001 1017.00001
101800001 LiJie None 李诫 0 这里是库房,存放着营造时用到的所有工具。 None 1.01800001 1018.00001
101900001 Subtitle None 字幕 0 檀木质地,刻度以朱砂标注,一端为方、一端为折,刻有 “材份” 刻度。 None 1.01900001 1019.00001
102000001 LiJie None 李诫 0 你看,构屋先定 “方”,柱枋是否垂直、斗拱是否方正,全凭这曲尺核验。 None 1.02000001 1020.00001
102100001 LiJie None 李诫 0 此前工地偷换木料,若早以曲尺量其形制,便知柳木径寸不足,断断用不得啊。 None 1.02100001 1021.00001
102200001 LiJie None 李诫 0 此乃方斗,也叫墨斗,配绳墨使用。 None 1.02200001 1022.00001
102200002 LiJie None 李诫 0 绳墨牵直,以墨斗弹线,便知木料是否平直、墙体是否端正。 None 1.02200002 1022.00002
102300001 Subtitle None 字幕 0 方斗为楠木所制,斗身刻 “将作监” 款识,墨仓密封,绳墨以生丝浸松烟墨制成,耐磨不褪。 None 1.02300001 1023.00001
102400001 LiJie None 李诫 0 营造之事,“直” 为要。 None 1.02400001 1024.00001
102400002 LiJie None 李诫 0 工头偷工减料,常以歪木充数,若以绳墨弹线,歪直立现,断无蒙混可能。 None 1.02400002 1024.00002
102500001 Player None 玩家 0 那这是何物? None 1.02500001 1025.00001
102600001 LiJie None 李诫 0 这是水准,也名 “水尺”,测地势高低、屋基平正之用。 None 1.02600001 1026.00001
102700001 Subtitle None 字幕 0 青铜制的水准器,形制为长槽,内盛水,槽侧刻刻度,槽端有通气孔,是宋代成熟的水准测量工具。 None 1.02700001 1027.00001
102800001 LiJie None 李诫 0 汴京地势多洼,营建房宇先以水准定基址 None 1.02800001 1028.00001
102800002 LiJie None 李诫 0 若基址倾斜,纵是木料精良,也难逃倾颓之祸。 None 1.02800002 1028.00002
102900001 LiJie None 李诫 0 水之性平,这水准便是借水定平。 None 1.02900001 1029.00001
103000001 LiJie None 李诫 0 除了这些器具,库房更藏有 “料例” 册籍, None 1.03000001 1030.00001
103000002 LiJie None 李诫 0 楠木、樟木、杉木各等用料定额,大木作、小木作各工序用工之数,皆在册中。 None 1.03000002 1030.00002
103100001 LiJie None 李诫 0 你既为画图令史,识器是第一步,更要知 “器以定法、法以量料”。 None 1.03100001 1031.00001
103100002 LiJie None 李诫 0 这些工具,是规矩的具象,料例是制度的准绳,二者相合,才能堵贪弊、正营造。 None 1.03100002 1031.00002
103200001 LiJie None 李诫 0 今日先熟其形、知其用。 None 1.03200001 1032.00001
103200002 LiJie None 李诫 0 明日随我去工地,以器验工,看看那些贪弊工头还能藏多少猫腻。 None 1.03200002 1032.00002
103300001 Player None 玩家 0 是,李主簿。 None 1.03300001 1033.00001
100200002 第2-4位数为对话Id GongTou None 工头 1 李官人啊,这...,我也不知...,啊! None 1.00200002 1002.00002
100200003 第5-9位数为对话行Id GongTou None 工头 1 定是那可恶的老鼠将这木材咬了去,或是这阴雨的天气染湿了榫头...。 None 1.00200003 1002.00003
100200004 LiJie None 李诫 0 那这木制松软、一掰就弯的木材是什么,我又不是不认识, None 1.00200004 1002.00004
100200005 LiJie None 李诫 0 大殿建筑用的都是上好的楠木,那这柳木是哪里来的你解释下。 None 1.00200005 1002.00005
100200006 GongTou None 工头 1 这...定是工人中出现了偷鸡摸狗的小人,李官人大可放心, None 1.00200006 1002.00006
100200007 GongTou None 工头 1 我一定将这小人找出来...。 None 1.00200007 1002.00007
100300001 Other None 旁白 0 你是新入将作监的画图令史,今日正是你当值的第一天。 None 1.00300001 1003.00001
100300002 LiJie None 李诫 1 你便是新任的画图令史? None 1.00300002 1003.00002
100300003 LiJie None 李诫 1 来得正好。 None 1.00300003 1003.00003
100300004 Player None 玩家 0 属下正是,见过李主簿。 None 1.00300004 1003.00004
100300005 LiJie None 李诫 1 方才工地塌架,你也有所耳闻。 None 1.00300005 1003.00005
100300006 LiJie None 李诫 1 这工头竟拿柳木来替代楠木,企图瞒天过海,结果却落得如此下场, None 1.00300006 1003.00006
100300007 LiJie None 李诫 1 幸好方才无人员伤亡,才让这工头躲过一劫。 None 1.00300007 1003.00007
100300008 LiJie None 李诫 1 如今营造无尺、用料无度,劣木充良、偷工减料已成大患。 None 1.00300008 1003.00008
100300009 LiJie None 李诫 1 而我们的职责,就是尽早发现这般祸患,防止酿成更大的问题。 None 1.00300009 1003.00009
100300010 LiJie None 李诫 1 无规矩,则屋不立;无准绳,则工不正。 None 1.0030001 1003.0001
100300011 LiJie None 李诫 1 你也要牢记。 None 1.00300011 1003.00011
100300012 Player None 玩家 0 是,李主簿。 None 1.00300012 1003.00012
100300013 LiJie None 李诫 1 你既为画图令史,第一要务便是识木、辨材、熟用器具。 None 1.00300013 1003.00013
100300014 LiJie None 李诫 1 现在随我去库房,我来带你认识水准、绳墨、曲尺、方斗这些营造根本之器。 None 1.00300014 1003.00014
100300015 LiJie None 李诫 1 待你熟习测量与料例,我便亲自带你到工地监工核验,杜绝此类祸事再发。 None 1.00300015 1003.00015
100300016 Player None 玩家 0 属下遵命。 None 1.00300016 1003.00016
100300017 Other None 旁白 0 你正式踏入将作监,一段以法度正营造的历程,自此开始。 None 1.00300017 1003.00017
100400001 LiJie None 李诫 1 这里是库房,存放着营造时用到的所有工具。 None 1.00400001 1004.00001
100400002 Subtitle None 字幕 0 檀木质地,刻度以朱砂标注,一端为方、一端为折,刻有 “材份” 刻度。 None 1.00400002 1004.00002
100400003 LiJie None 李诫 1 你看,构屋先定 “方”,柱枋是否垂直、斗拱是否方正,全凭这曲尺核验。 None 1.00400003 1004.00003
100400004 LiJie None 李诫 1 此前工地偷换木料,若早以曲尺量其形制,便知柳木径寸不足,断断用不得啊。 None 1.00400004 1004.00004
100400005 LiJie None 李诫 1 此乃方斗,也叫墨斗,配绳墨使用。 None 1.00400005 1004.00005
100400006 LiJie None 李诫 1 绳墨牵直,以墨斗弹线,便知木料是否平直、墙体是否端正。 None 1.00400006 1004.00006
100400007 Subtitle None 字幕 0 方斗为楠木所制,斗身刻 “将作监” 款识,墨仓密封,绳墨以生丝浸松烟墨制成,耐磨不褪。 None 1.00400007 1004.00007
100400008 LiJie None 李诫 1 营造之事,“直” 为要。 None 1.00400008 1004.00008
100400009 LiJie None 李诫 1 工头偷工减料,常以歪木充数,若以绳墨弹线,歪直立现,断无蒙混可能。 None 1.00400009 1004.00009
100400010 Player None 玩家 0 那这是何物? None 1.0040001 1004.0001
100400011 LiJie None 李诫 1 这是水准,也名 “水尺”,测地势高低、屋基平正之用。 None 1.00400011 1004.00011
100400012 Subtitle None 字幕 0 青铜制的水准器,形制为长槽,内盛水,槽侧刻刻度,槽端有通气孔,是宋代成熟的水准测量工具。 None 1.00400012 1004.00012
100400013 LiJie None 李诫 1 汴京地势多洼,营建房宇先以水准定基址 None 1.00400013 1004.00013
100400014 LiJie None 李诫 1 若基址倾斜,纵是木料精良,也难逃倾颓之祸。 None 1.00400014 1004.00014
100400015 LiJie None 李诫 1 水之性平,这水准便是借水定平。 None 1.00400015 1004.00015
100400016 LiJie None 李诫 1 除了这些器具,库房更藏有 “料例” 册籍, None 1.00400016 1004.00016
100400017 LiJie None 李诫 1 楠木、樟木、杉木各等用料定额,大木作、小木作各工序用工之数,皆在册中。 None 1.00400017 1004.00017
100400018 LiJie None 李诫 1 你既为画图令史,识器是第一步,更要知 “器以定法、法以量料”。 None 1.00400018 1004.00018
100400019 LiJie None 李诫 1 这些工具,是规矩的具象,料例是制度的准绳,二者相合,才能堵贪弊、正营造。 None 1.00400019 1004.00019
100400020 LiJie None 李诫 1 今日先熟其形、知其用。 None 1.0040002 1004.0002
100400021 LiJie None 李诫 1 明日随我去工地,以器验工,看看那些贪弊工头还能藏多少猫腻。 None 1.00400021 1004.00021
100400022 Player None 玩家 0 是,李主簿。 None 1.00400022 1004.00022
103400001 LiJie None 李诫 0 这工地是谁负责! None 1.03400001 1034.00001
103500001 GongTou None 工头 0 李主簿,您怎么又来了… None 1.03500001 1035.00001
103600001 LiJie None 李诫 0 我不来,怎知你们又在如何糊弄? None 1.03600001 1036.00001

View File

@ -3,6 +3,7 @@
# int string string bool bool
# 界面编号 策划备注 资源名称 界面组名称 是否允许多个界面实例 是否暂停被其覆盖的界面
1 弹出框 DialogForm Dialog True False
2 BgForm Default False False
100 主菜单 MenuForm Default False True
101 设置 SettingForm Default False True
102 关于 AboutForm Default False True

View File

@ -122,354 +122,7 @@ NavMeshSettings:
debug:
m_Flags: 0
m_NavMeshData: {fileID: 0}
--- !u!1 &203844586
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 203844589}
- component: {fileID: 203844588}
- component: {fileID: 203844587}
m_Layer: 0
m_Name: Directional Light
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!114 &203844587
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 203844586}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 474bcb49853aa07438625e644c072ee6, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Version: 3
m_UsePipelineSettings: 1
m_AdditionalLightsShadowResolutionTier: 2
m_LightLayerMask: 1
m_RenderingLayers: 1
m_CustomShadowLayers: 0
m_ShadowLayerMask: 1
m_ShadowRenderingLayers: 1
m_LightCookieSize: {x: 1, y: 1}
m_LightCookieOffset: {x: 0, y: 0}
m_SoftShadowQuality: 1
--- !u!108 &203844588
Light:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 203844586}
m_Enabled: 1
serializedVersion: 10
m_Type: 1
m_Shape: 0
m_Color: {r: 1, g: 0.95686275, b: 0.8392157, a: 1}
m_Intensity: 1
m_Range: 10
m_SpotAngle: 30
m_InnerSpotAngle: 21.80208
m_CookieSize: 10
m_Shadows:
m_Type: 2
m_Resolution: -1
m_CustomResolution: -1
m_Strength: 1
m_Bias: 0.05
m_NormalBias: 0.4
m_NearPlane: 0.2
m_CullingMatrixOverride:
e00: 1
e01: 0
e02: 0
e03: 0
e10: 0
e11: 1
e12: 0
e13: 0
e20: 0
e21: 0
e22: 1
e23: 0
e30: 0
e31: 0
e32: 0
e33: 1
m_UseCullingMatrixOverride: 0
m_Cookie: {fileID: 0}
m_DrawHalo: 0
m_Flare: {fileID: 0}
m_RenderMode: 0
m_CullingMask:
serializedVersion: 2
m_Bits: 4294967295
m_RenderingLayerMask: 1
m_Lightmapping: 4
m_LightShadowCasterMode: 0
m_AreaSize: {x: 1, y: 1}
m_BounceIntensity: 1
m_ColorTemperature: 6570
m_UseColorTemperature: 0
m_BoundingSphereOverride: {x: 0, y: 0, z: 0, w: 0}
m_UseBoundingSphereOverride: 0
m_UseViewFrustumForShadowCasterCull: 1
m_ShadowRadius: 0
m_ShadowAngle: 0
--- !u!4 &203844589
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 203844586}
serializedVersion: 2
m_LocalRotation: {x: 0.40821788, y: -0.23456968, z: 0.10938163, w: 0.8754261}
m_LocalPosition: {x: 0, y: 3, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 0}
m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0}
--- !u!1 &223482651
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 223482652}
- component: {fileID: 223482654}
- component: {fileID: 223482653}
m_Layer: 5
m_Name: Bg
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &223482652
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 223482651}
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: 2070240951}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 0, y: 0}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &223482653
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 223482651}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
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:
m_Calls: []
m_Sprite: {fileID: 21300000, guid: d339ce9c4958967469068a30e0753b30, type: 3}
m_Type: 0
m_PreserveAspect: 0
m_FillCenter: 1
m_FillMethod: 4
m_FillAmount: 1
m_FillClockwise: 1
m_FillOrigin: 0
m_UseSpriteMesh: 0
m_PixelsPerUnitMultiplier: 1
--- !u!222 &223482654
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 223482651}
m_CullTransparentMesh: 1
--- !u!1 &1160234425
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 1160234427}
- component: {fileID: 1160234426}
m_Layer: 0
m_Name: Global Volume
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!114 &1160234426
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1160234425}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 172515602e62fb746b5d573b38a5fe58, type: 3}
m_Name:
m_EditorClassIdentifier:
m_IsGlobal: 1
priority: 0
blendDistance: 0
weight: 1
sharedProfile: {fileID: 11400000, guid: 352998f9edeef2348a887c5a2e7dc5d1, type: 2}
--- !u!4 &1160234427
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1160234425}
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: 0}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1 &2070240947
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 2070240951}
- component: {fileID: 2070240950}
- component: {fileID: 2070240949}
- component: {fileID: 2070240948}
m_Layer: 5
m_Name: Canvas
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!114 &2070240948
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2070240947}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: dc42784cf147c0c48a680349fa168899, type: 3}
m_Name:
m_EditorClassIdentifier:
m_IgnoreReversedGraphics: 1
m_BlockingObjects: 0
m_BlockingMask:
serializedVersion: 2
m_Bits: 4294967295
--- !u!114 &2070240949
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2070240947}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 0cd44c1031e13a943bb63640046fad76, type: 3}
m_Name:
m_EditorClassIdentifier:
m_UiScaleMode: 1
m_ReferencePixelsPerUnit: 100
m_ScaleFactor: 1
m_ReferenceResolution: {x: 2048, y: 1152}
m_ScreenMatchMode: 0
m_MatchWidthOrHeight: 0
m_PhysicalUnit: 3
m_FallbackScreenDPI: 96
m_DefaultSpriteDPI: 96
m_DynamicPixelsPerUnit: 1
m_PresetInfoIsWorld: 0
--- !u!223 &2070240950
Canvas:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2070240947}
m_Enabled: 1
serializedVersion: 3
m_RenderMode: 0
m_Camera: {fileID: 0}
m_PlaneDistance: 100
m_PixelPerfect: 0
m_ReceivesEvents: 1
m_OverrideSorting: 0
m_OverridePixelPerfect: 0
m_SortingBucketNormalizedSize: 0
m_VertexColorAlwaysGammaSpace: 0
m_AdditionalShaderChannelsFlag: 0
m_UpdateRectTransformForStandalone: 0
m_SortingLayerID: 0
m_SortingOrder: -10000
m_TargetDisplay: 0
--- !u!224 &2070240951
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2070240947}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 0, y: 0, z: 0}
m_ConstrainProportionsScale: 0
m_Children:
- {fileID: 223482652}
m_Father: {fileID: 0}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 0, y: 0}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 0, y: 0}
m_Pivot: {x: 0, y: 0}
--- !u!1660057539 &9223372036854775807
SceneRoots:
m_ObjectHideFlags: 0
m_Roots:
- {fileID: 203844589}
- {fileID: 1160234427}
- {fileID: 2070240951}
m_Roots: []

View File

@ -17,6 +17,8 @@ public partial class GameEntry : MonoBehaviour
public static CombineComponent Combine { get; private set; }
public static DialogComponent Dialog { get; private set; }
public static AIChatComponent AIChat { get; private set; }
public static StoryDirectorComponent StoryDirector { get; private set; }
public static SpriteCacheComponent SpriteCache { get; private set; }
private static void InitCustomComponents()
{
@ -24,5 +26,7 @@ public partial class GameEntry : MonoBehaviour
Combine = UnityGameFramework.Runtime.GameEntry.GetComponent<CombineComponent>();
Dialog = UnityGameFramework.Runtime.GameEntry.GetComponent<DialogComponent>();
AIChat = UnityGameFramework.Runtime.GameEntry.GetComponent<AIChatComponent>();
StoryDirector = UnityGameFramework.Runtime.GameEntry.GetComponent<StoryDirectorComponent>();
SpriteCache = UnityGameFramework.Runtime.GameEntry.GetComponent<SpriteCacheComponent>();
}
}

View File

@ -377,6 +377,7 @@ namespace CustomComponent
GameEntry.Event.Fire(this, CombineGuideMessageEventArgs.Create(_completeHint));
}
GameEntry.Event.Fire(this, CombineCompletedEventArgs.Create());
_onPuzzleCompleted.Invoke();
}

View File

@ -338,11 +338,20 @@ namespace CustomComponent
private void EndDialogInternal()
{
int chapterId = _formContext != null ? _formContext.ChapterId : _currentChapterId;
int dialogId = _formContext != null ? _formContext.DialogId : 0;
int lineId = _formContext != null ? _formContext.CurrentLineId : 0;
_isPlaying = false;
_currentLineIndex = -1;
_formController.OnDialogEnded(_formContext);
_formController.CloseUI();
if (dialogId > 0)
{
GameEntry.Event.Fire(this, DialogCompletedEventArgs.Create(chapterId, dialogId, lineId));
}
}
private void ApplyLineToContext(DRDialogLine lineRow, int lineIndex, int totalLines)

View File

@ -16,6 +16,7 @@ namespace GeometryTD.CustomComponent
[SerializeField] private Vector2 _referenceResolution = new Vector2(2560f, 1600f);
[SerializeField] private bool _adaptUiCanvasToViewport = true;
[SerializeField] private bool _enableBlackMask = true;
[SerializeField] private bool _autoCollectSceneCanvases = true;
[SerializeField] private List<Transform> _uiRoots = new List<Transform>();
private readonly List<Canvas> _canvasBuffer = new List<Canvas>(32);
@ -29,6 +30,7 @@ namespace GeometryTD.CustomComponent
private bool _canvasCacheDirty = true;
private bool _uiEventSubscribed;
private bool _sceneEventSubscribed;
private bool _missingRootWarned;
private Canvas _maskCanvas;
@ -163,18 +165,6 @@ namespace GeometryTD.CustomComponent
return;
}
if (_uiRoots == null || _uiRoots.Count == 0)
{
if (!_missingRootWarned)
{
_missingRootWarned = true;
Log.Warning(
"ResolutionAdapterComponent missing injected roots. Assign UI/HPBar root transforms in scene.");
}
return;
}
if (_canvasCacheDirty)
{
RebuildCanvasCache();
@ -200,9 +190,49 @@ namespace GeometryTD.CustomComponent
_trackedCanvases.Clear();
_trackedCanvasSet.Clear();
foreach (var root in _uiRoots)
bool hasValidRoot = false;
if (_uiRoots != null)
{
CollectCanvases(root);
foreach (var root in _uiRoots)
{
if (root == null)
{
continue;
}
hasValidRoot = true;
CollectCanvases(root);
}
}
if (_autoCollectSceneCanvases || !hasValidRoot)
{
Canvas[] canvases = Resources.FindObjectsOfTypeAll<Canvas>();
foreach (Canvas canvas in canvases)
{
if (canvas == null || canvas == _maskCanvas || canvas.renderMode == RenderMode.WorldSpace)
{
continue;
}
GameObject gameObject = canvas.gameObject;
if (!gameObject.scene.IsValid() || !gameObject.scene.isLoaded)
{
continue;
}
if (_trackedCanvasSet.Add(canvas))
{
_trackedCanvases.Add(canvas);
}
}
}
if (!hasValidRoot && !_autoCollectSceneCanvases && !_missingRootWarned)
{
_missingRootWarned = true;
Log.Warning(
"ResolutionAdapterComponent missing injected roots. Assign UI/HPBar root transforms in scene or enable auto collection.");
}
}
@ -270,27 +300,46 @@ namespace GeometryTD.CustomComponent
private void TryEnsureUiEventSubscribed()
{
if (_uiEventSubscribed || GameEntry.Event == null)
if (GameEntry.Event == null)
{
return;
}
GameEntry.Event.Subscribe(OpenUIFormSuccessEventArgs.EventId, OnUIFormChanged);
GameEntry.Event.Subscribe(CloseUIFormCompleteEventArgs.EventId, OnUIFormChanged);
_uiEventSubscribed = true;
_canvasCacheDirty = true;
if (!_uiEventSubscribed)
{
GameEntry.Event.Subscribe(OpenUIFormSuccessEventArgs.EventId, OnUIFormChanged);
GameEntry.Event.Subscribe(CloseUIFormCompleteEventArgs.EventId, OnUIFormChanged);
_uiEventSubscribed = true;
_canvasCacheDirty = true;
}
if (!_sceneEventSubscribed)
{
GameEntry.Event.Subscribe(LoadSceneSuccessEventArgs.EventId, OnSceneChanged);
_sceneEventSubscribed = true;
_canvasCacheDirty = true;
}
}
private void UnsubscribeUiEvents()
{
if (!_uiEventSubscribed || GameEntry.Event == null)
if (GameEntry.Event == null)
{
return;
}
GameEntry.Event.Unsubscribe(OpenUIFormSuccessEventArgs.EventId, OnUIFormChanged);
GameEntry.Event.Unsubscribe(CloseUIFormCompleteEventArgs.EventId, OnUIFormChanged);
_uiEventSubscribed = false;
if (_uiEventSubscribed)
{
GameEntry.Event.Unsubscribe(OpenUIFormSuccessEventArgs.EventId, OnUIFormChanged);
GameEntry.Event.Unsubscribe(CloseUIFormCompleteEventArgs.EventId, OnUIFormChanged);
_uiEventSubscribed = false;
}
if (_sceneEventSubscribed)
{
GameEntry.Event.Unsubscribe(LoadSceneSuccessEventArgs.EventId, OnSceneChanged);
_sceneEventSubscribed = false;
}
}
private void OnUIFormChanged(object sender, GameEventArgs e)
@ -298,6 +347,12 @@ namespace GeometryTD.CustomComponent
_canvasCacheDirty = true;
}
private void OnSceneChanged(object sender, GameEventArgs e)
{
_canvasCacheDirty = true;
_missingRootWarned = false;
}
private void UpdateMaskLayout()
{
if (!_enableBlackMask)

View File

@ -33,7 +33,7 @@ namespace CustomComponent
{
_resource.LoadAsset
(
AssetUtility.GetUIDialogAsset(assetName),
AssetUtility.GetUISpriteAsset(assetName),
Constant.AssetPriority.UIFormAsset,
new LoadAssetCallbacks(
(resourcePath, asset, duration, userData) =>

View File

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

View File

@ -0,0 +1,22 @@
using UnityEngine;
namespace CustomComponent
{
[CreateAssetMenu(menuName = "Story/Directive/Change Background", fileName = "Directive_ChangeBackground")]
public sealed class StoryChangeBackgroundDirectiveAsset : StoryDirectiveAsset
{
[SerializeField] private string _backgroundAssetName = string.Empty;
public override string ActionName => "ChangeBackground";
public override void Execute(StoryDirectorComponent director)
{
if (director == null)
{
return;
}
director.ExecuteChangeBackground(_backgroundAssetName);
}
}
}

View File

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 2d4b16a5d76140a1b952ad48774dd89a
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,14 @@
using System;
using System.Collections.Generic;
using UI;
namespace CustomComponent
{
[Serializable]
public sealed class StoryCombineConfig
{
public bool AutoStart = true;
public List<CombineSlotContext> Slots = new List<CombineSlotContext>();
public List<CombinePartContext> Parts = new List<CombinePartContext>();
}
}

View File

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 4c53bd314c194677b10a2e7fa754fdbb
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,39 @@
using UnityEngine;
namespace CustomComponent
{
public abstract class StoryDirectiveAsset : ScriptableObject
{
[SerializeField] private bool _enabled = true;
[SerializeField] private StoryTriggerType _triggerType = StoryTriggerType.DialogCompleted;
[SerializeField] [Tooltip("DialogCompleted 时为对话 Id<=0 表示该触发类型下的任意 Id。")]
private int _triggerId = 0;
public bool IsEnabled => _enabled;
public StoryTriggerType TriggerType => _triggerType;
public int TriggerId => _triggerId;
public virtual string ActionName => GetType().Name;
public bool IsMatch(StoryTriggerType triggerType, int triggerId)
{
if (!_enabled || _triggerType != triggerType)
{
return false;
}
if (triggerType == StoryTriggerType.DialogCompleted && _triggerId > 0 && _triggerId != triggerId)
{
return false;
}
return true;
}
public abstract void Execute(StoryDirectorComponent director);
}
}

View File

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 2deed2f965a04cbab1c18d2e9b5d5845
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,22 @@
using UnityEngine;
namespace CustomComponent
{
[CreateAssetMenu(menuName = "Story/Directive/End Chapter", fileName = "Directive_EndChapter")]
public sealed class StoryEndChapterDirectiveAsset : StoryDirectiveAsset
{
[SerializeField] [Tooltip("<=0 则使用当前章节。")] private int _chapterId = 0;
public override string ActionName => "EndChapter";
public override void Execute(StoryDirectorComponent director)
{
if (director == null)
{
return;
}
director.ExecuteEndChapter(_chapterId);
}
}
}

View File

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 2b63fb6eb96e4d3193dd26b443f856c7
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,25 @@
using UnityEngine;
namespace CustomComponent
{
[CreateAssetMenu(menuName = "Story/Directive/Start Combine", fileName = "Directive_StartCombine")]
public sealed class StoryStartCombineDirectiveAsset : StoryDirectiveAsset
{
[SerializeField] private bool _useDefaultConfig = true;
[SerializeField] private StoryCombineConfig _combineConfig = new StoryCombineConfig();
public override string ActionName => "StartCombine";
public override void Execute(StoryDirectorComponent director)
{
if (director == null)
{
return;
}
StoryCombineConfig config = _useDefaultConfig ? null : _combineConfig;
director.ExecuteStartCombine(config);
}
}
}

View File

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 19a1150cd0fb4b648ad8232de4e38baa
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,22 @@
using UnityEngine;
namespace CustomComponent
{
[CreateAssetMenu(menuName = "Story/Directive/Start Dialog", fileName = "Directive_StartDialog")]
public sealed class StoryStartDialogDirectiveAsset : StoryDirectiveAsset
{
[SerializeField] private int _dialogId = 0;
public override string ActionName => "StartDialog";
public override void Execute(StoryDirectorComponent director)
{
if (director == null)
{
return;
}
director.ExecuteStartDialog(_dialogId);
}
}
}

View File

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 8e4367863f5042e1b5b0b3b3b7f62f5e
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,8 @@
namespace CustomComponent
{
public enum StoryTriggerType
{
DialogCompleted = 0,
CombineCompleted = 1
}
}

View File

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 2b9d79013962410681f2f29343902599
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,358 @@
using System.Collections.Generic;
using Definition.Enum;
using Event;
using UI;
using UnityEngine;
using UnityGameFramework.Runtime;
namespace CustomComponent
{
[DisallowMultipleComponent]
public class StoryDirectorComponent : GameFrameworkComponent
{
[SerializeField] [Tooltip("按顺序执行。每个元素是一个 StoryDirectiveAsset 资产引用。")]
private List<StoryDirectiveAsset> _directives = new List<StoryDirectiveAsset>();
[SerializeField] private bool _allowRepeatTrigger = false;
[SerializeField] private bool _verboseLog = true;
[SerializeField] private string _backgroundAssetNamePrefix = string.Empty;
private readonly HashSet<string> _consumedDirectiveTokens = new HashSet<string>();
private BgFormController _bgFormController;
private int _bgRequestVersion;
private bool _isExecuting;
private void Start()
{
GameEntry.Event.Subscribe(DialogCompletedEventArgs.EventId, OnDialogCompleted);
GameEntry.Event.Subscribe(CombineCompletedEventArgs.EventId, OnCombineCompleted);
}
private void OnDestroy()
{
GameEntry.Event.Unsubscribe(DialogCompletedEventArgs.EventId, OnDialogCompleted);
GameEntry.Event.Unsubscribe(CombineCompletedEventArgs.EventId, OnCombineCompleted);
_bgFormController?.CloseUI();
_bgFormController = null;
}
public void ResetConsumedDirectives()
{
_consumedDirectiveTokens.Clear();
}
private void OnDialogCompleted(object sender, GameFramework.Event.GameEventArgs e)
{
if (!(e is DialogCompletedEventArgs args))
{
return;
}
ExecuteDirectives(StoryTriggerType.DialogCompleted, args.DialogId);
}
private void OnCombineCompleted(object sender, GameFramework.Event.GameEventArgs e)
{
if (!(e is CombineCompletedEventArgs))
{
return;
}
ExecuteDirectives(StoryTriggerType.CombineCompleted, 0);
}
private void ExecuteDirectives(StoryTriggerType triggerType, int triggerId)
{
if (_isExecuting)
{
return;
}
_isExecuting = true;
try
{
for (int i = 0; i < _directives.Count; i++)
{
StoryDirectiveAsset directive = _directives[i];
if (directive == null || !directive.IsMatch(triggerType, triggerId))
{
continue;
}
string directiveToken = BuildDirectiveToken(directive, i);
if (!_allowRepeatTrigger && _consumedDirectiveTokens.Contains(directiveToken))
{
continue;
}
ExecuteDirective(directive, triggerType, triggerId);
if (!_allowRepeatTrigger)
{
_consumedDirectiveTokens.Add(directiveToken);
}
}
}
finally
{
_isExecuting = false;
}
}
private static string BuildDirectiveToken(StoryDirectiveAsset directive, int directiveIndex)
{
return $"{directive.GetInstanceID()}:{directiveIndex}";
}
private void ExecuteDirective(StoryDirectiveAsset directive, StoryTriggerType triggerType, int triggerId)
{
directive.Execute(this);
if (_verboseLog)
{
Log.Info("StoryDirector executed action '{0}' by trigger '{1}' ({2}).",
directive.ActionName, triggerType.ToString(), triggerId.ToString());
}
}
public void ExecuteStartDialog(int dialogId)
{
if (dialogId <= 0)
{
Log.Warning("StoryDirector start dialog skipped. dialogId must be positive.");
return;
}
if (GameEntry.Dialog == null)
{
Log.Warning("StoryDirector start dialog failed. Dialog component is missing.");
return;
}
GameEntry.Dialog.StartDialog(dialogId);
}
public void ExecuteStartCombine(StoryCombineConfig config)
{
if (GameEntry.Combine == null)
{
Log.Warning("StoryDirector start combine failed. Combine component is missing.");
return;
}
CombineFormContext context = BuildCombineFormContext(config);
int? formSerialId = GameEntry.Combine.StartLevel(context);
if (!formSerialId.HasValue)
{
Log.Warning("StoryDirector start combine failed. Open combine UI failed.");
return;
}
}
public void ExecuteChangeBackground(string backgroundAssetName)
{
string assetName = string.IsNullOrWhiteSpace(backgroundAssetName)
? string.Empty
: backgroundAssetName.Trim();
if (string.IsNullOrEmpty(assetName))
{
Log.Warning("StoryDirector change background skipped. assetName is empty.");
return;
}
if (GameEntry.SpriteCache == null)
{
Log.Warning("StoryDirector change background failed. SpriteCache component is missing.");
return;
}
int requestVersion = ++_bgRequestVersion;
GameEntry.SpriteCache.GetSprite(_backgroundAssetNamePrefix + assetName,
sprite => { OnBackgroundLoaded(requestVersion, assetName, sprite); });
}
private void OnBackgroundLoaded(int requestVersion, string assetName, Sprite sprite)
{
if (requestVersion != _bgRequestVersion)
{
return;
}
if (sprite == null)
{
Log.Warning("StoryDirector change background failed. Loaded sprite is null for '{0}'.", assetName);
return;
}
if (_bgFormController == null)
{
_bgFormController = new BgFormController();
}
_bgFormController.OpenUI(new BgFormContext
{
Sprite = sprite
});
}
public void ExecuteEndChapter(int chapterId)
{
int finalChapterId = chapterId > 0
? chapterId
: (GameEntry.Dialog != null ? GameEntry.Dialog.CurrentChapterId : 0);
GameEntry.Event.Fire(this, StoryChapterEndedEventArgs.Create(finalChapterId));
}
private static CombineFormContext BuildCombineFormContext(StoryCombineConfig config)
{
if (config != null && config.Slots != null && config.Slots.Count > 0)
{
return new CombineFormContext
{
Slots = CloneSlots(config.Slots),
Parts = CloneParts(config.Parts),
AutoStart = config.AutoStart
};
}
return BuildDefaultCombineContext();
}
private static List<CombineSlotContext> CloneSlots(List<CombineSlotContext> source)
{
var result = new List<CombineSlotContext>();
if (source == null)
{
return result;
}
for (int i = 0; i < source.Count; i++)
{
CombineSlotContext slot = source[i];
if (slot == null)
{
continue;
}
result.Add(new CombineSlotContext
{
RequiredPartType = slot.RequiredPartType,
BuildOrder = slot.BuildOrder,
RequireStrictOrder = slot.RequireStrictOrder,
AnchoredPosition = slot.AnchoredPosition,
SizeDelta = slot.SizeDelta,
MechanicsExplanation = slot.MechanicsExplanation,
MismatchHint = slot.MismatchHint
});
}
return result;
}
private static List<CombinePartContext> CloneParts(List<CombinePartContext> source)
{
var result = new List<CombinePartContext>();
if (source == null)
{
return result;
}
for (int i = 0; i < source.Count; i++)
{
CombinePartContext part = source[i];
if (part == null)
{
continue;
}
result.Add(new CombinePartContext
{
PartType = part.PartType,
PartDisplayName = part.PartDisplayName,
MechanicsExplanation = part.MechanicsExplanation,
LockAfterPlaced = part.LockAfterPlaced
});
}
return result;
}
private static CombineFormContext BuildDefaultCombineContext()
{
List<CombineSlotContext> slots = new List<CombineSlotContext>
{
new CombineSlotContext
{
RequiredPartType = CombinePartType.Dou,
BuildOrder = 0,
RequireStrictOrder = true,
AnchoredPosition = new Vector2(-320f, -160f),
SizeDelta = new Vector2(120f, 120f),
MechanicsExplanation = "Dou transfers upper load and works as the base node."
},
new CombineSlotContext
{
RequiredPartType = CombinePartType.Sheng,
BuildOrder = 1,
RequireStrictOrder = true,
AnchoredPosition = new Vector2(-320f, -20f),
SizeDelta = new Vector2(120f, 120f),
MechanicsExplanation = "Sheng raises layer height to form the bracket hierarchy."
},
new CombineSlotContext
{
RequiredPartType = CombinePartType.Gong,
BuildOrder = 2,
RequireStrictOrder = true,
AnchoredPosition = new Vector2(-320f, 120f),
SizeDelta = new Vector2(120f, 120f),
MechanicsExplanation = "Gong spreads force laterally through overhang."
},
new CombineSlotContext
{
RequiredPartType = CombinePartType.Qiao,
BuildOrder = 3,
RequireStrictOrder = true,
AnchoredPosition = new Vector2(-160f, 120f),
SizeDelta = new Vector2(120f, 120f),
MechanicsExplanation = "Qiao continues force transfer to the outer side."
},
new CombineSlotContext
{
RequiredPartType = CombinePartType.Ang,
BuildOrder = 4,
RequireStrictOrder = true,
AnchoredPosition = new Vector2(0f, 120f),
SizeDelta = new Vector2(120f, 120f),
MechanicsExplanation = "Ang uses leverage to redirect eave load inward."
}
};
List<CombinePartContext> parts = new List<CombinePartContext>
{
new CombinePartContext
{ PartType = CombinePartType.Dou, PartDisplayName = "Dou", LockAfterPlaced = true },
new CombinePartContext
{ PartType = CombinePartType.Sheng, PartDisplayName = "Sheng", LockAfterPlaced = true },
new CombinePartContext
{ PartType = CombinePartType.Gong, PartDisplayName = "Gong", LockAfterPlaced = true },
new CombinePartContext
{ PartType = CombinePartType.Qiao, PartDisplayName = "Qiao", LockAfterPlaced = true },
new CombinePartContext
{ PartType = CombinePartType.Ang, PartDisplayName = "Ang", LockAfterPlaced = true }
};
return new CombineFormContext
{
Slots = slots,
Parts = parts,
AutoStart = true
};
}
}
}

View File

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: d899fa8b1598c1846bc3a03d11c83d04
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,42 @@
using GameFramework;
using GameFramework.Event;
namespace Event
{
public class DialogCompletedEventArgs : GameEventArgs
{
public static readonly int EventId = typeof(DialogCompletedEventArgs).GetHashCode();
public override int Id => EventId;
public int ChapterId { get; private set; }
public int DialogId { get; private set; }
public int LastLineId { get; private set; }
public DialogCompletedEventArgs()
{
ChapterId = 0;
DialogId = 0;
LastLineId = 0;
}
public static DialogCompletedEventArgs Create(int chapterId, int dialogId, int lastLineId)
{
var args = ReferencePool.Acquire<DialogCompletedEventArgs>();
args.ChapterId = chapterId;
args.DialogId = dialogId;
args.LastLineId = lastLineId;
return args;
}
public override void Clear()
{
ChapterId = 0;
DialogId = 0;
LastLineId = 0;
}
}
}

View File

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: ff3fd581bec19164c8c5b03222e0ccec
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

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

View File

@ -0,0 +1,31 @@
using GameFramework;
using GameFramework.Event;
namespace Event
{
public class StoryChapterEndedEventArgs : GameEventArgs
{
public static readonly int EventId = typeof(StoryChapterEndedEventArgs).GetHashCode();
public override int Id => EventId;
public int ChapterId { get; private set; }
public StoryChapterEndedEventArgs()
{
ChapterId = 0;
}
public static StoryChapterEndedEventArgs Create(int chapterId)
{
var args = ReferencePool.Acquire<StoryChapterEndedEventArgs>();
args.ChapterId = chapterId;
return args;
}
public override void Clear()
{
ChapterId = 0;
}
}
}

View File

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 04884ea6e03d99345b9e4a9c60ccf913
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -66,9 +66,9 @@ namespace CustomUtility
return Utility.Text.Format("Assets/GameMain/UI/UISounds/{0}.wav", assetName);
}
public static string GetUIDialogAsset(string assetName)
public static string GetUISpriteAsset(string assetName)
{
return Utility.Text.Format("Assets/GameMain/UI/Dialogs/{0}.prefab", assetName);
return Utility.Text.Format("Assets/GameMain/UI/{0}", assetName);
}
}
}

View File

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

View File

@ -0,0 +1,18 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &11400000
MonoBehaviour:
m_ObjectHideFlags: 0
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: 2d4b16a5d76140a1b952ad48774dd89a, type: 3}
m_Name: BG1001
m_EditorClassIdentifier:
_enabled: 1
_triggerType: 0
_triggerId: 1001
_backgroundAssetName: BG_1.jpg

View File

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: fbe72cf66cec3ad4e9fb3167b291ce4f
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,18 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &11400000
MonoBehaviour:
m_ObjectHideFlags: 0
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: 8e4367863f5042e1b5b0b3b3b7f62f5e, type: 3}
m_Name: Dialog1001
m_EditorClassIdentifier:
_enabled: 1
_triggerType: 0
_triggerId: 1001
_dialogId: 1002

View File

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: a6031366dd068b84b9797525616de223
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:

View File

@ -525,8 +525,8 @@ RectTransform:
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 1}
m_AnchorMax: {x: 0, y: 1}
m_AnchoredPosition: {x: 250, y: -40}
m_SizeDelta: {x: 500, y: 80}
m_AnchoredPosition: {x: 200, y: -40}
m_SizeDelta: {x: 400, y: 80}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!1 &4514918814497795030
GameObject:
@ -835,10 +835,10 @@ MonoBehaviour:
m_faceColor:
serializedVersion: 2
rgba: 4294967295
m_fontSize: 80
m_fontSize: 72
m_fontSizeBase: 80
m_fontWeight: 400
m_enableAutoSizing: 0
m_enableAutoSizing: 1
m_fontSizeMin: 18
m_fontSizeMax: 72
m_fontStyle: 1
@ -987,5 +987,5 @@ RectTransform:
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 0}
m_AnchoredPosition: {x: 0, y: 280}
m_SizeDelta: {x: 0, y: 380}
m_SizeDelta: {x: -200, y: 380}
m_Pivot: {x: 0.5, y: 0.5}

View File

Before

Width:  |  Height:  |  Size: 2.1 MiB

After

Width:  |  Height:  |  Size: 2.1 MiB

View File

Before

Width:  |  Height:  |  Size: 1.9 MiB

After

Width:  |  Height:  |  Size: 1.9 MiB

View File

Before

Width:  |  Height:  |  Size: 1.6 MiB

After

Width:  |  Height:  |  Size: 1.6 MiB

View File

Before

Width:  |  Height:  |  Size: 2.0 MiB

After

Width:  |  Height:  |  Size: 2.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 138 KiB

View File

@ -0,0 +1,149 @@
fileFormatVersion: 2
guid: 77968dfed7b61334db617d490bb05477
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: 1
aniso: 1
mipBias: 0
wrapU: 1
wrapV: 1
wrapW: 0
nPOTScale: 0
lightmap: 0
compressionQuality: 50
spriteMode: 2
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: 3
buildTarget: DefaultTexturePlatform
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: 3
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: 3
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:
- serializedVersion: 2
name: brush_white_0
rect:
serializedVersion: 2
x: 0
y: 7
width: 600
height: 160
alignment: 0
pivot: {x: 0, y: 0}
border: {x: 0, y: 0, z: 0, w: 0}
outline: []
physicsShape: []
tessellationDetail: 0
bones: []
spriteID: eaadb4ab1e82b3a47970d20bef28d0c0
internalID: -423439662
vertices: []
indices:
edges: []
weights: []
outline: []
physicsShape: []
bones: []
spriteID: 5e97eb03825dee720800000000000000
internalID: 0
vertices: []
indices:
edges: []
weights: []
secondaryTextures: []
nameFileIdTable:
brush_white_0: -423439662
mipmapLimitGroupName:
pSDRemoveMatte: 0
userData:
assetBundleName:
assetBundleVariant:

View File

@ -122,6 +122,52 @@ NavMeshSettings:
debug:
m_Flags: 0
m_NavMeshData: {fileID: 0}
--- !u!1 &51490593
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 51490594}
- component: {fileID: 51490595}
m_Layer: 0
m_Name: SpriteCache
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &51490594
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 51490593}
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: 119167776}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!114 &51490595
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 51490593}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 42b4751aefa33c545a86f146a48536ee, type: 3}
m_Name:
m_EditorClassIdentifier:
_pixelsPerUnit: 100
_defaultPivot: {x: 0.5, y: 0.5}
--- !u!1 &119167775
GameObject:
m_ObjectHideFlags: 0
@ -156,6 +202,8 @@ Transform:
- {fileID: 434859534}
- {fileID: 1064285105}
- {fileID: 1402371486}
- {fileID: 2000155822}
- {fileID: 51490594}
m_Father: {fileID: 1852670053}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1 &120093239
@ -248,143 +296,6 @@ MonoBehaviour:
m_PointerBehavior: 0
m_CursorLockBehavior: 0
m_ScrollDeltaPerTick: 6
--- !u!1 &188380256
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 188380260}
- component: {fileID: 188380259}
- component: {fileID: 188380258}
- component: {fileID: 188380257}
m_Layer: 0
m_Name: Camera
m_TagString: MainCamera
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!114 &188380257
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 188380256}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: a79441f348de89743a2939f4d699eac1, type: 3}
m_Name:
m_EditorClassIdentifier:
m_RenderShadows: 1
m_RequiresDepthTextureOption: 2
m_RequiresOpaqueTextureOption: 2
m_CameraType: 0
m_Cameras: []
m_RendererIndex: -1
m_VolumeLayerMask:
serializedVersion: 2
m_Bits: 1
m_VolumeTrigger: {fileID: 0}
m_VolumeFrameworkUpdateModeOption: 2
m_RenderPostProcessing: 0
m_Antialiasing: 0
m_AntialiasingQuality: 2
m_StopNaN: 0
m_Dithering: 0
m_ClearDepth: 1
m_AllowXRRendering: 1
m_AllowHDROutput: 1
m_UseScreenCoordOverride: 0
m_ScreenSizeOverride: {x: 0, y: 0, z: 0, w: 0}
m_ScreenCoordScaleBias: {x: 0, y: 0, z: 0, w: 0}
m_RequiresDepthTexture: 0
m_RequiresColorTexture: 0
m_Version: 2
m_TaaSettings:
m_Quality: 3
m_FrameInfluence: 0.1
m_JitterScale: 1
m_MipBias: 0
m_VarianceClampScale: 0.9
m_ContrastAdaptiveSharpening: 0
--- !u!81 &188380258
AudioListener:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 188380256}
m_Enabled: 1
--- !u!20 &188380259
Camera:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 188380256}
m_Enabled: 1
serializedVersion: 2
m_ClearFlags: 1
m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0}
m_projectionMatrixMode: 1
m_GateFitMode: 2
m_FOVAxisMode: 0
m_Iso: 200
m_ShutterSpeed: 0.005
m_Aperture: 16
m_FocusDistance: 10
m_FocalLength: 50
m_BladeCount: 5
m_Curvature: {x: 2, y: 11}
m_BarrelClipping: 0.25
m_Anamorphism: 0
m_SensorSize: {x: 36, y: 24}
m_LensShift: {x: 0, y: 0}
m_NormalizedViewPortRect:
serializedVersion: 2
x: 0
y: 0
width: 1
height: 1
near clip plane: 0.3
far clip plane: 100
field of view: 60
orthographic: 0
orthographic size: 5
m_Depth: 0
m_CullingMask:
serializedVersion: 2
m_Bits: 4294967295
m_RenderingPath: -1
m_TargetTexture: {fileID: 0}
m_TargetDisplay: 0
m_TargetEye: 3
m_HDR: 1
m_AllowMSAA: 1
m_AllowDynamicResolution: 0
m_ForceIntoRT: 0
m_OcclusionCulling: 1
m_StereoConvergence: 10
m_StereoSeparation: 0.022
--- !u!4 &188380260
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 188380256}
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: 0}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!4 &192213471 stripped
Transform:
m_CorrespondingSourceObject: {fileID: 430602, guid: adb3eb1c35fcff14f89fba7b05c9d71c,
@ -1184,6 +1095,7 @@ MonoBehaviour:
_referenceResolution: {x: 2048, y: 1152}
_adaptUiCanvasToViewport: 1
_enableBlackMask: 1
_autoCollectSceneCanvases: 1
_uiRoots:
- {fileID: 934951765}
--- !u!1 &1852670052
@ -1263,10 +1175,59 @@ Transform:
m_Children: []
m_Father: {fileID: 119167776}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1 &2000155821
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 2000155822}
- component: {fileID: 2000155823}
m_Layer: 0
m_Name: StroyDirector
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &2000155822
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2000155821}
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: 119167776}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!114 &2000155823
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2000155821}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: d899fa8b1598c1846bc3a03d11c83d04, type: 3}
m_Name:
m_EditorClassIdentifier:
_directives:
- {fileID: 11400000, guid: fbe72cf66cec3ad4e9fb3167b291ce4f, type: 2}
- {fileID: 11400000, guid: a6031366dd068b84b9797525616de223, type: 2}
_allowRepeatTrigger: 0
_verboseLog: 1
_backgroundAssetNamePrefix: UISprites/Background/
--- !u!1660057539 &9223372036854775807
SceneRoots:
m_ObjectHideFlags: 0
m_Roots:
- {fileID: 1852670053}
- {fileID: 120093242}
- {fileID: 188380260}

View File

@ -3,12 +3,9 @@
# int string DialogUIMode int
# 对话编号 策划备注 对话标识 对话形式 章节编号
1001 第一章介绍 Ch1_Time01 Mask 1.001
1002 第一章主流程 Ch1_Dialog_LiJie01 BottomBox 1.002
1003 第一章玩法开始前闲聊 Ch1_Dialog_Foreman01 BottomBox 1.003
1004 Ch1_Dialog_LiJie02 BottomBox 1.004
1005 Ch1_Dialog_Foreman02 BottomBox 1.005
1006 Ch1_Narrator01 BottomBox 1.006
1007 Ch1_Dialog_LiJie03 BottomBox 1.007
1002 第一章主流程 Ch1_LiJie BottomBox 1.002
1003 Ch1_Narrator01 BottomBox 1.003
1004 Ch1_Dialog_LiJie03 BottomBox 1.004
1008 Ch1_Dialog_Player01 BottomBox 1.008
1009 Ch1_Dialog_LiJie04 BottomBox 1.009
1010 Ch1_Dialog_LiJie05 BottomBox 1.01

Binary file not shown.

View File

@ -4,51 +4,51 @@
# 对话行编号 策划备注 说话人Id 表情 显示人名 说话朝向 说话内容 演出效果 章节Id 对话Id
100100001 Id规则为 Time None 时间 0 元祐七年,北宋汴京。 None 1.00100001 1001.00001
100200001 第1位数为章节Id LiJie None 李诫 0 工头呢,工头呢,这是发生的什么事! None 1.00200001 1002.00001
100300001 第2-4位数为对话Id GongTou None 工头 0 李官人啊,这...,我也不知...,啊! None 1.00300001 1003.00001
100300002 第5-9位数为对话行Id GongTou None 工头 0 定是那可恶的老鼠将这木材咬了去,或是这阴雨的天气染湿了榫头...。 None 1.00300002 1003.00002
100400001 LiJie None 李诫 0 那这木制松软、一掰就弯的木材是什么,我又不是不认识, None 1.00400001 1004.00001
100400002 LiJie None 李诫 0 大殿建筑用的都是上好的楠木,那这柳木是哪里来的你解释下。 None 1.00400002 1004.00002
100500001 GongTou None 工头 0 这...定是工人中出现了偷鸡摸狗的小人,李官人大可放心, None 1.00500001 1005.00001
100500002 GongTou None 工头 0 我一定将这小人找出来...。 None 1.00500002 1005.00002
100600001 Other None 旁白 0 你是新入将作监的画图令史,今日正是你当值的第一天。 None 1.00600001 1006.00001
100700001 LiJie None 李诫 0 你便是新任的画图令史? None 1.00700001 1007.00001
100700002 LiJie None 李诫 0 来得正好。 None 1.00700002 1007.00002
100800001 Player None 玩家 0 属下正是,见过李主簿。 None 1.00800001 1008.00001
100900001 LiJie None 李诫 0 方才工地塌架,你也有所耳闻。 None 1.00900001 1009.00001
100900002 LiJie None 李诫 0 这工头竟拿柳木来替代楠木,企图瞒天过海,结果却落得如此下场, None 1.00900002 1009.00002
100900003 LiJie None 李诫 0 幸好方才无人员伤亡,才让这工头躲过一劫。 None 1.00900003 1009.00003
101000001 LiJie None 李诫 0 如今营造无尺、用料无度,劣木充良、偷工减料已成大患。 None 1.01000001 1010.00001
101000002 LiJie None 李诫 0 而我们的职责,就是尽早发现这般祸患,防止酿成更大的问题。 None 1.01000002 1010.00002
101100001 LiJie None 李诫 0 无规矩,则屋不立;无准绳,则工不正。 None 1.01100001 1011.00001
101100002 LiJie None 李诫 0 你也要牢记。 None 1.01100002 1011.00002
101200001 Player None 玩家 0 是,李主簿。 None 1.01200001 1012.00001
101300001 LiJie None 李诫 0 你既为画图令史,第一要务便是识木、辨材、熟用器具。 None 1.01300001 1013.00001
101400001 LiJie None 李诫 0 现在随我去库房,我来带你认识水准、绳墨、曲尺、方斗这些营造根本之器。 None 1.01400001 1014.00001
101500001 LiJie None 李诫 0 待你熟习测量与料例,我便亲自带你到工地监工核验,杜绝此类祸事再发。 None 1.01500001 1015.00001
101600001 Player None 玩家 0 属下遵命。 None 1.01600001 1016.00001
101700001 Other None 旁白 0 你正式踏入将作监,一段以法度正营造的历程,自此开始。 None 1.01700001 1017.00001
101800001 LiJie None 李诫 0 这里是库房,存放着营造时用到的所有工具。 None 1.01800001 1018.00001
101900001 Subtitle None 字幕 0 檀木质地,刻度以朱砂标注,一端为方、一端为折,刻有 “材份” 刻度。 None 1.01900001 1019.00001
102000001 LiJie None 李诫 0 你看,构屋先定 “方”,柱枋是否垂直、斗拱是否方正,全凭这曲尺核验。 None 1.02000001 1020.00001
102100001 LiJie None 李诫 0 此前工地偷换木料,若早以曲尺量其形制,便知柳木径寸不足,断断用不得啊。 None 1.02100001 1021.00001
102200001 LiJie None 李诫 0 此乃方斗,也叫墨斗,配绳墨使用。 None 1.02200001 1022.00001
102200002 LiJie None 李诫 0 绳墨牵直,以墨斗弹线,便知木料是否平直、墙体是否端正。 None 1.02200002 1022.00002
102300001 Subtitle None 字幕 0 方斗为楠木所制,斗身刻 “将作监” 款识,墨仓密封,绳墨以生丝浸松烟墨制成,耐磨不褪。 None 1.02300001 1023.00001
102400001 LiJie None 李诫 0 营造之事,“直” 为要。 None 1.02400001 1024.00001
102400002 LiJie None 李诫 0 工头偷工减料,常以歪木充数,若以绳墨弹线,歪直立现,断无蒙混可能。 None 1.02400002 1024.00002
102500001 Player None 玩家 0 那这是何物? None 1.02500001 1025.00001
102600001 LiJie None 李诫 0 这是水准,也名 “水尺”,测地势高低、屋基平正之用。 None 1.02600001 1026.00001
102700001 Subtitle None 字幕 0 青铜制的水准器,形制为长槽,内盛水,槽侧刻刻度,槽端有通气孔,是宋代成熟的水准测量工具。 None 1.02700001 1027.00001
102800001 LiJie None 李诫 0 汴京地势多洼,营建房宇先以水准定基址 None 1.02800001 1028.00001
102800002 LiJie None 李诫 0 若基址倾斜,纵是木料精良,也难逃倾颓之祸。 None 1.02800002 1028.00002
102900001 LiJie None 李诫 0 水之性平,这水准便是借水定平。 None 1.02900001 1029.00001
103000001 LiJie None 李诫 0 除了这些器具,库房更藏有 “料例” 册籍, None 1.03000001 1030.00001
103000002 LiJie None 李诫 0 楠木、樟木、杉木各等用料定额,大木作、小木作各工序用工之数,皆在册中。 None 1.03000002 1030.00002
103100001 LiJie None 李诫 0 你既为画图令史,识器是第一步,更要知 “器以定法、法以量料”。 None 1.03100001 1031.00001
103100002 LiJie None 李诫 0 这些工具,是规矩的具象,料例是制度的准绳,二者相合,才能堵贪弊、正营造。 None 1.03100002 1031.00002
103200001 LiJie None 李诫 0 今日先熟其形、知其用。 None 1.03200001 1032.00001
103200002 LiJie None 李诫 0 明日随我去工地,以器验工,看看那些贪弊工头还能藏多少猫腻。 None 1.03200002 1032.00002
103300001 Player None 玩家 0 是,李主簿。 None 1.03300001 1033.00001
100200002 第2-4位数为对话Id GongTou None 工头 1 李官人啊,这...,我也不知...,啊! None 1.00200002 1002.00002
100200003 第5-9位数为对话行Id GongTou None 工头 1 定是那可恶的老鼠将这木材咬了去,或是这阴雨的天气染湿了榫头...。 None 1.00200003 1002.00003
100200004 LiJie None 李诫 0 那这木制松软、一掰就弯的木材是什么,我又不是不认识, None 1.00200004 1002.00004
100200005 LiJie None 李诫 0 大殿建筑用的都是上好的楠木,那这柳木是哪里来的你解释下。 None 1.00200005 1002.00005
100200006 GongTou None 工头 1 这...定是工人中出现了偷鸡摸狗的小人,李官人大可放心, None 1.00200006 1002.00006
100200007 GongTou None 工头 1 我一定将这小人找出来...。 None 1.00200007 1002.00007
100300001 Other None 旁白 0 你是新入将作监的画图令史,今日正是你当值的第一天。 None 1.00300001 1003.00001
100300002 LiJie None 李诫 1 你便是新任的画图令史? None 1.00300002 1003.00002
100300003 LiJie None 李诫 1 来得正好。 None 1.00300003 1003.00003
100300004 Player None 玩家 0 属下正是,见过李主簿。 None 1.00300004 1003.00004
100300005 LiJie None 李诫 1 方才工地塌架,你也有所耳闻。 None 1.00300005 1003.00005
100300006 LiJie None 李诫 1 这工头竟拿柳木来替代楠木,企图瞒天过海,结果却落得如此下场, None 1.00300006 1003.00006
100300007 LiJie None 李诫 1 幸好方才无人员伤亡,才让这工头躲过一劫。 None 1.00300007 1003.00007
100300008 LiJie None 李诫 1 如今营造无尺、用料无度,劣木充良、偷工减料已成大患。 None 1.00300008 1003.00008
100300009 LiJie None 李诫 1 而我们的职责,就是尽早发现这般祸患,防止酿成更大的问题。 None 1.00300009 1003.00009
100300010 LiJie None 李诫 1 无规矩,则屋不立;无准绳,则工不正。 None 1.0030001 1003.0001
100300011 LiJie None 李诫 1 你也要牢记。 None 1.00300011 1003.00011
100300012 Player None 玩家 0 是,李主簿。 None 1.00300012 1003.00012
100300013 LiJie None 李诫 1 你既为画图令史,第一要务便是识木、辨材、熟用器具。 None 1.00300013 1003.00013
100300014 LiJie None 李诫 1 现在随我去库房,我来带你认识水准、绳墨、曲尺、方斗这些营造根本之器。 None 1.00300014 1003.00014
100300015 LiJie None 李诫 1 待你熟习测量与料例,我便亲自带你到工地监工核验,杜绝此类祸事再发。 None 1.00300015 1003.00015
100300016 Player None 玩家 0 属下遵命。 None 1.00300016 1003.00016
100300017 Other None 旁白 0 你正式踏入将作监,一段以法度正营造的历程,自此开始。 None 1.00300017 1003.00017
100400001 LiJie None 李诫 1 这里是库房,存放着营造时用到的所有工具。 None 1.00400001 1004.00001
100400002 Subtitle None 字幕 0 檀木质地,刻度以朱砂标注,一端为方、一端为折,刻有 “材份” 刻度。 None 1.00400002 1004.00002
100400003 LiJie None 李诫 1 你看,构屋先定 “方”,柱枋是否垂直、斗拱是否方正,全凭这曲尺核验。 None 1.00400003 1004.00003
100400004 LiJie None 李诫 1 此前工地偷换木料,若早以曲尺量其形制,便知柳木径寸不足,断断用不得啊。 None 1.00400004 1004.00004
100400005 LiJie None 李诫 1 此乃方斗,也叫墨斗,配绳墨使用。 None 1.00400005 1004.00005
100400006 LiJie None 李诫 1 绳墨牵直,以墨斗弹线,便知木料是否平直、墙体是否端正。 None 1.00400006 1004.00006
100400007 Subtitle None 字幕 0 方斗为楠木所制,斗身刻 “将作监” 款识,墨仓密封,绳墨以生丝浸松烟墨制成,耐磨不褪。 None 1.00400007 1004.00007
100400008 LiJie None 李诫 1 营造之事,“直” 为要。 None 1.00400008 1004.00008
100400009 LiJie None 李诫 1 工头偷工减料,常以歪木充数,若以绳墨弹线,歪直立现,断无蒙混可能。 None 1.00400009 1004.00009
100400010 Player None 玩家 0 那这是何物? None 1.0040001 1004.0001
100400011 LiJie None 李诫 1 这是水准,也名 “水尺”,测地势高低、屋基平正之用。 None 1.00400011 1004.00011
100400012 Subtitle None 字幕 0 青铜制的水准器,形制为长槽,内盛水,槽侧刻刻度,槽端有通气孔,是宋代成熟的水准测量工具。 None 1.00400012 1004.00012
100400013 LiJie None 李诫 1 汴京地势多洼,营建房宇先以水准定基址 None 1.00400013 1004.00013
100400014 LiJie None 李诫 1 若基址倾斜,纵是木料精良,也难逃倾颓之祸。 None 1.00400014 1004.00014
100400015 LiJie None 李诫 1 水之性平,这水准便是借水定平。 None 1.00400015 1004.00015
100400016 LiJie None 李诫 1 除了这些器具,库房更藏有 “料例” 册籍, None 1.00400016 1004.00016
100400017 LiJie None 李诫 1 楠木、樟木、杉木各等用料定额,大木作、小木作各工序用工之数,皆在册中。 None 1.00400017 1004.00017
100400018 LiJie None 李诫 1 你既为画图令史,识器是第一步,更要知 “器以定法、法以量料”。 None 1.00400018 1004.00018
100400019 LiJie None 李诫 1 这些工具,是规矩的具象,料例是制度的准绳,二者相合,才能堵贪弊、正营造。 None 1.00400019 1004.00019
100400020 LiJie None 李诫 1 今日先熟其形、知其用。 None 1.0040002 1004.0002
100400021 LiJie None 李诫 1 明日随我去工地,以器验工,看看那些贪弊工头还能藏多少猫腻。 None 1.00400021 1004.00021
100400022 Player None 玩家 0 是,李主簿。 None 1.00400022 1004.00022
103400001 LiJie None 李诫 0 这工地是谁负责! None 1.03400001 1034.00001
103500001 GongTou None 工头 0 李主簿,您怎么又来了… None 1.03500001 1035.00001
103600001 LiJie None 李诫 0 我不来,怎知你们又在如何糊弄? None 1.03600001 1036.00001

Binary file not shown.

View File

@ -3,6 +3,7 @@
# int string string bool bool
# 界面编号 策划备注 资源名称 界面组名称 是否允许多个界面实例 是否暂停被其覆盖的界面
1 弹出框 DialogForm Dialog True False
2 BgForm Default False False
100 主菜单 MenuForm Default False True
101 设置 SettingForm Default False True
102 关于 AboutForm Default False True

Binary file not shown.