diff --git a/README.assets/image-20230411134850372.png b/README.assets/image-20230411134850372.png
new file mode 100644
index 0000000..8b476d1
Binary files /dev/null and b/README.assets/image-20230411134850372.png differ
diff --git a/README.assets/image-20230411134857271.png b/README.assets/image-20230411134857271.png
new file mode 100644
index 0000000..f79c930
Binary files /dev/null and b/README.assets/image-20230411134857271.png differ
diff --git a/README.assets/image-20230411134921770.png b/README.assets/image-20230411134921770.png
new file mode 100644
index 0000000..19d46c1
Binary files /dev/null and b/README.assets/image-20230411134921770.png differ
diff --git a/README.assets/image-20230411134933108.png b/README.assets/image-20230411134933108.png
new file mode 100644
index 0000000..713d998
Binary files /dev/null and b/README.assets/image-20230411134933108.png differ
diff --git a/README.assets/image-20230411134959369.png b/README.assets/image-20230411134959369.png
new file mode 100644
index 0000000..f607526
Binary files /dev/null and b/README.assets/image-20230411134959369.png differ
diff --git a/README.assets/image-20230411135128676.png b/README.assets/image-20230411135128676.png
new file mode 100644
index 0000000..553c2ae
Binary files /dev/null and b/README.assets/image-20230411135128676.png differ
diff --git a/README.assets/image-20230411135345438.png b/README.assets/image-20230411135345438.png
new file mode 100644
index 0000000..7a80303
Binary files /dev/null and b/README.assets/image-20230411135345438.png differ
diff --git a/README.assets/image-20230411135459116.png b/README.assets/image-20230411135459116.png
new file mode 100644
index 0000000..547d1ec
Binary files /dev/null and b/README.assets/image-20230411135459116.png differ
diff --git a/README.md b/README.md
index f88035b..5a59d78 100644
--- a/README.md
+++ b/README.md
@@ -1,2 +1,46 @@
# VPet.Plugin.DemoClock
给桌宠添加一个时钟显示的功能,这算是代码嵌入类型MOD的DEMO
+
+
+
+参考本软件即可编写自己的代码MOD
+
+### 功能
+
+给桌宠添加一个可以显示时间的钟表
+
+* 支持倒计时
+* 支持正计时
+* 支持番茄钟 (工作/休息)
+
+每次使用番茄钟完成工作,还可以获得相应时间的 [金钱] 奖励
+
+### 相关截图
+
+菜单栏设置
+
+
+
+鼠标移近时突出显示状态
+
+
+
+待机时状态
+
+
+
+倒计时状态
+
+
+
+番茄钟:工作状态
+
+
+
+时间到
+
+
+
+游戏设置窗口
+
+
diff --git a/VPet.Plugin.DemoClock.sln b/VPet.Plugin.DemoClock.sln
new file mode 100644
index 0000000..998a5a5
--- /dev/null
+++ b/VPet.Plugin.DemoClock.sln
@@ -0,0 +1,25 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio Version 17
+VisualStudioVersion = 17.4.33213.308
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "VPet.Plugin.DemoClock", "VPet.Plugin.DemoClock\VPet.Plugin.DemoClock.csproj", "{D23F1150-999F-4698-800C-4E60FF853A3E}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Release|Any CPU = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {D23F1150-999F-4698-800C-4E60FF853A3E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {D23F1150-999F-4698-800C-4E60FF853A3E}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {D23F1150-999F-4698-800C-4E60FF853A3E}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {D23F1150-999F-4698-800C-4E60FF853A3E}.Release|Any CPU.Build.0 = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ SolutionGuid = {DE04C712-253C-491A-B3F6-AC3E3C3569E9}
+ EndGlobalSection
+EndGlobal
diff --git a/VPet.Plugin.DemoClock/1100_DemoClock/icon.png b/VPet.Plugin.DemoClock/1100_DemoClock/icon.png
new file mode 100644
index 0000000..74fb357
Binary files /dev/null and b/VPet.Plugin.DemoClock/1100_DemoClock/icon.png differ
diff --git a/VPet.Plugin.DemoClock/1100_DemoClock/info.lps b/VPet.Plugin.DemoClock/1100_DemoClock/info.lps
new file mode 100644
index 0000000..575978c
--- /dev/null
+++ b/VPet.Plugin.DemoClock/1100_DemoClock/info.lps
@@ -0,0 +1,2 @@
+vupmod#DemoClock:|author#lorisyounger:|gamever#100:|ver#100:|
+intro#给桌宠添加一个时钟显示的功能,这算是代码嵌入类型MOD的DEMO:|
\ No newline at end of file
diff --git a/VPet.Plugin.DemoClock/1100_DemoClock/plugin/LinePutScript.dll b/VPet.Plugin.DemoClock/1100_DemoClock/plugin/LinePutScript.dll
new file mode 100644
index 0000000..dc9c8ee
Binary files /dev/null and b/VPet.Plugin.DemoClock/1100_DemoClock/plugin/LinePutScript.dll differ
diff --git a/VPet.Plugin.DemoClock/1100_DemoClock/plugin/LinePutScript.xml b/VPet.Plugin.DemoClock/1100_DemoClock/plugin/LinePutScript.xml
new file mode 100644
index 0000000..c999426
--- /dev/null
+++ b/VPet.Plugin.DemoClock/1100_DemoClock/plugin/LinePutScript.xml
@@ -0,0 +1,4168 @@
+
+
+
+ LinePutScript
+
+
+
+
+ 通过字典类型的行, Name不会重复
+
+ Sub类型
+ 值类型
+
+
+
+ 子项目
+
+
+
+
+ 文本 在末尾没有结束行号的文本 (去除关键字的文本)
+
+
+
+
+ 文本 在末尾没有结束行号的文本 (正常)
+
+
+
+
+ 文本 (int)
+
+
+
+
+ 文本 (int64)
+
+
+
+
+ 文本 (double)
+
+
+
+
+ 注释 ///为注释
+
+
+
+
+ 获取Sub数量
+
+
+
+
+ 是否只读
+
+
+
+
+ 通过引索修改Line中Sub内容(错误:字典没有引索)
+
+ 要获得或设置的引索
+ 引索指定的Sub
+
+
+
+ 将指定的Sub添加到Subs列表的末尾
+
+ 要添加的Sub
+
+
+
+ 若无相同名称(Name)的Sub,则将指定的Sub添加到Subs列表的末尾
+ 若有,则替换成要添加的Sub
+
+ 要添加的Sub
+
+
+
+ 将指定Sub的元素添加到Subs的末尾
+
+ 要添加的多个Sub
+
+
+
+ 将指定的Sub添加到Subs列表的末尾
+
+ 要添加的Sub
+
+
+
+ 移除Line中所有的Sub
+
+
+
+
+ 返回一个值,该值指示指定的字段是否出现在Subs的Sub的名字
+
+ 字段
+ 如果在Line集合中找到符合的名字,则为True; 否则为false
+
+
+
+ 确定某Sub是否在Line集合中
+
+ 要在Line集合中定位的Sub
+ 如果在Line集合中找到sub,则为True; 否则为false
+
+
+
+ 将整个array复制到Line的Subs
+
+ 复制到Subs的Sub列表
+ 从零开始的引索,从引索处开始复制
+
+
+
+ 搜索与指定名称,并返回Line或整个Subs中的第一个匹配元素
+
+ 用于定义匹配的名称
+ 如果找到相同名称的第一个sub,则为该sub; 否则为null
+
+
+
+ 搜索与指定名称,并返回整个Assemblage中的第一个匹配元素
+
+ 用于定义匹配的名称
+ 用于定义匹配的信息 (去除关键字的文本)
+ 如果找到相同名称和信息的第一个Line,则为该Line; 否则为null
+
+
+
+ 匹配拥有相同名称的Line或sub的所有元素(注意:在字典中,信息是唯一的)
+
+ 用于定义匹配的名称
+ 如果找到相同名称的sub,其中所有元素均与指定谓词定义的条件匹配,则为该数组; 否则为一个空的Array
+
+
+
+ 匹配拥有相同名称和信息的Line或sub的所有元素(注意:在字典中,信息是唯一的)
+
+ 用于定义匹配的名称
+ 用于定义匹配的信息 (去除关键字的文本)
+ 如果找到相同名称和信息的sub,其中所有元素均与指定谓词定义的条件匹配,则为该数组; 否则为一个空的Array
+
+
+
+ 匹配拥有相同信息的Line或sub的所有元素(注意:在字典中,信息是唯一的)
+
+ 用于定义匹配的信息 (去除关键字的文本)
+ 如果找到相同信息的sub,其中所有元素均与指定谓词定义的条件匹配,则为该数组; 否则为一个空的Array
+
+
+
+ 搜索与指定信息,并返回整个Assemblage中的第一个匹配元素
+
+ 用于定义匹配的信息 (去除关键字的文本)
+ 如果找到相同信息的第一个Line,则为该Line; 否则为null
+
+
+
+ 搜索与指定名称,并返回Line或整个Subs中的第一个匹配元素;若未找到,则新建并添加相同名称的Sub,并且返回这个Sub
+
+ 用于定义匹配的名称
+ 如果找到相同名称的第一个sub,则为该sub; 否则为新建的相同名称sub
+
+
+
+ 返回一个 Subs 的第一个元素。
+
+ 要返回的第一个元素
+
+
+
+ 返回一个 Subs 的最后一个元素。
+
+ 要返回的最后一个元素
+
+
+
+ 搜索与指定名称,并返回Line或整个Subs中的第一个匹配元素;若未找到,则新建并添加相同名称的Sub,并且返回这个Sub
+
+ 用于定义匹配的名称
+ 如果找到相同名称的第一个sub,则为该sub; 否则为新建的相同名称sub
+
+
+
+ 获得bool属性的sub
+
+ 用于定义匹配的名称
+ 如果找到相同名称的sub,则为True; 否则为false
+
+
+
+ 设置bool属性的sub
+
+ 用于定义匹配的名称
+
+ 值
+
+
+
+
+ 获得int属性的sub
+
+ 用于定义匹配的名称
+ 如果没找到返回的默认值
+
+ 如果找到相同名称的sub,返回sub中储存的int值
+ 如果没找到,则返回默认值
+
+
+
+
+ 设置int属性的sub
+
+ 用于定义匹配的名称
+ 储存进sub的int值
+
+
+
+ 获得long属性的sub
+
+ 用于定义匹配的名称
+ 如果没找到返回的默认值
+
+ 如果找到相同名称的sub,返回sub中储存的long值
+ 如果没找到,则返回默认值
+
+
+
+
+ 设置long属性的sub
+
+ 用于定义匹配的名称
+ 储存进sub的long值
+
+
+
+ 获得double(long)属性的sub 通过转换long获得更精确的小数,小数位最大保留9位
+
+ 用于定义匹配的名称
+ 如果没找到返回的默认值
+
+ 如果找到相同名称的sub,返回sub中储存的double(long)值
+ 如果没找到,则返回默认值
+
+
+
+
+ 设置double(long)属性的sub 通过转换long获得更精确的小数,小数位最大保留9位
+
+ 用于定义匹配的名称
+ 储存进sub的double(long)值
+
+
+
+ 获得DateTime属性的sub
+
+ 用于定义匹配的名称
+ 如果没找到返回的默认值
+
+ 如果找到相同名称的sub,返回sub中储存的DateTime值
+ 如果没找到,则返回默认值
+
+
+
+
+ 设置DateTime属性的sub
+
+ 用于定义匹配的名称
+ 储存进sub的DateTime值
+
+
+
+ 获得String属性的sub
+
+ 用于定义匹配的名称
+ 如果没找到返回的默认值
+
+ 如果找到相同名称的sub,返回sub中储存的String值
+ 如果没找到,则返回默认值
+
+
+
+
+ 设置String属性的sub
+
+ 用于定义匹配的名称
+ 储存进sub的String值
+
+
+
+ 获得double属性的sub
+
+ 用于定义匹配的名称
+ 如果没找到返回的默认值
+
+ 如果找到相同名称的sub,返回sub中储存的double值
+ 如果没找到,则返回默认值
+
+
+
+
+ 设置double属性的sub
+
+ 用于定义匹配的名称
+ 储存进sub的double值
+
+
+
+ 通过名字和信息创建新的Line
+
+ 名称
+ 信息 (正常)
+ 文本 在末尾没有结束行号的文本 (正常)
+ 子类集合
+
+
+
+ 将其他Line内容拷贝到本Line
+
+ 其他line
+
+
+
+ 退回Text的反转义文本 (正常显示)
+
+ Text的反转义文本 (正常显示)
+
+
+
+ 将指定的Sub添加到指定索引处(失效:字典没有顺序)
+
+ 应插入 Sub 的从零开始的索引(失效)
+ 要添加的Sub
+
+
+
+ 将指定Sub的元素添加指定索引处(失效:字典没有顺序)
+
+ 应插入 Sub 的从零开始的索引
+ 要添加的多个Sub
+
+
+
+ 从Subs中移除特定名称
+
+ 要从Subs中删除的Sub的名称
+ 如果成功移除了Sub,则为 true; 否则为 false
+
+
+
+ 从Subs中移除特定名称的所有元素(失效:字典为单一性)
+
+ 要从Subs中删除的Sub的名称
+
+
+
+ 搜索全部相似名称的Sub的所有元素
+
+ %字段%
+ 如果找到相似名称的Sub,则为数组; 否则为一个空的Array
+
+
+
+ 搜索字段是否出现在Line名称,并返回整个Subs中的第一个匹配元素
+
+ %字段%
+ 如果找到相似名称的第一个Sub,则为该Sub; 否则为null
+
+
+
+ 搜索相同名称的Sub,并返回整个Subs中第一个匹配的sub从零开始的索引(错误:字典没有引索)
+
+ 用于定义匹配的名称
+ 如果找到相同名称的sub的第一个元素,则为该元素的从零开始的索引; 否则为 -1
+
+
+
+ 搜索相同名称的Sub,并返回整个Subs中第一个匹配的Sub从零开始的索引(错误:字典没有引索)
+
+ 用于定义匹配的Sub
+ 如果找到相同名称的Sub的第一个元素,则为该元素的从零开始的索引; 否则为 -1
+
+
+
+ 搜索相同名称的Sub,并返回整个Sub中全部匹配的sub从零开始的索引(错误:字典没有引索)
+
+ 用于定义匹配的名称
+ 如果找到相同名称的sub的元素,则为该元素的从零开始的索引组; 否则为空的Array
+
+
+
+ 将当前Line转换成文本格式 (info已经被转义/去除关键字)
+
+ Line的文本格式 (info已经被转义/去除关键字)
+
+
+
+ 将当前Line转换成文本格式 (info已经被转义/去除关键字)
+
+ Line的文本格式 (info已经被转义/去除关键字)
+
+
+
+ 返回一个新List,包含所有Subs
+
+ 所有储存的Subs
+
+
+
+ 加载 通过lps文本创建一个子类
+
+ lps文本
+
+
+
+ 获得该Line的长哈希代码
+
+ 64位哈希代码
+
+
+
+ 获得该Line的哈希代码
+
+ 32位哈希代码
+
+
+
+ 将指定的Sub添加到指定索引处 (失效:字典没有顺序)
+
+ 应插入 Sub 的从零开始的索引(失效)
+ 要添加的Sub
+
+
+
+ 从Subs中移除特定引索的Sub (错误:字典没有顺序)
+
+ 要删除Sub的引索
+
+
+
+ 从Subs中移除特定对象的第一个匹配项
+
+ 要从Subs中删除的Sub
+ 如果成功移除了Sub,则为 true; 否则为 false
+
+
+
+ 返回循环访问 Subs 的枚举数。
+
+ 用于 Subs 的枚举数
+
+
+
+ 获取或设置 String 属性的sub
+
+ (gstr)用于定义匹配的名称
+ 获取或设置对 String 属性的Sub
+
+
+
+ 获取或设置 Bool 属性的sub
+
+ (gbol)用于定义匹配的名称
+ 获取或设置对 bool 属性的Sub
+
+
+
+ 获取或设置 Int 属性的sub
+
+ (gint)用于定义匹配的名称
+ 获取或设置对 int 属性的Sub
+
+
+
+ 获取或设置 Long 属性的sub
+
+ (gi64)用于定义匹配的名称
+ 获取或设置对 long 属性的Sub
+
+
+
+ 获取或设置 Double 属性的sub
+
+ (gdbe)用于定义匹配的名称
+ 获取或设置对 double 属性的Sub
+
+
+
+ 获取或设置 Double(long) 属性的sub 通过转换long获得更精确的小数,小数位最大保留9位
+
+ (gflt)用于定义匹配的名称
+ 获取或设置对 double 属性的Sub
+
+
+
+ 获取或设置 DateTime 属性的sub
+
+ (gdbe)用于定义匹配的名称
+ 获取或设置对 double 属性的Sub
+
+
+
+ 通过字典类型的文件 包括文件读写等一系列操作
+
+
+
+
+ 集合 全部文件的数据
+
+
+
+
+ 创建一个 LpsDocument
+
+
+
+
+ 从指定的字符串创建 LpsDocument
+
+ 包含要加载的LPS文档的字符串
+
+
+
+ 将指定的Line添加到Assemblage列表
+
+ 要添加的Line
+
+
+
+ 若无相同名称(Name)的Line,则将指定的Line添加到Assemblage列表
+ 若有,则替换成要添加的Line
+
+ 要添加的Line
+
+
+
+ 将指定Line的元素添加到Assemblage
+
+ 要添加的多个Line
+
+
+
+ 将指定Line的元素添加到Assemblage
+
+ 要添加的多个Line
+
+
+
+ 将指定的Line添加到指定索引处(失效:字典没有顺序)
+
+ 应插入 Line 的从零开始的索引
+ 要添加的Line
+
+
+
+ 将指定Line的元素添加指定索引处(失效:字典没有顺序)
+
+ 应插入 Line 的从零开始的索引
+ 要添加的多个Line
+
+
+
+ 将指定Line的元素添加指定索引处(失效:字典没有顺序)
+
+ 应插入 Line 的从零开始的索引
+ 要添加的多个Line
+
+
+
+ 从Assemblage中移除特定对象的第一个匹配项
+
+ 要从Assemblage中删除的Line的名称
+ 如果成功移除了line,则为 true; 否则为 false
+
+
+
+ 从Assemblage中移除特定名称的第一个匹配项
+
+ 要从Assemblage中删除的Line的名称
+ 如果成功移除了line,则为 true; 否则为 false
+
+
+
+ 从Assemblage中移除移除与条件相匹配的所有Line (失效:字典没有顺序)
+
+ 要从Assemblage中删除的Line
+
+
+
+ 从Assemblage中移除移除与名称相匹配的所有Line (失效:字典没有顺序)
+
+ 要从Assemblage中删除的Line的名称
+
+
+
+ 移除Assemblage的指定索引处的Line (错误:字典没有引索)
+
+ 要移除的Line的从零开始的索引
+
+
+
+ 确定某Line是否在Assemblage中
+
+ 要在Assemblage中定位的Line
+ 如果在Assemblage中找到line,则为True; 否则为false
+
+
+
+ 确定某Sub是否在Assemblage中
+
+ 要在Assemblage中定位的Sub
+ 如果在Assemblage中找到line,则为True; 否则为false
+
+
+
+ 确定某Line(名字定位)是否在Assemblage中
+
+ Line的名字
+ 如果在Assemblage中找到相同的名字,则为True; 否则为false
+
+
+
+ 确定某sub(名字定位)是否在Assemblage中
+
+ sub的名字
+ 如果在Assemblage的sub中找到相同的名字,则为True; 否则为false
+
+
+
+ 匹配拥有相同名称的Line的所有元素(注意:在字典中,信息是唯一的)
+
+ 用于定义匹配的名称
+ 如果找到相同名称的Line,其中所有元素均与指定谓词定义的条件匹配,则为该数组; 否则为一个空的Array
+
+
+
+ 匹配拥有相同名称和信息的Line的所有元素(注意:在字典中,信息是唯一的)
+
+ 用于定义匹配的名称
+ 用于定义匹配的信息 (去除关键字的文本)
+ 如果找到相同名称和信息的Line,其中所有元素均与指定谓词定义的条件匹配,则为该数组; 否则为一个空的Array
+
+
+
+ 匹配拥有相同信息的Line的所有元素(注意:在字典中,信息是唯一的)
+
+ 用于定义匹配的信息 (去除关键字的文本)
+ 如果找到相同信息的Line,其中所有元素均与指定谓词定义的条件匹配,则为该数组; 否则为一个空的Array
+
+
+
+ 搜索与指定名称,并返回整个Assemblage中的第一个匹配元素
+
+ 用于定义匹配的名称
+ 如果找到相同名称的第一个Line,则为该Line; 否则为null
+
+
+
+ 搜索与指定名称和信息,并返回整个Assemblage中的第一个匹配元素
+
+ 用于定义匹配的名称
+ 用于定义匹配的信息 (去除关键字的文本)
+ 如果找到相同名称和信息的第一个Line,则为该Line; 否则为null
+
+
+
+ 搜索与指定信息,并返回整个Assemblage中的第一个匹配元素
+
+ 用于定义匹配的信息 (去除关键字的文本)
+ 如果找到相同信息的第一个Line,则为该Line; 否则为null
+
+
+
+ 搜索与指定名称,并返回整个Assemblage中的第一个匹配元素; 若未找到,则新建并添加相同名称的Line,并且返回这个Line
+
+ 用于定义匹配的名称
+ 如果找到相同名称的第一个Line,则为该Line; 否则为新建的相同名称Line
+
+
+
+ 匹配拥有相同名称的Sub的所有元素
+
+ 用于定义匹配的名称
+ 如果找到相同名称的Sub,其中所有元素均与指定谓词定义的条件匹配,则为该数组; 否则为一个空的Array
+
+
+
+ 匹配拥有相同名称和信息的Sub的所有元素
+
+ 用于定义匹配的名称
+ 用于定义匹配的信息 (去除关键字的文本)
+ 如果找到相同名称和信息的Sub,其中所有元素均与指定谓词定义的条件匹配,则为该数组; 否则为一个空的Array
+
+
+
+ 匹配拥有相同信息的Sub的所有元素
+
+ 用于定义匹配的信息 (去除关键字的文本)
+ 如果找到相同信息的Sub,其中所有元素均与指定谓词定义的条件匹配,则为该数组; 否则为一个空的Array
+
+
+
+ 搜索与指定名称,并返回整个Assemblage中的第一个匹配元素
+
+ 用于定义匹配的名称
+ 如果找到相同名称的第一个Sub,则为该Line; 否则为null
+
+
+
+ 搜索与指定名称和信息,并返回整个Assemblage中的第一个匹配元素
+
+ 用于定义匹配的名称
+ 用于定义匹配的信息 (去除关键字的文本)
+ 如果找到相同名称和信息的第一个Sub,则为该Line; 否则为null
+
+
+
+ 搜索与指定信息,并返回整个Assemblage中的第一个匹配元素
+
+ 用于定义匹配的信息 (去除关键字的文本)
+ 如果找到相同信息的第一个Sub,则为该Line; 否则为null
+
+
+
+ 搜索全部相似名称的Line的所有元素
+
+ %字段%
+ 如果找到相似名称的Line,则为数组; 否则为一个空的Array
+
+
+
+ 搜索字段是否出现在Line名称,并返回整个Assemblage中的第一个匹配元素
+
+ %字段%
+ 如果找到相似名称的第一个Line,则为该Line; 否则为null
+
+
+
+ 搜索全部相似名称的Sub的所有元素
+
+ %字段%
+ 如果找到相似名称的Line,则为该数组; 否则为一个空的Array
+
+
+
+ 搜索字段是否出现在Sub名称,并返回整个Assemblage中的第一个匹配元素
+
+ %字段%
+ 如果找到相同名称的第一个Sub,则为该Sub; 否则为null
+
+
+
+ 搜索相同名称的Line,并返回整个Assemblage中第一个匹配的Line从零开始的索引 (错误:字典没有引索)
+
+ 用于定义匹配的名称
+ 如果找到相同名称的Line的第一个元素,则为该元素的从零开始的索引; 否则为 -1
+
+
+
+ 搜索相同名称的Line,并返回整个Assemblage中全部匹配的Line从零开始的索引 (错误:字典没有引索)
+
+ 用于定义匹配的名称
+ 如果找到相同名称的Line的元素,则为该元素的从零开始的索引组; 否则为空的Array
+
+
+
+ 获得Assemblage目前储存的Line数量
+
+
+
+
+ 从指定的字符串加载LPS文档
+
+ 包含要加载的LPS文档的字符串
+
+
+
+ 返回一个Assemblage的第一个元素。
+
+ 要返回的第一个元素
+
+
+
+ 返回一个Assemblage的最后一个元素。
+
+ 要返回的最后一个元素
+
+
+
+ 返回循环访问 Assemblage 的枚举数。
+
+ 用于 Assemblage 的枚举数
+
+
+
+ 搜索与指定名称,并返回整个Assemblage中的第一个匹配元素; 若未找到,则新建并添加相同名称的Line,并且返回这个Line
+
+ 用于定义匹配的名称
+ 如果找到相同名称的第一个Line,则为该Line; 否则为新建的相同名称Line
+
+
+
+ 将当前Documents转换成文本格式
+
+ LinePutScript的文本格式
+
+
+
+ 获得该LPS文档的长哈希代码
+
+ 64位哈希代码
+
+
+
+ 获得该LPS文档的哈希代码
+
+ 32位哈希代码
+
+
+
+ 确认对象是否等于当前对象
+
+ Subs
+
+
+
+
+ 获得当前文档大小 单位:字符
+
+
+
+
+ 是否只读
+
+
+
+
+ 通过引索修改lps中Line内容 (错误:字典没有引索)
+
+ 要获得或设置的引索
+ 引索指定的Line
+
+
+
+ 获得bool属性的line
+
+ 用于定义匹配的名称
+ 如果找到相同名称的line,则为True; 否则为false
+
+
+
+ 设置bool属性的line
+
+ 用于定义匹配的名称
+
+ 如果为ture,则在没有相同name为lineName的line时候添加新的line
+ 如果为false,则删除所有name为lineName的line
+
+
+
+
+ 获得int属性的line
+
+ 用于定义匹配的名称
+ 如果没找到返回的默认值
+
+ 如果找到相同名称的line,返回line中储存的int值
+ 如果没找到,则返回默认值
+
+
+
+
+ 设置int属性的line
+
+ 用于定义匹配的名称
+ 储存进line的int值
+
+
+
+ 获得long属性的line
+
+ 用于定义匹配的名称
+ 如果没找到返回的默认值
+
+ 如果找到相同名称的line,返回line中储存的long值
+ 如果没找到,则返回默认值
+
+
+
+
+ 设置long属性的line
+
+ 用于定义匹配的名称
+ 储存进line的long值
+
+
+
+ 获得String属性的line
+
+ 用于定义匹配的名称
+ 如果没找到返回的默认值
+
+ 如果找到相同名称的line,返回line中储存的string值
+ 如果没找到,则返回默认值
+
+
+
+
+ 设置String属性的line
+
+ 用于定义匹配的名称
+ 储存进line的String值
+
+
+
+ 获得double属性的line
+
+ 用于定义匹配的名称
+ 如果没找到返回的默认值
+
+ 如果找到相同名称的line,返回line中储存的double值
+ 如果没找到,则返回默认值
+
+
+
+
+ 设置double属性的line
+
+ 用于定义匹配的名称
+ 储存进line的double值
+
+
+
+ 获得double(long)属性的line 通过转换long获得更精确的小数,小数位最大保留9位
+
+ 用于定义匹配的名称
+ 如果没找到返回的默认值
+
+ 如果找到相同名称的line,返回line中储存的double(long)值
+ 如果没找到,则返回默认值
+
+
+
+
+ 设置double(long)属性的line 通过转换long获得更精确的小数,小数位最大保留9位
+
+ 用于定义匹配的名称
+ 储存进line的double(long)值
+
+
+
+ 获得DateTime属性的line
+
+ 用于定义匹配的名称
+ 如果没找到返回的默认值
+
+ 如果找到相同名称的line,返回line中储存的DateTime值
+ 如果没找到,则返回默认值
+
+
+
+
+ 设置DateTime属性的line
+
+ 用于定义匹配的名称
+ 储存进line的DateTime值
+
+
+
+ 获取或设置 String 属性的line
+
+ (gstr)用于定义匹配的名称
+ 获取或设置对 String 属性的Line
+
+
+
+ 获取或设置 Bool 属性的line
+
+ (gbol)用于定义匹配的名称
+ 获取或设置对 bool 属性的Line
+
+
+
+ 获取或设置 Int 属性的line
+
+ (gint)用于定义匹配的名称
+ 获取或设置对 int 属性的Line
+
+
+
+ 获取或设置 Long 属性的line
+
+ (gi64)用于定义匹配的名称
+ 获取或设置对 long 属性的Line
+
+
+
+ 获取或设置 Double 属性的line
+
+ (gdbe)用于定义匹配的名称
+ 获取或设置对 double 属性的Line
+
+
+
+ 获取或设置 Double(long) 属性的line 通过转换long获得更精确的小数,小数位最大保留9位
+
+ (gflt)用于定义匹配的名称
+ 获取或设置对 double 属性的line
+
+
+
+ 获取或设置 DateTime 属性的line
+
+ (gdbe)用于定义匹配的名称
+ 获取或设置对 double 属性的line
+
+
+
+ 搜索相同Line,并返回整个Assemblage中第一个匹配的Line从零开始的索引 (错误:字典没有引索)
+
+ 用于定义匹配的Line
+ 如果找到相同名称的Line的第一个元素,则为该元素的从零开始的索引; 否则为 -1
+
+
+
+ 将指定的Line添加到指定索引处 (失效:字典没有顺序)
+
+ 应插入 Line 的从零开始的索引
+ 要添加的Line
+
+
+
+ 将指定的Line添加到Assemblage列表
+
+ 要添加的Line
+
+
+
+ 移除Assemblage中所有的Line
+
+
+
+
+ 将整个array复制到Assemblage
+
+ 复制到Assemblage的Line列表
+ 从零开始的引索,从引索处开始复制
+
+
+
+ 返回一个新List,包含所有Line
+
+ 所有储存的Line
+
+
+
+ Get Object 可以通过强制转换进行更轻松的getset操作
+
+
+
+
+ 储存在gobject中的值
+
+
+
+
+ 生成 Gobj
+
+
+
+
+ string 可以通过强制转换进行更轻松的getset操作
+ 例: line[(gstr)"subname"]
+
+
+
+
+ 生成 Gobj
+
+
+
+
+ 强制转换gobjcet成string
+
+ gobject
+
+
+
+ 强制转换string成gobjcet
+
+ string
+
+
+
+ bool 可以通过强制转换进行更轻松的getset操作
+ 例: line[(gbol)"subname"]
+
+
+
+
+ 生成 Gobj
+
+
+
+
+ 强制转换gobjcet成string
+
+ gobject
+
+
+
+ 强制转换string成gobjcet
+
+ string
+
+
+
+ int 可以通过强制转换进行更轻松的getset操作
+ 例: line[(gint)"subname"]
+
+
+
+
+ 生成 Gobj
+
+
+
+
+ 强制转换gobjcet成string
+
+ gobject
+
+
+
+ 强制转换string成gobjcet
+
+ string
+
+
+
+ long 可以通过强制转换进行更轻松的getset操作
+ 例: line[(gi64)"subname"]
+
+
+
+
+ 生成 Gobj
+
+
+
+
+ 强制转换gobjcet成string
+
+ gobject
+
+
+
+ 强制转换string成gobjcet
+
+ string
+
+
+
+ double 可以通过强制转换进行更轻松的getset操作
+ 例: line[(gdbe)"subname"]
+
+
+
+
+ 生成 Gobj
+
+
+
+
+ 强制转换gobjcet成string
+
+ gobject
+
+
+
+ 强制转换string成gobjcet
+
+ string
+
+
+
+ DateTime 可以通过强制转换进行更轻松的getset操作
+ 例: line[(gdat)"subname"]
+
+
+
+
+ 生成 Gobj
+
+
+
+
+ 强制转换gobjcet成string
+
+ gobject
+
+
+
+ 强制转换string成gobjcet
+
+ string
+
+
+
+ double(long) 通过转换long获得更精确的小数
+ 可以通过强制转换进行更轻松的getset操作
+ 例: line[(gflt)"subname"]
+
+
+
+
+ 生成 Gobj
+
+
+
+
+ 强制转换gobjcet成string
+
+ gobject
+
+
+
+ 强制转换string成gobjcet
+
+ string
+
+
+
+ 支持使用GOBJ获取设置的接口
+
+
+
+
+ 搜索与指定名称,并返回Line或整个Subs中的第一个匹配元素;若未找到,则新建并添加相同名称的Sub,并且返回这个Sub
+
+ 用于定义匹配的名称
+ 如果找到相同名称的第一个sub,则为该sub; 否则为新建的相同名称sub
+
+
+
+ 获得bool属性的sub
+
+ 用于定义匹配的名称
+ 如果找到相同名称的sub,则为True; 否则为false
+
+
+
+ 设置bool属性的sub
+
+ 用于定义匹配的名称
+
+ 值
+
+
+
+
+ 获得int属性的sub
+
+ 用于定义匹配的名称
+ 如果没找到返回的默认值
+
+ 如果找到相同名称的sub,返回sub中储存的int值
+ 如果没找到,则返回默认值
+
+
+
+
+ 设置int属性的sub
+
+ 用于定义匹配的名称
+ 储存进sub的int值
+
+
+
+ 获得long属性的sub
+
+ 用于定义匹配的名称
+ 如果没找到返回的默认值
+
+ 如果找到相同名称的sub,返回sub中储存的long值
+ 如果没找到,则返回默认值
+
+
+
+
+ 设置long属性的sub
+
+ 用于定义匹配的名称
+ 储存进sub的long值
+
+
+
+ 获得double(long)属性的sub 通过转换long获得更精确的小数,小数位最大保留9位
+
+ 用于定义匹配的名称
+ 如果没找到返回的默认值
+
+ 如果找到相同名称的sub,返回sub中储存的double(long)值
+ 如果没找到,则返回默认值
+
+
+
+
+ 设置double(long)属性的sub 通过转换long获得更精确的小数,小数位最大保留9位
+
+ 用于定义匹配的名称
+ 储存进sub的double(long)值
+
+
+
+ 获得DateTime属性的sub
+
+ 用于定义匹配的名称
+ 如果没找到返回的默认值
+
+ 如果找到相同名称的sub,返回sub中储存的DateTime值
+ 如果没找到,则返回默认值
+
+
+
+
+ 设置DateTime属性的sub
+
+ 用于定义匹配的名称
+ 储存进sub的DateTime值
+
+
+
+ 获得String属性的sub
+
+ 用于定义匹配的名称
+ 如果没找到返回的默认值
+
+ 如果找到相同名称的sub,返回sub中储存的String值
+ 如果没找到,则返回默认值
+
+
+
+
+ 设置String属性的sub
+
+ 用于定义匹配的名称
+ 储存进sub的String值
+
+
+
+ 获得double属性的sub
+
+ 用于定义匹配的名称
+ 如果没找到返回的默认值
+
+ 如果找到相同名称的sub,返回sub中储存的double值
+ 如果没找到,则返回默认值
+
+
+
+
+ 设置double属性的sub
+
+ 用于定义匹配的名称
+ 储存进sub的double值
+
+
+
+ 获取或设置 String 属性的sub
+
+ (gstr)用于定义匹配的名称
+ 获取或设置对 String 属性的Sub
+
+
+
+ 获取或设置 Bool 属性的sub
+
+ (gbol)用于定义匹配的名称
+ 获取或设置对 bool 属性的Sub
+
+
+
+ 获取或设置 Int 属性的sub
+
+ (gint)用于定义匹配的名称
+ 获取或设置对 int 属性的Sub
+
+
+
+ 获取或设置 Long 属性的sub
+
+ (gi64)用于定义匹配的名称
+ 获取或设置对 long 属性的Sub
+
+
+
+ 获取或设置 Double 属性的sub
+
+ (gdbe)用于定义匹配的名称
+ 获取或设置对 double 属性的Sub
+
+
+
+ 获取或设置 Double(long) 属性的sub 通过转换long获得更精确的小数,小数位最大保留9位
+
+ (gflt)用于定义匹配的名称
+ 获取或设置对 double 属性的Sub
+
+
+
+ 获取或设置 DateTime 属性的sub
+
+ (gdbe)用于定义匹配的名称
+ 获取或设置对 double 属性的Sub
+
+
+
+ 行接口 包含多个子类的接口 继承自子类接口
+
+
+
+
+ 通过名字和信息创建新的Line
+
+ 名称
+ 信息 (正常)
+ 文本 在末尾没有结束行号的文本 (正常)
+ 子类集合
+
+
+
+ 将其他Line内容拷贝到本Line
+
+ 其他line
+
+
+
+ 文本 在末尾没有结束行号的文本 (去除关键字的文本)
+
+
+
+
+ 文本 在末尾没有结束行号的文本 (正常)
+
+
+
+
+ 注释 ///为注释
+
+
+
+
+ 文本 (int)
+
+
+
+
+ 文本 (int64)
+
+
+
+
+ 文本 (double)
+
+
+
+
+ 退回Text的反转义文本 (正常显示)
+
+ Text的反转义文本 (正常显示)
+
+
+
+ 将指定的Sub添加到Subs列表的末尾
+
+ 要添加的Sub
+
+
+
+ 若无相同名称(Name)的Sub,则将指定的Sub添加到Subs列表的末尾
+ 若有,则替换成要添加的Sub
+
+ 要添加的Sub
+
+
+
+ 将指定Sub的元素添加到Subs的末尾
+
+ 要添加的多个Sub
+
+
+
+ 将指定的Sub添加到指定索引处
+
+ 应插入 Sub 的从零开始的索引
+ 要添加的Sub
+
+
+
+ 将指定Sub的元素添加指定索引处
+
+ 应插入 Sub 的从零开始的索引
+ 要添加的多个Sub
+
+
+
+ 从Subs中移除特定名称的第一个匹配项
+
+ 要从Subs中删除的Sub的名称
+ 如果成功移除了Sub,则为 true; 否则为 false
+
+
+
+ 从Subs中移除特定名称的所有元素
+
+ 要从Subs中删除的Sub的名称
+
+
+
+ 返回一个值,确定某Sub是否在Line集合中
+
+ 要在Line集合中定位的Sub的名字
+ 如果在Line集合中找到符合的名字,则为True; 否则为false
+
+
+
+ 匹配拥有相同名称的Line或sub的所有元素
+
+ 用于定义匹配的名称
+ 如果找到相同名称的sub,其中所有元素均与指定谓词定义的条件匹配,则为该数组; 否则为一个空的Array
+
+
+
+ 匹配拥有相同名称和信息的Line或sub的所有元素
+
+ 用于定义匹配的名称
+ 用于定义匹配的信息 (去除关键字的文本)
+ 如果找到相同名称和信息的sub,其中所有元素均与指定谓词定义的条件匹配,则为该数组; 否则为一个空的Array
+
+
+
+ 匹配拥有相同信息的Line或sub的所有元素
+
+ 用于定义匹配的信息 (去除关键字的文本)
+ 如果找到相同信息的sub,其中所有元素均与指定谓词定义的条件匹配,则为该数组; 否则为一个空的Array
+
+
+
+ 搜索与指定名称,并返回Line或整个Subs中的第一个匹配元素
+
+ 用于定义匹配的名称
+ 如果找到相同名称的第一个sub,则为该sub; 否则为null
+
+
+
+ 搜索与指定名称,并返回整个Assemblage中的第一个匹配元素
+
+ 用于定义匹配的名称
+ 用于定义匹配的信息 (去除关键字的文本)
+ 如果找到相同名称和信息的第一个Line,则为该Line; 否则为null
+
+
+
+ 搜索与指定信息,并返回整个Assemblage中的第一个匹配元素
+
+ 用于定义匹配的信息 (去除关键字的文本)
+ 如果找到相同信息的第一个Line,则为该Line; 否则为null
+
+
+
+ 搜索与指定名称,并返回Line或整个Subs中的第一个匹配元素;若未找到,则新建并添加相同名称的Sub,并且返回这个Sub
+
+ 用于定义匹配的名称
+ 如果找到相同名称的第一个sub,则为该sub; 否则为新建的相同名称sub
+
+
+
+ 搜索全部相似名称的Sub的所有元素
+
+ %字段%
+ 如果找到相似名称的Sub,则为数组; 否则为一个空的Array
+
+
+
+ 搜索字段是否出现在Line名称,并返回整个Subs中的第一个匹配元素
+
+ %字段%
+ 如果找到相似名称的第一个Sub,则为该Sub; 否则为null
+
+
+
+ 搜索相同名称的Sub,并返回整个Subs中第一个匹配的sub从零开始的索引
+
+ 用于定义匹配的名称
+ 如果找到相同名称的sub的第一个元素,则为该元素的从零开始的索引; 否则为 -1
+
+
+
+ 搜索相同名称的Sub,并返回整个Sub中全部匹配的sub从零开始的索引
+
+ 用于定义匹配的名称
+ 如果找到相同名称的sub的元素,则为该元素的从零开始的索引组; 否则为空的Array
+
+
+
+ 将当前Line转换成文本格式 (info已经被转义/去除关键字)
+
+ Line的文本格式 (info已经被转义/去除关键字)
+
+
+
+ 将当前Line转换成文本格式 (info已经被转义/去除关键字) 将输出储存到StringBuilder
+
+ 储存到的 StringBuilder
+ Line的文本格式 (info已经被转义/去除关键字)
+
+
+
+ 返回一个 Subs 的第一个元素。
+
+ 要返回的第一个元素
+
+
+
+ 返回一个 Subs 的最后一个元素。
+
+ 要返回的最后一个元素
+
+
+
+ 返回一个新List,包含所有Subs
+
+ 所有储存的Subs
+
+
+
+ LPS接口
+
+ Line类型
+ Sub类型
+ 值类型
+
+
+
+ 返回一个新List,包含所有Line
+
+ 所有储存的Line
+
+
+
+ 将指定的Line添加到Assemblage列表的末尾
+
+ 要添加的Line
+
+
+
+ 若无相同名称(Name)的Line,则将指定的Line添加到Assemblage列表的末尾
+ 若有,则替换成要添加的Line
+
+ 要添加的Line
+
+
+
+ 将指定Line的元素添加到Assemblage的末尾
+
+ 要添加的多个Line
+
+
+
+ 将指定Line的元素添加到Assemblage的末尾
+
+ 要添加的多个Line
+
+
+
+ 将指定的Line添加到指定索引处
+
+ 应插入 Line 的从零开始的索引
+ 要添加的Line
+
+
+
+ 将指定Line的元素添加指定索引处
+
+ 应插入 Line 的从零开始的索引
+ 要添加的多个Line
+
+
+
+ 将指定Line的元素添加指定索引处
+
+ 应插入 Line 的从零开始的索引
+ 要添加的多个Line
+
+
+
+ 从Assemblage中移除特定名称的第一个匹配项
+
+ 要从Assemblage中删除的Line的名称
+ 如果成功移除了line,则为 true; 否则为 false
+
+
+
+ 从Assemblage中移除移除与条件相匹配的所有Line
+
+ 要从Assemblage中删除的Line
+
+
+
+ 从Assemblage中移除移除与名称相匹配的所有Line
+
+ 要从Assemblage中删除的Line的名称
+
+
+
+ 确定某Sub是否在Assemblage中
+
+ 要在Assemblage中定位的Sub
+ 如果在Assemblage中找到line,则为True; 否则为false
+
+
+
+ 确定某Line(名字定位)是否在Assemblage中
+
+ Line的名字
+ 如果在Assemblage中找到相同的名字,则为True; 否则为false
+
+
+
+ 确定某sub(名字定位)是否在Assemblage中
+
+ sub的名字
+ 如果在Assemblage的sub中找到相同的名字,则为True; 否则为false
+
+
+
+ 匹配拥有相同名称的Line的所有元素
+
+ 用于定义匹配的名称
+ 如果找到相同名称的Line,其中所有元素均与指定谓词定义的条件匹配,则为该数组; 否则为一个空的Array
+
+
+
+ 匹配拥有相同名称和信息的Line的所有元素
+
+ 用于定义匹配的名称
+ 用于定义匹配的信息 (去除关键字的文本)
+ 如果找到相同名称和信息的Line,其中所有元素均与指定谓词定义的条件匹配,则为该数组; 否则为一个空的Array
+
+
+
+ 匹配拥有相同信息的Line的所有元素
+
+ 用于定义匹配的信息 (去除关键字的文本)
+ 如果找到相同信息的Line,其中所有元素均与指定谓词定义的条件匹配,则为该数组; 否则为一个空的Array
+
+
+
+ 搜索与指定名称,并返回整个Assemblage中的第一个匹配元素
+
+ 用于定义匹配的名称
+ 如果找到相同名称的第一个Line,则为该Line; 否则为null
+
+
+
+ 搜索与指定名称和信息,并返回整个Assemblage中的第一个匹配元素
+
+ 用于定义匹配的名称
+ 用于定义匹配的信息 (去除关键字的文本)
+ 如果找到相同名称和信息的第一个Line,则为该Line; 否则为null
+
+
+
+ 搜索与指定信息,并返回整个Assemblage中的第一个匹配元素
+
+ 用于定义匹配的信息 (去除关键字的文本)
+ 如果找到相同信息的第一个Line,则为该Line; 否则为null
+
+
+
+ 搜索与指定名称,并返回整个Assemblage中的第一个匹配元素; 若未找到,则新建并添加相同名称的Line,并且返回这个Line
+
+ 用于定义匹配的名称
+ 如果找到相同名称的第一个Line,则为该Line; 否则为新建的相同名称Line
+
+
+
+ 匹配拥有相同名称的Sub的所有元素
+
+ 用于定义匹配的名称
+ 如果找到相同名称的Sub,其中所有元素均与指定谓词定义的条件匹配,则为该数组; 否则为一个空的Array
+
+
+
+ 匹配拥有相同名称和信息的Sub的所有元素
+
+ 用于定义匹配的名称
+ 用于定义匹配的信息 (去除关键字的文本)
+ 如果找到相同名称和信息的Sub,其中所有元素均与指定谓词定义的条件匹配,则为该数组; 否则为一个空的Array
+
+
+
+ 匹配拥有相同信息的Sub的所有元素
+
+ 用于定义匹配的信息 (去除关键字的文本)
+ 如果找到相同信息的Sub,其中所有元素均与指定谓词定义的条件匹配,则为该数组; 否则为一个空的Array
+
+
+
+ 搜索与指定名称,并返回整个Assemblage中的第一个匹配元素
+
+ 用于定义匹配的名称
+ 如果找到相同名称的第一个Sub,则为该Line; 否则为null
+
+
+
+ 搜索与指定名称和信息,并返回整个Assemblage中的第一个匹配元素
+
+ 用于定义匹配的名称
+ 用于定义匹配的信息 (去除关键字的文本)
+ 如果找到相同名称和信息的第一个Sub,则为该Line; 否则为null
+
+
+
+ 搜索与指定信息,并返回整个Assemblage中的第一个匹配元素
+
+ 用于定义匹配的信息 (去除关键字的文本)
+ 如果找到相同信息的第一个Sub,则为该Line; 否则为null
+
+
+
+ 搜索全部相似名称的Line的所有元素
+
+ %字段%
+ 如果找到相似名称的Line,则为数组; 否则为一个空的Array
+
+
+
+ 搜索字段是否出现在Line名称,并返回整个Assemblage中的第一个匹配元素
+
+ %字段%
+ 如果找到相似名称的第一个Line,则为该Line; 否则为null
+
+
+
+ 搜索全部相似名称的Sub的所有元素
+
+ %字段%
+ 如果找到相似名称的Line,则为该数组; 否则为一个空的Array
+
+
+
+ 搜索字段是否出现在Sub名称,并返回整个Assemblage中的第一个匹配元素
+
+ %字段%
+ 如果找到相同名称的第一个Sub,则为该Sub; 否则为null
+
+
+
+ 搜索相同名称的Line,并返回整个Assemblage中第一个匹配的Line从零开始的索引
+
+ 用于定义匹配的名称
+ 如果找到相同名称的Line的第一个元素,则为该元素的从零开始的索引; 否则为 -1
+
+
+
+ 搜索相同名称的Line,并返回整个Assemblage中全部匹配的Line从零开始的索引
+
+ 用于定义匹配的名称
+ 如果找到相同名称的Line的元素,则为该元素的从零开始的索引组; 否则为空的Array
+
+
+
+ 从指定的字符串加载LPS文档
+
+ 包含要加载的LPS文档的字符串
+
+
+
+ 返回一个Assemblage的第一个元素。
+
+ 要返回的第一个元素
+
+
+
+ 返回一个Assemblage的最后一个元素。
+
+ 要返回的最后一个元素
+
+
+
+ 获得该LPS文档的长哈希代码
+
+ 64位哈希代码
+
+
+
+ 获得该LPS文档的哈希代码
+
+ 32位哈希代码
+
+
+
+ 任何类型的值均可储存的接口
+
+
+
+
+ 储存的数据
+
+
+
+
+ 转换成为储存String类型
+
+
+
+
+ 转换成 String 类型
+
+
+
+
+ 转换成 long 类型
+
+
+
+
+ 转换成 int 类型
+
+
+
+
+ 转换成 double 类型
+
+
+
+
+ 转换成 double(int64) 类型
+
+
+
+
+ 转换成 DateTime 类型
+
+
+
+
+ 转换成 bool 类型
+
+
+
+
+ 设置 string 值
+
+
+
+
+ 设置 int 值
+
+
+
+
+ 设置 long 值
+
+
+
+
+ 设置 double 值
+
+
+
+
+ 设置 float 值
+
+
+
+
+ 设置 DateTime 值
+
+
+
+
+ 设置 bool 值
+
+
+
+
+ 子类接口 LinePutScript最基础的类的最基础的接口
+
+
+
+
+ 加载 通过lps文本创建一个子类
+
+ lps文本
+
+
+
+ 加载 通过名字和信息创建新的Sub
+
+ 名称
+ 信息 (正常版本)
+
+
+
+ 将其他Sub内容拷贝到本Sub
+
+ 其他Sub
+
+
+
+ 名称 没有唯一性
+
+
+
+
+ 信息 (去除关键字的文本)
+
+
+
+
+ 信息 (正常)
+
+
+
+
+ 信息 (int)
+
+
+
+
+ 信息 (int64)
+
+
+
+
+ 信息 (double)
+
+
+
+
+ 返回一个 Info集合 的第一个string。
+
+ 要返回的第一个string
+
+
+
+ 返回一个 Info集合 的最后一个string。
+
+ 要返回的最后一个string
+
+
+
+ 退回Info的反转义文本 (正常显示)
+
+ info的反转义文本 (正常显示)
+
+
+
+ 退回Info集合的转义文本集合 (正常显示)
+
+ info的转义文本集合 (正常显示)
+
+
+
+ 将当前Sub转换成文本格式 (info已经被转义/去除关键字)
+
+ Sub的文本格式 (info已经被转义/去除关键字)
+
+
+
+ 获得该Sub的哈希代码
+
+ 32位哈希代码
+
+
+
+ 获得该Sub的长哈希代码
+
+ 64位哈希代码
+
+
+
+ 行 包含多个子类 继承自子类
+
+
+
+
+ 创建一行
+
+
+
+
+ 通过lpsLine文本创建一行
+
+ lpsSub文本
+
+
+
+ 通过名字和信息创建新的Line
+
+ 名称
+ 信息 (正常)
+ 文本 在末尾没有结束行号的文本 (正常)
+ 子类集合
+
+
+
+ 通过其他Line创建新的Line
+
+ 其他line
+
+
+
+ 克隆一个Line
+
+ 相同的Line
+
+
+
+ 返回一个新List,包含所有Subs
+
+ 所有储存的Subs
+
+
+
+ 文件 包括文件读写等一系列操作
+
+
+
+
+ 创建一个 LpsDocument
+
+
+
+
+ 从指定的字符串创建 LpsDocument
+
+ 包含要加载的LPS文档的字符串
+
+
+
+ 当前Line读取进度
+
+
+
+
+ 读取读取进度当前Line 并且自动切换到下一Line
+
+ 如何有则返回当前Line,如果没有则返回null
+
+
+
+ 获取读取进度当前Line
+
+ 如何有则返回当前Line,如果没有则返回null
+
+
+
+ 将指定的Line添加到当前读取进度之后
+
+ 要添加的Line
+
+
+
+ 新建的Line添加到当前读取进度之后
+
+ 要添加的行名称
+ 行信息
+ 行文本
+ 行子类
+
+
+
+ 将指定的Sub添加到当前读取进度Line中
+
+ 要添加的子类
+
+
+
+ 将指定的Sub添加到当前读取进度Line中
+
+ 要添加的行名称
+ 要添加的行信息
+
+
+
+ 将读取进度设置为0
+
+
+
+
+ 将读取进度设置为上限 即最后一行
+
+
+
+
+ 判断是否能够继续读取数据
+
+ 如果还有下一行,返回True,否则False
+
+
+
+ Set Object 可以储存任何类型的值 对性能进行优化
+
+
+
+
+ 储存Object的类型
+
+
+
+
+ 字符串
+
+
+
+
+ 布尔值
+
+
+
+
+ 整数
+
+
+
+
+ 整数64位
+
+
+
+
+ 浮点数
+
+
+
+
+ 浮点数(long)
+
+
+
+
+ 时间
+
+
+
+
+ 类型
+
+
+
+
+ 储存的数据
+
+
+
+
+ 新建 SetObject: string
+
+
+
+
+ 新建 SetObject: string
+
+ 值
+
+
+
+ 新建 SetObject: long
+
+ 值
+
+
+
+ 新建 SetObject: int
+
+ 值
+
+
+
+ 新建 SetObject: double
+
+ 值
+
+
+
+ 新建 SetObject: String
+
+ 值
+
+
+
+ 新建 SetObject: DateTime
+
+ 值
+
+
+
+ 新建 SetObject: bool
+
+ 值
+
+
+
+ 转换成为储存String类型
+
+
+
+
+ 转换成 String 类型
+
+
+
+
+ 转换成 long 类型
+
+
+
+
+ 转换成 int 类型
+
+
+
+
+ 转换成 double 类型
+
+
+
+
+ 转换成 double(int64) 类型
+
+
+
+
+ 转换成 DateTime 类型
+
+
+
+
+ 转换成 bool 类型
+
+
+
+
+ 设置 string 值
+
+
+
+
+ 设置 int 值
+
+
+
+
+ 设置 long 值
+
+
+
+
+ 设置 double 值
+
+
+
+
+ 设置 float 值
+
+
+
+
+ 设置 DateTime 值
+
+
+
+
+ 设置 bool 值
+
+
+
+
+ 转换 String 为 SetObject
+
+
+
+
+ 转换 SetObject 为 String
+
+
+
+
+ 转换 int 为 SetObject
+
+
+
+
+ 转换 SetObject 为 int
+
+
+
+
+ 转换 long 为 SetObject
+
+
+
+
+ 转换 SetObject 为 long
+
+
+
+
+ 转换 double 为 SetObject
+
+
+
+
+ 转换 SetObject 为 double
+
+
+
+
+ 转换 bool 为 SetObject
+
+
+
+
+ 转换 SetObject 为 bool
+
+
+
+
+ 转换 DateTime 为 SetObject
+
+
+
+
+ 转换 SetObject 为 DateTime
+
+
+
+
+ 比较两个 SetObject 对象差距
+
+
+
+
+ 比较两个 SetObject 对象差距
+
+
+
+
+ 判断是否相等
+
+ 其他参数
+
+
+
+
+ 比较两个 SetObject 对象是否相等
+
+
+
+
+ 比较两个 SetObject 对象是否相等
+
+
+
+
+ 克隆新的 SetObject
+
+
+
+
+
+ 比较 SetObject 和 string 是否相等
+
+
+
+
+ 比较 SetObject 和 long 是否相等
+
+
+
+
+ 比较 SetObject 和 int 是否相等
+
+
+
+
+ 比较 SetObject 和 double 是否相等
+
+
+
+
+ 比较 SetObject 和 DateTime 是否相等
+
+
+
+
+ 比较 SetObject 和 bool 是否相等
+
+
+
+
+ 获取 SetObject 的 HashCode
+
+
+
+
+
+ 转换成文本形式
+
+
+
+
+ String 结构 通过String实时修改具体参数,为LineputScript提供第四层结构
+
+
+
+
+ 是否为单线程
+
+
+
+
+ 生成可以修改的String结构
+
+ 设置String方法 (非转义)
+ 获取String方法 (非转义)
+ 是否为单线程,如果为单线程,将会缓存数据列表,设置为true将会提高读取效率
+
+
+
+ 获取相关项目String
+
+ 项目名称
+ 默认值
+ 如果找到项目则返回值;否则为返回默认值
+
+
+
+ 设置相关项目String
+
+ 项目名称
+ 设置项目的String值
+
+
+
+ 获取相关项目String 如果为空则退回""
+
+
+
+
+ 获得bool属性的项目
+
+ 项目名称
+ 如果没找到返回的默认值
+ 如果找到项目则返回项目中的值,若未找到则返回默认值
+
+
+
+ 获得bool属性的项目
+
+ 项目名称
+ 如果找到项目则返回项目中的值,若未找到则返回false
+
+
+
+ 设置bool属性的项目
+
+ 项目名称
+
+ 如果为ture,则在没有相同name为key的sub时候添加新的sub
+ 如果为false,则删除所有name为key的sub
+
+
+
+
+ 获得int属性的项目
+
+ 项目名称
+ 如果没找到返回的默认值
+
+ 如果找到项目则返回项目中储存的int值
+ 如果没找到,则返回默认值
+
+
+
+
+ 设置int属性的项目
+
+ 项目名称
+ 设置项目的int值
+
+
+
+ 获得long属性的项目
+
+ 项目名称
+ 如果没找到返回的默认值
+
+ 如果找到项目则返回项目中储存的long值
+ 如果没找到,则返回默认值
+
+
+
+
+ 设置long属性的项目
+
+ 项目名称
+ 设置项目的long值
+
+
+
+ 获得double(long)属性的项目 通过转换long获得更精确的小数,小数位最大保留9位
+
+ 项目名称
+ 如果没找到返回的默认值
+
+ 如果找到项目则返回项目中储存的double(long)值
+ 如果没找到,则返回默认值
+
+
+
+
+ 设置double(long)属性的项目 通过转换long获得更精确的小数,小数位最大保留9位
+
+ 项目名称
+ 设置项目的double(long)值
+
+
+
+ 获得DateTime属性的项目
+
+ 项目名称
+ 如果没找到返回的默认值
+
+ 如果找到项目则返回项目中储存的DateTime值
+ 如果没找到,则返回默认值
+
+
+
+
+ 设置DateTime属性的项目
+
+ 项目名称
+ 设置项目的DateTime值
+
+
+
+ 获得double属性的项目
+
+ 项目名称
+ 如果没找到返回的默认值
+
+ 如果找到项目则返回项目中储存的double值
+ 如果没找到,则返回默认值
+
+
+
+
+ 设置double属性的项目
+
+ 项目名称
+ 设置项目的double值
+
+
+
+ 获取或设置 String 属性的项目
+
+ (gstr)项目名称
+ 获取或设置对 String 属性的项目
+
+
+
+ 获取或设置 Bool 属性的项目
+
+ (gbol)项目名称
+ 获取或设置对 bool 属性的项目
+
+
+
+ 获取或设置 Int 属性的项目
+
+ (gint)项目名称
+ 获取或设置对 int 属性的项目
+
+
+
+ 获取或设置 Long 属性的项目
+
+ (gi64)项目名称
+ 获取或设置对 long 属性的项目
+
+
+
+ 获取或设置 Double 属性的项目
+
+ (gdbe)项目名称
+ 获取或设置对 double 属性的项目
+
+
+
+ 获取或设置 Double(long) 属性的项目 通过转换long获得更精确的小数,小数位最大保留9位
+
+ (gflt)项目名称
+ 获取或设置对 double 属性的项目
+
+
+
+ 获取或设置 DateTime 属性的项目
+
+ (gdbe)项目名称
+ 获取或设置对 double 属性的项目
+
+
+
+ 获取Key集合
+
+
+
+
+ 获取Values集合(原始值)
+
+
+
+
+ 获取集合大小
+
+
+
+
+ IDictionary
+
+
+
+
+ IDictionary
+
+
+
+
+ IDictionary
+
+
+
+
+ IDictionary
+
+
+
+
+ 是否包含指定的键
+
+ 键
+ true为包含,false为不包含
+
+
+
+ 设置相关项目String
+
+ 项目名称
+ 设置项目的String值
+
+
+
+ 从项目列表中删除指定的键
+
+ 项目名称
+ 是否删除成功
+
+
+
+ 设置相关项目String
+
+ 配对(原始值)
+
+
+
+ 移除所有项目
+
+
+
+
+ 查看是否包含特定的配对
+
+ 配对(原始值)
+
+
+
+
+ 从引索开始复制匹配
+
+ 配对列表(原始值)
+ 引索
+
+
+
+ 移除第一个匹配的配对
+
+ 配对
+ 是否删除成功
+
+
+
+ 获取迭代(原始值)
+
+ 迭代器
+
+
+
+ 判断是否相等
+
+ 其他String
+ 如果相等则为0
+
+
+
+ 获取迭代(原始值)
+
+ 迭代器
+
+
+
+ 判断是否相等
+
+ 其他StringStructure
+ 如果相等则为0
+
+
+
+ 获取相关项目String
+
+ 项目名称
+ 如果找到项目则返回值(原始值)
+
+
+
+ 子类 LinePutScript最基础的类
+
+
+
+
+ 创建一个子类
+
+
+
+
+ 通过lpsSub文本创建一个子类
+
+ lpsSub文本
+
+
+
+ 加载 通过lps文本创建一个子类
+
+ lps文本
+
+
+
+ 通过名字和信息创建新的Sub
+
+ 名称
+ 信息 (正常版本)
+
+
+
+ 通过名字和信息创建新的Sub
+
+ 名称
+ 信息 (正常版本)
+
+
+
+ 通过名字和信息创建新的Sub
+
+ 名称
+ 多个信息 (正常版本)
+
+
+
+ 通过Sub创建新的Sub
+
+ 其他Sub
+
+
+
+ 将其他Sub内容拷贝到本Sub
+
+ 其他Sub
+
+
+
+ 名称 没有唯一性
+
+
+
+
+ ID 根据Name生成 没有唯一性
+
+
+
+
+ 信息 (去除关键字的文本)
+
+
+
+
+ 信息 (正常)
+
+
+
+
+ 获得Info的String结构
+
+
+
+
+ 信息 (int)
+
+
+
+
+ 信息 (int64)
+
+
+
+
+ 信息 (double)
+
+
+
+
+ 返回循环访问 Info集合 的枚举数。
+
+ 用于 Info集合 的枚举数
+
+
+
+ 返回一个 Info集合 的第一个string。
+
+ 要返回的第一个string
+
+
+
+ 返回一个 Info集合 的最后一个string。
+
+ 要返回的最后一个string
+
+
+
+ 退回Info的反转义文本 (正常显示)
+
+ info的反转义文本 (正常显示)
+
+
+
+ 退回Info集合的转义文本集合 (正常显示)
+
+ info的转义文本集合 (正常显示)
+
+
+
+ 将当前Sub转换成文本格式 (info已经被转义/去除关键字)
+
+ Sub的文本格式 (info已经被转义/去除关键字)
+
+
+
+ 获得该Sub的哈希代码
+
+ 32位哈希代码
+
+
+
+ 获得该Sub的长哈希代码
+
+ 64位哈希代码
+
+
+
+ 确认对象是否等于当前对象
+
+ Subs
+
+
+
+
+ 将当前sub与另一个sub进行比较,并退回一个整数指示在排序位置中是位于另一个对象之前之后还是相同位置
+
+ 另一个sub
+ 值小于零时排在 other 之前 值等于零时出现在相同排序位置 值大于零则排在 other 之后
+
+
+
+ 克隆一个Sub
+
+ 相同的sub
+
+
+
+ 行 包含多个子类 继承自子类
+
+
+
+
+ 创建一行
+
+
+
+
+ 通过lpsLine文本创建一行
+
+ lpsSub文本
+
+
+
+ 加载 通过lps文本创建一个子类
+
+ lps文本
+
+
+
+ 通过名字和信息创建新的Line
+
+ 名称
+ 信息 (正常)
+ 文本 在末尾没有结束行号的文本 (正常)
+ 子类集合
+
+
+
+ 通过名字和信息创建新的Line
+
+ 名称
+ 信息 (正常)
+ 文本 在末尾没有结束行号的文本 (正常)
+ 子类集合
+
+
+
+ 通过其他Line创建新的Line
+
+ 其他line
+
+
+
+ 将其他Line内容拷贝到本Line
+
+ 其他line
+
+
+
+ 文本 在末尾没有结束行号的文本 (去除关键字的文本)
+
+
+
+
+ 文本 在末尾没有结束行号的文本 (正常)
+
+
+
+
+ 获得Text的String结构
+
+
+
+
+ 注释 ///为注释
+
+
+
+
+ 文本 (int)
+
+
+
+
+ 文本 (int64)
+
+
+
+
+ 文本 (double)
+
+
+
+
+ 退回Text的反转义文本 (正常显示)
+
+ Text的反转义文本 (正常显示)
+
+
+
+ 子项目
+
+
+
+
+ 将指定的Sub添加到Subs列表的末尾
+
+ 要添加的Sub
+
+
+
+ 若无相同名称(Name)的Sub,则将指定的Sub添加到Subs列表的末尾
+ 若有,则替换成要添加的Sub
+
+ 要添加的Sub
+
+
+
+ 将指定Sub的元素添加到Subs的末尾
+
+ 要添加的多个Sub
+
+
+
+ 将指定的Sub添加到指定索引处
+
+ 应插入 Sub 的从零开始的索引
+ 要添加的Sub
+
+
+
+ 将指定Sub的元素添加指定索引处
+
+ 应插入 Sub 的从零开始的索引
+ 要添加的多个Sub
+
+
+
+ 从Subs中移除特定对象的第一个匹配项
+
+ 要从Subs中删除的Sub
+ 如果成功移除了Sub,则为 true; 否则为 false
+
+
+
+ 从Subs中移除特定名称的第一个匹配项
+
+ 要从Subs中删除的Sub的名称
+ 如果成功移除了Sub,则为 true; 否则为 false
+
+
+
+ 从Subs中移除特定名称的所有元素
+
+ 要从Subs中删除的Sub的名称
+
+
+
+ 确定某Sub是否在Line集合中
+
+ 要在Line集合中定位的Sub
+ 如果在Line集合中找到sub,则为True; 否则为false
+
+
+
+ 返回一个值,确定某Sub是否在Line集合中
+
+ 要在Line集合中定位的Sub的名字
+ 如果在Line集合中找到符合的名字,则为True; 否则为false
+
+
+
+ 匹配拥有相同名称的Line或sub的所有元素
+
+ 用于定义匹配的名称
+ 如果找到相同名称的sub,其中所有元素均与指定谓词定义的条件匹配,则为该数组; 否则为一个空的Array
+
+
+
+ 匹配拥有相同名称和信息的Line或sub的所有元素
+
+ 用于定义匹配的名称
+ 用于定义匹配的信息 (去除关键字的文本)
+ 如果找到相同名称和信息的sub,其中所有元素均与指定谓词定义的条件匹配,则为该数组; 否则为一个空的Array
+
+
+
+ 匹配拥有相同信息的Line或sub的所有元素
+
+ 用于定义匹配的信息 (去除关键字的文本)
+ 如果找到相同信息的sub,其中所有元素均与指定谓词定义的条件匹配,则为该数组; 否则为一个空的Array
+
+
+
+ 搜索与指定名称,并返回Line或整个Subs中的第一个匹配元素
+
+ 用于定义匹配的名称
+ 如果找到相同名称的第一个sub,则为该sub; 否则为null
+
+
+
+ 搜索与指定名称,并返回整个Assemblage中的第一个匹配元素
+
+ 用于定义匹配的名称
+ 用于定义匹配的信息 (去除关键字的文本)
+ 如果找到相同名称和信息的第一个Line,则为该Line; 否则为null
+
+
+
+ 搜索与指定信息,并返回整个Assemblage中的第一个匹配元素
+
+ 用于定义匹配的信息 (去除关键字的文本)
+ 如果找到相同信息的第一个Line,则为该Line; 否则为null
+
+
+
+ 搜索与指定名称,并返回Line或整个Subs中的第一个匹配元素;若未找到,则新建并添加相同名称的Sub,并且返回这个Sub
+
+ 用于定义匹配的名称
+ 如果找到相同名称的第一个sub,则为该sub; 否则为新建的相同名称sub
+
+
+
+ 搜索全部相似名称的Sub的所有元素
+
+ %字段%
+ 如果找到相似名称的Sub,则为数组; 否则为一个空的Array
+
+
+
+ 搜索字段是否出现在Line名称,并返回整个Subs中的第一个匹配元素
+
+ %字段%
+ 如果找到相似名称的第一个Sub,则为该Sub; 否则为null
+
+
+
+ 搜索相同名称的Sub,并返回整个Subs中第一个匹配的sub从零开始的索引
+
+ 用于定义匹配的名称
+ 如果找到相同名称的sub的第一个元素,则为该元素的从零开始的索引; 否则为 -1
+
+
+
+ 搜索相同名称的Sub,并返回整个Sub中全部匹配的sub从零开始的索引
+
+ 用于定义匹配的名称
+ 如果找到相同名称的sub的元素,则为该元素的从零开始的索引组; 否则为空的Array
+
+
+
+ 将当前Line转换成文本格式 (info已经被转义/去除关键字)
+
+ Line的文本格式 (info已经被转义/去除关键字)
+
+
+
+ 将当前Line转换成文本格式 (info已经被转义/去除关键字) 将输出储存到StringBuilder
+
+ 储存到的 StringBuilder
+ Line的文本格式 (info已经被转义/去除关键字)
+
+
+
+ 获得该Line的长哈希代码
+
+ 64位哈希代码
+
+
+
+ 获得该Line的哈希代码
+
+ 32位哈希代码
+
+
+
+ 确认对象是否等于当前对象
+
+ Subs
+
+
+
+
+ 返回循环访问 Subs 的枚举数。
+
+ 用于 Subs 的枚举数
+
+
+
+ 返回一个 Subs 的第一个元素。
+
+ 要返回的第一个元素
+
+
+
+ 返回一个 Subs 的最后一个元素。
+
+ 要返回的最后一个元素
+
+
+
+ 搜索与指定名称,并返回Line或整个Subs中的第一个匹配元素;若未找到,则新建并添加相同名称的Sub,并且返回这个Sub
+
+ 用于定义匹配的名称
+ 如果找到相同名称的第一个sub,则为该sub; 否则为新建的相同名称sub
+
+
+
+ 获得bool属性的sub
+
+ 用于定义匹配的名称
+ 如果找到相同名称的sub,则为True; 否则为false
+
+
+
+ 设置bool属性的sub
+
+ 用于定义匹配的名称
+
+ 值
+
+
+
+
+ 获得int属性的sub
+
+ 用于定义匹配的名称
+ 如果没找到返回的默认值
+
+ 如果找到相同名称的sub,返回sub中储存的int值
+ 如果没找到,则返回默认值
+
+
+
+
+ 设置int属性的sub
+
+ 用于定义匹配的名称
+ 储存进sub的int值
+
+
+
+ 获得long属性的sub
+
+ 用于定义匹配的名称
+ 如果没找到返回的默认值
+
+ 如果找到相同名称的sub,返回sub中储存的long值
+ 如果没找到,则返回默认值
+
+
+
+
+ 设置long属性的sub
+
+ 用于定义匹配的名称
+ 储存进sub的long值
+
+
+
+ 获得double(long)属性的sub 通过转换long获得更精确的小数,小数位最大保留9位
+
+ 用于定义匹配的名称
+ 如果没找到返回的默认值
+
+ 如果找到相同名称的sub,返回sub中储存的double(long)值
+ 如果没找到,则返回默认值
+
+
+
+
+ 设置double(long)属性的sub 通过转换long获得更精确的小数,小数位最大保留9位
+
+ 用于定义匹配的名称
+ 储存进sub的double(long)值
+
+
+
+ 获得DateTime属性的sub
+
+ 用于定义匹配的名称
+ 如果没找到返回的默认值
+
+ 如果找到相同名称的sub,返回sub中储存的DateTime值
+ 如果没找到,则返回默认值
+
+
+
+
+ 设置DateTime属性的sub
+
+ 用于定义匹配的名称
+ 储存进sub的DateTime值
+
+
+
+ 获得String属性的sub
+
+ 用于定义匹配的名称
+ 如果没找到返回的默认值
+
+ 如果找到相同名称的sub,返回sub中储存的String值
+ 如果没找到,则返回默认值
+
+
+
+
+ 设置String属性的sub
+
+ 用于定义匹配的名称
+ 储存进sub的String值
+
+
+
+ 获得double属性的sub
+
+ 用于定义匹配的名称
+ 如果没找到返回的默认值
+
+ 如果找到相同名称的sub,返回sub中储存的double值
+ 如果没找到,则返回默认值
+
+
+
+
+ 设置double属性的sub
+
+ 用于定义匹配的名称
+ 储存进sub的double值
+
+
+
+ 获取或设置 String 属性的sub
+
+ (gstr)用于定义匹配的名称
+ 获取或设置对 String 属性的Sub
+
+
+
+ 获取或设置 Bool 属性的sub
+
+ (gbol)用于定义匹配的名称
+ 获取或设置对 bool 属性的Sub
+
+
+
+ 获取或设置 Int 属性的sub
+
+ (gint)用于定义匹配的名称
+ 获取或设置对 int 属性的Sub
+
+
+
+ 获取或设置 Long 属性的sub
+
+ (gi64)用于定义匹配的名称
+ 获取或设置对 long 属性的Sub
+
+
+
+ 获取或设置 Double 属性的sub
+
+ (gdbe)用于定义匹配的名称
+ 获取或设置对 double 属性的Sub
+
+
+
+ 获取或设置 Double(long) 属性的sub 通过转换long获得更精确的小数,小数位最大保留9位
+
+ (gflt)用于定义匹配的名称
+ 获取或设置对 double 属性的Sub
+
+
+
+ 获取或设置 DateTime 属性的sub
+
+ (gdbe)用于定义匹配的名称
+ 获取或设置对 double 属性的Sub
+
+
+
+ 获取Sub数量
+
+
+
+
+ 是否只读
+
+
+
+
+ 通过引索修改Line中Sub内容
+
+ 要获得或设置的引索
+ 引索指定的Sub
+
+
+
+ 搜索相同名称的Sub,并返回整个Subs中第一个匹配的Sub从零开始的索引
+
+ 用于定义匹配的Sub
+ 如果找到相同名称的Sub的第一个元素,则为该元素的从零开始的索引; 否则为 -1
+
+
+
+ 将指定的Sub添加到指定索引处
+
+ 应插入 Sub 的从零开始的索引
+ 要添加的Sub
+
+
+
+ 从Subs中移除特定引索的Sub
+
+ 要删除Sub的引索
+
+
+
+ 将指定的Sub添加到Subs列表的末尾
+
+ 要添加的Sub
+
+
+
+ 移除Line中所有的Sub
+
+
+
+
+ 将整个array复制到Line的Subs
+
+ 复制到Subs的Sub列表
+ 从零开始的引索,从引索处开始复制
+
+
+
+ 将当前line与另一个line进行比较,并退回一个整数指示在排序位置中是位于另一个对象之前之后还是相同位置
+
+ 另一个line
+ 值小于零时排在 other 之前 值等于零时出现在相同排序位置 值大于零则排在 other 之后
+
+
+
+ 克隆一个Line
+
+ 相同的Line
+
+
+
+ 返回一个新List,包含所有Subs
+
+ 所有储存的Subs
+
+
+
+ 文件 包括文件读写等一系列操作
+
+
+
+
+ 集合 全部文件的数据
+
+
+
+
+ 创建一个 LpsDocument
+
+
+
+
+ 从指定的字符串创建 LpsDocument
+
+ 包含要加载的LPS文档的字符串
+
+
+
+ 将指定的Line添加到Assemblage列表的末尾
+
+ 要添加的Line
+
+
+
+ 若无相同名称(Name)的Line,则将指定的Line添加到Assemblage列表的末尾
+ 若有,则替换成要添加的Line
+
+ 要添加的Line
+
+
+
+ 将指定Line的元素添加到Assemblage的末尾
+
+ 要添加的多个Line
+
+
+
+ 将指定Line的元素添加到Assemblage的末尾
+
+ 要添加的多个Line
+
+
+
+ 将指定的Line添加到指定索引处
+
+ 应插入 Line 的从零开始的索引
+ 要添加的Line
+
+
+
+ 将指定Line的元素添加指定索引处
+
+ 应插入 Line 的从零开始的索引
+ 要添加的多个Line
+
+
+
+ 将指定Line的元素添加指定索引处
+
+ 应插入 Line 的从零开始的索引
+ 要添加的多个Line
+
+
+
+ 从Assemblage中移除特定对象的第一个匹配项
+
+ 要从Assemblage中删除的Line的名称
+ 如果成功移除了line,则为 true; 否则为 false
+
+
+
+ 从Assemblage中移除特定名称的第一个匹配项
+
+ 要从Assemblage中删除的Line的名称
+ 如果成功移除了line,则为 true; 否则为 false
+
+
+
+ 从Assemblage中移除移除与条件相匹配的所有Line
+
+ 要从Assemblage中删除的Line
+
+
+
+ 从Assemblage中移除移除与名称相匹配的所有Line
+
+ 要从Assemblage中删除的Line的名称
+
+
+
+ 移除Assemblage的指定索引处的Line
+
+ 要移除的Line的从零开始的索引
+
+
+
+ 确定某Line是否在Assemblage中
+
+ 要在Assemblage中定位的Line
+ 如果在Assemblage中找到line,则为True; 否则为false
+
+
+
+ 确定某Sub是否在Assemblage中
+
+ 要在Assemblage中定位的Sub
+ 如果在Assemblage中找到line,则为True; 否则为false
+
+
+
+ 确定某Line(名字定位)是否在Assemblage中
+
+ Line的名字
+ 如果在Assemblage中找到相同的名字,则为True; 否则为false
+
+
+
+ 确定某sub(名字定位)是否在Assemblage中
+
+ sub的名字
+ 如果在Assemblage的sub中找到相同的名字,则为True; 否则为false
+
+
+
+ 匹配拥有相同名称的Line的所有元素
+
+ 用于定义匹配的名称
+ 如果找到相同名称的Line,其中所有元素均与指定谓词定义的条件匹配,则为该数组; 否则为一个空的Array
+
+
+
+ 匹配拥有相同名称和信息的Line的所有元素
+
+ 用于定义匹配的名称
+ 用于定义匹配的信息 (去除关键字的文本)
+ 如果找到相同名称和信息的Line,其中所有元素均与指定谓词定义的条件匹配,则为该数组; 否则为一个空的Array
+
+
+
+ 匹配拥有相同信息的Line的所有元素
+
+ 用于定义匹配的信息 (去除关键字的文本)
+ 如果找到相同信息的Line,其中所有元素均与指定谓词定义的条件匹配,则为该数组; 否则为一个空的Array
+
+
+
+ 搜索与指定名称,并返回整个Assemblage中的第一个匹配元素
+
+ 用于定义匹配的名称
+ 如果找到相同名称的第一个Line,则为该Line; 否则为null
+
+
+
+ 搜索与指定名称和信息,并返回整个Assemblage中的第一个匹配元素
+
+ 用于定义匹配的名称
+ 用于定义匹配的信息 (去除关键字的文本)
+ 如果找到相同名称和信息的第一个Line,则为该Line; 否则为null
+
+
+
+ 搜索与指定信息,并返回整个Assemblage中的第一个匹配元素
+
+ 用于定义匹配的信息 (去除关键字的文本)
+ 如果找到相同信息的第一个Line,则为该Line; 否则为null
+
+
+
+ 搜索与指定名称,并返回整个Assemblage中的第一个匹配元素; 若未找到,则新建并添加相同名称的Line,并且返回这个Line
+
+ 用于定义匹配的名称
+ 如果找到相同名称的第一个Line,则为该Line; 否则为新建的相同名称Line
+
+
+
+ 匹配拥有相同名称的Sub的所有元素
+
+ 用于定义匹配的名称
+ 如果找到相同名称的Sub,其中所有元素均与指定谓词定义的条件匹配,则为该数组; 否则为一个空的Array
+
+
+
+ 匹配拥有相同名称和信息的Sub的所有元素
+
+ 用于定义匹配的名称
+ 用于定义匹配的信息 (去除关键字的文本)
+ 如果找到相同名称和信息的Sub,其中所有元素均与指定谓词定义的条件匹配,则为该数组; 否则为一个空的Array
+
+
+
+ 匹配拥有相同信息的Sub的所有元素
+
+ 用于定义匹配的信息 (去除关键字的文本)
+ 如果找到相同信息的Sub,其中所有元素均与指定谓词定义的条件匹配,则为该数组; 否则为一个空的Array
+
+
+
+ 搜索与指定名称,并返回整个Assemblage中的第一个匹配元素
+
+ 用于定义匹配的名称
+ 如果找到相同名称的第一个Sub,则为该Line; 否则为null
+
+
+
+ 搜索与指定名称和信息,并返回整个Assemblage中的第一个匹配元素
+
+ 用于定义匹配的名称
+ 用于定义匹配的信息 (去除关键字的文本)
+ 如果找到相同名称和信息的第一个Sub,则为该Line; 否则为null
+
+
+
+ 搜索与指定信息,并返回整个Assemblage中的第一个匹配元素
+
+ 用于定义匹配的信息 (去除关键字的文本)
+ 如果找到相同信息的第一个Sub,则为该Line; 否则为null
+
+
+
+ 搜索全部相似名称的Line的所有元素
+
+ %字段%
+ 如果找到相似名称的Line,则为数组; 否则为一个空的Array
+
+
+
+ 搜索字段是否出现在Line名称,并返回整个Assemblage中的第一个匹配元素
+
+ %字段%
+ 如果找到相似名称的第一个Line,则为该Line; 否则为null
+
+
+
+ 搜索全部相似名称的Sub的所有元素
+
+ %字段%
+ 如果找到相似名称的Line,则为该数组; 否则为一个空的Array
+
+
+
+ 搜索字段是否出现在Sub名称,并返回整个Assemblage中的第一个匹配元素
+
+ %字段%
+ 如果找到相同名称的第一个Sub,则为该Sub; 否则为null
+
+
+
+ 搜索相同名称的Line,并返回整个Assemblage中第一个匹配的Line从零开始的索引
+
+ 用于定义匹配的名称
+ 如果找到相同名称的Line的第一个元素,则为该元素的从零开始的索引; 否则为 -1
+
+
+
+ 搜索相同名称的Line,并返回整个Assemblage中全部匹配的Line从零开始的索引
+
+ 用于定义匹配的名称
+ 如果找到相同名称的Line的元素,则为该元素的从零开始的索引组; 否则为空的Array
+
+
+
+ 获得Assemblage目前储存的Line数量
+
+
+
+
+ 从指定的字符串加载LPS文档
+
+ 包含要加载的LPS文档的字符串
+
+
+
+ 返回一个Assemblage的第一个元素。
+
+ 要返回的第一个元素
+
+
+
+ 返回一个Assemblage的最后一个元素。
+
+ 要返回的最后一个元素
+
+
+
+ 返回循环访问 Assemblage 的枚举数。
+
+ 用于 Assemblage 的枚举数
+
+
+
+ 搜索与指定名称,并返回整个Assemblage中的第一个匹配元素; 若未找到,则新建并添加相同名称的Line,并且返回这个Line
+
+ 用于定义匹配的名称
+ 如果找到相同名称的第一个Line,则为该Line; 否则为新建的相同名称Line
+
+
+
+ 将当前Documents转换成文本格式
+
+ LinePutScript的文本格式
+
+
+
+ 获得该LPS文档的长哈希代码
+
+ 64位哈希代码
+
+
+
+ 获得该LPS文档的哈希代码
+
+ 32位哈希代码
+
+
+
+ 确认对象是否等于当前对象
+
+ Subs
+
+
+
+
+ 获得当前文档大小 单位:字符
+
+
+
+
+ 是否只读
+
+
+
+
+ 通过引索修改lps中Line内容
+
+ 要获得或设置的引索
+ 引索指定的Line
+
+
+
+ 获得bool属性的line
+
+ 用于定义匹配的名称
+ 如果找到相同名称的line,则为True; 否则为false
+
+
+
+ 设置bool属性的line
+
+ 用于定义匹配的名称
+
+ 如果为ture,则在没有相同name为lineName的line时候添加新的line
+ 如果为false,则删除所有name为lineName的line
+
+
+
+
+ 获得int属性的line
+
+ 用于定义匹配的名称
+ 如果没找到返回的默认值
+
+ 如果找到相同名称的line,返回line中储存的int值
+ 如果没找到,则返回默认值
+
+
+
+
+ 设置int属性的line
+
+ 用于定义匹配的名称
+ 储存进line的int值
+
+
+
+ 获得long属性的line
+
+ 用于定义匹配的名称
+ 如果没找到返回的默认值
+
+ 如果找到相同名称的line,返回line中储存的long值
+ 如果没找到,则返回默认值
+
+
+
+
+ 设置long属性的line
+
+ 用于定义匹配的名称
+ 储存进line的long值
+
+
+
+ 获得String属性的line
+
+ 用于定义匹配的名称
+ 如果没找到返回的默认值
+
+ 如果找到相同名称的line,返回line中储存的string值
+ 如果没找到,则返回默认值
+
+
+
+
+ 设置String属性的line
+
+ 用于定义匹配的名称
+ 储存进line的String值
+
+
+
+ 获得double属性的line
+
+ 用于定义匹配的名称
+ 如果没找到返回的默认值
+
+ 如果找到相同名称的line,返回line中储存的double值
+ 如果没找到,则返回默认值
+
+
+
+
+ 设置double属性的line
+
+ 用于定义匹配的名称
+ 储存进line的double值
+
+
+
+ 获得double(long)属性的line 通过转换long获得更精确的小数,小数位最大保留9位
+
+ 用于定义匹配的名称
+ 如果没找到返回的默认值
+
+ 如果找到相同名称的line,返回line中储存的double(long)值
+ 如果没找到,则返回默认值
+
+
+
+
+ 设置double(long)属性的line 通过转换long获得更精确的小数,小数位最大保留9位
+
+ 用于定义匹配的名称
+ 储存进line的double(long)值
+
+
+
+ 获得DateTime属性的line
+
+ 用于定义匹配的名称
+ 如果没找到返回的默认值
+
+ 如果找到相同名称的line,返回line中储存的DateTime值
+ 如果没找到,则返回默认值
+
+
+
+
+ 设置DateTime属性的line
+
+ 用于定义匹配的名称
+ 储存进line的DateTime值
+
+
+
+ 获取或设置 String 属性的line
+
+ (gstr)用于定义匹配的名称
+ 获取或设置对 String 属性的Line
+
+
+
+ 获取或设置 Bool 属性的line
+
+ (gbol)用于定义匹配的名称
+ 获取或设置对 bool 属性的Line
+
+
+
+ 获取或设置 Int 属性的line
+
+ (gint)用于定义匹配的名称
+ 获取或设置对 int 属性的Line
+
+
+
+ 获取或设置 Long 属性的line
+
+ (gi64)用于定义匹配的名称
+ 获取或设置对 long 属性的Line
+
+
+
+ 获取或设置 Double 属性的line
+
+ (gdbe)用于定义匹配的名称
+ 获取或设置对 double 属性的Line
+
+
+
+ 获取或设置 Double(long) 属性的line 通过转换long获得更精确的小数,小数位最大保留9位
+
+ (gflt)用于定义匹配的名称
+ 获取或设置对 double 属性的line
+
+
+
+ 获取或设置 DateTime 属性的line
+
+ (gdbe)用于定义匹配的名称
+ 获取或设置对 double 属性的line
+
+
+
+ 搜索相同Line,并返回整个Assemblage中第一个匹配的Line从零开始的索引
+
+ 用于定义匹配的Line
+ 如果找到相同名称的Line的第一个元素,则为该元素的从零开始的索引; 否则为 -1
+
+
+
+ 将指定的Line添加到指定索引处
+
+ 应插入 Line 的从零开始的索引
+ 要添加的Line
+
+
+
+ 将指定的Line添加到Assemblage列表的末尾
+
+ 要添加的Line
+
+
+
+ 移除Assemblage中所有的Line
+
+
+
+
+ 将整个array复制到Assemblage
+
+ 复制到Assemblage的Line列表
+ 从零开始的引索,从引索处开始复制
+
+
+
+ 返回一个新List,包含所有Line
+
+ 所有储存的Line
+
+
+
+ 子类 LinePutScript最基础的类
+
+
+
+
+ 创建一个子类
+
+
+
+
+ 通过lpsSub文本创建一个子类
+
+ lpsSub文本
+
+
+
+ 通过名字和信息创建新的Sub
+
+ 名称
+ 信息 (正常版本)
+
+
+
+ 通过名字和信息创建新的Sub
+
+ 名称
+ 多个信息 (正常版本)
+
+
+
+ 分割字符串
+
+ 需要分割的文本
+ 分割符号
+ 分割次数 -1 为无限次数
+
+
+
+
+ 将文本进行反转义处理(成为正常显示的文本)
+
+ 要反转义的文本
+ 反转义后的文本 正常显示的文本
+
+
+
+ 将文本进行转义处理(成为去除关键字的文本)
+
+ 要转义的文本
+ 转义后的文本 (去除关键字的文本)
+
+
+
+ 获取String的HashCode(MD5)
+
+ String
+ HashCode
+
+
+
diff --git a/VPet.Plugin.DemoClock/1100_DemoClock/plugin/Panuon.WPF.UI.dll b/VPet.Plugin.DemoClock/1100_DemoClock/plugin/Panuon.WPF.UI.dll
new file mode 100644
index 0000000..9054cb6
Binary files /dev/null and b/VPet.Plugin.DemoClock/1100_DemoClock/plugin/Panuon.WPF.UI.dll differ
diff --git a/VPet.Plugin.DemoClock/1100_DemoClock/plugin/Panuon.WPF.dll b/VPet.Plugin.DemoClock/1100_DemoClock/plugin/Panuon.WPF.dll
new file mode 100644
index 0000000..f4b35f0
Binary files /dev/null and b/VPet.Plugin.DemoClock/1100_DemoClock/plugin/Panuon.WPF.dll differ
diff --git a/VPet.Plugin.DemoClock/1100_DemoClock/plugin/VPet-Simulator.Core.dll b/VPet.Plugin.DemoClock/1100_DemoClock/plugin/VPet-Simulator.Core.dll
new file mode 100644
index 0000000..ee11842
Binary files /dev/null and b/VPet.Plugin.DemoClock/1100_DemoClock/plugin/VPet-Simulator.Core.dll differ
diff --git a/VPet.Plugin.DemoClock/1100_DemoClock/plugin/VPet-Simulator.Core.xml b/VPet.Plugin.DemoClock/1100_DemoClock/plugin/VPet-Simulator.Core.xml
new file mode 100644
index 0000000..258b20a
--- /dev/null
+++ b/VPet.Plugin.DemoClock/1100_DemoClock/plugin/VPet-Simulator.Core.xml
@@ -0,0 +1,1388 @@
+
+
+
+ VPet-Simulator.Core
+
+
+
+
+ Main.xaml 的交互逻辑
+
+
+ Main
+
+
+
+
+ 游戏核心
+
+
+
+
+ 菜单栏
+
+
+
+
+ 菜单栏
+
+
+
+
+ 刷新时间时会调用该方法
+
+
+
+
+ 刷新时间时会调用该方法,在所有任务处理完之后
+
+
+
+
+ 自动加载触摸事件
+
+
+
+
+ 清理所有状态
+
+
+
+
+ 当前动画类型
+
+
+
+
+ 默认循环次数
+
+
+
+
+ 显示默认情况
+
+
+
+
+ 显示结束动画
+
+ 结束后接下来
+ 是否成功结束
+
+
+
+ 显示关机动画
+
+
+
+
+ 显示摸头情况
+
+
+
+
+ 显示摸身体情况
+
+
+
+
+ 显示待机(模式1)情况
+
+
+
+
+ 显示待机(模式1)情况
+
+
+
+
+ 显示待机(模式2)情况
+
+
+
+
+ 显示待机(模式2)情况
+
+
+
+
+ 显示蹲下情况
+
+
+
+
+ 显示蹲下情况
+
+
+
+
+ 显示无聊情况
+
+
+
+
+ 显示无聊情况
+
+
+
+
+ 显示睡觉情况
+
+
+
+
+ 显示睡觉情况 (正常)
+
+
+
+
+ 显示睡觉情况 (强制)
+
+
+
+
+ 显示拖拽情况
+
+
+
+
+ 显示拖拽中
+
+
+
+
+ 显示掉到地上 从左边
+
+
+
+
+ 显示掉到地上 从左边
+
+
+
+
+ 显示向左走 (有判断)
+
+
+
+
+ 显示向左走
+
+
+
+
+ 显示向右走 (有判断)
+
+
+
+
+ 显示向右走
+
+
+
+
+ 显示向左爬 (有判断)
+
+
+
+
+ 显示向左爬
+
+
+
+
+ 显示向右爬 (有判断)
+
+
+
+
+ 显示向右爬
+
+
+
+
+ 显示左墙壁爬行 上
+
+
+
+
+ 显示左墙壁爬行 上
+
+
+
+
+ 显示左墙壁爬行 下
+
+
+
+
+ 显示左墙壁爬行 下
+
+
+
+
+ 显示右墙壁爬行 上
+
+
+
+
+ 显示右墙壁爬行 上
+
+
+
+
+ 显示右墙壁爬行 下
+
+
+
+
+ 显示右墙壁爬行 下
+
+
+
+
+ 显示顶部墙壁爬行向右
+
+
+
+
+ 显示顶部墙壁爬行向左
+
+
+
+
+ 显示顶部墙壁爬行向左
+
+
+
+
+ 显示顶部墙壁爬行向左
+
+
+
+
+ 显示掉落向左
+
+
+
+
+ 显示掉落向左
+
+
+
+
+ 显示掉落向右
+
+
+
+
+ 显示掉落向右
+
+
+
+
+ 显示动画
+
+ 动画类型
+ 动画结束后操作
+ 是否储存随机数字典
+
+
+
+ 显示动画 (自动多层切换)
+
+ 动画
+ 结束操作
+
+
+
+ 处理说话内容
+
+
+
+
+ 事件Timer
+
+
+
+
+ 说话
+
+ 说话内容
+
+
+
+ 定点移动位置向量
+
+
+
+
+ 定点移动定时器
+
+
+
+
+ 设置计算间隔
+
+ 计算间隔
+
+
+
+ 是否启用智能移动
+
+
+
+
+ 设置移动模式
+
+ 允许移动
+ 启用智能移动
+ 智能移动周期
+
+
+
+ MainGrid Name Field
+
+
+
+
+ UIGrid_Back Name Field
+
+
+
+
+ UIGrid Name Field
+
+
+
+
+ InitializeComponent
+
+
+
+
+ MessageBar.xaml 的交互逻辑
+
+
+ MessageBar
+
+
+
+
+ 显示消息
+
+ 名字
+ 内容
+
+
+
+ 强制关闭
+
+
+
+
+ TText Name Field
+
+
+
+
+ InitializeComponent
+
+
+
+
+ ToolBar.xaml 的交互逻辑
+
+
+ ToolBar
+
+
+
+
+ 窗口类型
+
+
+
+
+ 投喂
+
+
+
+
+ 互动
+
+
+
+
+ 自定
+
+
+
+
+ 设置
+
+
+
+
+ 添加按钮
+
+ 按钮位置
+ 显示名称
+ 功能
+
+
+
+ MainGrid Name Field
+
+
+
+
+ BdrPanel Name Field
+
+
+
+
+ MenuDIY Name Field
+
+
+
+
+ MenuSetting Name Field
+
+
+
+
+ InitializeComponent
+
+
+
+
+ FoodAnimation.xaml 的交互逻辑
+
+
+ FoodAnimation
+
+
+
+
+ InitializeComponent
+
+
+
+
+ 图像显示核心
+
+
+
+
+ 动画类型
+
+
+
+
+ 被提起动态 (循环)
+
+
+
+
+ 被提起静态 (开始)
+
+
+
+
+ 被提起静态 (循环)
+
+
+
+
+ 从上向右爬 (循环)
+
+
+
+
+ 从上向左爬 (循环)
+
+
+
+
+ 爬起向右
+
+
+
+
+ 爬起向左
+
+
+
+
+ 从右边爬 (开始)
+
+
+
+
+ 从左边爬 (开始)
+
+
+
+
+ 从右边爬 (循环)
+
+
+
+
+ 从左边爬 (循环)
+
+
+
+
+ 呼吸 (循环)
+
+
+
+
+ 摸头 (开始)
+
+
+
+
+ 摸头 (循环)
+
+
+
+
+ 摸头 (结束)
+
+
+
+
+ 摸身体 (开始)
+
+
+
+
+ 摸身体 (循环)
+
+
+
+
+ 摸身体 (结束)
+
+
+
+
+ 爬行向右 (开始)
+
+
+
+
+ 爬行向右 (循环)
+
+
+
+
+ 爬行向右 (结束)
+
+
+
+
+ 爬行向左 (开始)
+
+
+
+
+ 爬行向左 (循环)
+
+
+
+
+ 爬行向左 (结束)
+
+
+
+
+ 下蹲 (开始)
+
+
+
+
+ 下蹲 (循环)
+
+
+
+
+ 下蹲 (结束)
+
+
+
+
+ 下落向左 (开始)
+
+
+
+
+ 下落向左 (循环)
+
+
+
+
+ 下落向左 (结束)
+
+
+
+
+ 下落向右 (开始/循环)
+
+
+
+
+ 下落向右 (开始/循环)
+
+
+
+
+ 下落向右 (结束)
+
+
+
+
+ 走路向右 (开始)
+
+
+
+
+ 走路向右 (循环)
+
+
+
+
+ 走路向右 (结束)
+
+
+
+
+ 走路向左 (开始)
+
+
+
+
+ 走路向左 (循环)
+
+
+
+
+ 走路向左 (结束)
+
+
+
+
+ 无聊 (开始)
+
+
+
+
+ 无聊 (循环)
+
+
+
+
+ 无聊 (结束)
+
+
+
+
+ 睡觉 (开始)
+
+
+
+
+ 睡觉 (循环)
+
+
+
+
+ 睡觉 (结束)
+
+
+
+
+ 说话 (开始)
+
+
+
+
+ 说话 (循环)
+
+
+
+
+ 说话 (结束)
+
+
+
+
+ 说话 (开始)
+
+
+
+
+ 说话 (循环)
+
+
+
+
+ 说话 (结束)
+
+
+
+
+ 待机 模式1 (开始)
+
+
+
+
+ 待机 模式1 (循环)
+
+
+
+
+ 待机 模式1 (结束)
+
+
+
+
+ 待机 模式2 (开始)
+
+
+
+
+ 待机 模式2 (循环)
+
+
+
+
+ 待机 模式2 (结束)
+
+
+
+
+ 开机
+
+
+
+
+ 关机
+
+
+
+
+ 图像字典
+
+
+
+
+ 通用UI资源
+
+
+
+
+ 通用设置属性/方法
+
+
+
+
+ 添加动画
+
+ 动画
+ 类型
+
+
+
+ 添加动画 自动创建
+
+ 位置
+ 状态类型
+ 动画类型
+
+
+
+ 随机数字典(用于确保随机动画不会错位)
+
+
+
+
+ 查找动画
+
+ 动画类型
+ 状态类型,找不到就找相同动画类型
+ 是否储存随机数字典
+
+
+
+
+ 动画类型默认前文本
+
+
+
+
+ 动画设置
+
+
+
+
+ 摸头触发位置
+
+
+
+
+ 提起触发位置
+
+
+
+
+ 摸头触发大小
+
+
+
+
+ 提起触发大小
+
+
+
+
+ 提起定位点
+
+
+
+
+ 行走速度
+
+
+
+
+ 侧边爬行速度
+
+
+
+
+ 顶部爬行速度
+
+
+
+
+ 爬行速度
+
+
+
+
+ 掉落速度 X轴
+
+
+
+
+ 掉落速度 Y轴
+
+
+
+
+ 定位爬行左边距离
+
+
+
+
+ 定位爬行右边距离
+
+
+
+
+ 定位爬行上边距离
+
+
+
+
+ 初始化设置
+
+
+
+
+
+ 加载更多设置,新的替换后来的,允许空内容
+
+
+
+
+ IEyeTracking.xaml 的交互逻辑
+
+
+ EyeTracking
+
+
+
+
+ InitializeComponent
+
+
+
+
+ 动画显示接口
+
+
+
+
+ 从0开始运行该动画
+
+
+
+
+ 当前动画播放状态
+
+
+
+
+ 是否循环播放
+
+
+
+
+ 是否继续播放
+
+
+
+
+ 从0开始运行该动画, 等待部署完成后执行
+
+
+
+
+ 该动画模式
+
+
+
+
+ 该动画类型
+
+
+
+
+ 停止动画
+
+ 停止动画时是否允许执行停止帧
+
+
+
+ Picture.xaml 的交互逻辑
+
+
+
+
+ 新建新静态图像
+
+ 图片路径
+
+
+
+ 图片资源
+
+
+
+
+ PNGAnimation.xaml 的交互逻辑
+
+
+
+
+ 所有动画帧
+
+
+
+
+ 当前动画播放状态
+
+
+
+
+ 当前动画是否执行ENDACTION
+
+
+
+
+ 是否循环播放
+
+
+
+
+ 是否循环播放
+
+
+
+
+ 是否准备完成
+
+
+
+
+ 动画停止时运行的方法
+
+
+
+
+ 图片资源
+
+
+
+
+ 新建 PNG 动画
+
+ 文件夹位置
+ 文件内容列表
+ 是否循环
+
+
+
+ 单帧动画
+
+
+
+
+ 帧时间
+
+
+
+
+ 运行该图层
+
+
+
+
+ 从0开始运行该动画
+
+
+
+
+ 获取资源笔刷
+
+
+
+
+
+
+ 游戏使用资源
+
+
+
+
+ 控制器
+
+
+
+
+ 触摸范围和事件列表
+
+
+
+
+ 图形核心
+
+
+
+
+ 游戏数据
+
+
+
+
+ 触摸范围事件
+
+
+
+
+ 位置
+
+
+
+
+ 大小
+
+
+
+
+ 如果是触发的内容
+
+
+
+
+ 否:立即触发/是:长按触发
+
+
+
+
+ 创建个触摸范围事件
+
+ 位置
+ 大小
+ 如果是触发的内容
+ 否:立即触发/是:长按触发
+
+
+
+ 判断是否成功触发该点击事件
+
+ 位置
+ 是否成功
+
+
+
+ 桌宠控制器 需自行实现
+
+
+
+
+ 移动桌宠位置 (自带缩放倍率)
+
+ X轴
+ Y轴
+
+
+
+ 获取桌宠距离左侧的位置
+
+
+
+
+ 获取桌宠距离右侧的位置
+
+
+
+
+ 获取桌宠距离上方的位置
+
+
+
+
+ 获取桌宠距离下方的位置
+
+
+
+
+ 缩放比例
+
+
+
+
+ 按多久视为长按 单位毫秒
+
+
+
+
+ 显示面板窗体
+
+
+
+
+ 启用计算等数据功能
+
+
+
+
+ 互动周期
+
+
+
+
+ 宠物加载器
+
+
+
+
+ 宠物图像
+
+
+
+
+ 图像位置
+
+
+
+
+ 宠物名字
+
+
+
+
+ 宠物介绍
+
+
+
+
+ 游戏存档
+
+
+
+
+ 宠物名字
+
+
+
+
+ 金钱
+
+
+
+
+ 经验值
+
+
+
+
+ 等级
+
+
+
+
+ 升级所需经验值
+
+
+
+
+
+ 体力 0-100
+
+
+
+
+ 变化 体力
+
+
+
+
+ 饱腹度
+
+
+
+
+ 变化 食物
+
+
+
+
+ 口渴度
+
+
+
+
+ 变化 口渴度
+
+
+
+
+ 心情
+
+
+
+
+ 变化 心情
+
+
+
+
+ 健康(生病)(隐藏)
+
+
+
+
+ 好感度(隐藏)(累加值)
+
+
+
+
+ 清除变化
+
+
+
+
+ 宠物状态模式
+
+
+
+
+ 高兴
+
+
+
+
+ 普通
+
+
+
+
+ 状态不佳
+
+
+
+
+ 生病(躺床)
+
+
+
+
+ 计算宠物当前状态
+
+
+
+
+ 新游戏
+
+
+
+
+ 读档
+
+
+
+
+ 存档
+
+ 存档行
+
+
+
+ 当前正在的状态
+
+
+
+
+ 默认:啥都没干
+
+
+
+
+ 正在干活, workingobj指示正在干啥活
+
+
+
+
+ 学习中
+
+
+
+
+ 玩耍中
+
+
+
+
+ 强类型资源类,用于查找本地化字符串等。
+
+
+
+
+ 返回此类使用的缓存 ResourceManager 实例。
+
+
+
+
+ 重写当前线程的 CurrentUICulture 属性,对
+ 使用此强类型资源类的所有资源查找执行重写。
+
+
+
+
diff --git a/VPet.Plugin.DemoClock/1100_DemoClock/plugin/VPet-Simulator.Windows.Interface.dll b/VPet.Plugin.DemoClock/1100_DemoClock/plugin/VPet-Simulator.Windows.Interface.dll
new file mode 100644
index 0000000..3418a7b
Binary files /dev/null and b/VPet.Plugin.DemoClock/1100_DemoClock/plugin/VPet-Simulator.Windows.Interface.dll differ
diff --git a/VPet.Plugin.DemoClock/1100_DemoClock/plugin/VPet-Simulator.Windows.Interface.xml b/VPet.Plugin.DemoClock/1100_DemoClock/plugin/VPet-Simulator.Windows.Interface.xml
new file mode 100644
index 0000000..c5a25b9
--- /dev/null
+++ b/VPet.Plugin.DemoClock/1100_DemoClock/plugin/VPet-Simulator.Windows.Interface.xml
@@ -0,0 +1,225 @@
+
+
+
+ VPet-Simulator.Windows.Interface
+
+
+
+
+ 是否为Steam用户
+
+
+
+
+ 游戏设置
+
+
+
+
+ 宠物加载器列表
+
+
+
+
+ 桌宠数据核心
+
+
+
+
+ 桌宠主要部件
+
+
+
+
+ 版本号
+
+
+
+
+ 版本号
+
+
+
+
+ 上次点击时间 (Tick)
+
+
+
+
+ 所有三方插件
+
+
+
+
+ 设置游戏缩放倍率
+
+ 缩放倍率 范围0.1-10
+
+
+
+ 保存设置
+
+
+
+
+ 加载DIY内容
+
+
+
+
+ 运行动作
+
+ 动作名称
+
+
+
+ 这是插件的主体内容 请继承这个类
+
+
+
+
+ 通过插件名称定位插件
+
+
+
+
+ 主窗体, 主程序提供的各种功能和设置等 大部分参数和调用均在这里
+
+
+
+
+ MOD插件初始化
+
+ 主窗体
+ 请不要加载游戏和玩家数据,仅用作初始化
+ 加载数据(CORE)/游戏(SAVE),请使用 LoadPlugin
+
+
+
+ 初始化程序+读取存档
+
+ 例:添加自己的Tick到 mw.Main.EventTimer
+ 例:创建使用UI的桌面控件
+
+
+
+ 游戏结束 (可以保存或清空等,不过保存有专门的Save())
+
+
+
+
+ 储存游戏 (可以写 Save.Other 储存设置和数据等)
+
+
+
+
+ 打开代码插件设置
+
+
+
+
+ 重载DIY按钮, 如需添加自定义按钮可在此处添加
+
+
+
+
+ 缩放倍率
+
+
+
+
+ 是否为更大的屏幕
+
+
+
+
+ 是否启用数据收集 //TODO:判断游戏是否是原版的
+
+
+
+
+ 数据收集频率
+
+
+
+
+ 自动保存频率 (min)
+
+
+
+
+ 是否置于顶层
+
+
+
+
+ 数据收集是否被禁止(当日)
+
+
+
+
+ 按多久视为长按 单位毫秒
+
+
+
+
+ 互动周期
+
+
+
+
+ 计算间隔
+
+
+
+
+ 允许移动事件
+
+
+
+
+ 智能移动
+
+
+
+
+ 启用计算等数据功能
+
+
+
+
+ 智能移动周期 (秒)
+
+
+
+
+ 开机启动
+
+
+
+
+ 开机启动 Steam
+
+
+
+
+ 桌宠选择内容
+
+
+
+
+ 是否记录游戏退出位置 (默认:是)
+
+
+
+
+ 记录上次退出位置
+
+
+
+
+ 设置中桌宠启动的位置
+
+
+
+
diff --git a/VPet.Plugin.DemoClock/1100_DemoClock/plugin/VPet.Plugin.DemoClock.dll b/VPet.Plugin.DemoClock/1100_DemoClock/plugin/VPet.Plugin.DemoClock.dll
new file mode 100644
index 0000000..ed44c3a
Binary files /dev/null and b/VPet.Plugin.DemoClock/1100_DemoClock/plugin/VPet.Plugin.DemoClock.dll differ
diff --git a/VPet.Plugin.DemoClock/CountDownInput.xaml b/VPet.Plugin.DemoClock/CountDownInput.xaml
new file mode 100644
index 0000000..dfce365
--- /dev/null
+++ b/VPet.Plugin.DemoClock/CountDownInput.xaml
@@ -0,0 +1,43 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/VPet.Plugin.DemoClock/CountDownInput.xaml.cs b/VPet.Plugin.DemoClock/CountDownInput.xaml.cs
new file mode 100644
index 0000000..33191a9
--- /dev/null
+++ b/VPet.Plugin.DemoClock/CountDownInput.xaml.cs
@@ -0,0 +1,42 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using System.Windows.Shapes;
+
+namespace VPet.Plugin.DemoClock
+{
+ ///
+ /// CountDownInput.xaml 的交互逻辑
+ ///
+ public partial class CountDownInput : Window
+ {
+ public TimeSpan Return = TimeSpan.Zero;
+
+ public CountDownInput(TimeSpan ret)
+ {
+ InitializeComponent();
+ if (ret < TimeSpan.Zero)
+ {
+ ret = -ret;
+ }
+ hh.Value = Math.Min(40, (int)ret.TotalHours);
+ mm.Value = ret.Minutes;
+ ss.Value = ret.Seconds;
+ }
+
+ private void OK_Click(object sender, RoutedEventArgs e)
+ {
+ Return = TimeSpan.FromHours(hh.Value) + TimeSpan.FromSeconds(ss.Value) + TimeSpan.FromMinutes(mm.Value);
+ DialogResult = true;
+ }
+ }
+}
diff --git a/VPet.Plugin.DemoClock/DemoClock.cs b/VPet.Plugin.DemoClock/DemoClock.cs
new file mode 100644
index 0000000..6a653a0
--- /dev/null
+++ b/VPet.Plugin.DemoClock/DemoClock.cs
@@ -0,0 +1,146 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Timers;
+using System.Windows.Controls;
+using System.Windows;
+using VPet_Simulator.Windows.Interface;
+using System.Windows.Threading;
+
+namespace VPet.Plugin.DemoClock
+{
+ ///
+ /// Demo 时钟
+ ///
+ public class DemoClock : MainPlugin
+ {
+
+ public enum Mode
+ {
+ ///
+ /// 正常显示时间
+ ///
+ None,
+ ///
+ /// 倒计时
+ ///
+ CountDown,
+ ///
+ /// 正计时
+ ///
+ Timing,
+ ///
+ /// 番茄钟:工作
+ ///
+ Tomato_Work,
+ ///
+ /// 番茄钟:休息
+ ///
+ Tomato_Rest,
+ ///
+ /// 番茄钟:长休息
+ ///
+ Tomato_Rest_Long,
+ ///
+ /// 时间到 暂停状态
+ ///
+ CountDown_End
+ }
+ ///
+ /// 当前时钟模式
+ ///
+ public Mode mode = Mode.None;
+ MenuItem menuItem;
+ public TimeClock WPFTimeClock;
+ public Setting Set;
+
+ public MenuItem mTotmatoWork;
+ public MenuItem mTotmatoRest;
+ public MenuItem mCountDown;
+ public MenuItem mTiming;
+
+ public long CountDownLength;
+ public DemoClock(IMainWindow mainwin) : base(mainwin)
+ {
+ }
+
+ public override void LoadPlugin()
+ {
+ var line = MW.Set.FindLine("DemoClock");
+ if (line == null)
+ {
+ Set = new Setting();
+ }
+ else
+ {
+ Set = new Setting(line);
+ MW.Set.Remove(line);
+ }
+ MW.Set.Add(Set);
+
+ WPFTimeClock = new TimeClock(this);
+
+ menuItem = new MenuItem()
+ {
+ Header = "DM时钟",
+ HorizontalContentAlignment = HorizontalAlignment.Center
+ };
+ //foreach (MenuItem mi in WPFTimeClock.CM.Items)
+ // menuItem.Items.Add(mi);
+
+ var mi = new MenuItem()
+ {
+ Header = "设置",
+ HorizontalContentAlignment = HorizontalAlignment.Center,
+ };
+ mi.Click += (s, e) => { Setting(); };
+ menuItem.Items.Add(mi);
+ menuItem.Items.Add(new Separator());
+ mCountDown = new MenuItem()
+ {
+ Header = "开始倒计时",
+ HorizontalContentAlignment = HorizontalAlignment.Center,
+ };
+ mCountDown.Click += WPFTimeClock.CountDownMenuItem_Click;
+ menuItem.Items.Add(mCountDown);
+
+ mTiming = new MenuItem()
+ {
+ Header = "开始正计时",
+ HorizontalContentAlignment = HorizontalAlignment.Center,
+ };
+ mTiming.Click += WPFTimeClock.TimingMenuItem_Click;
+ menuItem.Items.Add(mTiming);
+
+ mTotmatoWork = new MenuItem()
+ {
+ Header = "开始工作",
+ HorizontalContentAlignment = HorizontalAlignment.Center,
+ };
+ mTotmatoWork.Click += WPFTimeClock.WorkMenuItem_Click;
+ menuItem.Items.Add(mTotmatoWork);
+
+ mTotmatoRest = new MenuItem()
+ {
+ Header = "开始休息",
+ HorizontalContentAlignment = HorizontalAlignment.Center,
+ };
+ mTotmatoRest.Click += WPFTimeClock.RestMenuItem_Click;
+ menuItem.Items.Add(mTotmatoRest);
+
+ }
+ public override void LoadDIY()
+ {
+ MW.Main.ToolBar.MenuDIY.Items.Add(menuItem);
+ }
+
+ public override string PluginName => "DemoClock";
+
+ public override void Setting()
+ {
+ new winSetting(this).Show();
+ }
+ }
+}
diff --git a/VPet.Plugin.DemoClock/Properties/AssemblyInfo.cs b/VPet.Plugin.DemoClock/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..9daf96f
--- /dev/null
+++ b/VPet.Plugin.DemoClock/Properties/AssemblyInfo.cs
@@ -0,0 +1,55 @@
+using System.Reflection;
+using System.Resources;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+using System.Windows;
+
+// 有关程序集的一般信息由以下
+// 控制。更改这些特性值可修改
+// 与程序集关联的信息。
+[assembly: AssemblyTitle("VPet.Plugin.DemoClock")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("VPet.Plugin.DemoClock")]
+[assembly: AssemblyCopyright("Copyright © 2023")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+//将 ComVisible 设置为 false 将使此程序集中的类型
+//对 COM 组件不可见。 如果需要从 COM 访问此程序集中的类型,
+//请将此类型的 ComVisible 特性设置为 true。
+[assembly: ComVisible(false)]
+
+//若要开始生成可本地化的应用程序,请设置
+//.csproj 文件中的 CultureYouAreCodingWith
+//例如,如果您在源文件中使用的是美国英语,
+//使用的是美国英语,请将 设置为 en-US。 然后取消
+//对以下 NeutralResourceLanguage 特性的注释。 更新
+//以下行中的“en-US”以匹配项目文件中的 UICulture 设置。
+
+//[assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.Satellite)]
+
+
+[assembly:ThemeInfo(
+ ResourceDictionaryLocation.None, //主题特定资源词典所处位置
+ //(未在页面中找到资源时使用,
+ //或应用程序资源字典中找到时使用)
+ ResourceDictionaryLocation.SourceAssembly //常规资源词典所处位置
+ //(未在页面中找到资源时使用,
+ //、应用程序或任何主题专用资源字典中找到时使用)
+)]
+
+
+// 程序集的版本信息由下列四个值组成:
+//
+// 主版本
+// 次版本
+// 生成号
+// 修订号
+//
+//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值
+//通过使用 "*",如下所示:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
diff --git a/VPet.Plugin.DemoClock/Properties/Resources.Designer.cs b/VPet.Plugin.DemoClock/Properties/Resources.Designer.cs
new file mode 100644
index 0000000..747ffbe
--- /dev/null
+++ b/VPet.Plugin.DemoClock/Properties/Resources.Designer.cs
@@ -0,0 +1,62 @@
+//------------------------------------------------------------------------------
+//
+// 此代码由工具生成。
+// 运行时版本: 4.0.30319.42000
+//
+// 对此文件的更改可能导致不正确的行为,如果
+// 重新生成代码,则所做更改将丢失。
+//
+//------------------------------------------------------------------------------
+
+namespace VPet.Plugin.DemoClock.Properties {
+
+
+ ///
+ /// 强类型资源类,用于查找本地化字符串等。
+ ///
+ // 此类是由 StronglyTypedResourceBuilder
+ // 类通过类似于 ResGen 或 Visual Studio 的工具自动生成的。
+ // 若要添加或移除成员,请编辑 .ResX 文件,然后重新运行 ResGen
+ // (以 /str 作为命令选项),或重新生成 VS 项目。
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+ internal class Resources {
+
+ private static global::System.Resources.ResourceManager resourceMan;
+
+ private static global::System.Globalization.CultureInfo resourceCulture;
+
+ [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
+ internal Resources() {
+ }
+
+ ///
+ /// 返回此类使用的缓存 ResourceManager 实例。
+ ///
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Resources.ResourceManager ResourceManager {
+ get {
+ if ((resourceMan == null)) {
+ global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("VPet.Plugin.DemoClock.Properties.Resources", typeof(Resources).Assembly);
+ resourceMan = temp;
+ }
+ return resourceMan;
+ }
+ }
+
+ ///
+ /// 重写当前线程的 CurrentUICulture 属性,对
+ /// 使用此强类型资源类的所有资源查找执行重写。
+ ///
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Globalization.CultureInfo Culture {
+ get {
+ return resourceCulture;
+ }
+ set {
+ resourceCulture = value;
+ }
+ }
+ }
+}
diff --git a/VPet.Plugin.DemoClock/Properties/Resources.resx b/VPet.Plugin.DemoClock/Properties/Resources.resx
new file mode 100644
index 0000000..af7dbeb
--- /dev/null
+++ b/VPet.Plugin.DemoClock/Properties/Resources.resx
@@ -0,0 +1,117 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
\ No newline at end of file
diff --git a/VPet.Plugin.DemoClock/Properties/Settings.Designer.cs b/VPet.Plugin.DemoClock/Properties/Settings.Designer.cs
new file mode 100644
index 0000000..78fb36d
--- /dev/null
+++ b/VPet.Plugin.DemoClock/Properties/Settings.Designer.cs
@@ -0,0 +1,30 @@
+//------------------------------------------------------------------------------
+//
+// This code was generated by a tool.
+// Runtime Version:4.0.30319.42000
+//
+// Changes to this file may cause incorrect behavior and will be lost if
+// the code is regenerated.
+//
+//------------------------------------------------------------------------------
+
+namespace VPet.Plugin.DemoClock.Properties
+{
+
+
+ [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")]
+ internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase
+ {
+
+ private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
+
+ public static Settings Default
+ {
+ get
+ {
+ return defaultInstance;
+ }
+ }
+ }
+}
diff --git a/VPet.Plugin.DemoClock/Properties/Settings.settings b/VPet.Plugin.DemoClock/Properties/Settings.settings
new file mode 100644
index 0000000..033d7a5
--- /dev/null
+++ b/VPet.Plugin.DemoClock/Properties/Settings.settings
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/VPet.Plugin.DemoClock/Setting.cs b/VPet.Plugin.DemoClock/Setting.cs
new file mode 100644
index 0000000..c3e2045
--- /dev/null
+++ b/VPet.Plugin.DemoClock/Setting.cs
@@ -0,0 +1,174 @@
+using LinePutScript;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace VPet.Plugin.DemoClock
+{
+ public class Setting : Line
+ {
+ public Setting() : base("DemoClock", "")
+ {
+ timeshifting = 0;
+ hour24 = false;
+ tomato_worktime = 45;
+ tomato_resttime = 15;
+ tomato_resttimelong = 45;
+ }
+ public Setting(Line line) : base(line)
+ {
+ timeshifting = GetFloat("timeshifting", 0);
+ hour24 = GetBool("hour24");
+ tomato_worktime = GetDouble("tomato_worktime", 45);
+ tomato_resttime = GetDouble("tomato_resttime", 15);
+ tomato_resttimelong = GetDouble("tomato_resttimelong", 45);
+ }
+ double timeshifting;
+ ///
+ /// 时间偏移
+ ///
+ public double TimeShifting
+ {
+ get => timeshifting;
+ set
+ {
+ timeshifting = value;
+ SetFloat("timeshifting", value);
+ }
+ }
+ ///
+ /// 是否自动放置到桌宠后方
+ ///
+ public bool PlaceAutoBack
+ {
+ get => !GetBool("placeautofront");
+ set => SetBool("placeautofront", !value);
+ }
+ ///
+ /// 放置距离设置
+ ///
+ public double PlaceBotton
+ {
+ get => GetDouble("placebotton", 100);
+ set => SetDouble("placebotton", value);
+ }
+ ///
+ /// 默认倒计时
+ ///
+ public double DefaultCountDown
+ {
+ get => GetDouble("defaultcountdown", 5);
+ set => SetDouble("defaultcountdown", value);
+ }
+ ///
+ /// 闲置透明度 (0-1.0)
+ ///
+ public double Opacity
+ {
+ get => GetDouble("opacity", 0.6);
+ set => SetDouble("opacity", value);
+ }
+ bool hour24;
+ ///
+ /// 是否使用24小时制
+ ///
+ public bool Hour24
+ {
+ get => hour24;
+ set
+ {
+ hour24 = value;
+ SetBool("hour24", value);
+ }
+ }
+ double tomato_worktime;
+ ///
+ /// 番茄钟工作时长
+ ///
+ public double Tomato_WorkTime
+ {
+ get => tomato_worktime;
+ set
+ {
+ tomato_worktime = value;
+ SetDouble("tomato_worktime", value);
+ }
+ }
+ double tomato_resttime;
+ ///
+ /// 番茄钟休息时长
+ ///
+ public double Tomato_RestTime
+ {
+ get => tomato_resttime;
+ set { tomato_resttime = value; SetDouble("tomato_resttime", value); }
+ }
+ public double tomato_resttimelong;
+ ///
+ /// 番茄钟长休息时长
+ ///
+ public double Tomato_RestTimeLong
+ {
+ get => tomato_resttimelong;
+ set { SetDouble("tomato_resttimelong", value); tomato_resttimelong = value; }
+ }
+ ///
+ /// 番茄钟工作语音
+ ///
+ public string Tomato_WorkVoice
+ {
+ get => GetString("tomato_workvoice", "pack://application:,,,/Res/Work.mp3");
+ set => SetString("tomato_workvoice", value);
+ }
+ ///
+ /// 番茄钟休息语音
+ ///
+ public string Tomato_RestVoice
+ {
+ get => GetString("tomato_restvoice", "pack://application:,,,/Res/Rest.mp3");
+ set => SetString("tomato_restvoice", value);
+ }
+ ///
+ /// 番茄钟结束语音
+ ///
+ public string Tomato_EndVoice
+ {
+ get => GetString("tomato_endvoice", "pack://application:,,,/Res/End.mp3");
+ set => SetString("tomato_endvoice", value);
+ }
+ ///
+ /// 番茄钟工作语音
+ ///
+ public string CountDownVoice
+ {
+ get => GetString("countdownvoice", "pack://application:,,,/Res/CountDown.mp3");
+ set => SetString("countdownvoice", value);
+ }
+ ///
+ /// 拥有番茄数量
+ ///
+ public int Tomato_Count
+ {
+ get => GetInt("tomato_count");
+ set => SetInt("tomato_count", value);
+ }
+ ///
+ /// 拥有番茄总数量
+ ///
+ public int Tomato_Count_Total
+ {
+ get => GetInt("tomato_count_total");
+ set => SetInt("tomato_count_total", value);
+ }
+ ///
+ /// 添加番茄数量
+ ///
+ public void AddTomato(int count)
+ {
+ Tomato_Count += count;
+ Tomato_Count_Total += count;
+ }
+ }
+}
diff --git a/VPet.Plugin.DemoClock/TimeClock.xaml b/VPet.Plugin.DemoClock/TimeClock.xaml
new file mode 100644
index 0000000..4064ba7
--- /dev/null
+++ b/VPet.Plugin.DemoClock/TimeClock.xaml
@@ -0,0 +1,56 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/VPet.Plugin.DemoClock/TimeClock.xaml.cs b/VPet.Plugin.DemoClock/TimeClock.xaml.cs
new file mode 100644
index 0000000..3b31d2f
--- /dev/null
+++ b/VPet.Plugin.DemoClock/TimeClock.xaml.cs
@@ -0,0 +1,529 @@
+using Panuon.WPF.UI;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using System.Windows.Navigation;
+using System.Windows.Shapes;
+using System.Windows.Threading;
+using static VPet.Plugin.DemoClock.DemoClock;
+using System.Timers;
+
+namespace VPet.Plugin.DemoClock
+{
+ ///
+ /// TimeClock.xaml 的交互逻辑
+ ///
+ public partial class TimeClock : UserControl
+ {
+ DemoClock Master;
+ public DispatcherTimer TimeTimer;
+ public DispatcherTimer CountTimer;
+ public DateTime StartTime;
+ public TimeSpan PauseTime;
+ public bool IsPause = false;
+ Timer CloseTimer;
+
+ public TimeClock(DemoClock master)
+ {
+ InitializeComponent();
+ Master = master;
+ Master.MW.Main.UIGrid.Children.Insert(0, this);
+
+ TimeTimer = new DispatcherTimer();
+ TimeTimer.Interval = TimeSpan.FromSeconds(1);
+ TimeTimer.Tick += TimeTimer_Tick;
+ TimeTimer.Start();
+
+ CountTimer = new DispatcherTimer();
+ //CountTimer.Interval = TimeSpan.FromSeconds(1);
+ CountTimer.Tick += CountTimer_Tick;
+
+ CloseTimer = new Timer()
+ {
+ Interval = 4000,
+ AutoReset = false,
+ Enabled = false
+ };
+ CloseTimer.Elapsed += CloseTimer_Elapsed;
+
+ Opacity = master.Set.Opacity;
+ Margin = new Thickness(0, 0, 0, master.Set.PlaceBotton);
+ Master.MW.Main.MouseEnter += UserControl_MouseEnter;
+ Master.MW.Main.MouseLeave += UserControl_MouseLeave;
+ TimeTimer_Tick();
+
+ }
+
+ private void CloseTimer_Elapsed(object sender, ElapsedEventArgs e)
+ {
+ Dispatcher.Invoke(() =>
+ {
+ Opacity = Master.Set.Opacity;
+ if (Master.Set.PlaceAutoBack && Master.MW.Main.UIGrid.Children.Contains(this))
+ {
+ Master.MW.Main.UIGrid.Children.Remove(this);
+ Master.MW.Main.UIGrid_Back.Children.Add(this);
+ }
+ });
+ }
+ private void UserControl_MouseEnter(object sender, MouseEventArgs e)
+ {
+ if (Master.Set.PlaceAutoBack && Master.MW.Main.UIGrid_Back.Children.Contains(this))
+ {
+ Master.MW.Main.UIGrid_Back.Children.Remove(this);
+ Master.MW.Main.UIGrid.Children.Insert(0, this);
+ }
+ Opacity = 0.95;
+ CloseTimer.Enabled = false;
+ }
+
+ private void UserControl_MouseLeave(object sender, MouseEventArgs e)
+ {
+ CloseTimer.Start();
+ }
+
+ bool TimeSpanChanged = false;
+ private void CountTimer_Tick(object sender = null, EventArgs e = null)
+ {
+ if (IsPause)
+ return;
+ switch (Master.mode)
+ {
+ default:
+ case Mode.None:
+ CountTimer.Stop();
+ break;
+ case Mode.Timing:
+ var diff = DateTime.Now - StartTime + PauseTime;
+ if (diff.TotalMinutes > 1)
+ {
+ TTimes.Text = diff.ToString(@"mm\:ss");
+ if (TimeSpanChanged)
+ {
+ CountTimer.Interval = TimeSpan.FromSeconds(1);
+ TimeSpanChanged = false;
+ }
+ }
+ else
+ TTimes.Text = diff.ToString(@"ss\:ff");
+
+ if (diff.TotalMinutes < 1.5)
+ {
+ TDates.Text = $"计时: {diff.TotalSeconds:f1} 秒";
+ }
+ else if (diff.TotalHours < 1.5)
+ {
+ TDates.Text = $"计时: {diff.TotalMinutes:f1} 分钟";
+ }
+ else
+ {
+ TDates.Text = $"计时: {diff.Hours:f1} 小时";
+ }
+ break;
+ case Mode.CountDown:
+ diff = StartTime - DateTime.Now;
+ if (diff <= TimeSpan.Zero)
+ {
+ TTimes.Text = "时间到";
+ TDates.Text = "计时结束";
+ TOthers.Text = "点击此处回到时间显示";
+ TOthers.Visibility = Visibility.Visible;
+ Master.mode = Mode.CountDown_End;
+ CountTimer.Stop();
+ return;
+ }
+ PBTimeLeft.Value = PBTimeLeft.Maximum - diff.TotalMinutes;
+ if (diff.TotalMinutes < 1)
+ {
+ TTimes.Text = diff.ToString(@"ss\:ff");
+ if (TimeSpanChanged)
+ {
+ CountTimer.Interval = TimeSpan.FromMilliseconds(10);
+ TimeSpanChanged = false;
+ }
+ }
+ else
+ {
+ TTimes.Text = diff.ToString(@"mm\:ss");
+ }
+ if (diff.TotalMinutes < 1.5)
+ {
+ TDates.Text = $"剩余: {diff.TotalSeconds:f1} 秒";
+ }
+ else if (diff.TotalHours < 1.5)
+ {
+ TDates.Text = $"剩余: {diff.TotalMinutes:f1} 分钟";
+ }
+ else
+ {
+ TDates.Text = $"剩余: {diff.Hours:f1} 小时";
+ }
+ break;
+ case Mode.Tomato_Work:
+ diff = DateTime.Now - StartTime;
+ var diffleft = TimeSpan.FromMinutes(Master.Set.Tomato_WorkTime) - diff;
+ if (diffleft <= TimeSpan.Zero)
+ {
+ Master.Set.AddTomato((int)Master.Set.Tomato_WorkTime / 10);
+ Master.MW.Core.Save.Money += (int)Master.Set.Tomato_WorkTime / 10;
+ TTimes.Text = "时间到";
+ TDates.Text = "工作结束";
+ TOthers.Text = "点击此处开始休息";
+ Master.mode = Mode.CountDown_End;
+ CountTimer.Stop();
+ return;
+ }
+ TTimes.Text = diff.TotalMinutes.ToString("f1") + 'm';
+ PBTimeLeft.Value = diff.TotalMinutes;
+ if (diffleft.TotalMinutes < 1.5)
+ {
+ TDates.Text = $"工作剩{diffleft.TotalSeconds:f1}秒";
+ }
+ else if (diffleft.TotalHours < 1.5)
+ {
+ TDates.Text = $"工作剩{diffleft.TotalMinutes:f1}分钟";
+ }
+ else
+ {
+ TDates.Text = $"工作剩{diffleft.Hours:f1}小时";
+ }
+ break;
+ case Mode.Tomato_Rest:
+ diff = DateTime.Now - StartTime;
+ diffleft = TimeSpan.FromMinutes(Master.Set.Tomato_RestTime) - diff;
+ if (diffleft <= TimeSpan.Zero)
+ {
+ TTimes.Text = "时间到";
+ TDates.Text = "休息结束";
+ TOthers.Text = "点击此处开始工作";
+ Master.mode = Mode.CountDown_End;
+ CountTimer.Stop();
+ return;
+ }
+ TTimes.Text = diff.TotalMinutes.ToString("f1") + 'm';
+ PBTimeLeft.Value = diff.TotalMinutes;
+
+ if (diffleft.TotalMinutes < 1.5)
+ {
+ TDates.Text = $"休息剩{diffleft.TotalSeconds:f1}秒";
+ }
+ else if (diffleft.TotalHours < 1.5)
+ {
+ TDates.Text = $"休息剩{diffleft.TotalMinutes:f1}分钟";
+ }
+ else
+ {
+ TDates.Text = $"休息剩{diffleft.Hours:f1}小时";
+ }
+ break;
+ case Mode.Tomato_Rest_Long:
+ diff = DateTime.Now - StartTime;
+ diffleft = TimeSpan.FromMinutes(Master.Set.Tomato_RestTimeLong) - diff;
+ if (diffleft <= TimeSpan.Zero)
+ {
+ TTimes.Text = "时间到";
+ TDates.Text = "长休息结束";
+ TOthers.Text = "点击此处开始工作";
+ Master.mode = Mode.CountDown_End;
+ CountTimer.Stop();
+ return;
+ }
+ TTimes.Text = diff.TotalMinutes.ToString("f1") + 'm';
+ PBTimeLeft.Value = diff.TotalMinutes;
+
+ if (diffleft.TotalMinutes < 1.5)
+ {
+ TDates.Text = $"休息剩{diffleft.TotalSeconds:f1}秒";
+ }
+ else if (diffleft.TotalHours < 1.5)
+ {
+ TDates.Text = $"休息剩{diffleft.TotalMinutes:f1}分钟";
+ }
+ else
+ {
+ TDates.Text = $"休息剩{diffleft.Hours:f1}小时";
+ }
+ break;
+ }
+ }
+ public void StartTiming()
+ {
+ StartTime = DateTime.Now;
+ TimeSpanChanged = true;
+ TOthers.Visibility = Visibility.Collapsed;
+ IsPause = false;
+ PauseTime = TimeSpan.Zero;
+ CountTimer.Interval = TimeSpan.FromMilliseconds(10);
+ CountTimer.Start();
+ Master.mode = Mode.Timing;
+ }
+ public void PauseTiming()
+ {
+ IsPause = true;
+ CountTimer.IsEnabled = false;
+ PauseTime += DateTime.Now - StartTime;
+ TDates.Text = "计时暂停" + TDates.Text.Substring(3);
+ }
+ public void ContinueTiming()
+ {
+ StartTime = DateTime.Now;
+ IsPause = false;
+ CountTimer.Start();
+ CountTimer_Tick();
+ }
+ public void StartCountDown(TimeSpan time)
+ {
+ Master.mode = Mode.CountDown;
+ StartTime = DateTime.Now + time;
+ TimeSpanChanged = true;
+ IsPause = false;
+ TOthers.Visibility = Visibility.Collapsed;
+ PauseTime = TimeSpan.Zero;
+ PBTimeLeft.Value = 0;
+ PBTimeLeft.Maximum = time.TotalMinutes;
+ PBTimeLeft.Visibility = Visibility.Visible;
+ CountTimer.Interval = TimeSpan.FromSeconds(1);
+ CountTimer.Start();
+ }
+ public void ContinueCountDown()
+ {
+ StartTime = DateTime.Now + PauseTime;
+ IsPause = false;
+ CountTimer.Start();
+ CountTimer_Tick();
+ }
+ public void PauseCountDown()
+ {
+ IsPause = true;
+ CountTimer.IsEnabled = false;
+ PauseTime = StartTime - DateTime.Now;
+ }
+ public void StartWork()
+ {
+ Master.mode = Mode.Tomato_Work;
+ StartTime = DateTime.Now;
+ IsPause = false;
+ TOthers.Visibility = Visibility.Visible;
+ TOthers.Text = $"番茄点数 {Master.Set.Tomato_Count} 累计点数 {Master.Set.Tomato_Count_Total}";
+ PauseTime = TimeSpan.Zero;
+ PBTimeLeft.Value = 0;
+ PBTimeLeft.Visibility = Visibility.Visible;
+ PBTimeLeft.Maximum = Master.Set.Tomato_WorkTime;
+ CountTimer.Interval = TimeSpan.FromSeconds(1);
+ CountTimer.Start();
+ }
+ public void StartRest()
+ {
+ Master.mode = Mode.Tomato_Rest;
+ StartTime = DateTime.Now;
+ IsPause = false;
+ TOthers.Visibility = Visibility.Visible;
+ TOthers.Text = $"番茄点数 {Master.Set.Tomato_Count} 累计点数 {Master.Set.Tomato_Count_Total}";
+ PauseTime = TimeSpan.Zero;
+ PBTimeLeft.Value = 0;
+ PBTimeLeft.Visibility = Visibility.Visible;
+ PBTimeLeft.Maximum = Master.Set.Tomato_RestTime;
+ CountTimer.Interval = TimeSpan.FromSeconds(1);
+ CountTimer.Start();
+ }
+ public void StartRestLong()
+ {
+ Master.mode = Mode.Tomato_Rest_Long;
+ StartTime = DateTime.Now;
+ IsPause = false;
+ TOthers.Visibility = Visibility.Visible;
+ TOthers.Text = $"番茄点数 {Master.Set.Tomato_Count} 累计点数 {Master.Set.Tomato_Count_Total}";
+ PauseTime = TimeSpan.Zero;
+ PBTimeLeft.Value = 0;
+ PBTimeLeft.Visibility = Visibility.Visible;
+ PBTimeLeft.Maximum = Master.Set.Tomato_RestTimeLong;
+ CountTimer.Interval = TimeSpan.FromSeconds(1);
+ CountTimer.Start();
+ }
+
+ private void TimeTimer_Tick(object sender = null, EventArgs e = null)
+ {
+ //相关UI更新
+ if (Master.mode == Mode.None)
+ {
+ if (Master.Set.Hour24)
+ {
+ TTimes.Text = DateTime.Now.ToString("HH:mm");
+ }
+ else
+ {
+ TTimes.Text = DateTime.Now.ToString("hh:mm");
+ }
+ TDayofWeek.Text = DateTime.Now.ToString("tt dddd");
+ TDates.Text = DateTime.Now.ToString("yyyy/MM/dd");
+ }
+ else
+ {
+ if (Master.Set.Hour24)
+ {
+ TDayofWeek.Text = DateTime.Now.ToString("tt HH:mm");
+ }
+ else
+ {
+ TDayofWeek.Text = DateTime.Now.ToString("tt hh:mm");
+ }
+ }
+ }
+
+ public void CountDownMenuItem_Click(object sender, RoutedEventArgs e)
+ {
+ if (Master.mode == Mode.CountDown)
+ {
+ if (IsPause)
+ {
+ ContinueCountDown();
+ CountDownMenuItem.Header = "暂停倒计时";
+ Master.mCountDown.Header = "暂停倒计时";
+ }
+ else
+ {
+ PauseCountDown();
+ CountDownMenuItem.Header = "继续倒计时";
+ Master.mCountDown.Header = "继续倒计时";
+ }
+ }
+ else
+ {
+ CountDownInput input = new CountDownInput(TimeSpan.FromMinutes(Master.Set.DefaultCountDown));
+ if (input.ShowDialog() == true && input.Return != TimeSpan.Zero)
+ {
+ StartCountDown(input.Return);
+ CountDownMenuItem.Header = "暂停倒计时";
+ Master.mCountDown.Header = "暂停倒计时";
+ }
+ }
+ }
+
+ private void SettingMenuItem_Click(object sender, RoutedEventArgs e)
+ {
+ Master.Setting();
+ }
+
+ public void TimingMenuItem_Click(object sender, RoutedEventArgs e)
+ {
+ if (Master.mode == Mode.Timing)
+ {
+ if (IsPause)
+ {
+ ContinueTiming();
+ TimingMenuItem.Header = "暂停计时";
+ Master.mTiming.Header = "暂停计时";
+ }
+ else
+ {
+ PauseTiming();
+ TimingMenuItem.Header = "继续计时";
+ Master.mTiming.Header = "继续计时";
+ }
+ }
+ else
+ {
+ StartTiming();
+ TimingMenuItem.Header = "暂停计时";
+ Master.mTiming.Header = "暂停计时";
+ }
+ }
+
+ public void WorkMenuItem_Click(object sender, RoutedEventArgs e)
+ {
+ if (Master.mode == Mode.Tomato_Work)
+ {
+ if (MessageBoxX.Show("是否停止当前工作?", "停止工作", MessageBoxButton.YesNo) == MessageBoxResult.Yes)
+ {
+ Master.mode = Mode.None;
+ CountTimer.IsEnabled = false;
+ TOthers.Visibility = Visibility.Collapsed;
+ PBTimeLeft.Visibility = Visibility.Collapsed;
+ WorkMenuItem.Header = "开始工作";
+ Master.mTotmatoWork.Header = "开始工作";
+ }
+ }
+ else if (Master.mode == Mode.Tomato_Rest)
+ {
+ if (MessageBoxX.Show("是否停止当前休息?", "停止休息", MessageBoxButton.YesNo) == MessageBoxResult.Yes)
+ {
+ Master.mode = Mode.None;
+ CountTimer.IsEnabled = false;
+ TOthers.Visibility = Visibility.Collapsed;
+ PBTimeLeft.Visibility = Visibility.Collapsed;
+ WorkMenuItem.Header = "开始工作";
+ Master.mTotmatoWork.Header = "开始工作";
+ }
+ }
+ else
+ {
+ StartWork();
+ WorkMenuItem.Header = "停止工作";
+ Master.mTotmatoWork.Header = "停止工作";
+ }
+ }
+
+ public void RestMenuItem_Click(object sender, RoutedEventArgs e)
+ {
+ if (Master.mode == Mode.Tomato_Rest || Master.mode == Mode.Tomato_Rest_Long)
+ {
+ if (MessageBoxX.Show("是否停止当前休息?\n扣除的番茄不会被退还", "停止休息", MessageBoxButton.YesNo) == MessageBoxResult.Yes)
+ {
+ Master.mode = Mode.None;
+ CountTimer.IsEnabled = false;
+ TOthers.Visibility = Visibility.Collapsed;
+ PBTimeLeft.Visibility = Visibility.Collapsed;
+ WorkMenuItem.Header = "开始休息";
+ Master.mTotmatoWork.Header = "开始休息";
+ }
+ }
+ else
+ {
+ int need = (int)Math.Round(Master.Set.Tomato_RestTimeLong / 2);
+ if (Master.Set.Tomato_Count <= Master.Set.Tomato_RestTimeLong / 2 && MessageBoxResult.Yes ==
+ MessageBoxX.Show($"是否开始休息?\n休息所需番茄 {need}\n当前拥有番茄 {Master.Set.Tomato_Count}", "开始休息", MessageBoxButton.YesNo))
+ {
+ Master.Set.Tomato_Count -= need;
+ StartRestLong();
+ WorkMenuItem.Header = "停止休息";
+ Master.mTotmatoWork.Header = "停止休息";
+ }
+ else
+ {
+ MessageBoxX.Show($"当前番茄不足,不能开始长休息\n休息所需番茄 {need}\n当前拥有番茄 {Master.Set.Tomato_Count}", "休息失败,请好好工作");
+ }
+ }
+ }
+
+ private void UserControl_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
+ {
+ switch (TDates.Text)
+ {
+ case "计时结束":
+ Master.mode = Mode.None;
+ CountTimer.IsEnabled = false;
+ TOthers.Visibility = Visibility.Collapsed;
+ PBTimeLeft.Visibility = Visibility.Collapsed;
+ CountDownMenuItem.Header = "开始倒计时";
+ Master.mCountDown.Header = "开始倒计时";
+ break;
+ case "工作结束":
+ StartRest();
+ break;
+ case "休息结束":
+ case "长休息结束":
+ StartWork();
+ break;
+ }
+ }
+ }
+}
diff --git a/VPet.Plugin.DemoClock/VPet.Plugin.DemoClock.csproj b/VPet.Plugin.DemoClock/VPet.Plugin.DemoClock.csproj
new file mode 100644
index 0000000..85dcd3e
--- /dev/null
+++ b/VPet.Plugin.DemoClock/VPet.Plugin.DemoClock.csproj
@@ -0,0 +1,115 @@
+
+
+
+
+ Debug
+ AnyCPU
+ {D23F1150-999F-4698-800C-4E60FF853A3E}
+ library
+ VPet.Plugin.DemoClock
+ VPet.Plugin.DemoClock
+ v4.6.2
+ 512
+ {60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
+ 4
+ true
+
+
+ true
+ full
+ false
+ bin\Debug\
+ DEBUG;TRACE
+ prompt
+ 4
+
+
+ pdbonly
+ true
+ bin\Release\
+ TRACE
+ prompt
+ 4
+
+
+
+ ..\packages\LinePutScript.1.6.1\lib\net462\LinePutScript.dll
+
+
+ ..\packages\Panuon.WPF.1.0.1\lib\net462\Panuon.WPF.dll
+
+
+ ..\packages\Panuon.WPF.UI.1.1.8.5\lib\net462\Panuon.WPF.UI.dll
+
+
+
+
+
+
+
+
+
+
+ 4.0
+
+
+ ..\packages\VPet-Simulator.Core.0.1.1\lib\net462\VPet-Simulator.Core.dll
+
+
+ ..\packages\VPet-Simulator.Windows.Interface.0.1.2\lib\net462\VPet-Simulator.Windows.Interface.dll
+
+
+
+
+
+
+
+ CountDownInput.xaml
+
+
+
+
+ winSetting.xaml
+
+
+ TimeClock.xaml
+
+
+ Designer
+ MSBuild:Compile
+
+
+ Designer
+ MSBuild:Compile
+
+
+ Designer
+ MSBuild:Compile
+
+
+
+
+ Code
+
+
+ True
+ True
+ Resources.resx
+
+
+ True
+ Settings.settings
+ True
+
+
+ ResXFileCodeGenerator
+ Resources.Designer.cs
+
+
+
+ SettingsSingleFileGenerator
+ Settings.Designer.cs
+
+
+
+
\ No newline at end of file
diff --git a/VPet.Plugin.DemoClock/packages.config b/VPet.Plugin.DemoClock/packages.config
new file mode 100644
index 0000000..a966889
--- /dev/null
+++ b/VPet.Plugin.DemoClock/packages.config
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/VPet.Plugin.DemoClock/winSetting.xaml b/VPet.Plugin.DemoClock/winSetting.xaml
new file mode 100644
index 0000000..ae7b68e
--- /dev/null
+++ b/VPet.Plugin.DemoClock/winSetting.xaml
@@ -0,0 +1,153 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 默认系统声音 - Win10
+ 少女 - NyaSwarm
+ 秘书 - 杨远
+ 萝莉 - 喵霸霸
+
+
+
+
+
diff --git a/VPet.Plugin.DemoClock/winSetting.xaml.cs b/VPet.Plugin.DemoClock/winSetting.xaml.cs
new file mode 100644
index 0000000..3861057
--- /dev/null
+++ b/VPet.Plugin.DemoClock/winSetting.xaml.cs
@@ -0,0 +1,173 @@
+using Microsoft.Win32;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using System.Windows.Shapes;
+
+namespace VPet.Plugin.DemoClock
+{
+ ///
+ /// winSetting.xaml 的交互逻辑
+ ///
+ public partial class winSetting : Window
+ {
+ private bool AllowChange = false;
+ DemoClock Master;
+ Setting Set;
+ public winSetting(DemoClock master)
+ {
+ InitializeComponent();
+ Master = master;
+ Set = Master.Set;
+ Switch24h.IsChecked = Set.Hour24;
+ PlaceSilder.Value = Set.PlaceBotton;
+ OpacitySilder.Value = Set.Opacity * 100;
+ SwitchAutoLayer.IsChecked = Set.PlaceAutoBack;
+ NumTimeDiff.Value = Set.TimeShifting;
+ NumDefCountDown.Value = Set.DefaultCountDown;
+ NumTomatoWork.Value = Set.Tomato_WorkTime;
+ NumTomatoRest.Value = Set.Tomato_RestTime;
+ NumTomatoRestLong.Value = Set.Tomato_RestTimeLong;
+ TextCountDown.Text = Set.CountDownVoice;
+ TextTomatoWork.Text = Set.Tomato_WorkVoice;
+ TextTomatoRest.Text = Set.Tomato_RestVoice;
+ TextTomatoEnd.Text = Set.Tomato_EndVoice;
+
+ AllowChange = true;
+ }
+
+ private void Switch24h_Checked(object sender, RoutedEventArgs e)
+ {
+ if (!AllowChange)
+ return;
+ Set.Hour24 = Switch24h.IsChecked.Value;
+ }
+
+ private void PlaceSilder_ValueChanged(object sender, RoutedPropertyChangedEventArgs e)
+ {
+ if (!AllowChange)
+ return;
+ Set.PlaceBotton = PlaceSilder.Value;
+ Master.WPFTimeClock.Margin = new Thickness(0, 0, 0, Set.PlaceBotton);
+ }
+
+ private void OpacitySilder_ValueChanged(object sender, RoutedPropertyChangedEventArgs e)
+ {
+ if (!AllowChange)
+ return;
+ Set.Opacity = OpacitySilder.Value / 100;
+ if(Master.WPFTimeClock.Opacity != 0.95)
+ Master.WPFTimeClock.Opacity = Set.Opacity;
+ }
+
+ private void SwitchAutoLayer_Checked(object sender, RoutedEventArgs e)
+ {
+ if (!AllowChange)
+ return;
+ Set.PlaceAutoBack = SwitchAutoLayer.IsChecked.Value;
+ if (Master.Set.PlaceAutoBack && Master.MW.Main.UIGrid_Back.Children.Contains(Master.WPFTimeClock))
+ {
+ Master.MW.Main.UIGrid_Back.Children.Remove(Master.WPFTimeClock);
+ Master.MW.Main.UIGrid.Children.Insert(0, Master.WPFTimeClock);
+ }
+ }
+
+ private void NumTimeDiff_ValueChanged(object sender, Panuon.WPF.SelectedValueChangedRoutedEventArgs e)
+ {
+ if (!AllowChange)
+ return;
+ Set.TimeShifting = NumTimeDiff.Value;
+ }
+
+ private void NumDefCountDown_ValueChanged(object sender, Panuon.WPF.SelectedValueChangedRoutedEventArgs e)
+ {
+ if (!AllowChange)
+ return;
+ Set.DefaultCountDown = NumDefCountDown.Value;
+ }
+
+ private void TextCountDown_TextChanged(object sender, TextChangedEventArgs e)
+ {
+ if (!AllowChange)
+ return;
+ Set.CountDownVoice = TextCountDown.Text;
+ }
+
+ private void NumTomatoWork_ValueChanged(object sender, Panuon.WPF.SelectedValueChangedRoutedEventArgs e)
+ {
+ if (!AllowChange)
+ return;
+ Set.Tomato_WorkTime = NumTomatoWork.Value;
+ }
+
+ private void NumTomatoRest_ValueChanged(object sender, Panuon.WPF.SelectedValueChangedRoutedEventArgs e)
+ {
+ if (!AllowChange)
+ return;
+ Set.Tomato_RestTime = NumTomatoRest.Value;
+ }
+
+ private void NumTomatoRestLong_ValueChanged(object sender, Panuon.WPF.SelectedValueChangedRoutedEventArgs e)
+ {
+ if (!AllowChange)
+ return;
+ Set.Tomato_RestTimeLong = NumTomatoRestLong.Value;
+ }
+ private void TextTomatoWork_TextChanged(object sender, TextChangedEventArgs e)
+ {
+ if (!AllowChange)
+ return;
+ Set.Tomato_WorkVoice = TextTomatoWork.Text;
+ }
+
+ private void TextTomatoRest_TextChanged(object sender, TextChangedEventArgs e)
+ {
+ if (!AllowChange)
+ return;
+ Set.Tomato_RestVoice = TextTomatoRest.Text;
+ }
+
+ private void TextTomatoEnd_TextChanged(object sender, TextChangedEventArgs e)
+ {
+ if (!AllowChange)
+ return;
+ Set.Tomato_EndVoice = TextTomatoEnd.Text;
+ }
+
+ private void btn_path_Click(object sender, RoutedEventArgs e)
+ {
+ OpenFileDialog openFileDialog = new OpenFileDialog();
+ openFileDialog.Filter = "音频文件|*.wav;*.mp3";
+
+ if (openFileDialog.ShowDialog() != true)
+ {
+ return;
+ }
+ Button button = sender as Button;
+ switch (button.Tag)
+ {
+ case "CountDown":
+ TextCountDown.Text = openFileDialog.FileName;
+ break;
+ case "TomatoWork":
+ TextTomatoWork.Text = openFileDialog.FileName;
+ break;
+ case "TomatoRest":
+ TextTomatoRest.Text = openFileDialog.FileName;
+ break;
+ case "TomatoEnd":
+ TextTomatoEnd.Text = openFileDialog.FileName;
+ break;
+ }
+ }
+ }
+}
diff --git a/democlock.aseprite b/democlock.aseprite
new file mode 100644
index 0000000..a2d6854
Binary files /dev/null and b/democlock.aseprite differ
diff --git a/democlock.png b/democlock.png
new file mode 100644
index 0000000..74fb357
Binary files /dev/null and b/democlock.png differ