From 5548ddba97508d9aafcfa9652642df5c4b5d80b1 Mon Sep 17 00:00:00 2001 From: Dazed Date: Sun, 5 Nov 2023 13:04:20 -0600 Subject: [PATCH] Initial Commit --- .gitignore | 15 + README.md | 49 + builder_config.json | 1 + data/scenario/_preview.ks | 36 + data/scenario/cg1.ks | 25 + data/scenario/cg2.ks | 13 + data/scenario/cg3.ks | 24 + data/scenario/cg4.ks | 24 + data/scenario/cg5.ks | 24 + data/scenario/cg6.ks | 24 + data/scenario/cg7.ks | 11 + data/scenario/config.ks | 379 ++ data/scenario/end1.ks | 1218 ++++++ data/scenario/end2.ks | 1195 ++++++ data/scenario/end3.ks | 866 +++++ data/scenario/end4.ks | 567 +++ data/scenario/end4b.ks | 881 +++++ data/scenario/end5.ks | 983 +++++ data/scenario/end6.ks | 721 ++++ data/scenario/end7.ks | 395 ++ data/scenario/first.ks | 35 + data/scenario/make.ks | 9 + data/scenario/q1.ks | 1530 ++++++++ data/scenario/q2.ks | 336 ++ data/scenario/rep1.ks | 24 + data/scenario/rep2.ks | 24 + data/scenario/rep3.ks | 24 + data/scenario/rep4.ks | 24 + data/scenario/rep5.ks | 9 + data/scenario/scene1.ks | 289 ++ data/scenario/scene10.ks | 743 ++++ data/scenario/scene11.ks | 845 +++++ data/scenario/scene12.ks | 841 ++++ data/scenario/scene13.ks | 651 ++++ data/scenario/scene14.ks | 1179 ++++++ data/scenario/scene2.ks | 778 ++++ data/scenario/scene3.ks | 207 + data/scenario/scene4.ks | 406 ++ data/scenario/scene5.ks | 1114 ++++++ data/scenario/scene6.ks | 630 +++ data/scenario/scene7.ks | 1103 ++++++ data/scenario/scene8.ks | 1081 ++++++ data/scenario/scene9.ks | 1170 ++++++ data/scenario/sr.ks | 50 + data/scenario/system/_cg1.ks | 3 + data/scenario/system/_cg2.ks | 3 + data/scenario/system/_cg3.ks | 3 + data/scenario/system/_cg4.ks | 3 + data/scenario/system/_cg5.ks | 3 + data/scenario/system/_cg6.ks | 3 + data/scenario/system/_config.ks | 2 + data/scenario/system/_end1.ks | 23 + data/scenario/system/_end2.ks | 30 + data/scenario/system/_end3.ks | 14 + data/scenario/system/_end4.ks | 18 + data/scenario/system/_end4b.ks | 17 + data/scenario/system/_end5.ks | 22 + data/scenario/system/_end6.ks | 15 + data/scenario/system/_end7.ks | 7 + data/scenario/system/_preview.ks | 2 + data/scenario/system/_q1.ks | 8 + data/scenario/system/_q2.ks | 3 + data/scenario/system/_rep1.ks | 3 + data/scenario/system/_rep2.ks | 3 + data/scenario/system/_rep3.ks | 3 + data/scenario/system/_rep4.ks | 3 + data/scenario/system/_scene1.ks | 10 + data/scenario/system/_scene10.ks | 23 + data/scenario/system/_scene11.ks | 13 + data/scenario/system/_scene12.ks | 19 + data/scenario/system/_scene13.ks | 19 + data/scenario/system/_scene14.ks | 28 + data/scenario/system/_scene2.ks | 9 + data/scenario/system/_scene3.ks | 7 + data/scenario/system/_scene4.ks | 15 + data/scenario/system/_scene5.ks | 29 + data/scenario/system/_scene6.ks | 17 + data/scenario/system/_scene7.ks | 29 + data/scenario/system/_scene8.ks | 26 + data/scenario/system/_scene9.ks | 28 + data/scenario/system/_sr.ks | 2 + data/scenario/system/_title_screen.ks | 2 + data/scenario/system/builder.ks | 220 ++ data/scenario/system/chara_define.ks | 24 + data/scenario/system/live2d.ks | 387 ++ data/scenario/system/live2d_define.ks | 2 + data/scenario/system/master_cg.ks | 523 +++ data/scenario/system/message_window.ks | 27 + data/scenario/system/plugin.ks | 2 + data/scenario/system/plugin_third.ks | 0 data/scenario/system/tyrano.ks | 185 + data/scenario/title_screen.ks | 34 + data/system/KeyConfig.js | 106 + node_modules/adm-zip/README.md | 64 + node_modules/adm-zip/adm-zip.js | 475 +++ node_modules/adm-zip/headers/entryHeader.js | 261 ++ node_modules/adm-zip/headers/index.js | 2 + node_modules/adm-zip/headers/mainHeader.js | 80 + node_modules/adm-zip/methods/deflater.js | 1578 ++++++++ node_modules/adm-zip/methods/index.js | 2 + node_modules/adm-zip/methods/inflater.js | 448 +++ node_modules/adm-zip/package.json | 51 + node_modules/adm-zip/util/constants.js | 115 + node_modules/adm-zip/util/errors.js | 35 + node_modules/adm-zip/util/fattr.js | 84 + node_modules/adm-zip/util/index.js | 4 + node_modules/adm-zip/util/utils.js | 199 + node_modules/adm-zip/zipEntry.js | 284 ++ node_modules/adm-zip/zipFile.js | 311 ++ node_modules/fs-extra/LICENSE | 15 + node_modules/fs-extra/README.md | 588 +++ .../fs-extra/lib/copy-sync/copy-file-sync.js | 39 + .../fs-extra/lib/copy-sync/copy-sync.js | 48 + node_modules/fs-extra/lib/copy-sync/index.js | 3 + node_modules/fs-extra/lib/copy/copy.js | 44 + node_modules/fs-extra/lib/copy/index.js | 3 + node_modules/fs-extra/lib/copy/ncp.js | 243 ++ node_modules/fs-extra/lib/empty/index.js | 47 + node_modules/fs-extra/lib/ensure/file.js | 43 + node_modules/fs-extra/lib/ensure/index.js | 21 + node_modules/fs-extra/lib/ensure/link.js | 58 + .../fs-extra/lib/ensure/symlink-paths.js | 97 + .../fs-extra/lib/ensure/symlink-type.js | 27 + node_modules/fs-extra/lib/ensure/symlink.js | 62 + node_modules/fs-extra/lib/index.js | 37 + node_modules/fs-extra/lib/json/index.js | 9 + node_modules/fs-extra/lib/json/jsonfile.js | 14 + .../fs-extra/lib/json/output-json-sync.js | 16 + node_modules/fs-extra/lib/json/output-json.js | 24 + node_modules/fs-extra/lib/mkdirs/index.js | 9 + .../fs-extra/lib/mkdirs/mkdirs-sync.js | 57 + node_modules/fs-extra/lib/mkdirs/mkdirs.js | 61 + node_modules/fs-extra/lib/mkdirs/win32.js | 24 + node_modules/fs-extra/lib/move/index.js | 161 + node_modules/fs-extra/lib/output/index.js | 35 + node_modules/fs-extra/lib/remove/index.js | 14 + node_modules/fs-extra/lib/util/assign.js | 14 + node_modules/fs-extra/lib/util/utimes.js | 69 + node_modules/fs-extra/lib/walk/index.js | 5 + .../fs-extra/node_modules/graceful-fs/LICENSE | 15 + .../node_modules/graceful-fs/README.md | 133 + .../fs-extra/node_modules/graceful-fs/fs.js | 21 + .../node_modules/graceful-fs/graceful-fs.js | 262 ++ .../graceful-fs/legacy-streams.js | 118 + .../node_modules/graceful-fs/package.json | 77 + .../node_modules/graceful-fs/polyfills.js | 310 ++ .../fs-extra/node_modules/jsonfile/LICENSE | 15 + .../fs-extra/node_modules/jsonfile/README.md | 162 + .../fs-extra/node_modules/jsonfile/index.js | 133 + .../node_modules/jsonfile/package.json | 71 + .../fs-extra/node_modules/klaw/LICENSE | 15 + .../fs-extra/node_modules/klaw/README.md | 270 ++ .../fs-extra/node_modules/klaw/package.json | 66 + .../fs-extra/node_modules/klaw/src/assign.js | 16 + .../fs-extra/node_modules/klaw/src/index.js | 52 + .../node_modules/path-is-absolute/index.js | 20 + .../node_modules/path-is-absolute/license | 21 + .../path-is-absolute/package.json | 77 + .../node_modules/path-is-absolute/readme.md | 59 + .../fs-extra/node_modules/rimraf/LICENSE | 15 + .../fs-extra/node_modules/rimraf/README.md | 101 + .../fs-extra/node_modules/rimraf/bin.js | 40 + .../rimraf/node_modules/glob/LICENSE | 15 + .../rimraf/node_modules/glob/README.md | 368 ++ .../rimraf/node_modules/glob/common.js | 236 ++ .../rimraf/node_modules/glob/glob.js | 790 ++++ .../glob/node_modules/inflight/LICENSE | 15 + .../glob/node_modules/inflight/README.md | 37 + .../glob/node_modules/inflight/inflight.js | 44 + .../inflight/node_modules/wrappy/LICENSE | 15 + .../inflight/node_modules/wrappy/README.md | 36 + .../inflight/node_modules/wrappy/package.json | 63 + .../inflight/node_modules/wrappy/wrappy.js | 33 + .../glob/node_modules/inflight/package.json | 72 + .../glob/node_modules/inherits/LICENSE | 16 + .../glob/node_modules/inherits/README.md | 42 + .../glob/node_modules/inherits/inherits.js | 7 + .../node_modules/inherits/inherits_browser.js | 23 + .../glob/node_modules/inherits/package.json | 63 + .../glob/node_modules/minimatch/LICENSE | 15 + .../glob/node_modules/minimatch/README.md | 209 + .../glob/node_modules/minimatch/minimatch.js | 923 +++++ .../node_modules/brace-expansion/README.md | 122 + .../node_modules/brace-expansion/index.js | 201 + .../node_modules/balanced-match/README.md | 91 + .../node_modules/balanced-match/index.js | 58 + .../node_modules/balanced-match/package.json | 77 + .../node_modules/concat-map/LICENSE | 18 + .../node_modules/concat-map/example/map.js | 6 + .../node_modules/concat-map/index.js | 13 + .../node_modules/concat-map/package.json | 83 + .../node_modules/concat-map/test/map.js | 39 + .../node_modules/brace-expansion/package.json | 79 + .../glob/node_modules/minimatch/package.json | 64 + .../glob/node_modules/once/LICENSE | 15 + .../glob/node_modules/once/README.md | 79 + .../once/node_modules/wrappy/LICENSE | 15 + .../once/node_modules/wrappy/README.md | 36 + .../once/node_modules/wrappy/package.json | 63 + .../once/node_modules/wrappy/wrappy.js | 33 + .../glob/node_modules/once/once.js | 42 + .../glob/node_modules/once/package.json | 67 + .../rimraf/node_modules/glob/package.json | 78 + .../rimraf/node_modules/glob/sync.js | 478 +++ .../fs-extra/node_modules/rimraf/package.json | 66 + .../fs-extra/node_modules/rimraf/rimraf.js | 343 ++ node_modules/fs-extra/package.json | 94 + package.json | 1 + tyrano/lang.js | 33 + tyrano/libs.js | 1329 +++++++ tyrano/libs/alertify/alertify.min.js | 2 + tyrano/libs/html2canvas.js | 3376 +++++++++++++++++ tyrano/libs/jquery-1.10.2.min.js | 5 + tyrano/libs/jquery-2.0.3.min.js | 6 + tyrano/libs/jquery-ui.min.js | 12 + tyrano/libs/jquery.a3d.js | 495 +++ tyrano/libs/jquery.a3d.min.js | 280 ++ tyrano/libs/jquery.touchSwipe.min.js | 14 + tyrano/libs/jsrender.min.js | 3 + tyrano/libs/lz-string.min.js | 1 + tyrano/libs/remodal/remodal.js | 785 ++++ .../libs/textillate/assets/jquery.fittext.js | 43 + .../textillate/assets/jquery.lettering.js | 66 + tyrano/libs/textillate/jquery.textillate.js | 287 ++ tyrano/plugins/kag/kag.event.js | 1 + tyrano/plugins/kag/kag.js | 35 + tyrano/plugins/kag/kag.key_mouse.js | 12 + tyrano/plugins/kag/kag.layer.js | 16 + tyrano/plugins/kag/kag.menu.js | 29 + tyrano/plugins/kag/kag.parser.js | 10 + tyrano/plugins/kag/kag.rider.js | 5 + tyrano/plugins/kag/kag.tag.js | 115 + tyrano/plugins/kag/kag.tag_audio.js | 26 + tyrano/plugins/kag/kag.tag_camera.js | 12 + tyrano/plugins/kag/kag.tag_ext.js | 75 + tyrano/plugins/kag/kag.tag_system.js | 37 + tyrano/tyrano.base.js | 108 + tyrano/tyrano.js | 139 + 238 files changed, 43119 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 builder_config.json create mode 100644 data/scenario/_preview.ks create mode 100644 data/scenario/cg1.ks create mode 100644 data/scenario/cg2.ks create mode 100644 data/scenario/cg3.ks create mode 100644 data/scenario/cg4.ks create mode 100644 data/scenario/cg5.ks create mode 100644 data/scenario/cg6.ks create mode 100644 data/scenario/cg7.ks create mode 100644 data/scenario/config.ks create mode 100644 data/scenario/end1.ks create mode 100644 data/scenario/end2.ks create mode 100644 data/scenario/end3.ks create mode 100644 data/scenario/end4.ks create mode 100644 data/scenario/end4b.ks create mode 100644 data/scenario/end5.ks create mode 100644 data/scenario/end6.ks create mode 100644 data/scenario/end7.ks create mode 100644 data/scenario/first.ks create mode 100644 data/scenario/make.ks create mode 100644 data/scenario/q1.ks create mode 100644 data/scenario/q2.ks create mode 100644 data/scenario/rep1.ks create mode 100644 data/scenario/rep2.ks create mode 100644 data/scenario/rep3.ks create mode 100644 data/scenario/rep4.ks create mode 100644 data/scenario/rep5.ks create mode 100644 data/scenario/scene1.ks create mode 100644 data/scenario/scene10.ks create mode 100644 data/scenario/scene11.ks create mode 100644 data/scenario/scene12.ks create mode 100644 data/scenario/scene13.ks create mode 100644 data/scenario/scene14.ks create mode 100644 data/scenario/scene2.ks create mode 100644 data/scenario/scene3.ks create mode 100644 data/scenario/scene4.ks create mode 100644 data/scenario/scene5.ks create mode 100644 data/scenario/scene6.ks create mode 100644 data/scenario/scene7.ks create mode 100644 data/scenario/scene8.ks create mode 100644 data/scenario/scene9.ks create mode 100644 data/scenario/sr.ks create mode 100644 data/scenario/system/_cg1.ks create mode 100644 data/scenario/system/_cg2.ks create mode 100644 data/scenario/system/_cg3.ks create mode 100644 data/scenario/system/_cg4.ks create mode 100644 data/scenario/system/_cg5.ks create mode 100644 data/scenario/system/_cg6.ks create mode 100644 data/scenario/system/_config.ks create mode 100644 data/scenario/system/_end1.ks create mode 100644 data/scenario/system/_end2.ks create mode 100644 data/scenario/system/_end3.ks create mode 100644 data/scenario/system/_end4.ks create mode 100644 data/scenario/system/_end4b.ks create mode 100644 data/scenario/system/_end5.ks create mode 100644 data/scenario/system/_end6.ks create mode 100644 data/scenario/system/_end7.ks create mode 100644 data/scenario/system/_preview.ks create mode 100644 data/scenario/system/_q1.ks create mode 100644 data/scenario/system/_q2.ks create mode 100644 data/scenario/system/_rep1.ks create mode 100644 data/scenario/system/_rep2.ks create mode 100644 data/scenario/system/_rep3.ks create mode 100644 data/scenario/system/_rep4.ks create mode 100644 data/scenario/system/_scene1.ks create mode 100644 data/scenario/system/_scene10.ks create mode 100644 data/scenario/system/_scene11.ks create mode 100644 data/scenario/system/_scene12.ks create mode 100644 data/scenario/system/_scene13.ks create mode 100644 data/scenario/system/_scene14.ks create mode 100644 data/scenario/system/_scene2.ks create mode 100644 data/scenario/system/_scene3.ks create mode 100644 data/scenario/system/_scene4.ks create mode 100644 data/scenario/system/_scene5.ks create mode 100644 data/scenario/system/_scene6.ks create mode 100644 data/scenario/system/_scene7.ks create mode 100644 data/scenario/system/_scene8.ks create mode 100644 data/scenario/system/_scene9.ks create mode 100644 data/scenario/system/_sr.ks create mode 100644 data/scenario/system/_title_screen.ks create mode 100644 data/scenario/system/builder.ks create mode 100644 data/scenario/system/chara_define.ks create mode 100644 data/scenario/system/live2d.ks create mode 100644 data/scenario/system/live2d_define.ks create mode 100644 data/scenario/system/master_cg.ks create mode 100644 data/scenario/system/message_window.ks create mode 100644 data/scenario/system/plugin.ks create mode 100644 data/scenario/system/plugin_third.ks create mode 100644 data/scenario/system/tyrano.ks create mode 100644 data/scenario/title_screen.ks create mode 100644 data/system/KeyConfig.js create mode 100644 node_modules/adm-zip/README.md create mode 100644 node_modules/adm-zip/adm-zip.js create mode 100644 node_modules/adm-zip/headers/entryHeader.js create mode 100644 node_modules/adm-zip/headers/index.js create mode 100644 node_modules/adm-zip/headers/mainHeader.js create mode 100644 node_modules/adm-zip/methods/deflater.js create mode 100644 node_modules/adm-zip/methods/index.js create mode 100644 node_modules/adm-zip/methods/inflater.js create mode 100644 node_modules/adm-zip/package.json create mode 100644 node_modules/adm-zip/util/constants.js create mode 100644 node_modules/adm-zip/util/errors.js create mode 100644 node_modules/adm-zip/util/fattr.js create mode 100644 node_modules/adm-zip/util/index.js create mode 100644 node_modules/adm-zip/util/utils.js create mode 100644 node_modules/adm-zip/zipEntry.js create mode 100644 node_modules/adm-zip/zipFile.js create mode 100644 node_modules/fs-extra/LICENSE create mode 100644 node_modules/fs-extra/README.md create mode 100644 node_modules/fs-extra/lib/copy-sync/copy-file-sync.js create mode 100644 node_modules/fs-extra/lib/copy-sync/copy-sync.js create mode 100644 node_modules/fs-extra/lib/copy-sync/index.js create mode 100644 node_modules/fs-extra/lib/copy/copy.js create mode 100644 node_modules/fs-extra/lib/copy/index.js create mode 100644 node_modules/fs-extra/lib/copy/ncp.js create mode 100644 node_modules/fs-extra/lib/empty/index.js create mode 100644 node_modules/fs-extra/lib/ensure/file.js create mode 100644 node_modules/fs-extra/lib/ensure/index.js create mode 100644 node_modules/fs-extra/lib/ensure/link.js create mode 100644 node_modules/fs-extra/lib/ensure/symlink-paths.js create mode 100644 node_modules/fs-extra/lib/ensure/symlink-type.js create mode 100644 node_modules/fs-extra/lib/ensure/symlink.js create mode 100644 node_modules/fs-extra/lib/index.js create mode 100644 node_modules/fs-extra/lib/json/index.js create mode 100644 node_modules/fs-extra/lib/json/jsonfile.js create mode 100644 node_modules/fs-extra/lib/json/output-json-sync.js create mode 100644 node_modules/fs-extra/lib/json/output-json.js create mode 100644 node_modules/fs-extra/lib/mkdirs/index.js create mode 100644 node_modules/fs-extra/lib/mkdirs/mkdirs-sync.js create mode 100644 node_modules/fs-extra/lib/mkdirs/mkdirs.js create mode 100644 node_modules/fs-extra/lib/mkdirs/win32.js create mode 100644 node_modules/fs-extra/lib/move/index.js create mode 100644 node_modules/fs-extra/lib/output/index.js create mode 100644 node_modules/fs-extra/lib/remove/index.js create mode 100644 node_modules/fs-extra/lib/util/assign.js create mode 100644 node_modules/fs-extra/lib/util/utimes.js create mode 100644 node_modules/fs-extra/lib/walk/index.js create mode 100644 node_modules/fs-extra/node_modules/graceful-fs/LICENSE create mode 100644 node_modules/fs-extra/node_modules/graceful-fs/README.md create mode 100644 node_modules/fs-extra/node_modules/graceful-fs/fs.js create mode 100644 node_modules/fs-extra/node_modules/graceful-fs/graceful-fs.js create mode 100644 node_modules/fs-extra/node_modules/graceful-fs/legacy-streams.js create mode 100644 node_modules/fs-extra/node_modules/graceful-fs/package.json create mode 100644 node_modules/fs-extra/node_modules/graceful-fs/polyfills.js create mode 100644 node_modules/fs-extra/node_modules/jsonfile/LICENSE create mode 100644 node_modules/fs-extra/node_modules/jsonfile/README.md create mode 100644 node_modules/fs-extra/node_modules/jsonfile/index.js create mode 100644 node_modules/fs-extra/node_modules/jsonfile/package.json create mode 100644 node_modules/fs-extra/node_modules/klaw/LICENSE create mode 100644 node_modules/fs-extra/node_modules/klaw/README.md create mode 100644 node_modules/fs-extra/node_modules/klaw/package.json create mode 100644 node_modules/fs-extra/node_modules/klaw/src/assign.js create mode 100644 node_modules/fs-extra/node_modules/klaw/src/index.js create mode 100644 node_modules/fs-extra/node_modules/path-is-absolute/index.js create mode 100644 node_modules/fs-extra/node_modules/path-is-absolute/license create mode 100644 node_modules/fs-extra/node_modules/path-is-absolute/package.json create mode 100644 node_modules/fs-extra/node_modules/path-is-absolute/readme.md create mode 100644 node_modules/fs-extra/node_modules/rimraf/LICENSE create mode 100644 node_modules/fs-extra/node_modules/rimraf/README.md create mode 100644 node_modules/fs-extra/node_modules/rimraf/bin.js create mode 100644 node_modules/fs-extra/node_modules/rimraf/node_modules/glob/LICENSE create mode 100644 node_modules/fs-extra/node_modules/rimraf/node_modules/glob/README.md create mode 100644 node_modules/fs-extra/node_modules/rimraf/node_modules/glob/common.js create mode 100644 node_modules/fs-extra/node_modules/rimraf/node_modules/glob/glob.js create mode 100644 node_modules/fs-extra/node_modules/rimraf/node_modules/glob/node_modules/inflight/LICENSE create mode 100644 node_modules/fs-extra/node_modules/rimraf/node_modules/glob/node_modules/inflight/README.md create mode 100644 node_modules/fs-extra/node_modules/rimraf/node_modules/glob/node_modules/inflight/inflight.js create mode 100644 node_modules/fs-extra/node_modules/rimraf/node_modules/glob/node_modules/inflight/node_modules/wrappy/LICENSE create mode 100644 node_modules/fs-extra/node_modules/rimraf/node_modules/glob/node_modules/inflight/node_modules/wrappy/README.md create mode 100644 node_modules/fs-extra/node_modules/rimraf/node_modules/glob/node_modules/inflight/node_modules/wrappy/package.json create mode 100644 node_modules/fs-extra/node_modules/rimraf/node_modules/glob/node_modules/inflight/node_modules/wrappy/wrappy.js create mode 100644 node_modules/fs-extra/node_modules/rimraf/node_modules/glob/node_modules/inflight/package.json create mode 100644 node_modules/fs-extra/node_modules/rimraf/node_modules/glob/node_modules/inherits/LICENSE create mode 100644 node_modules/fs-extra/node_modules/rimraf/node_modules/glob/node_modules/inherits/README.md create mode 100644 node_modules/fs-extra/node_modules/rimraf/node_modules/glob/node_modules/inherits/inherits.js create mode 100644 node_modules/fs-extra/node_modules/rimraf/node_modules/glob/node_modules/inherits/inherits_browser.js create mode 100644 node_modules/fs-extra/node_modules/rimraf/node_modules/glob/node_modules/inherits/package.json create mode 100644 node_modules/fs-extra/node_modules/rimraf/node_modules/glob/node_modules/minimatch/LICENSE create mode 100644 node_modules/fs-extra/node_modules/rimraf/node_modules/glob/node_modules/minimatch/README.md create mode 100644 node_modules/fs-extra/node_modules/rimraf/node_modules/glob/node_modules/minimatch/minimatch.js create mode 100644 node_modules/fs-extra/node_modules/rimraf/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/README.md create mode 100644 node_modules/fs-extra/node_modules/rimraf/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/index.js create mode 100644 node_modules/fs-extra/node_modules/rimraf/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/README.md create mode 100644 node_modules/fs-extra/node_modules/rimraf/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/index.js create mode 100644 node_modules/fs-extra/node_modules/rimraf/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/package.json create mode 100644 node_modules/fs-extra/node_modules/rimraf/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/LICENSE create mode 100644 node_modules/fs-extra/node_modules/rimraf/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/example/map.js create mode 100644 node_modules/fs-extra/node_modules/rimraf/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/index.js create mode 100644 node_modules/fs-extra/node_modules/rimraf/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/package.json create mode 100644 node_modules/fs-extra/node_modules/rimraf/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/test/map.js create mode 100644 node_modules/fs-extra/node_modules/rimraf/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/package.json create mode 100644 node_modules/fs-extra/node_modules/rimraf/node_modules/glob/node_modules/minimatch/package.json create mode 100644 node_modules/fs-extra/node_modules/rimraf/node_modules/glob/node_modules/once/LICENSE create mode 100644 node_modules/fs-extra/node_modules/rimraf/node_modules/glob/node_modules/once/README.md create mode 100644 node_modules/fs-extra/node_modules/rimraf/node_modules/glob/node_modules/once/node_modules/wrappy/LICENSE create mode 100644 node_modules/fs-extra/node_modules/rimraf/node_modules/glob/node_modules/once/node_modules/wrappy/README.md create mode 100644 node_modules/fs-extra/node_modules/rimraf/node_modules/glob/node_modules/once/node_modules/wrappy/package.json create mode 100644 node_modules/fs-extra/node_modules/rimraf/node_modules/glob/node_modules/once/node_modules/wrappy/wrappy.js create mode 100644 node_modules/fs-extra/node_modules/rimraf/node_modules/glob/node_modules/once/once.js create mode 100644 node_modules/fs-extra/node_modules/rimraf/node_modules/glob/node_modules/once/package.json create mode 100644 node_modules/fs-extra/node_modules/rimraf/node_modules/glob/package.json create mode 100644 node_modules/fs-extra/node_modules/rimraf/node_modules/glob/sync.js create mode 100644 node_modules/fs-extra/node_modules/rimraf/package.json create mode 100644 node_modules/fs-extra/node_modules/rimraf/rimraf.js create mode 100644 node_modules/fs-extra/package.json create mode 100644 package.json create mode 100644 tyrano/lang.js create mode 100644 tyrano/libs.js create mode 100644 tyrano/libs/alertify/alertify.min.js create mode 100644 tyrano/libs/html2canvas.js create mode 100644 tyrano/libs/jquery-1.10.2.min.js create mode 100644 tyrano/libs/jquery-2.0.3.min.js create mode 100644 tyrano/libs/jquery-ui.min.js create mode 100644 tyrano/libs/jquery.a3d.js create mode 100644 tyrano/libs/jquery.a3d.min.js create mode 100644 tyrano/libs/jquery.touchSwipe.min.js create mode 100644 tyrano/libs/jsrender.min.js create mode 100644 tyrano/libs/lz-string.min.js create mode 100644 tyrano/libs/remodal/remodal.js create mode 100644 tyrano/libs/textillate/assets/jquery.fittext.js create mode 100644 tyrano/libs/textillate/assets/jquery.lettering.js create mode 100644 tyrano/libs/textillate/jquery.textillate.js create mode 100644 tyrano/plugins/kag/kag.event.js create mode 100644 tyrano/plugins/kag/kag.js create mode 100644 tyrano/plugins/kag/kag.key_mouse.js create mode 100644 tyrano/plugins/kag/kag.layer.js create mode 100644 tyrano/plugins/kag/kag.menu.js create mode 100644 tyrano/plugins/kag/kag.parser.js create mode 100644 tyrano/plugins/kag/kag.rider.js create mode 100644 tyrano/plugins/kag/kag.tag.js create mode 100644 tyrano/plugins/kag/kag.tag_audio.js create mode 100644 tyrano/plugins/kag/kag.tag_camera.js create mode 100644 tyrano/plugins/kag/kag.tag_ext.js create mode 100644 tyrano/plugins/kag/kag.tag_system.js create mode 100644 tyrano/tyrano.base.js create mode 100644 tyrano/tyrano.js diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..85117dc --- /dev/null +++ b/.gitignore @@ -0,0 +1,15 @@ +# Ignore all files +*.* + +# Except +!*.json +!*.js +!*.zip +!*.7z +!*.csv +!*.ks +!.gitignore +!srp.pac +!README.md + +# Images diff --git a/README.md b/README.md new file mode 100644 index 0000000..3ba175d --- /dev/null +++ b/README.md @@ -0,0 +1,49 @@ +# Apply Patch +1. Click Code +2. Click Download ZIP +3. Extract to game folder and Replace All. + +# How To Contribute +TLDR 3 steps. + + Fork the repository. + Make the changes. + Submit a pull request to the project owner. + +If everything looks good and doesn't break things I'll merge it in. + +Longer Version: + +Things that are needed: +* [VSCode](https://code.visualstudio.com/) Make sure you check all the boxes for context menus. ![image](https://github.com/DazedMTL/Dungeon-With-Girl/assets/96628874/7a84b624-32fe-4845-a0f6-2b9f39795070) +* The Game +* [Git](https://git-scm.com/downloads) (Use the default for everything. Just keep clicking Next) +* Motivation to learn + +Installation: +1. Fork the repo using the fork button at the top. Click Code > HTTPS > Copy URL. +2. Right click on the game folder and click 'Open with VSCode' (Shift+Right_Click if you are on Windows 11) +3. Click on the Source Control Button and click initialize repository. + +![image](https://github.com/DazedMTL/Dungeon-With-Girl/assets/96628874/61e818e6-11f9-450d-9d7d-263d109dbf56) + +4. At the top click on Terminal > New Terminal. Enter the following: `git clone [URL_YOU_COPIED_ABOVE]`. +5. Copy the contents of the new folder created with git clone into the game folder and replace all. +6. Your source control menu should be good to go and look like this. + +![image](https://github.com/DazedMTL/Dungeon-With-Girl/assets/96628874/c19787a0-172d-4a08-a37a-e3b56e70e86a) + +Now you are all setup, all you need to do is play the game and look for any changes that need to be made. Stuff like spelling errors, wrong names, inconsistencies, spacing issues, etc. + +7. Use the FIND functionality to search for what you are trying to fix. For example if a character's name is wrong, type that into the search menu and start looking, then make the change. Try not to mess with any scripts or variables you might see. + +![image](https://github.com/DazedMTL/Dungeon-With-Girl/assets/96628874/589eccaf-7f86-43f7-a917-7e6e477b381a) + +8. After you are satisfied with your changes it's time to put in a PR. Go to source control to see all your changes. Add a message and click the `Commit` button to save them all. + +![image](https://github.com/DazedMTL/Dungeon-With-Girl/assets/96628874/a9a8973b-bc01-4184-bea9-63a925d961a2) + +8. Click Sync to push your changes to your fork. Now all that's left is to put in a pull request. +9. Go to Pull Requests > New Pull Requests. Look at the arrow, your fork should be pointing to the original repo (mine). Add in details on what you fixed and Submit. If everything looks good I'll merge it in and you would have successfully contributed. + +Got questions? Just shoot me a message, more than happy to walk you through any of the tools. diff --git a/builder_config.json b/builder_config.json new file mode 100644 index 0000000..a1615a6 --- /dev/null +++ b/builder_config.json @@ -0,0 +1 @@ +{"version":"1.8","map_chara":{"美里":1,"明日香":2,"局長":3,"谷田":4,"勝野":5,"黒原":6,"ノブオ":7},"plugin":{},"map_font":{},"map_var":{"qpt":{"val":"0","kind":"f"},"qp":{"val":"0","kind":"f"},"tp":{"val":"0","kind":"f"},"end":{"val":"0","kind":"f"},"ask":{"val":"0","kind":"f"}},"map_param_pin":{},"map_theme":{"name":"","opacity":"","button":0,"message_color":"","chara_name_color":"","glink":"","jname":""},"map_cg":{"map_page":{"cg1":1,"cg2":1,"cg3":1,"cg4":1,"cg5":1,"cg6":1,"cg7":1},"map_image":{"101":["hiro101-1.jpg","hiro101-2.jpg","hiro101-3.jpg","hiro101-4.jpg","hiro101-5.jpg","hiro101-6.jpg","hiro101-7.jpg","hiro101-8.jpg","hiro101-9.jpg","hiro101-10.jpg","hiro101-11.jpg","hiro101-12.jpg"],"103":["hiro103-1.jpg","hiro103-2.jpg","hiro103-3.jpg","hiro103-4.jpg"],"104":["hiro104-1.jpg","hiro104-2.jpg","hiro104-3.jpg","hiro104-4.jpg","hiro104-5.jpg","hiro104-6.jpg","hiro104-7.jpg"],"105":["hiro105-1.jpg","hiro105-2.jpg","hiro105-3.jpg","hiro105-4.jpg","hiro105-5.jpg","hiro105-6.jpg"],"106":["hiro106-1.jpg","hiro106-2.jpg"],"107":["hiro107-1.jpg","hiro107-2.jpg","hiro107-3.jpg","hiro107-4.jpg","hiro107-5.jpg","hiro107-6.jpg","hiro107-7.jpg","hiro107-8.jpg","hiro107-9.jpg","hiro107-10.jpg","hiro107-11.jpg"],"109":["hiro109-1.jpg","hiro109-2.jpg"],"110":["hiro110-1.jpg","hiro110-2.jpg","hiro131.jpg"],"112":["hiro112-1.jpg","hiro112-2.jpg","hiro112-3.jpg"],"113":["hiro113-1.jpg","hiro113-2.jpg","hiro113-3.jpg","hiro113-4.jpg","hiro113-5+.jpg","hiro113-5.jpg","hiro113-6.jpg"],"114":["hiro114-1.jpg","hiro114-2.jpg"],"115":["hiro115.jpg","hiro115-1.jpg","hiro115-1+.jpg","hiro115-2.jpg","hiro115-3.jpg","hiro115-3+.jpg"],"116":["hiro116-1.jpg","hiro116-2.jpg","hiro116-3.jpg","hiro116-4.jpg"],"117":["hiro117-1.jpg","hiro117-2.jpg","hiro117-3.jpg","hiro117-4.jpg","hiro117-5.jpg","hiro117-6.jpg","hiro117-7.jpg","hiro117-8.jpg"],"118":["hiro118-4.jpg","hiro118-5.jpg","hiro118-1.jpg","hiro118-6.jpg","hiro118-7.jpg","hiro118-8.jpg","hiro118-9.jpg","hiro118-10.jpg"],"119":["hiro119-1.jpg","hiro119-2.jpg","hiro119-3.jpg","hiro119-4.jpg"],"120":["hiro120-1.jpg","hiro120-2.jpg","hiro120-3.jpg","hiro120-4.jpg","hiro120-5.jpg"],"121":["hiro121-1.jpg","hiro121-2.jpg","hiro121-3.jpg"],"122":["hiro122-1.jpg","hiro122-2.jpg","hiro122-3.jpg","hiro122-4.jpg","hiro122-5.jpg","hiro122-6.jpg","hiro122-7.jpg","hiro122-8.jpg","hiro122-9.jpg","hiro122-10.jpg","hiro122-11.jpg"],"123":["hiro123-1.jpg","hiro123-2.jpg","hiro123-3.jpg","hiro123-4.jpg","hiro123-5.jpg","hiro123-6.jpg","hiro123-7.jpg","hiro123-8.jpg","hiro123-9.jpg","hiro133-1.jpg","hiro133-2.jpg"],"124":["hiro124-1.jpg","hiro124-2.jpg"],"125":["hiro125-1.jpg","hiro125-2.jpg","hiro125-3.jpg"],"127":["hiro127-1.jpg","hiro127-2.jpg","hiro127-3.jpg","hiro127-4.jpg","hiro127-5.jpg","hiro127-6.jpg","hiro127-7.jpg","hiro127-8.jpg"],"129":["hiro129-1.jpg","hiro129-2.jpg","hiro129-3.jpg","hiro129-4.jpg"],"132":["hiro132-1.jpg","hiro132-2.jpg","hiro132-3.jpg","hiro132-4.jpg","hiro132-5.jpg","hiro132-6.jpg"],"134":["hiro134-1.jpg","hiro134-2.jpg"],"135":["hiro135-1.jpg","hiro135-2.jpg","hiro135-3.jpg","hiro135-4.jpg"],"136":["hiro136-1.jpg","hiro136-2.jpg"],"137":["hiro137-1.jpg","hiro137-2.jpg","hiro137-3.jpg","hiro137-4.jpg"],"139":["hiro139-1.jpg","hiro139-2.jpg","hiro139-3.jpg"],"140":["hiro140-1.jpg","hiro140-2.jpg","hiro140-3.jpg"],"141":["hiro141-1.jpg","hiro141-2.jpg"],"142":["hiro142-1.jpg","hiro142-2.jpg","hiro142-3.jpg","hiro142-4.jpg"],"143":["hiro143-1.jpg","hiro143-2.jpg","hiro143-3.jpg"],"144":["hiro144.jpg","hiro145-1.jpg","hiro145-2.jpg","hiro145-3.jpg","hiro145-4.jpg"],"146":["hiro146-1.jpg","hiro146-2.jpg","hiro146-3.jpg"],"147":["hiro147.jpg"],"148":["hiro148-1.jpg","hiro148-2.jpg"],"149":["hiro149-1.jpg","hiro149-2.jpg","hiro149-3.jpg","hiro149-4.jpg","hiro149-5.jpg","hiro149-6.jpg"],"151":["hiro151.jpg"],"254":["hiro254-1.jpg","hiro254-2.jpg","hiro254-3.jpg","hiro254-10.jpg","hiro254-4.jpg","hiro254-5.jpg","hiro254-6.jpg","hiro254-7.jpg","hiro254-8.jpg","hiro254-11.jpg","hiro254-12.jpg","hiro254-9.jpg","hiro254-13.jpg"]}},"map_replay":{"map_page":{"rep1":1,"rep2":1,"rep3":1,"rep4":1,"rep5":1},"map_jump":{"reps1":{"storage":"scene2.ks","target":"*rep1"},"reps2":{"storage":"scene4.ks","target":"*rep2"},"reps3":{"storage":"scene4.ks","target":"*rep3"},"reps4":{"storage":"scene5.ks","target":"*rep4"},"reps5":{"storage":"scene6.ks","target":"*rep5"},"reps6":{"storage":"scene7.ks","target":"*rep6"},"reps7":{"storage":"scene7.ks","target":"*rep7"},"reps8":{"storage":"scene8.ks","target":"*rep8"},"reps9":{"storage":"scene8.ks","target":"*rep9"},"reps10":{"storage":"scene8.ks","target":"*rep10"},"reps11":{"storage":"scene9.ks","target":"*rep11"},"reps12":{"storage":"scene9.ks","target":"*rep12"},"reps13":{"storage":"scene10.ks","target":"*rep13"},"reps14":{"storage":"scene11.ks","target":"*rep14"},"reps15":{"storage":"end1.ks","target":"*rep15"},"reps16":{"storage":"end1.ks","target":"*rep16"},"reps17":{"storage":"end1.ks","target":"*rep17"},"reps18":{"storage":"end2.ks","target":"*rep18"},"reps19":{"storage":"end4b.ks","target":"*rep19"},"reps20":{"storage":"end4b.ks","target":"*rep20"},"reps21":{"storage":"scene12.ks","target":"*rep21"},"reps22":{"storage":"scene13.ks","target":"*rep22"},"reps23":{"storage":"scene14.ks","target":"*rep23"},"reps24":{"storage":"end3.ks","target":"*rep24"},"reps25":{"storage":"end4.ks","target":"*rep25"},"reps26":{"storage":"scene14.ks","target":"*rep26"},"reps27":{"storage":"end5.ks","target":"*rep27"}}},"live2d_version":"3","name":"jana","game_type":"adv","size_type":"6","width":1280,"height":720,"vertical":false,"check_title":"no","check_menu":"no","message_window":{"use_image":false,"image_file":"","msg_width":"1240","msg_height":"237","msg_top":"500","msg_left":"20","margint":"45","marginl":"10","marginr":"20","marginb":"10","vertical":false,"color":"","opacity":"180","window_color":"0x000000","chara_name_color":"0xFFFFFF","chara_name_size":"26","chara_name_x":"35","chara_name_y":"510","chara_name_bold":"bold","game_type":"adv","check_chara_mode":true,"text_chara_mod_time":600,"check_memory_chara_face":false,"check_chara_anim":true,"select_chara_anim_mode":"easeInQuad","icon_position_x":"0","icon_position_y":"0","icon_position_fix":false,"select_talk_focus":"none","text_pos_change_time":"600","cg_noimage":"noimage.png","replay_noimage":"noimage.png","map_role":{},"flag_shadow":"false","edge_color":"undefined","flag_edge":"false","shadow_color":"undefined"},"component_manage":{"scenario":{"tb_start_text":"true","cm":"true","glink":"true","label":"true","jump":"true","s":"true","call":"true","return":"true"},"text":{"wait":"true","quake":"true","tb_ptext_show":"true","tb_ptext_hide":"true","l":"true"},"screen_effect":{"mask":"true","mask_off":"true","layermode":"true","layermode_movie":"true","free_layermode":"true"},"character":{"chara_show":"true","chara_hide":"true","chara_mod":"true","chara_move":"true","chara_hide_all":"true"},"live2d":{"live2d_new":"true","live2d_show":"true","live2d_motion":"true","live2d_hide":"true","live2d_mod":"true","live2d_expression":"true","live2d_fadein":"true","live2d_fadeout":"true","live2d_delete_all":"true"},"image":{"bg":"true","tb_image_show":"true","tb_image_hide":"true","clickable":"true","button":"true"},"effect":{"tb_show_message_window":"true","tb_hide_message_window":"true","hidemessage":"true","delay":"true","font":"true","resetfont":"true"},"media":{"playbgm":"true","stopbgm":"true","playse":"true","stopse":"true","movie":"true"},"bgmovie":{},"camera":{},"eval":{"tb_eval":"true","edit":"true","commit":"true","tb_cg":"true","tb_replay_start":"true","tb_replay":"true"},"script":{"iscript":"true","tb_start_tyrano_code":"true"},"plugin":{}}} \ No newline at end of file diff --git a/data/scenario/_preview.ks b/data/scenario/_preview.ks new file mode 100644 index 0000000..7da87f5 --- /dev/null +++ b/data/scenario/_preview.ks @@ -0,0 +1,36 @@ +[_tb_system_call storage=system/_preview.ks ] + +[mask time=10] +[mask_off time=10] +[hidemenubutton] + +[tb_clear_images] + +[stopbgm time="1000" ] +[tb_keyconfig flag="0" ] +[tb_hide_message_window ] +[chara_hide_all time="1000" wait="true" ] +[bg storage="hiro200+.jpg" ] +[playbgm volume="100" time="1000" loop="true" storage="Sleeping_City.ogg" ] +*title + +[glink color="black" text="はじめから" x="75" y="370" size="20" target="*start" width="" height="" _clickable_img="" ] +[glink color="black" text="つづきから" x="75" y="470" size="20" target="*load" width="" height="" _clickable_img="" ] +[glink color="black" storage="cg1.ks" size="20" text="CGモード" x="75" y="570" width="" height="" _clickable_img="" ] +[glink color="black" storage="rep1.ks" size="20" text="回想モード" x="75" y="670" width="" height="" _clickable_img="" ] +[s ] +*start + +[showmenubutton] + +[cm ] +[tb_keyconfig flag="1" ] +[jump storage="scene1.ks" target="" ] +[s ] +*load + +[cm ] +[showload] + +[jump target="*title" storage="" ] +[s ] diff --git a/data/scenario/cg1.ks b/data/scenario/cg1.ks new file mode 100644 index 0000000..1a76e1a --- /dev/null +++ b/data/scenario/cg1.ks @@ -0,0 +1,25 @@ +[_tb_system_call storage=system/_cg1.ks] + +[tb_clear_images] + +[stopbgm time="1000" ] +[playbgm volume="100" time="1000" loop="true" storage="music16.ogg" ] +[mask time="200" ] +[bg time="1" storage="bg_base.png" _tb_parts_type="bg" ] +[button graphic="c_btn_back.png" storage="title_screen.ks" target="" time="1" width="100" height="100" x="1150" y="600" _tb_parts_type="button" ] +[tb_cg_image_button graphic="hiro254-1.jpg" storage="system/master_cg.ks" target="" role="sleepgame" no_graphic="&sf._tb_cg_noimage" time="1" width="300" height="200" x="100" y="100" _tb_parts_type="cg_image_button" id="254" ] + +[tb_cg_image_button graphic="hiro116-1.jpg" storage="system/master_cg.ks" target="" role="sleepgame" no_graphic="&sf._tb_cg_noimage" time="1" width="300" height="200" x="492" y="102" _tb_parts_type="cg_image_button" id="116" ] + +[tb_cg_image_button graphic="hiro104-1.jpg" storage="system/master_cg.ks" target="" role="sleepgame" no_graphic="&sf._tb_cg_noimage" time="1" width="300" height="200" x="866" y="100" _tb_parts_type="cg_image_button" id="104" ] + +[tb_cg_image_button graphic="hiro106-1.jpg" storage="system/master_cg.ks" target="" role="sleepgame" no_graphic="&sf._tb_cg_noimage" time="1" width="300" height="200" x="96" y="362" _tb_parts_type="cg_image_button" id="106" ] + +[tb_cg_image_button graphic="hiro109-1.jpg" storage="system/master_cg.ks" target="" role="sleepgame" no_graphic="&sf._tb_cg_noimage" time="1" width="300" height="200" x="496" y="361" _tb_parts_type="cg_image_button" id="109" ] + +[tb_cg_image_button graphic="hiro113-1.jpg" storage="system/master_cg.ks" target="" role="sleepgame" no_graphic="&sf._tb_cg_noimage" time="1" width="300" height="200" x="870" y="359" _tb_parts_type="cg_image_button" id="113" ] + +[tb_image_show storage="default/cg.png" name="_tb_system" time="1" width="320" height="100" x="50" y="650" _tb_parts_type="image" ] +[button graphic="arrow_next.png" storage="cg2.ks" target="" time="1" width="100" height="100" x="1000" y="600" _tb_parts_type="button" ] +[mask_off time="200" ] +[s ] diff --git a/data/scenario/cg2.ks b/data/scenario/cg2.ks new file mode 100644 index 0000000..743d53b --- /dev/null +++ b/data/scenario/cg2.ks @@ -0,0 +1,13 @@ +[tb_clear_images][mask time=200][bg time="1" storage="bg_base.png" _tb_parts_type="bg" ] +[tb_cg_image_button graphic="hiro112-1.jpg" storage="system/master_cg.ks" target="" role="sleepgame" no_graphic="&sf._tb_cg_noimage" time="1" width="300" height="200" x="100" y="100" _tb_parts_type="cg_image_button" id="112" ] +[button graphic="c_btn_back.png" storage="title_screen.ks" target="" time="1" width="100" height="100" x="1150" y="600" _tb_parts_type="button" ] +[button graphic="arrow_prev.png" storage="cg1.ks" target="" time="1" width="100" height="100" x="850" y="600" _tb_parts_type="button" ] +[tb_image_show storage="default/cg.png" name="_tb_system" time="1" width="320" height="100" x="50" y="650" _tb_parts_type="image" ] +[tb_cg_image_button graphic="hiro115.jpg" storage="system/master_cg.ks" target="" role="sleepgame" no_graphic="&sf._tb_cg_noimage" time="1" width="300" height="200" x="470" y="100" _tb_parts_type="cg_image_button" id="115" ] +[tb_cg_image_button graphic="hiro114-1.jpg" storage="system/master_cg.ks" target="" role="sleepgame" no_graphic="&sf._tb_cg_noimage" time="1" width="300" height="200" x="840" y="100" _tb_parts_type="cg_image_button" id="114" ] +[tb_cg_image_button graphic="hiro132-1.jpg" storage="system/master_cg.ks" target="" role="sleepgame" no_graphic="&sf._tb_cg_noimage" time="1" width="300" height="200" x="100" y="370" _tb_parts_type="cg_image_button" id="132" ] +[tb_cg_image_button graphic="hiro141-1.jpg" storage="system/master_cg.ks" target="" role="sleepgame" no_graphic="&sf._tb_cg_noimage" time="1" width="300" height="200" x="470" y="370" _tb_parts_type="cg_image_button" id="141" ] +[tb_cg_image_button graphic="hiro117-1.jpg" storage="system/master_cg.ks" target="" role="sleepgame" no_graphic="&sf._tb_cg_noimage" time="1" width="300" height="200" x="840" y="370" _tb_parts_type="cg_image_button" id="117" ] +[button graphic="arrow_next.png" storage="cg3.ks" target="" time="1" width="100" height="100" x="1000" y="600" _tb_parts_type="button" ] +[mask_off time=200] +[s] diff --git a/data/scenario/cg3.ks b/data/scenario/cg3.ks new file mode 100644 index 0000000..00675c8 --- /dev/null +++ b/data/scenario/cg3.ks @@ -0,0 +1,24 @@ +[_tb_system_call storage=system/_cg3.ks] + +[tb_clear_images] + +[mask time="200" ] +[bg time="1" storage="bg_base.png" _tb_parts_type="bg" ] +[tb_image_show storage="default/cg.png" name="_tb_system" time="1" width="320" height="100" x="50" y="650" _tb_parts_type="image" ] +[button graphic="c_btn_back.png" storage="title_screen.ks" target="" time="1" width="100" height="100" x="1150" y="600" _tb_parts_type="button" ] +[tb_cg_image_button graphic="hiro139-1.jpg" storage="system/master_cg.ks" target="" role="sleepgame" no_graphic="&sf._tb_cg_noimage" time="1" width="300" height="200" x="100" y="100" _tb_parts_type="cg_image_button" id="139" ] + +[button graphic="arrow_prev.png" storage="cg2.ks" target="" time="1" width="100" height="100" x="850" y="600" _tb_parts_type="button" ] +[tb_cg_image_button graphic="hiro140-1.jpg" storage="system/master_cg.ks" target="" role="sleepgame" no_graphic="&sf._tb_cg_noimage" time="1" width="300" height="200" x="470" y="100" _tb_parts_type="cg_image_button" id="140" ] + +[tb_cg_image_button graphic="hiro127-1.jpg" storage="system/master_cg.ks" target="" role="sleepgame" no_graphic="&sf._tb_cg_noimage" time="1" width="300" height="200" x="840" y="100" _tb_parts_type="cg_image_button" id="127" ] + +[tb_cg_image_button graphic="hiro129-1.jpg" storage="system/master_cg.ks" target="" role="sleepgame" no_graphic="&sf._tb_cg_noimage" time="1" width="300" height="200" x="100" y="370" _tb_parts_type="cg_image_button" id="129" ] + +[tb_cg_image_button graphic="hiro105-1.jpg" storage="system/master_cg.ks" target="" role="sleepgame" no_graphic="&sf._tb_cg_noimage" time="1" width="300" height="200" x="470" y="370" _tb_parts_type="cg_image_button" id="105" ] + +[tb_cg_image_button graphic="hiro119-1.jpg" storage="system/master_cg.ks" target="" role="sleepgame" no_graphic="&sf._tb_cg_noimage" time="1" width="300" height="200" x="840" y="370" _tb_parts_type="cg_image_button" id="119" ] + +[button graphic="arrow_next.png" storage="cg4.ks" target="" time="1" width="100" height="100" x="1000" y="600" _tb_parts_type="button" ] +[mask_off time="200" ] +[s ] diff --git a/data/scenario/cg4.ks b/data/scenario/cg4.ks new file mode 100644 index 0000000..3c7cf20 --- /dev/null +++ b/data/scenario/cg4.ks @@ -0,0 +1,24 @@ +[_tb_system_call storage=system/_cg4.ks] + +[tb_clear_images] + +[mask time="200" ] +[bg time="1" storage="bg_base.png" _tb_parts_type="bg" ] +[tb_image_show storage="default/cg.png" name="_tb_system" time="1" width="320" height="100" x="50" y="650" _tb_parts_type="image" ] +[button graphic="c_btn_back.png" storage="title_screen.ks" target="" time="1" width="100" height="100" x="1150" y="600" _tb_parts_type="button" ] +[button graphic="arrow_prev.png" storage="cg3.ks" target="" time="1" width="100" height="100" x="850" y="600" _tb_parts_type="button" ] +[tb_cg_image_button graphic="hiro120-1.jpg" storage="system/master_cg.ks" target="" role="sleepgame" no_graphic="&sf._tb_cg_noimage" time="1" width="300" height="200" x="100" y="100" _tb_parts_type="cg_image_button" id="120" ] + +[tb_cg_image_button graphic="hiro121-1.jpg" storage="system/master_cg.ks" target="" role="sleepgame" no_graphic="&sf._tb_cg_noimage" time="1" width="300" height="200" x="470" y="100" _tb_parts_type="cg_image_button" id="121" ] + +[tb_cg_image_button graphic="hiro144.jpg" storage="system/master_cg.ks" target="" role="sleepgame" no_graphic="&sf._tb_cg_noimage" time="1" width="300" height="200" x="840" y="100" _tb_parts_type="cg_image_button" id="144" ] + +[tb_cg_image_button graphic="hiro143-1.jpg" storage="system/master_cg.ks" target="" role="sleepgame" no_graphic="&sf._tb_cg_noimage" time="1" width="300" height="200" x="100" y="370" _tb_parts_type="cg_image_button" id="143" ] + +[tb_cg_image_button graphic="hiro142-1.jpg" storage="system/master_cg.ks" target="" role="sleepgame" no_graphic="&sf._tb_cg_noimage" time="1" width="300" height="200" x="470" y="370" _tb_parts_type="cg_image_button" id="142" ] + +[tb_cg_image_button graphic="hiro136-1.jpg" storage="system/master_cg.ks" target="" role="sleepgame" no_graphic="&sf._tb_cg_noimage" time="1" width="300" height="200" x="840" y="370" _tb_parts_type="cg_image_button" id="136" ] + +[button graphic="arrow_next.png" storage="cg5.ks" target="" time="1" width="100" height="100" x="1000" y="600" _tb_parts_type="button" ] +[mask_off time="200" ] +[s ] diff --git a/data/scenario/cg5.ks b/data/scenario/cg5.ks new file mode 100644 index 0000000..cb37dd3 --- /dev/null +++ b/data/scenario/cg5.ks @@ -0,0 +1,24 @@ +[_tb_system_call storage=system/_cg5.ks] + +[tb_clear_images] + +[mask time="200" ] +[bg time="1" storage="bg_base.png" _tb_parts_type="bg" ] +[tb_image_show storage="default/cg.png" name="_tb_system" time="1" width="320" height="100" x="50" y="650" _tb_parts_type="image" ] +[button graphic="c_btn_back.png" storage="title_screen.ks" target="" time="1" width="100" height="100" x="1150" y="600" _tb_parts_type="button" ] +[button graphic="arrow_prev.png" storage="cg4.ks" target="" time="1" width="100" height="100" x="850" y="600" _tb_parts_type="button" ] +[tb_cg_image_button graphic="hiro118-0.jpg" storage="system/master_cg.ks" target="" role="sleepgame" no_graphic="&sf._tb_cg_noimage" time="1" width="300" height="200" x="100" y="100" _tb_parts_type="cg_image_button" id="118" ] + +[tb_cg_image_button graphic="hiro122-1.jpg" storage="system/master_cg.ks" target="" role="sleepgame" no_graphic="&sf._tb_cg_noimage" time="1" width="300" height="200" x="470" y="100" _tb_parts_type="cg_image_button" id="122" ] + +[tb_cg_image_button graphic="hiro134-1.jpg" storage="system/master_cg.ks" target="" role="sleepgame" no_graphic="&sf._tb_cg_noimage" time="1" width="300" height="200" x="840" y="100" _tb_parts_type="cg_image_button" id="134" ] + +[tb_cg_image_button graphic="hiro124-1.jpg" storage="system/master_cg.ks" target="" role="sleepgame" no_graphic="&sf._tb_cg_noimage" time="1" width="300" height="200" x="100" y="370" _tb_parts_type="cg_image_button" id="124" ] + +[tb_cg_image_button graphic="hiro103-1.jpg" storage="system/master_cg.ks" target="" role="sleepgame" no_graphic="&sf._tb_cg_noimage" time="1" width="300" height="200" x="470" y="370" _tb_parts_type="cg_image_button" id="103" ] + +[tb_cg_image_button graphic="hiro125-1.jpg" storage="system/master_cg.ks" target="" role="sleepgame" no_graphic="&sf._tb_cg_noimage" time="1" width="300" height="200" x="840" y="370" _tb_parts_type="cg_image_button" id="125" ] + +[button graphic="arrow_next.png" storage="cg6.ks" target="" time="1" width="100" height="100" x="1000" y="600" _tb_parts_type="button" ] +[mask_off time="200" ] +[s ] diff --git a/data/scenario/cg6.ks b/data/scenario/cg6.ks new file mode 100644 index 0000000..80b4faa --- /dev/null +++ b/data/scenario/cg6.ks @@ -0,0 +1,24 @@ +[_tb_system_call storage=system/_cg6.ks] + +[tb_clear_images] + +[mask time="200" ] +[bg time="1" storage="bg_base.png" _tb_parts_type="bg" ] +[tb_image_show storage="default/cg.png" name="_tb_system" time="1" width="320" height="100" x="50" y="650" _tb_parts_type="image" ] +[button graphic="arrow_prev.png" storage="cg5.ks" target="" time="1" width="100" height="100" x="850" y="600" _tb_parts_type="button" ] +[button graphic="c_btn_back.png" storage="title_screen.ks" target="" time="1" width="100" height="100" x="1150" y="600" _tb_parts_type="button" ] +[tb_cg_image_button graphic="hiro107-1.jpg" storage="system/master_cg.ks" target="" role="sleepgame" no_graphic="&sf._tb_cg_noimage" time="1" width="300" height="200" x="100" y="100" _tb_parts_type="cg_image_button" id="107" ] + +[tb_cg_image_button graphic="hiro110-1.jpg" storage="system/master_cg.ks" target="" role="sleepgame" no_graphic="&sf._tb_cg_noimage" time="1" width="300" height="200" x="470" y="100" _tb_parts_type="cg_image_button" id="110" ] + +[tb_cg_image_button graphic="hiro123-1.jpg" storage="system/master_cg.ks" target="" role="sleepgame" no_graphic="&sf._tb_cg_noimage" time="1" width="300" height="200" x="840" y="100" _tb_parts_type="cg_image_button" id="123" ] + +[tb_cg_image_button graphic="hiro146-1.jpg" storage="system/master_cg.ks" target="" role="sleepgame" no_graphic="&sf._tb_cg_noimage" time="1" width="300" height="200" x="100" y="370" _tb_parts_type="cg_image_button" id="146" ] + +[tb_cg_image_button graphic="hiro147.jpg" storage="system/master_cg.ks" target="" role="sleepgame" no_graphic="&sf._tb_cg_noimage" time="1" width="300" height="200" x="470" y="370" _tb_parts_type="cg_image_button" id="147" ] + +[tb_cg_image_button graphic="hiro148-1.jpg" storage="system/master_cg.ks" target="" role="sleepgame" no_graphic="&sf._tb_cg_noimage" time="1" width="300" height="200" x="840" y="370" _tb_parts_type="cg_image_button" id="148" ] + +[button graphic="arrow_next.png" storage="cg7.ks" target="" time="1" width="100" height="100" x="1000" y="600" _tb_parts_type="button" ] +[mask_off time="200" ] +[s ] diff --git a/data/scenario/cg7.ks b/data/scenario/cg7.ks new file mode 100644 index 0000000..cc5b75a --- /dev/null +++ b/data/scenario/cg7.ks @@ -0,0 +1,11 @@ +[tb_clear_images][mask time=200][bg time="1" storage="bg_base.png" _tb_parts_type="bg" ] +[tb_image_show storage="default/cg.png" name="_tb_system" time="1" width="320" height="100" x="50" y="650" _tb_parts_type="image" ] +[button graphic="arrow_prev.png" storage="cg6.ks" target="" time="1" width="100" height="100" x="850" y="600" _tb_parts_type="button" ] +[button graphic="c_btn_back.png" storage="title_screen.ks" target="" time="1" width="100" height="100" x="1150" y="600" _tb_parts_type="button" ] +[tb_cg_image_button graphic="hiro135-1.jpg" storage="system/master_cg.ks" target="" role="sleepgame" no_graphic="&sf._tb_cg_noimage" time="1" width="300" height="200" x="100" y="100" _tb_parts_type="cg_image_button" id="135" ] +[tb_cg_image_button graphic="hiro137-1.jpg" storage="system/master_cg.ks" target="" role="sleepgame" no_graphic="&sf._tb_cg_noimage" time="1" width="300" height="200" x="470" y="100" _tb_parts_type="cg_image_button" id="137" ] +[tb_cg_image_button graphic="hiro149-1.jpg" storage="system/master_cg.ks" target="" role="sleepgame" no_graphic="&sf._tb_cg_noimage" time="1" width="300" height="200" x="840" y="100" _tb_parts_type="cg_image_button" id="149" ] +[tb_cg_image_button graphic="hiro151.jpg" storage="system/master_cg.ks" target="" role="sleepgame" no_graphic="&sf._tb_cg_noimage" time="1" width="300" height="200" x="100" y="370" _tb_parts_type="cg_image_button" id="151" ] +[tb_cg_image_button graphic="hiro101-1.jpg" storage="system/master_cg.ks" target="" role="sleepgame" no_graphic="&sf._tb_cg_noimage" time="1" width="300" height="200" x="470" y="370" _tb_parts_type="cg_image_button" id="101" ] +[mask_off time=200] +[s] diff --git a/data/scenario/config.ks b/data/scenario/config.ks new file mode 100644 index 0000000..95b8122 --- /dev/null +++ b/data/scenario/config.ks @@ -0,0 +1,379 @@ +[_tb_system_call storage=system/_config.ks] + +[layopt layer="message0" visible="false"] + +[clearfix] + +[stop_keyconfig] + +[free_layermode time="100" wait="true" ] +[reset_camera time="100" wait="true" ] +[iscript] +$(".layer_camera").empty(); +[endscript] + +[hidemenubutton] + +[iscript] +TG.config.autoRecordLabel = "true"; // ラベル通過記録を有効に +tf.current_bgm_vol = parseInt(TG.config.defaultBgmVolume); // BGM音量 +tf.current_se_vol = parseInt(TG.config.defaultSeVolume); // SE音量 +tf.current_ch_speed = parseInt(TG.config.chSpeed); // テキスト表示速度 +tf.current_auto_speed = parseInt(TG.config.autoSpeed); // オート時のテキスト表示速度 +tf.text_skip ="ON"; // 未読スキップ +if(TG.config.unReadTextSkip != "true"){ +tf.text_skip ="OFF"; +} +tf.user_setting = TG.config.alreadyReadTextColor; +if(tf.user_setting != 'default'){ +TG.config.alreadyReadTextColor = 'default'; // 一時的に既読テキストの文字色を変更しないようにしています +} +[endscript] + +[iscript] +/* 画像類のパス */ +tf.img_path = '../image/config/'; +/* 画像類のパス(ボタン) */ +tf.btn_path_off = tf.img_path + 'c_btn.gif'; +tf.btn_path_on = tf.img_path + 'c_set.png'; +// ボタン画像の幅と高さ +tf.btn_w = 46; // 幅 +tf.btn_h = 46; // 高さ +// ボタンを表示する座標(tf.config_y_ch[0]とtf.config_y_auto[0]は未使用) +tf.config_x = [1040, 400, 454, 508, 562, 616, 670, 724, 778, 832, 886]; // X座標(共通) +tf.config_y_bgm = 190; // BGMのY座標 +tf.config_y_se = 250; // SEのY座標 +tf.config_y_ch = 325; // テキスト速度のY座標 +tf.config_y_auto = 385; // オート速度のY座標 +// 上記の配列変数の添字を格納しておく変数。選択した音量や速度に対応。 +tf.config_num_bgm; // BGM +tf.config_num_se; // SE +tf.config_num_ch; // テキスト速度 +tf.config_num_auto; // オート速度 +// テキスト速度のサンプルテキストとして表示する文字列(お好みに合わせて変更してください) +tf.text_sample = 'テストメッセージです。このスピードでテキストが表示されます。'; +// サンプルテキストを表示しておく時間(テキストを表示し終わってから700ミリ秒で消去させています) +tf.text_sample_speed; +// 既読スキップの画像ファイル名を格納しておく変数 +tf.img_unread_skip; +[endscript] + +[cm ] +[bg storage="bg_config.jpg" time="100" ] +[button fix="true" graphic="&tf.img_path + 'c_btn_back.png'" enterimg="&tf.img_path + 'c_btn_back2.png'" target="*backtitle" x="1160" y="20" storage="" ] +[jump target="*config_page" storage="" ] +*config_page + +[button name="bgmvol,bgmvol_10" fix="true" target="*vol_bgm_change" graphic="&tf.btn_path_off" width="&tf.btn_w" height="&tf.btn_h" x="&tf.config_x[1]" y="&tf.config_y_bgm" exp="tf.current_bgm_vol =  10; tf.config_num_bgm =  1" storage="" ] +[button name="bgmvol,bgmvol_20" fix="true" target="*vol_bgm_change" graphic="&tf.btn_path_off" width="&tf.btn_w" height="&tf.btn_h" x="&tf.config_x[2]" y="&tf.config_y_bgm" exp="tf.current_bgm_vol =  20; tf.config_num_bgm =  2" storage="" ] +[button name="bgmvol,bgmvol_30" fix="true" target="*vol_bgm_change" graphic="&tf.btn_path_off" width="&tf.btn_w" height="&tf.btn_h" x="&tf.config_x[3]" y="&tf.config_y_bgm" exp="tf.current_bgm_vol =  30; tf.config_num_bgm =  3" storage="" ] +[button name="bgmvol,bgmvol_40" fix="true" target="*vol_bgm_change" graphic="&tf.btn_path_off" width="&tf.btn_w" height="&tf.btn_h" x="&tf.config_x[4]" y="&tf.config_y_bgm" exp="tf.current_bgm_vol =  40; tf.config_num_bgm =  4" storage="" ] +[button name="bgmvol,bgmvol_50" fix="true" target="*vol_bgm_change" graphic="&tf.btn_path_off" width="&tf.btn_w" height="&tf.btn_h" x="&tf.config_x[5]" y="&tf.config_y_bgm" exp="tf.current_bgm_vol =  50; tf.config_num_bgm =  5" storage="" ] +[button name="bgmvol,bgmvol_60" fix="true" target="*vol_bgm_change" graphic="&tf.btn_path_off" width="&tf.btn_w" height="&tf.btn_h" x="&tf.config_x[6]" y="&tf.config_y_bgm" exp="tf.current_bgm_vol =  60; tf.config_num_bgm =  6" storage="" ] +[button name="bgmvol,bgmvol_70" fix="true" target="*vol_bgm_change" graphic="&tf.btn_path_off" width="&tf.btn_w" height="&tf.btn_h" x="&tf.config_x[7]" y="&tf.config_y_bgm" exp="tf.current_bgm_vol =  70; tf.config_num_bgm =  7" storage="" ] +[button name="bgmvol,bgmvol_80" fix="true" target="*vol_bgm_change" graphic="&tf.btn_path_off" width="&tf.btn_w" height="&tf.btn_h" x="&tf.config_x[8]" y="&tf.config_y_bgm" exp="tf.current_bgm_vol =  80; tf.config_num_bgm =  8" storage="" ] +[button name="bgmvol,bgmvol_90" fix="true" target="*vol_bgm_change" graphic="&tf.btn_path_off" width="&tf.btn_w" height="&tf.btn_h" x="&tf.config_x[9]" y="&tf.config_y_bgm" exp="tf.current_bgm_vol =  90; tf.config_num_bgm =  9" storage="" ] +[button name="bgmvol,bgmvol_100" fix="true" target="*vol_bgm_change" graphic="&tf.btn_path_off" width="&tf.btn_w" height="&tf.btn_h" x="&tf.config_x[10]" y="&tf.config_y_bgm" exp="tf.current_bgm_vol = 100; tf.config_num_bgm = 10" storage="" ] +[button name="bgmvol,bgmvol_0" fix="true" target="*vol_bgm_change" graphic="&tf.btn_path_off" width="&tf.btn_w" height="&tf.btn_h" x="&tf.config_x[0]" y="&tf.config_y_bgm" exp="tf.current_bgm_vol = 0; tf.config_num_bgm = 0" storage="" ] +[button name="sevol,sevol_10" fix="true" target="*vol_se_change" graphic="&tf.btn_path_off" width="&tf.btn_w" height="&tf.btn_h" x="&tf.config_x[1]" y="&tf.config_y_se" exp="tf.current_se_vol =  10; tf.config_num_se =  1" storage="" ] +[button name="sevol,sevol_20" fix="true" target="*vol_se_change" graphic="&tf.btn_path_off" width="&tf.btn_w" height="&tf.btn_h" x="&tf.config_x[2]" y="&tf.config_y_se" exp="tf.current_se_vol =  20; tf.config_num_se =  2" storage="" ] +[button name="sevol,sevol_30" fix="true" target="*vol_se_change" graphic="&tf.btn_path_off" width="&tf.btn_w" height="&tf.btn_h" x="&tf.config_x[3]" y="&tf.config_y_se" exp="tf.current_se_vol =  30; tf.config_num_se =  3" storage="" ] +[button name="sevol,sevol_40" fix="true" target="*vol_se_change" graphic="&tf.btn_path_off" width="&tf.btn_w" height="&tf.btn_h" x="&tf.config_x[4]" y="&tf.config_y_se" exp="tf.current_se_vol =  40; tf.config_num_se =  4" storage="" ] +[button name="sevol,sevol_50" fix="true" target="*vol_se_change" graphic="&tf.btn_path_off" width="&tf.btn_w" height="&tf.btn_h" x="&tf.config_x[5]" y="&tf.config_y_se" exp="tf.current_se_vol =  50; tf.config_num_se =  5" storage="" ] +[button name="sevol,sevol_60" fix="true" target="*vol_se_change" graphic="&tf.btn_path_off" width="&tf.btn_w" height="&tf.btn_h" x="&tf.config_x[6]" y="&tf.config_y_se" exp="tf.current_se_vol =  60; tf.config_num_se =  6" storage="" ] +[button name="sevol,sevol_70" fix="true" target="*vol_se_change" graphic="&tf.btn_path_off" width="&tf.btn_w" height="&tf.btn_h" x="&tf.config_x[7]" y="&tf.config_y_se" exp="tf.current_se_vol =  70; tf.config_num_se =  7" storage="" ] +[button name="sevol,sevol_80" fix="true" target="*vol_se_change" graphic="&tf.btn_path_off" width="&tf.btn_w" height="&tf.btn_h" x="&tf.config_x[8]" y="&tf.config_y_se" exp="tf.current_se_vol =  80; tf.config_num_se =  8" storage="" ] +[button name="sevol,sevol_90" fix="true" target="*vol_se_change" graphic="&tf.btn_path_off" width="&tf.btn_w" height="&tf.btn_h" x="&tf.config_x[9]" y="&tf.config_y_se" exp="tf.current_se_vol =  90; tf.config_num_se =  9" storage="" ] +[button name="sevol,sevol_100" fix="true" target="*vol_se_change" graphic="&tf.btn_path_off" width="&tf.btn_w" height="&tf.btn_h" x="&tf.config_x[10]" y="&tf.config_y_se" exp="tf.current_se_vol = 100; tf.config_num_se = 10" storage="" ] +[button name="sevol,sevol_0" fix="true" target="*vol_se_change" graphic="&tf.btn_path_off" width="&tf.btn_w" height="&tf.btn_h" x="&tf.config_x[0]" y="&tf.config_y_se" exp="tf.current_se_vol = 0; tf.config_num_se = 0" storage="" ] +[button name="ch,ch_100" fix="true" target="*ch_speed_change" graphic="&tf.btn_path_off" width="&tf.btn_w" height="&tf.btn_h" x="&tf.config_x[1]" y="&tf.config_y_ch" exp="tf.set_ch_speed =100; tf.config_num_ch = 0" storage="" ] +[button name="ch,ch_80" fix="true" target="*ch_speed_change" graphic="&tf.btn_path_off" width="&tf.btn_w" height="&tf.btn_h" x="&tf.config_x[2]" y="&tf.config_y_ch" exp="tf.set_ch_speed = 80; tf.config_num_ch = 1" storage="" ] +[button name="ch,ch_50" fix="true" target="*ch_speed_change" graphic="&tf.btn_path_off" width="&tf.btn_w" height="&tf.btn_h" x="&tf.config_x[3]" y="&tf.config_y_ch" exp="tf.set_ch_speed = 50; tf.config_num_ch = 2" storage="" ] +[button name="ch,ch_40" fix="true" target="*ch_speed_change" graphic="&tf.btn_path_off" width="&tf.btn_w" height="&tf.btn_h" x="&tf.config_x[4]" y="&tf.config_y_ch" exp="tf.set_ch_speed = 40; tf.config_num_ch = 3" storage="" ] +[button name="ch,ch_30" fix="true" target="*ch_speed_change" graphic="&tf.btn_path_off" width="&tf.btn_w" height="&tf.btn_h" x="&tf.config_x[5]" y="&tf.config_y_ch" exp="tf.set_ch_speed = 30; tf.config_num_ch = 4" storage="" ] +[button name="ch,ch_25" fix="true" target="*ch_speed_change" graphic="&tf.btn_path_off" width="&tf.btn_w" height="&tf.btn_h" x="&tf.config_x[6]" y="&tf.config_y_ch" exp="tf.set_ch_speed = 25; tf.config_num_ch = 5" storage="" ] +[button name="ch,ch_20" fix="true" target="*ch_speed_change" graphic="&tf.btn_path_off" width="&tf.btn_w" height="&tf.btn_h" x="&tf.config_x[7]" y="&tf.config_y_ch" exp="tf.set_ch_speed = 20; tf.config_num_ch = 6" storage="" ] +[button name="ch,ch_11" fix="true" target="*ch_speed_change" graphic="&tf.btn_path_off" width="&tf.btn_w" height="&tf.btn_h" x="&tf.config_x[8]" y="&tf.config_y_ch" exp="tf.set_ch_speed = 11; tf.config_num_ch = 7" storage="" ] +[button name="ch,ch_8" fix="true" target="*ch_speed_change" graphic="&tf.btn_path_off" width="&tf.btn_w" height="&tf.btn_h" x="&tf.config_x[9]" y="&tf.config_y_ch" exp="tf.set_ch_speed =  8; tf.config_num_ch = 8" storage="" ] +[button name="ch,ch_5" fix="true" target="*ch_speed_change" graphic="&tf.btn_path_off" width="&tf.btn_w" height="&tf.btn_h" x="&tf.config_x[10]" y="&tf.config_y_ch" exp="tf.set_ch_speed =  5; tf.config_num_ch = 9" storage="" ] +[button name="auto,auto_5000" fix="true" target="*auto_speed_change" graphic="&tf.btn_path_off" width="&tf.btn_w" height="&tf.btn_h" x="&tf.config_x[1]" y="&tf.config_y_auto" exp="tf.set_auto_speed = 5000; tf.config_num_auto = 0" storage="" ] +[button name="auto,auto_4500" fix="true" target="*auto_speed_change" graphic="&tf.btn_path_off" width="&tf.btn_w" height="&tf.btn_h" x="&tf.config_x[2]" y="&tf.config_y_auto" exp="tf.set_auto_speed = 4500; tf.config_num_auto = 1" storage="" ] +[button name="auto,auto_4000" fix="true" target="*auto_speed_change" graphic="&tf.btn_path_off" width="&tf.btn_w" height="&tf.btn_h" x="&tf.config_x[3]" y="&tf.config_y_auto" exp="tf.set_auto_speed = 4000; tf.config_num_auto = 2" storage="" ] +[button name="auto,auto_3500" fix="true" target="*auto_speed_change" graphic="&tf.btn_path_off" width="&tf.btn_w" height="&tf.btn_h" x="&tf.config_x[4]" y="&tf.config_y_auto" exp="tf.set_auto_speed = 3500; tf.config_num_auto = 3" storage="" ] +[button name="auto,auto_3000" fix="true" target="*auto_speed_change" graphic="&tf.btn_path_off" width="&tf.btn_w" height="&tf.btn_h" x="&tf.config_x[5]" y="&tf.config_y_auto" exp="tf.set_auto_speed = 3000; tf.config_num_auto = 4" storage="" ] +[button name="auto,auto_2500" fix="true" target="*auto_speed_change" graphic="&tf.btn_path_off" width="&tf.btn_w" height="&tf.btn_h" x="&tf.config_x[6]" y="&tf.config_y_auto" exp="tf.set_auto_speed = 2500; tf.config_num_auto = 5" storage="" ] +[button name="auto,auto_2000" fix="true" target="*auto_speed_change" graphic="&tf.btn_path_off" width="&tf.btn_w" height="&tf.btn_h" x="&tf.config_x[7]" y="&tf.config_y_auto" exp="tf.set_auto_speed = 2000; tf.config_num_auto = 6" storage="" ] +[button name="auto,auto_1300" fix="true" target="*auto_speed_change" graphic="&tf.btn_path_off" width="&tf.btn_w" height="&tf.btn_h" x="&tf.config_x[8]" y="&tf.config_y_auto" exp="tf.set_auto_speed = 1300; tf.config_num_auto = 7" storage="" ] +[button name="auto,auto_800" fix="true" target="*auto_speed_change" graphic="&tf.btn_path_off" width="&tf.btn_w" height="&tf.btn_h" x="&tf.config_x[9]" y="&tf.config_y_auto" exp="tf.set_auto_speed =  800; tf.config_num_auto = 8" storage="" ] +[button name="auto,auto_500" fix="true" target="*auto_speed_change" graphic="&tf.btn_path_off" width="&tf.btn_w" height="&tf.btn_h" x="&tf.config_x[10]" y="&tf.config_y_auto" exp="tf.set_auto_speed =  500; tf.config_num_auto = 9" storage="" ] +[button name="unread_off" fix="true" target="*skip_off" graphic="&tf.btn_path_off" width="170" height="45" x="400" y="470" storage="" ] +[button name="unread_on" fix="true" target="*skip_on" graphic="&tf.btn_path_off" width="170" height="45" x="580" y="470" storage="" ] +[iscript] +$(".bgmvol_"+tf.current_bgm_vol).attr("src","data/image/config/c_set.png"); +$(".sevol_"+tf.current_se_vol).attr("src","data/image/config/c_set.png"); +$(".ch_"+tf.current_ch_speed).attr("src","data/image/config/c_set.png"); +$(".auto_"+tf.current_auto_speed).attr("src","data/image/config/c_set.png"); +if(tf.text_skip == 'OFF'){ +$(".unread_off").attr("src","./data/image/config/c_skipoff.png"); +}else{ +$(".unread_on").attr("src","./data/image/config/c_skipon.png"); +} +[endscript] + +[s ] +*backtitle + +[cm ] +[iscript] +TG.config.alreadyReadTextColor = tf.user_setting; // 既読テキストの文字色を復帰 +[endscript] + +[layopt layer="message1" visible="false"] + +[clearfix] + +[start_keyconfig] + +[clearstack] + +[awakegame] + +*vol_bgm_change + +[iscript] +$(".bgmvol").attr("src","data/image/config/c_btn.png"); +$(".bgmvol_"+tf.current_bgm_vol).attr("src","data/image/config/c_set.png"); +[endscript] + +[bgmopt volume="&tf.current_bgm_vol"] + +[return ] +*vol_se_change + +[iscript] +$(".sevol").attr("src","data/image/config/c_btn.png"); +$(".sevol_"+tf.current_se_vol).attr("src","data/image/config/c_set.png"); +[endscript] + +[seopt volume="&tf.current_se_vol"] + +[return ] +*ch_speed_change + +[iscript] +$(".ch").attr("src","data/image/config/c_btn.png"); +$(".ch_"+tf.set_ch_speed).attr("src","data/image/config/c_set.png"); +tf.current_ch_speed = tf.set_ch_speed; +[endscript] + +[configdelay speed="&tf.set_ch_speed"] + +[position layer="message1" left="90" top="580" width="1100" height="100" margint="2" marginl="30" page="fore" visible="true" opacity="0"] + +[layopt layer="message1" visible="true"] + +[current layer="message1"] + +[emb exp="tf.text_sample"] + +[iscript] +$(".current_span").css("color","#66564C"); // サンプルテキストのフォントカラーを指定 +tf.system.backlog.pop(); // サンプルテキストを履歴から削除(nolog~endnologタグと同じです) +[endscript] + +[eval exp="tf.text_sample_speed = tf.set_ch_speed * tf.text_sample.length + 700"] + +[wait time="&tf.text_sample_speed" ] +[er] + +[layopt layer="message1" visible="false"] + +[return ] +*auto_speed_change + +[iscript] +$(".auto").attr("src","data/image/config/c_btn.png"); +$(".auto_"+tf.set_auto_speed).attr("src","data/image/config/c_set.png"); +[endscript] + +[autoconfig speed="&tf.set_auto_speed"] + +[return ] +*skip_off + +[iscript] +$(".unread_off").attr("src","./data/image/config/c_skipoff.png"); +$(".unread_on").attr("src","./data/image/config/c_btn.gif"); +tf.text_skip = "OFF"; +[endscript] + +[config_record_label skip="false"] + +[return ] +*skip_on + +[iscript] +$(".unread_off").attr("src","./data/image/config/c_btn.gif"); +$(".unread_on").attr("src","./data/image/config/c_skipon.png"); +tf.text_skip = "ON"; +[endscript] + +[config_record_label skip="true"] + +[return ] +*icon_bgm + +[iscript] +// 設定した音量によって色付き画像の表示・非表示を切替える +$( ".bgm_img_0").css( "visibility", tf.config_num_bgm == 0 ? 'visible' : 'hidden' ); +$( ".bgm_img_1").css( "visibility", tf.config_num_bgm > 0 ? 'visible' : 'hidden' ); +$( ".bgm_img_2").css( "visibility", tf.config_num_bgm > 1 ? 'visible' : 'hidden' ); +$( ".bgm_img_3").css( "visibility", tf.config_num_bgm > 2 ? 'visible' : 'hidden' ); +$( ".bgm_img_4").css( "visibility", tf.config_num_bgm > 3 ? 'visible' : 'hidden' ); +$( ".bgm_img_5").css( "visibility", tf.config_num_bgm > 4 ? 'visible' : 'hidden' ); +$( ".bgm_img_6").css( "visibility", tf.config_num_bgm > 5 ? 'visible' : 'hidden' ); +$( ".bgm_img_7").css( "visibility", tf.config_num_bgm > 6 ? 'visible' : 'hidden' ); +$( ".bgm_img_8").css( "visibility", tf.config_num_bgm > 7 ? 'visible' : 'hidden' ); +$( ".bgm_img_9").css( "visibility", tf.config_num_bgm > 8 ? 'visible' : 'hidden' ); +$(".bgm_img_10").css( "visibility", tf.config_num_bgm > 9 ? 'visible' : 'hidden' ); +[endscript] + +[return ] +*icon_se + +[iscript] +$(".se_img_0").css( "visibility", tf.config_num_se == 0 ? 'visible' : 'hidden'); +$(".se_img_1").css( "visibility", tf.config_num_se > 0 ? 'visible' : 'hidden'); +$(".se_img_2").css( "visibility", tf.config_num_se > 1 ? 'visible' : 'hidden'); +$(".se_img_3").css( "visibility", tf.config_num_se > 2 ? 'visible' : 'hidden'); +$(".se_img_4").css( "visibility", tf.config_num_se > 3 ? 'visible' : 'hidden'); +$(".se_img_5").css( "visibility", tf.config_num_se > 4 ? 'visible' : 'hidden'); +$(".se_img_6").css( "visibility", tf.config_num_se > 5 ? 'visible' : 'hidden'); +$(".se_img_7").css( "visibility", tf.config_num_se > 6 ? 'visible' : 'hidden'); +$(".se_img_8").css( "visibility", tf.config_num_se > 7 ? 'visible' : 'hidden'); +$(".se_img_9").css( "visibility", tf.config_num_se > 8 ? 'visible' : 'hidden'); +$(".se_img_10").css("visibility", tf.config_num_se > 9 ? 'visible' : 'hidden'); +[endscript] + +[return ] +*icon_ch + +[iscript] +$(".ch_img_1").css( "visibility", tf.config_num_ch >= 0 ? 'visible' : 'hidden'); +$(".ch_img_2").css( "visibility", tf.config_num_ch > 0 ? 'visible' : 'hidden'); +$(".ch_img_3").css( "visibility", tf.config_num_ch > 1 ? 'visible' : 'hidden'); +$(".ch_img_4").css( "visibility", tf.config_num_ch > 2 ? 'visible' : 'hidden'); +$(".ch_img_5").css( "visibility", tf.config_num_ch > 3 ? 'visible' : 'hidden'); +$(".ch_img_6").css( "visibility", tf.config_num_ch > 4 ? 'visible' : 'hidden'); +$(".ch_img_7").css( "visibility", tf.config_num_ch > 5 ? 'visible' : 'hidden'); +$(".ch_img_8").css( "visibility", tf.config_num_ch > 6 ? 'visible' : 'hidden'); +$(".ch_img_9").css( "visibility", tf.config_num_ch > 7 ? 'visible' : 'hidden'); +$(".ch_img_10").css("visibility", tf.config_num_ch > 8 ? 'visible' : 'hidden'); +[endscript] + +[return ] +*icon_auto + +[iscript] +$(".auto_img_1").css( "visibility", tf.config_num_auto >= 0 ? 'visible' : 'hidden'); +$(".auto_img_2").css( "visibility", tf.config_num_auto > 0 ? 'visible' : 'hidden'); +$(".auto_img_3").css( "visibility", tf.config_num_auto > 1 ? 'visible' : 'hidden'); +$(".auto_img_4").css( "visibility", tf.config_num_auto > 2 ? 'visible' : 'hidden'); +$(".auto_img_5").css( "visibility", tf.config_num_auto > 3 ? 'visible' : 'hidden'); +$(".auto_img_6").css( "visibility", tf.config_num_auto > 4 ? 'visible' : 'hidden'); +$(".auto_img_7").css( "visibility", tf.config_num_auto > 5 ? 'visible' : 'hidden'); +$(".auto_img_8").css( "visibility", tf.config_num_auto > 6 ? 'visible' : 'hidden'); +$(".auto_img_9").css( "visibility", tf.config_num_auto > 7 ? 'visible' : 'hidden'); +$(".auto_img_10").css("visibility", tf.config_num_auto > 8 ? 'visible' : 'hidden'); +[endscript] + +[return ] +*load_img + +[layopt layer="0" visible="true"] + +[image layer="0" name="bgm_img_0" storage="&tf.img_path + 'set1.png'" x="&tf.config_x[0]" y="&tf.config_y_bgm"] + +[image layer="0" name="bgm_img_1" storage="&tf.img_path + 'set1.png'" x="&tf.config_x[1]" y="&tf.config_y_bgm"] + +[image layer="0" name="bgm_img_2" storage="&tf.img_path + 'set1.png'" x="&tf.config_x[2]" y="&tf.config_y_bgm"] + +[image layer="0" name="bgm_img_3" storage="&tf.img_path + 'set1.png'" x="&tf.config_x[3]" y="&tf.config_y_bgm"] + +[image layer="0" name="bgm_img_4" storage="&tf.img_path + 'set1.png'" x="&tf.config_x[4]" y="&tf.config_y_bgm"] + +[image layer="0" name="bgm_img_5" storage="&tf.img_path + 'set1.png'" x="&tf.config_x[5]" y="&tf.config_y_bgm"] + +[image layer="0" name="bgm_img_6" storage="&tf.img_path + 'set1.png'" x="&tf.config_x[6]" y="&tf.config_y_bgm"] + +[image layer="0" name="bgm_img_7" storage="&tf.img_path + 'set1.png'" x="&tf.config_x[7]" y="&tf.config_y_bgm"] + +[image layer="0" name="bgm_img_8" storage="&tf.img_path + 'set1.png'" x="&tf.config_x[8]" y="&tf.config_y_bgm"] + +[image layer="0" name="bgm_img_9" storage="&tf.img_path + 'set1.png'" x="&tf.config_x[9]" y="&tf.config_y_bgm"] + +[image layer="0" name="bgm_img_10" storage="&tf.img_path + 'set1.png'" x="&tf.config_x[10]" y="&tf.config_y_bgm"] + +[image layer="0" name="se_img_0" storage="&tf.img_path + 'set2.png'" x="&tf.config_x[0]" y="&tf.config_y_se"] + +[image layer="0" name="se_img_1" storage="&tf.img_path + 'set2.png'" x="&tf.config_x[1]" y="&tf.config_y_se"] + +[image layer="0" name="se_img_2" storage="&tf.img_path + 'set2.png'" x="&tf.config_x[2]" y="&tf.config_y_se"] + +[image layer="0" name="se_img_3" storage="&tf.img_path + 'set2.png'" x="&tf.config_x[3]" y="&tf.config_y_se"] + +[image layer="0" name="se_img_4" storage="&tf.img_path + 'set2.png'" x="&tf.config_x[4]" y="&tf.config_y_se"] + +[image layer="0" name="se_img_5" storage="&tf.img_path + 'set2.png'" x="&tf.config_x[5]" y="&tf.config_y_se"] + +[image layer="0" name="se_img_6" storage="&tf.img_path + 'set2.png'" x="&tf.config_x[6]" y="&tf.config_y_se"] + +[image layer="0" name="se_img_7" storage="&tf.img_path + 'set2.png'" x="&tf.config_x[7]" y="&tf.config_y_se"] + +[image layer="0" name="se_img_8" storage="&tf.img_path + 'set2.png'" x="&tf.config_x[8]" y="&tf.config_y_se"] + +[image layer="0" name="se_img_9" storage="&tf.img_path + 'set2.png'" x="&tf.config_x[9]" y="&tf.config_y_se"] + +[image layer="0" name="se_img_10" storage="&tf.img_path + 'set2.png'" x="&tf.config_x[10]" y="&tf.config_y_se"] + +[image layer="0" name="ch_img_1" storage="&tf.img_path + 'set1.png'" x="&tf.config_x[1]" y="&tf.config_y_ch"] + +[image layer="0" name="ch_img_2" storage="&tf.img_path + 'set1.png'" x="&tf.config_x[2]" y="&tf.config_y_ch"] + +[image layer="0" name="ch_img_3" storage="&tf.img_path + 'set1.png'" x="&tf.config_x[3]" y="&tf.config_y_ch"] + +[image layer="0" name="ch_img_4" storage="&tf.img_path + 'set1.png'" x="&tf.config_x[4]" y="&tf.config_y_ch"] + +[image layer="0" name="ch_img_5" storage="&tf.img_path + 'set1.png'" x="&tf.config_x[5]" y="&tf.config_y_ch"] + +[image layer="0" name="ch_img_6" storage="&tf.img_path + 'set1.png'" x="&tf.config_x[6]" y="&tf.config_y_ch"] + +[image layer="0" name="ch_img_7" storage="&tf.img_path + 'set1.png'" x="&tf.config_x[7]" y="&tf.config_y_ch"] + +[image layer="0" name="ch_img_8" storage="&tf.img_path + 'set1.png'" x="&tf.config_x[8]" y="&tf.config_y_ch"] + +[image layer="0" name="ch_img_9" storage="&tf.img_path + 'set1.png'" x="&tf.config_x[9]" y="&tf.config_y_ch"] + +[image layer="0" name="ch_img_10" storage="&tf.img_path + 'set1.png'" x="&tf.config_x[10]" y="&tf.config_y_ch"] + +[image layer="0" name="auto_img_1" storage="&tf.img_path + 'set2.png'" x="&tf.config_x[1]" y="&tf.config_y_auto"] + +[image layer="0" name="auto_img_2" storage="&tf.img_path + 'set2.png'" x="&tf.config_x[2]" y="&tf.config_y_auto"] + +[image layer="0" name="auto_img_3" storage="&tf.img_path + 'set2.png'" x="&tf.config_x[3]" y="&tf.config_y_auto"] + +[image layer="0" name="auto_img_4" storage="&tf.img_path + 'set2.png'" x="&tf.config_x[4]" y="&tf.config_y_auto"] + +[image layer="0" name="auto_img_5" storage="&tf.img_path + 'set2.png'" x="&tf.config_x[5]" y="&tf.config_y_auto"] + +[image layer="0" name="auto_img_6" storage="&tf.img_path + 'set2.png'" x="&tf.config_x[6]" y="&tf.config_y_auto"] + +[image layer="0" name="auto_img_7" storage="&tf.img_path + 'set2.png'" x="&tf.config_x[7]" y="&tf.config_y_auto"] + +[image layer="0" name="auto_img_8" storage="&tf.img_path + 'set2.png'" x="&tf.config_x[8]" y="&tf.config_y_auto"] + +[image layer="0" name="auto_img_9" storage="&tf.img_path + 'set2.png'" x="&tf.config_x[9]" y="&tf.config_y_auto"] + +[image layer="0" name="auto_img_10" storage="&tf.img_path + 'set2.png'" x="&tf.config_x[10]" y="&tf.config_y_auto"] + +[return ] diff --git a/data/scenario/end1.ks b/data/scenario/end1.ks new file mode 100644 index 0000000..55f28d7 --- /dev/null +++ b/data/scenario/end1.ks @@ -0,0 +1,1218 @@ +[_tb_system_call storage=system/_end1.ks] + +[mask time="1000" effect="fadeIn" color="0x000000" ] +[bg time="1000" method="crossfade" storage="hiro999.jpg" ] +[mask_off time="1000" effect="fadeOut" ] +[playbgm volume="100" time="1000" loop="true" storage="bluenoise.ogg" ] +[tb_start_text mode=1 ] +# +「人気キャスター本番中に母乳お漏らし!?」「千山亜紀子母乳体質!?」[p] +亜紀子がニュース番組の中で母乳を漏らしたことは、大きな話題を呼んだ[p] +元々硬派キャスターからお色気路線に変更して知名度が上がっていたところに、母乳体質というより男の下半身をくすぐる要素が加わったのだから話題にならないわけはなかった[p] +「汗だ」「いや母乳だ」とその真偽も含めて論争が繰り広げられた[p] +中には売名のためにわざとなにかを仕込んで服が濡れるようにしたという「ヤラセ」説を主張するものもいた[p] +そんな中、亜紀子本人が深夜番組の中で母乳のことについて真実を公表するというニュースが飛び込んできた[p] +千山亜紀子は本当に母乳が出るのか?[p] +亜紀子本人の口からそれが語られるということで注目が集まり、その回の視聴率は深夜番組としては異例の17%をたたき出した[p] +すべては勝野の思い通りだった[p] + +[_tb_end_text] + +[tb_hide_message_window ] +[stopbgm time="1000" ] +*rep15 + +[tb_replay_start ] +[bg time="1000" method="crossfade" storage="hiro120-1.jpg" ] +[tb_show_message_window ] +[playbgm volume="100" time="1000" loop="true" storage="オフィスの日常.ogg" ] +[tb_start_text mode=1 ] +#梅田 +「ウメちゃんのディーープな話~~~!」[p] +「っさ、今週も始まりました、ディープな話。今週のゲストはこちらの方々です~」[p] +#若手芸人 +「よろしくお願いしますーー!」[p] +#バラドル +「どうもよろしくお願いしま~す」[p] +#梅田 +「キミは元Zの局アナやったんやんな?」[p] +#バラドル +「はい、そうです~。千山先輩の一つ後輩です~~」[p] +#亜紀子 +「そ、そうなんですよ」[p] +#梅田 +「後輩かいな。仲は良かったんかいな」[p] +#バラドル +「もう、尊敬する先輩で、良くしてもらいました~」[p] +#亜紀子 +「そうですね、それなりには・・・はい」[p] +# +実はこのバラドルは亜紀子のことをとても嫌っていた[p] +アナウンサー時代からチャラチャラしていて、有名人と結婚するために腰掛でアナウンサーをやっているような娘で、仕事一筋の亜紀子とは最初から相性が悪かった[p] +その後、俳優との不倫が発覚して局をクビのような形で退社し、バラエティアイドルに転身して今は質の悪い仕事をこなしてなんとか芸能界にしがみついている[p] +そんな境遇から、正統派でキャスターとして着実に人気を集めている亜紀子のことを嫉妬し、憎んでいた[p] +勝野はその事情を良く知っていて、わざと今回のゲストに彼女をキャスティングしたのだ[p] +#梅田 +「それじゃ今日のテーマはなんですか?」[p] +#亜紀子 +「は、はい、今日のテーマは・・・ぼ・・・『母乳』です」[p] +#梅田 +「出た!」[p] +「これはみなさん・・・ねえ?」[p] +#若手芸人 +「そうですよね。ちょうど今話題になってるやつですよね?」[p] +#バラドル +「話題になってます~~」[p] +#梅田 +「キミ実際どうなんよ?母乳が出るんかいな?」[p] +#亜紀子 +「え・・・と、あの、それは後ほどちゃんとお話ししますので、まずは母乳マニアの方々をお呼びしましょう」[p] + + +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro118-0.jpg" ] +[tb_start_text mode=1 ] +# +亜紀子が母乳が出るかの真相を先送りにして、いつものようにマニア3人を呼び入れて母乳についてのトークが始まった[p] +これは視聴者を焦らして視聴率を稼ぐとともに、より一層亜紀子を辱めるための勝野の作戦だった[p] +#梅田 +「母乳ってのはやっぱアレなん、赤ちゃんに戻りたいみたいなそういう感覚なん?」[p] +#マニアA +「うーん、そういうのも根源にはあるかもしれないですけど、いわゆる赤ちゃんプレイとは全然違いますね」[p] +#マニアB +「母親が赤ちゃんのために出しているモノを吸う、という背徳感ですね」[p] +#若手芸人 +「なるほど~。よく考えたら異常ですもんね」[p] +#マニアA +「異常であるっていうのは興奮の要素として重要ですよね」[p] +#バラドル +「Aさんなんか変態っぽい~~」[p] +#マニアA +「ありがとうございます。でも人間って誰でも変態なんじゃないですか」[p] +#梅田 +「なんやこいつwまぁそやけども」[p] +「母乳ってやっぱり飲むの?飲まんでもいいの?」[p] +#マニアC +「飲みます」[p] +#マニアB +「飲みますけど、それはそこまで重要じゃないかもしれませんね。女性が母乳を出しているという事実が重要なわけで」[p] +#マニアA +「そうですね。母乳ってスカトロに近いというか、羞恥を楽しむ面もありますよね」[p] +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro120-5.jpg" ] +[tb_start_text mode=1 ] +#梅田 +「スカトロ!?ウンコと母乳はちゃうやろ!」[p] +# +モミモミモミ[p] +#亜紀子 +「アッ・・・」[p] +#マニアA +「それは違います。だから綺麗なスカトロというか・・・正しいスカトロというか」[p] +#若手芸人 +「正しいスカトロ!」[p] +#マニアA +「ギャップですよね。こんなキレイな女性でもウンチする、こんなキレイな女性でも母乳を出す、みたいな」[p] +「一番女性的な行為でもありますしね、母乳を出すって」[p] +#梅田 +「でも実際問題どうなん、母乳出る女性なんてどうやって出会うのよ?」[p] +[_tb_end_text] + +[tb_image_show time="1000" storage="default/hiro101-97.jpg" width="411" height="436" x="-9" y="283" _clickable_img="" name="img_17" ] +[tb_start_text mode=1 ] +# +ズポッ![p] +#亜紀子 +「アンッ・・・♥」[p] +#マニアB +「たしかにそこは問題ですが、一応探せばあるんですよ。そういう場所が」[p] +#梅田 +「あるんや?母乳出る女性が居るお店みたいなんが?」[p] +# +グリグリグリ・・・[p] +#亜紀子 +「アヒッ・・・♥そ、そういうお店が実際東京には何軒かあるようでして・・・ンッ・・・Bさんもそういったお店のオーナーなんですよね?」[p] +#マニアB +「そうなんです、好きが高じて店を作っちゃいました」[p] +#梅田 +「そういう店作ったんかいな!へーー!」[p] +# +ズポッ・・・ズニュッ[p] +#亜紀子 +「アンッ♥・・・こ、こちらがそのお店の・・・ンッ・・・映像なんですが・・・ハゥンッ♥」[p] +#若手芸人 +「おーーー、なんかすごそう」[p] +#バラドル +「えーーーw」[p] +#マニアC +「僕らも常連です」[p] +#マニアA +「Bさんの店にはいつもお世話になってます」[p] +#梅田 +「へぇーーー・・・あるんやねぇこういう店が」[p] +# +クチュックチュッ[p] +#亜紀子 +「アッ・・・ンンッ♥」[p] +#バラドル +「あれ?千山先輩どうしたんですかぁ~?なんかエッチな声出してますけど」[p] +#亜紀子 +「あ、す、すいません。な、なんでも・・・アンッ♥」[p] +#梅田 +「ごめんごめん、気にせんといて。俺が尻触ってるだけやから」[p] +#若手芸人 +「なにしてんすか!w」[p] +#バラドル +「えーーっ!?千山先輩そんなセクハラされてるんですか!?」[p] +「ちゃんと言った方がいいですよ!先輩は一流のエリートキャスターなんですから!」[p] +#亜紀子 +「い、いえ、これはスキンシップなので全然わたしは・・・」[p] +#梅田 +「千山ちゃんが緊張しやすいから。俺がお尻触ってほぐしてあげてるんや、な?」[p] +# +グチュッ・・・グチュッ[p] +#亜紀子 +「アヒッ♥・・・そ、そうなんです。わ、私のほうからお願いして触ってもらってるんです・・・アフゥッ♥」[p] +#バラドル +「えーーー!千山先輩ってそんなエッチだったんですね~。意外~~~w」[p] +#亜紀子 +「アハハハ・・・」[p] +(わかっててわざと煽ってるんだわ・・・。いい気味だと思ってるのね私の惨めな姿を・・・)[p] +#梅田 +「で、話戻すけど、あなたのお店で働いてる女の人はやっぱり子育て中の人ばっかりなんや?」[p] +#マニアB +「そうですね、ほとんどは子育て中の母乳の出る期間を利用して働きに来ている人ですね」[p] +「元々そういう仕事してた人が多くて、母乳が出る間は高給がもらえるのでうちに来てくれているわけです」[p] +#梅田 +「やっぱ普通の店よりお給料は高いんや」[p] +#マニアB +「そうですね、やっぱり特別な付加価値が付くわけですし、マニアの人はお金を出しても来てくれますから」[p] +#梅田 +「全員が子育て中の人なん?ずっと母乳が出る人体質の人とかはいないん?」[p] +#マニアB +「一人だけ居ます。一番人気の子で、この子は子育てが終ってるんですけどずっと母乳が出続けてるんです」[p] +#若手芸人 +「へーー、そういう人もいるんややっぱり」[p] +#梅田 +「母乳マニアとしてはどうなん?子育てしてるかどうかは関係ないの?」[p] +#マニアC +「関係ないですね」[p] +#マニアA +「基本「母乳が出る=子育て中」ですからね。あまり考えたことがありませんが・・・」[p] +「もし子供が居なくて体質で母乳が出る人が居たら、むしろボクは興奮するかもしれませんね。羞恥という観点では」[p] +#梅田 +「ほお!ほんなら美人でオッパイ100cm超えてて出産経験無いのに母乳が出る女性が居たら、もう最高なんや?」[p] +#バラドル +「え~~~、それって誰のことですかぁ~~?w」[p] +#マニアA +「それはもう・・・最高ですね」[p] +#マニアC +「最高っす!」[p] +#梅田 +「キミらも当然例のニュースは知ってるんやろ?千山ちゃんの?」[p] + +[_tb_end_text] + +[tb_image_hide time="1000" ] +[bg time="1000" method="crossfade" storage="hiro120-3.jpg" ] +[tb_start_text mode=1 ] +#亜紀子 +「アッ・・・♥」[p] +#マニアA +「もちろん知ってます!」[p] +#マニアB +「僕ら母乳マニアは騒然としてますよ」[p] +#マニアC +「うんうん」[p] +#若手芸人 +「やっぱりマニアの間ではでっかいニュースなんや」[p] +#マニアA +「もちろんですよ。今日もずっと気になって仕方がなかったんです」[p] +#マニアC +「もう100回以上観ましたよあのニュースの映像」[p] +#梅田 +「で、キミらはどう思ってるん?ほんまに母乳が出ると思ってる?」[p] +# +モミモミモミ[p] +#亜紀子 +「アンッ・・・ハァンッ♥」[p] +#マニアC +「ボクは母乳だと思います。あれは汗ではない。見間違えようがない」[p] +#マニアB +「私もそう思います」[p] +#マニアA +「私も母乳だと思います。というかそうであって欲しい」[p] +#梅田 +「なるほどねぇ~~」[p] +# +モミモミモミ[p] +#亜紀子 +「ンッ・・・アフゥッ♥」[p] +#バラドル +「梅田さん先輩のオッパイ揉んじゃダメですよぉ~~!」[p] +#亜紀子 +「アッ・・・い、いえ・・・梅田さんには・・・アンッ♥・・・わ、わたしのオッパイならいくらでも自由に揉んでくださいと・・・ヤンッ♥」[p] +#梅田 +「そうそう、スキンシップやから」[p] +#バラドル +「え~~~、千山先輩そうまでして仕事欲しいんですかぁ~~幻滅ぅ~~~ww」[p] +#亜紀子 +「アハハハ・・・アンッ♥」[p] +#梅田 +「そんなことどうでもええねん!」[p] +「問題はホンマに母乳が出るかどうか、っちゅうことや!」[p] +「どやねん!?」[p] +# +モミモミモミモミ[p] +#亜紀子 +「アヒッ・・・そ、それは・・・」[p] +#梅田 +「それは・・・?」[p] +# +モミモミモミッ[p] +#亜紀子 +「し・・・CMの後で・・・!アンッ♥」[p] +#一同 +「ズコーーーーっ!」[p] + + +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro118-0.jpg" ] +[tb_start_text mode=1 ] +# +収録は一旦、数分間の休憩に入り次にCM明けからの形で再開されることになった[p] +亜紀子にとっては破滅へのカウントダウンであり、逃げ出すことも出来ずただ自らを辱めるためのセリフを再確認して時間はあっという間に過ぎた[p] +#ディレクター +「収録再開しまーす!5・・・4・・・・・・」[p] +#梅田 +「っというわけでね。いよいよ気になっていたことを発表してくれるわけですね?」[p] +#亜紀子 +「は、はい・・・」[p] +#若手芸人 +「おおーー」[p] +#バラドル +「気になる~~~w」[p] +#亜紀子 +「あ・・・えっと・・・それでは・・・発表します」[p] +「わたくし千山亜紀子は・・・母乳が・・・」[p] +# +ドゥルルルルルルルルル[p] +#亜紀子 +「出ます!」[p] +#一同 +「おおおおーーーー!」[p] + +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro120-5.jpg" ] +[tb_start_text mode=1 ] +#梅田 +「やっぱり母乳が出るんや!?」[p] +#亜紀子 +「は、はい・・・出ます」[p] +#マニアたち +「おおおーーーー!」[p] +#若手芸人 +「すごーー!」[p] +#亜紀子 +「あの・・・今まで隠していて申し訳ありません。実は昔から母乳体質でして・・・」[p] +「出産もしていないのに母乳が出るなんて恥ずかしくて秘密にしてたんです・・・」[p] +#梅田 +「別に隠さんでもええのに」[p] +#バラドル +「そりゃ隠しますよぉ~~!子供も産んでないのに母乳が出るなんて異常ですもん!」[p] +「そんなのイヤらしい目で見られるに決まってるじゃないですか。先輩かわいそう~~~w」[p] +#亜紀子 +「そ、そうなんです。た、ただでさえオッパイが大きいのに母乳が出るなんて・・・どスケベな体質を知られるのは恥ずかしくて仕方がなかったんですが・・・」[p] +「ニュース中に母乳があふれてしまった時に・・・こ、興奮してしまっている自分に気がついたんです・・・」[p] +#梅田 +「興奮しとったんかいな!ど変態やないか!」[p] +#バラドル +「やだ~~~~興奮してたんですかぁ~~~!?変態~~~~w」[p] +#亜紀子 +「は、はい・・・どスケベですいません・・・」[p] +「そ、それで・・・これを機に母乳体質をカミングアウトしてぼ、母乳アナウンサーとして頑張っていこうかと思いまして・・・」[p] +#若手芸人 +「母乳アナウンサー!」[p] +#バラドル +「キャハハハ!面白~~~~い!」[p] +#亜紀子 +「アハハ・・・そ、それでですね・・・これからは母乳を売りにして・・・もっとエッチな番組にもどんどん出ようと思ってます・・・」[p] +「名前も千山亜紀子から・・・ち、乳山亜紀子に改名しようかと思ってます・・・!」[p] +#梅田 +「乳山亜紀子www」[p] +#若手芸人 +「開き直りすぎですてwwww」[p] +#バラドル +「乳山亜紀子wwwなにそれ、バカみた~~~いww」[p] +#亜紀子 +「は、はい・・・その・・・あ、新しい乳山亜紀子を・・・よろしくお願いします!」[p] +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro118-3.jpg" ] +[chara_show name="美里" time="1000" wait="true" storage="chara/1/hiro260-6s.png" width="479" height="1198" left="333" top="8" reflect="false" ] +[tb_start_text mode=1 ] +#梅田 +「おいおいおいおい!」[p] +#若手芸人 +「ええーーーー!?」[p] +#バラドル +「キャーーーーーー!ヤダーーー!なにしてるのーーーー!?」[p] +#マニアたち +「うおおおおお!」[p] +#亜紀子 +「こ、これまで、母乳体質のどスケベ変態女のくせにキャスターを気取って偉そうな態度をとって申し訳ありませんでした・・・っ!」[p] +「こ、これからは母乳オナペット女子アナとして、裸一貫で頑張っていきます!」[p] +「どんな下品な仕事でも誠心誠意身体を張って母乳を出して頑張っていきます!よろしくお願いします!」[p] + +[_tb_end_text] + +[chara_hide name="美里" time="1000" wait="true" pos_mode="true" ] +[bg time="1000" method="crossfade" storage="hiro101-7.jpg" ] +[tb_start_text mode=1 ] +#ノブオ +「すげぇぇぇ!!」[p] +「あの千山亜紀子が脱いだ!!」[p] +「乳すげぇーーー・・・乳輪もでかいし、なんてエロい身体してんだよぉ!」[p] +「母乳アナウンサーって、この番組攻めすぎだろ!」[p] +「乳山亜紀子に改名ってwwww」[p] +「うひょーーーエロすぎるぜ!・・・シコシコシコシコ」[p] +# +・・・・・・[p] +・・・[p] +#キミヒコ +「・・・・・・」[p] +「あ、亜紀子・・・」[p] +「キミはいったいどこへ向かっているのか・・・?」[p] +「亜紀子・・・キミは俺だけの女神ではなかったのか・・・?」[p] +「まるでAV女優じゃないか・・・あの知的で誇り高き亜紀子はどこへ行ってしまったのか・・・?」[p] +「あぁ・・・俺の天使・・・地に堕ちた天使・・・」[p] +「・・・・・・シコシコシコシコ」[p] +# +・・・・・・[p] +・・・[p] + +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro118-3.jpg" ] +[chara_show name="美里" time="1000" wait="true" storage="chara/1/hiro260-6s.png" width="499" height="1248" left="323" top="13" reflect="false" ] +[tb_start_text mode=1 ] +#梅田 +「いやぁ~~ぶっちゃけたねぇ~!」[p] +#若手芸人 +「でもすごいですよ。ハンディキャップを前向きに受け止めて頑張っていこうってのが偉いです!」[p] +#バラドル +「ホント先輩尊敬しますぅ~!これからはオナペット母乳じょ・・・ブプッ!・・・ごめんなさいwお、オナペット母乳女子アナとして頑張ってください~~ww」[p] +#亜紀子 +「あ、ありがとう」[p] +#梅田 +「さあ、それじゃ早速母乳女子アナとしての仕事をしてくれるんですか?」[p] +#亜紀子 +「は、はい。いつもならセクシー女優さんにお越しいただいてマニアの方々の理想を実現するんですが、今回は・・・僭越ながらわたしがやらせていただきます」[p] +#マニアたち +「おおお!?」[p] +#梅田 +「ということは今からここで母乳を出してくれるんですね?」[p] +#亜紀子 +「は、はい。わ、わたしの母乳・・・よかったら飲んでください♥」[p] +#マニアたち +「やったぁぁ!!」[p] +[_tb_end_text] + +[chara_hide_all time="1000" wait="true" ] +[bg time="1000" method="crossfade" storage="hiro143-1.jpg" ] +[tb_start_text mode=1 ] +#マニアC +「うぉぉぉぉ!すごいっっ!」[p] +#マニアA +「ち、近くで見ると・・・迫力が・・・ゴクリ」[p] +#梅田 +「触ったらアカンで!一応芸能人やからな」[p] +#マニアC +「は、はいっ」[p] +#マニアB +「くそぉーうらやましい!」[p] +#梅田 +「しゃーない、自分じゃんけんで負けたんやから」[p] +「そのかわり近くで見てていいから」[p] +#マニアB +「はい、目に焼き付けます」[p] +#亜紀子 +「そ、それじゃ・・・マニアAさんCさん、亜紀子の恥ずかしいオッパイ・・・い~~っぱい飲んでねっ♥」[p] +#マニアA・C +「はいっ!」[p] +#バラドル +「キャハハハ!先輩やらし~~~~ww」[p] +#亜紀子 +「あ、あの・・・実はわたし、自分では母乳を出せないので・・・梅田さんにお願いしてもいいですか」[p] +#梅田 +「えっ、なんや、自分でビャーーって搾って出されへんのんかいな?」[p] +#亜紀子 +「は、はい・・・自分では上手く搾れなくて・・・」[p] +「それで、意図していないときに勝手に溢れてしまって、あのニュースの時も・・・」[p] +#梅田 +「はーはーそういうことかいな。なるほどなぁー」[p] +#若手芸人 +「自分で搾れないって不便ですねー」[p] +#梅田 +「ほんなら、俺が搾ってええんかいな」[p] +#亜紀子 +「はい、よ、よろしくお願いします・・・」[p] +#若手芸人 +「うわーーうらやましいなーー!」[p] +#梅田 +「あほ!仕事や仕事!」[p] +「ほならちょっと失礼して・・・」[p] + + +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro143-2.jpg" ] +[tb_start_text mode=1 ] +# +ムギュッ![p] +#亜紀子 +「アンンッ・・・♥」[p] +#梅田 +「おいおい変な声出しなや。自分ホンマ乳弱いなぁ」[p] +#亜紀子 +「アンッ・・・ど、ドスケベな身体ですいません・・・ンンッ♥」[p] +#梅田 +「ほんなら搾っていくで」[p] +# +モギュッ!ムギュッ![p] +#亜紀子 +「アンッ・・・ンフゥッ♥」[p] +#梅田 +「しかしすごい乳やなコレ・・・手で掴みきれへんがな」[p] +# +モミュッモミュッ![p] +#亜紀子 +「アヒッ・・・す、すいません・・・もっと優しく・・・ハァンッ♥」[p] +#梅田 +「しゃーないがな、乳搾ってるんやから。・・・なかなか出ぇへんな」[p] +# +モミュッモミュッムギュッ![p] +#亜紀子 +「アヒィッ・・・ンハァッ♥」[p] +#バラドル +「先輩なに本気で感じてるんですかぁテレビですよテレビ!」[p] +#亜紀子 +「ご、ごめんなさ・・・アヒッ♥」[p] +#マニアたち +「ハァッ・・・ハァッ・・・すごい・・・ゴクリ」[p] +#梅田 +「もうちょい待ってな、すぐに出すから・・・よいしょっ!」[p] +# +ギュムッ!モギュッ![p] +#亜紀子 +「アヒッ・・・ンンーーッ♥」[p] + + +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro143-3.jpg" ] +[tb_cg id="143" ] +[tb_start_text mode=1 ] +# +ピューーーッ![p] +#梅田 +「おっ、出たっ!」[p] +#亜紀子 +「ンンーーーッ♥」[p] +#マニアA・C +「ハァッ!!オォォォオ!!」[p] +# +モギュッ!モギュッ![p] +ピューーッ!ピューーッ![p] +#亜紀子 +「アヒィンッ・・・ダメェェッ♥」[p] +#マニアA・C +「オォォォ・・・ゴクゴク・・・ふぉぉぉ!」[p] +#マニアB +「おぉ・・・すげえ・・・出てる・・・っ!」[p] +#梅田 +「ホレッ!どやっ!美味しいか!?」[p] +# +モミュッ!モミュッ!モミュッ![p] +プシャーーッ!ピューーッ!ピューーッ![p] +#マニアA +「ンムッ・・・ゴクッ・・・さ、最高ですっ!・・・アムッ」[p] +#マニアC +「ご、極上だ・・・!ゴクッゴクッ・・・!」[p] +#亜紀子 +「アフゥッ・・・アヒッ♥」[p] +#バラドル +「先輩ほら、美味しいって言ってくれてますよ。よかったですねw」[p] +#亜紀子 +「アンッ・・・あ、ありがとう・・・ございます・・・っアヒィッ♥」[p] +#梅田 +「ほれっ、なんぼでも出るな!飲め飲め!カッカッカ!」[p] +# +モミュッ!ムギュッ!ギュッ![p] +ピューッ!ピューーッ!ピューーーーッ![p] +#亜紀子 +「アヒッ・・・だ、ダメェッ・・・そんな強く・・・っ・・・ンンーーーッ♥」[p] +#マニアA・C +「ふぉぉ!ゴクッゴクッ!ハァッ・・・ハァッ・・・ンプッ!」[p] +# +ムギュッ!モミュッ!モミュッ![p] +ピューーーッ!プシャーーーッ![p] +#亜紀子 +「アッ・・・ヤァッ・・・アヒッ・・・アヒィーーーーーッ♥」[p] +ビクンッ♥ビクンッ♥[p] +#梅田 +「オワッ、こいつイきよった!!」[p] +#亜紀子 +「アヒィンッ♥・・・アフゥッ・・・アァンッ♥」[p] +#バラドル +「ヤダァァー!?ちょっと先輩なにイッてるんですか!?カメラで撮られてるのにイっちゃうなんて完全に変態じゃないですかぁー!」[p] +#亜紀子 +「アンッ・・・ご、ごめんなさい・・・っ♥」[p] +#バラドル +「昔わたしに偉そうに説教してた先輩がこんな変態だったなんて、なんか騙された気分ですぅ~w」[p] +#亜紀子 +「アヒッ・・・ご、ごめんなさい・・・変態のくせに・・・アンッ・・・偉そうにして・・・アハァンッ♥」[p] +#梅田 +「まぁまぁええやないか。こうして母乳女子アナとして更生したんやから」[p] +# +モギュッ!ムギュッ![p] +ピュピューーーッ![p] +#亜紀子 +「アンッ・・・アヒィーーーンッ♥」[p] +# + +[_tb_end_text] + +[tb_hide_message_window ] +[stopbgm time="1000" ] +[tb_replay id="reps15" ] +*rep16 + +[tb_replay_start ] +[mask time="1000" effect="fadeIn" color="0x000000" ] +[bg time="1000" method="crossfade" storage="hiro999.jpg" ] +[tb_show_message_window ] +[mask_off time="1000" effect="fadeOut" ] +[tb_start_text mode=1 ] +# +母乳体質をカミングアウトしオナペット宣言をした亜紀子には、もはやメインキャスターへの夢は残されていなかった[p] +夕方のニュースも降板になり、エッチな深夜バラエティで裸をさらけ出すのが主な仕事となった[p] +かろうじて深夜の短いニュース番組を読ませてもらっていたが、それも亜紀子の「女子アナ」という付加価値を維持するためものにすぎなかった[p] +それでも亜紀子は少しでも報道に携われることに慰めを感じ、今日も真剣にニュースを読むのだった[p] +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro254-7.jpg" ] +[playbgm volume="100" time="1000" loop="false" storage="music13.ogg" ] +[tb_start_text mode=1 ] +#亜紀子 +「こんばんは、23時のニュースです。母乳アナウンサーの乳山亜紀子がお伝えします」[p] +[_tb_end_text] + +[stopbgm time="1000" ] +[playbgm volume="40" time="1000" loop="true" storage="Green&Dance_2.ogg" ] +[tb_start_text mode=1 ] +#亜紀子 +「今夜も・・・ンッ・・・搾乳をしながらで失礼いたします・・・っ」[p] +「さ、最初のニュースです・・・アンッ♥。今日・・・午後18時ごろ東大阪市のスーパーマーケットでぇ・・・ンッ・・・弁当にガムが混入される事件が・・・ありました・・・ンンッ♥」[p] +「弁当を購入した客から「弁当にガムが入っている」という苦情があり・・・ハンッ♥・・・失礼しました・・・調べたところいくつかの弁当に・・・ガムが混入されていることがわかりましたぁ・・・ハァッ♥」[p] +「べ、弁当はラップで包まれた状態で・・・アフゥッ♥・・・チン、陳列されており・・・っ、客が中に物を入れることは困難な・・・ことからぁっ、せ、製造段階でまぎれこんだと・・・見られておりますぅんっ♥」[p] +「弁当は・・・チン、店舗に併設されている調理場でぇ・・・っ♥・・・せ、製造されており、警察は従業員の誰かが・・・ひゃ、犯人ではないかと見て取り調べを行っています・・・アヒッ♥」[p] +「なお、ガムはぶ、ブドウ味だったとぉ・・・ンンッ♥・・・いうことですぅっ」[p] +「にゅ、ニュースにところどころ・・・ンッ♥・・・お、お見苦しいところがありますっ・・・申し訳・・・ございません・・・アンッ♥」[p] +「さ、搾乳機に・・・お、オッパイを搾られて・・・ンンッ♥・・・感じてしまっておりますぅっ・・・ど、ドスケベで申し訳ありません・・・アヒッ♥」[p] +「つ、続いてのニュースです―――」[p] + + +[_tb_end_text] + +[mask time="1000" effect="fadeIn" color="0x000000" ] +[mask_off time="1000" effect="fadeOut" ] +[tb_start_text mode=1 ] +#亜紀子 +「瓦斯首相が・・・ンッ♥・・・男尊女卑を掲げる精神団体「男根会」に・・・にゅ入会していたぁ・・・ンヒッ♥・・・ことが発覚した件でぇ・・・アフゥッ♥」[p] +「アハァ・・・し、失礼しました・・・ふ、袋田幹事長は・・・ンンーッ♥・・・ハァ・・・「首相の私生活のことであり党としては何の問題もない」として・・・ンッ・・・問題視しない姿勢を明らかにしましたぁンッ♥」[p] +「が、瓦斯首相は・・・アヒィッ♥・・・だ、男尊・・・女卑のぉ・・・アフッ♥・・・し、思想がぁ・・・アァーーーーッ♥」[p] +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro254-8.jpg" ] +[tb_cg id="254" ] +[tb_start_text mode=1 ] +#亜紀子 +「し、失礼しましたぁ・・・アンッ♥・・・せ、政治にぃ・・・ンンーーッ♥・・・ハァ・・・ハァ・・・え、影響を・・・ッ・・・アンッ♥・・・あ、与えるのではぁぁ・・・アッ・・・アアーーッ♥」[p] +「し、失礼しまし・・・アヒッ♥・・・あ、与えるのでは・・・ないかとの・・・ンンッ♥・・・だ、ダメェーーーーーッ♥」[p] +「アッ・・・アヒッ♥」[p] +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro254-7.jpg" ] +[tb_start_text mode=1 ] +#亜紀子 +「アッ・・・ハァッ・・・し、失礼いたしました・・・アッ・・・ニュース中に・・・お、オッパイで感じて・・・ぜ、絶頂に達してしまいました」[p] +「ドスケベで大変申し訳ありません・・・っ♥」[p] +「えー・・・瓦斯首相は記者団の質問に「男根会の思想は素晴らしいが今すぐ政治に影響することはない」と答えました・・・アフゥッ♥」[p] +「しかし一部では民生党が・・・ンッ♥・・・男根会が支援する男尊党との・・・連立を計画しているという情報もあり・・・アヒッ♥・・・日本の男尊女卑化が大きく進むのではないかと懸念の声が上がっています」[p] +「野党はこの件を・・・アンッ♥・・・国会で追及していく方針ですが、野党内にも・・・アフゥッ♥・・・男根会の会員が相当数居るとも噂されており、今回のことが政権に・・・ンンッ♥与える影響は小さいと観られていますぅ」[p] +「い、以上23時のニュースでした・・・アヒッ♥・・・放送中にか、感じまくってパンティをビショビショにしてしまったことをお詫び申し上げます。大変・・・失礼いたしました・・・アンッ♥」[p] +「それでは失礼します・・・っ」[p] +[_tb_end_text] + +[stopbgm time="1000" ] +[tb_replay id="reps16" ] +[bg time="1000" method="crossfade" storage="hiro999.jpg" ] +[tb_start_text mode=1 ] +# +オナペット女子アナとしてすっかり定着した亜紀子は、高視聴率を稼ぐ人気芸能人になった[p] +亜紀子本人が望んだ形では決してないが、芸能人としてはある意味成功と言えた[p] +しかし常に半裸に近い格好でテレビに出演する亜紀子に、もはや「ニュースキャスターが肌を露出する」という有り難味はなくなり、人気を維持するためにより過激な演出を求められるのであった[p] +そして・・・[p] +[_tb_end_text] + +[tb_hide_message_window ] +*rep17 + +[tb_replay_start ] +[mask time="1000" effect="fadeIn" color="0x000000" ] +[bg time="1000" method="crossfade" storage="hiro202.jpg" ] +[tb_show_message_window ] +[chara_show name="ノブオ" time="1000" wait="true" storage="chara/7/hiro263-2.png" width="404" height="808" left="175" top="49" reflect="false" ] +[mask_off time="1000" effect="fadeOut" ] +[playbgm volume="100" time="1000" loop="true" storage="neonpurple.ogg" ] +[tb_start_text mode=1 ] +#ノブオ +「おおー・・・これがテレビ局の中かぁ」[p] +「ここを芸能人たちがいつも歩いているのかと思うとドキドキするな」[p] +「・・・しかしまさか応募に当選するとは思わなかったなぁ、週間ピンクSHOW!の一般参加ゲームコーナー」[p] +「最近あの番組、乳山亜紀子や岡明日香が出演するようになってすごく人気が出てるからな」[p] +「一般参加の倍率もかなり高いって聞いたけど、運がよかったぜ」[p] +「今日はあの乳山亜紀子とエッチなゲームが出来るんだ・・・あぁ楽しみだなぁ」[p] +「・・・おっと、今から勃起してたらやばいぞ。静まれ静まれ・・・」[p] + + +[_tb_end_text] + +[chara_show name="谷田" time="1000" wait="true" storage="chara/4/hiro259-1.png" width="390" height="936" left="720" top="21" reflect="false" ] +[tb_start_text mode=1 ] +#谷田 +「あ、一般参加の方ですね。そろそろ時間なんで、スタジオに移動しますので付いて来てください」[p] +#ノブオ +「あ、はい!」[p] +[_tb_end_text] + +[chara_hide_all time="1000" wait="true" ] +[stopbgm time="1000" ] +[bg time="1000" method="crossfade" storage="hiro999.jpg" ] +[playbgm volume="100" time="1000" loop="true" storage="オフィスの日常.ogg" ] +[tb_start_text mode=1 ] +#司会者 +「さぁ続いてはお待ちかね大人気コーナー『お色気ドキドキ♥バトル』~~~~!」[p] +「今週も一般視聴者から選ばれた挑戦者にお色気ファイターとエッチなゲームで闘っていただきます」[p] +「今週のお色気ファイターはこいつだ!」[p] + +[_tb_end_text] + +[chara_show name="美里" time="1000" wait="true" storage="chara/1/hiro260-6s.png" width="445" height="1113" left="208" top="49" reflect="false" ] +[tb_start_text mode=1 ] +#司会者 +「ご存知オナペット母乳女子アナ、乳山亜紀子~~~~!」[p] +#亜紀子 +「乳山亜紀子です、よろしくおねがいします♥」[p] +「今日も精一杯頑張ります!ボインボインッ♥」[p] +#司会者 +「さぁ乳山ちゃん、最近負け続きだけど今日は大丈夫なのぉ?」[p] +#亜紀子 +「は、はい・・・前回も絶頂に達してしまって、オシッコを漏らして負けてしまったんですけど、今回は絶対頑張ります」[p] +#司会者 +「乳山ちゃんはホントすぐにオシッコ漏らしちゃうからねぇ~w今日は頑張って耐えてよ?」[p] +#亜紀子 +「はい、頑張りますっ!」[p] +#司会者 +「それでは挑戦者に登場してもらいましょう。埼玉県からお越しのノブオさんです。どうぞ!」[p] +# +[_tb_end_text] + +[chara_show name="ノブオ" time="1000" wait="true" storage="chara/7/hiro263-4.png" width="383" height="766" left="724" top="70" reflect="false" ] +[tb_start_text mode=1 ] +#ノブオ +「よ、よろしくお願いします」[p] +#司会者 +「はい、よろしくお願いします。えー、ノブオさんは28歳ということですが、お仕事は何をされてるんですか?」[p] +#ノブオ +「ふ、フリーターです」[p] +#司会者 +「なるほどぉー、バトルに勝つと賞金10万円がもらえますので、ぜひ勝って持って帰ってくださいね」[p] +#ノブオ +「は、はい、頑張ります」[p] +#司会者 +「今日の相手は乳山亜紀子アナですけど、どうですか乳山ちゃんを目の前にして」[p] +#ノブオ +「いやぁ・・・び、美人だし、すごく、え、エッチだなぁと思います」[p] +#亜紀子 +「あ、ありがとうございます」[p] +#司会者 +「どうですか乳山亜紀子の生乳は?」[p] +#ノブオ +「す、すごいです・・・」[p] +#亜紀子 +「アハハ・・・」[p] +#司会者 +「今日も母乳がパンパンに詰まってますからね」[p] +「さて、今日の対戦方法はこちら・・・『漕いで漕いで母乳を搾れ!ドキドキ♥自転車搾乳バトル』!!」[p] +「えー、内容はいたってシンプルです。まず乳山アナが拘束されて搾乳機をつけられます」[p] +「そして挑戦者は自転車を漕いで電気を起こして搾乳機を作動させて乳山アナのオッパイを搾っていただきます」[p] +「ただし、漕ぐスピードが遅いと吸引力が弱くてオッパイはなかなか吸えません」[p] +「速く漕げば漕ぐほど搾乳機のパワーが強くなって母乳がたくさん搾れます」[p] +「制限時間内に200ccの母乳を搾れたら挑戦者の勝ち、搾れなければ挑戦失敗となります」[p] +「ただし、途中で乳山アナがオシッコを漏らしちゃうとその時点で挑戦者の勝利となります。ルールはわかりましたか?」[p] +#ノブオ +「は、はい!」[p] +#司会者 +「自転車はどうですか?」[p] +#ノブオ +「普段から乗ってるので、結構自信あります」[p] +#司会者 +「おーなるほど、ということですけど乳山ちゃん、耐えられそうですか?」[p] +#亜紀子 +「は、はい、今日は絶対にオシッコを漏らさないように我慢します」[p] +#司会者 +「10万円結構でかいですからね。番組のために絶対に我慢してくださいよ」[p] +#亜紀子 +「はいっ」[p] +#司会者 +「それではスタンバイの方よろしくお願いします!」[p] +# +・・・・・・[p] +・・・[p] +[_tb_end_text] + +[mask time="1000" effect="fadeIn" color="0x000000" ] +[chara_hide_all time="1000" wait="true" ] +[bg time="1000" method="crossfade" storage="hiro142-1.jpg" ] +[mask_off time="1000" effect="fadeOut" ] +[tb_start_text mode=1 ] +#司会者 +「さあスタンバイが出来たようです。乳山チャンどうですかー?」[p] +#亜紀子 +「は、はい・・・じゅ、準備・・・オーケーです・・・っ」[p] +#司会者 +「アララーー、これはすーごい格好になってますねぇーw大丈夫ですか?」[p] +#亜紀子 +「は、はい・・・だ、大丈夫です・・・っ」[p] +#司会者 +「いやぁーこれは・・・完全にSMの世界ですよ。乳山ちゃんキツかったらキツいって言ってよ?」[p] +#亜紀子 +「い、いえ・・・オナペット女子アナとして・・・こ、これくらいは・・・全然平気・・・ですっ」[p] +#司会者 +「首輪もグイーーっと引っ張られてちゃってるけど苦しくない?」[p] +#亜紀子 +「い、いえ・・・搾っている顔がちゃんと・・・見えるようにということで・・・大丈夫です・・・」[p] +#司会者 +「さすが乳山ちゃん、家畜扱いされて興奮してるんじゃないの?」[p] +#亜紀子 +「あ、はい・・・こ、興奮してます・・・っ・・・へ、変態ですいません・・・」[p] +#司会者 +「はい、了解ですぅー。テレビをご覧の皆さん、これは乳山アナが自ら望んでやってることですから。決して無理やりやらせているわけではないので、そこは誤解しないでくださいね」[p] +「挑戦者のノブオさんも準備オーケーですかー?」[p] +#ノブオ +「はい!大丈夫です!」[p] +#司会者 +「それでは早速バトルのほうをスタートしてまいりましょう。よーーーーーい・・・スタートォォ!」[p] +#ノブオ +「うぉぉぉーーーー!」[p] +#司会者 +「さあ挑戦者漕ぎ始めました!最初から飛ばしています!」[p] +#ノブオ +「フオオオオーーー!」[p] +# +ウィィィィ・・・ン[p] +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro142-2.jpg" ] +[tb_start_text mode=1 ] +#亜紀子 +「ア・・・ッ♥」[p] +#司会者 +「おっ、速度が一定に達して搾乳機が始動しました!」[p] +#ノブオ +「ぬおおおおおー!」[p] +# +ウィィィィン[p] +キューーーッ[p] +#亜紀子 +「アッ・・・ンッ♥」[p] +#司会者 +「さぁ搾乳機がターゲットのオッパイを吸いはじめましたぁ!」[p] +「乳山ちゃんどうですか、結構吸われてますか!?」[p] +#亜紀子 +「アンッ・・・は、はい・・・吸われてます・・・アンッ♥」[p] +#ノブオ +「フヌーーーーーッ!」[p] +#司会者 +「挑戦者、奇声を上げながら自転車を漕ぐ漕ぐ漕ぐぅーーー!」[p] +「しかし、まだ乳山アナの乳首からは母乳は出ていないぞぉ~~!」[p] +#ノブオ +「フォーーーオオオ!」[p] +# +キュウゥゥゥゥ・・・っ![p] +#亜紀子 +「ンンッ・・・ンフゥッ♥」[p] +#司会者 +「乳首が弱い乳山亜紀子、思わず声が漏れているぅ~~!」[p] +「しかし、母乳の方は・・・おおっ!?」[p] +#ノブオ +「ウガァァァァァ!!」[p] +# +キュウウーーーーッ[p] +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro142-3.jpg" ] +[tb_start_text mode=1 ] +#司会者 +「オオーーッ!今両方の乳首から母乳が噴き出してきましたぁー!!」[p] +#ノブオ +「ヌオオオオーーーッ!」[p] +# +キュイィィィーーッ[p] +ピューーーーッ![p] +#亜紀子 +「アッ・・・クッぅ・・・ンッ♥」[p] +#司会者 +「さあ母乳がパイプを伝って容器に溜まり始めましたぁ!」[p] +「200ccですからこのペースだとどうなのかぁー!?」[p] +#ノブオ +「フヌゥウウウーっ!」[p] +# +ピューーーーッ![p] +ドピューーーッ!」[p] +#亜紀子 +「ハゥ・・・ッ・・・アヒッ♥」[p] +#司会者 +「オッパイを搾られて声が漏れているぞぉ!大丈夫ですか乳山アナ!?」[p] +#亜紀子 +「アンッ♥・・・は、はひっ・・・ンンッ♥」[p] +#ノブオ +「オリャァアアアアア!」[p] +# +プシャーーーッ![p] +ビシューーーッ![p] +#司会者 +「容器の中にどんどん母乳が溜まっていくぅーー!3分の1くらいまで一気に溜まったぞぉー!」[p] +「制限時間はまだ半分以上ある!乳山亜紀子耐えられるのかーー!?」[p] +#ノブオ +「フォォォォォォォ!」[p] +# +ピューーーッ![p] +ドピューーーーッ![p] +#亜紀子 +「アハァンッ♥・・・アヒィーーーッ♥」[p] +#司会者 +「あぁー乳を吸われて乳山亜紀子が感じまくっているぅーーー!」[p] +「またオシッコを漏らしてしまうのかぁーーー!?」[p] +#ノブオ +「ドォリャァァァーーーっ!!」[p] +# +ブシャーーーッ![p] +ドピュピューーーーッ![p] +#亜紀子 +「アヒィーーッ♥・・・ンンーーーッ・・・アハァンッ♥」[p] +#司会者 +「乳山アナ、耐えて耐えて!もうちょっとだから!」[p] +#亜紀子 +「ンンッ♥・・・アヒィーッ・・・ダメェーーッ♥」[p] +#ノブオ +「オリャァアァァアアアアッ!!」[p] +# +ドピューーーッ![p] +ブシャーーーーッ![p] +#亜紀子 +「アヒィーーーーッ♥アンッ♥アンンッ♥」[p] +#司会者 +「あぁーー母乳があふれ出しているーーーーっ!これは挑戦者のすごい猛攻だぁーーー!!」[p] +「母乳が一気に溜まっていくーー!これはまたしても乳山アナ完全敗北かぁーーー!?」[p] +#ノブオ +「うぉぉぉぉおおおおおおっ!!」[p] +#亜紀子 +「アヒィーーーーーッ♥ダメェーーーーーッ♥」[p] +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro142-4.jpg" ] +[tb_cg id="142" ] +[tb_start_text mode=1 ] +# +ジョボボボボボボボ![p] +#司会者 +「あぁーーーーー乳山亜紀子またしても失禁ーーーーーっ!!」[p] +#亜紀子 +「イヤァーーーーーッ♥アッ・・・み、見ないでぇーーーーーっ♥」[p] +# +ジョボボボボボボ[p] +#ノブオ +「ぬおおおおおおおおお!!」[p] +# +ドピューーーーッ![p] +プシャーーーーーーッ![p] +#司会者 +「ゲーム終了ぉーーーーっ!!」[p] +# +カンカンカンカン![p] +#ノブオ +「ハァッ・・・ハァッ・・・ハァッ!」[p] +#亜紀子 +「アヒッ♥・・・ダメェ・・・っ♥」[p] +# +ジョボボボボボ[p] +#司会者 +「乳山亜紀子まだ小便を漏らしているーーっ!」[p] +#亜紀子 +「あぁ・・・ヤンッ♥」[p] +# +ジョボボボボ・・・チョロッ[p] +#司会者 +「ようやくお漏らしが止まりました。乳山亜紀子完全敗北です!」[p] +#亜紀子 +「あぁ・・・ハァッ・・・ハァッ・・・」[p] +#司会者 +「というわけで・・・挑戦者の勝利!おめでとうございますっ!」[p] +#ノブオ +「ハァッ・・・あ、ありがとうございます・・・っ・・・ゼェゼェ・・・」[p] +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro999.jpg" ] +[chara_show name="ノブオ" time="1000" wait="true" storage="chara/7/hiro263-4.png" width="408" height="816" left="688" top="13" reflect="false" ] +[tb_start_text mode=1 ] +#司会者 +「いやぁ、見事な勝利でしたね」[p] +#ノブオ +「は、はい、ありがとうございますっ」[p] +#司会者 +「最後は失禁によるTKOということでしたが」[p] +#ノブオ +「そうですね、精一杯漕ぎました」[p] +#司会者 +「あ、最後は結局母乳も200cc越えてたんですね。もう完全勝利でした」[p] +#ノブオ +「あ、そうなんですか。よかったです!」[p] +#司会者 +それでは賞金10万円になります。どうぞ」[p] +#ノブオ +「あっ、ありがとうございます!」[p] +#司会者 +「それと搾った母乳も副賞としてお持ち帰りできますので、悪くなる前に飲んじゃってくださいね」[p] +#ノブオ +「えっ、母乳ももらえるんですか、やった!」[p] +#司会者 +「というわけで、今回のドキドキ♥バトルは挑戦者の勝利でした!また来週!」[p] +# +・・・・・・[p] +・・・[p] + +[_tb_end_text] + +[chara_hide_all time="1000" wait="true" ] +[stopbgm time="1000" ] +[mask time="1000" effect="fadeIn" color="0x000000" ] +[bg time="1000" method="crossfade" storage="hiro202.jpg" ] +[chara_show name="ノブオ" time="1000" wait="true" storage="chara/7/hiro263-2.png" width="400" height="800" left="662" top="27" reflect="false" ] +[mask_off time="1000" effect="fadeOut" ] +[playbgm volume="100" time="1000" loop="true" storage="neonpurple.ogg" ] +[tb_start_text mode=1 ] +#ノブオ +「いやぁ・・・楽しかったなぁーー」[p] +「テレビに出るなんて初めてなんでどうなるかと思ったけど、来てよかったよ」[p] +「あの乳山亜紀子の失禁ショーが見れた上に10万円までもらっちゃって・・・」[p] +「おまけに母乳まで・・・うおお、たまらんなぁ」[p] +「しかしエロかったなぁ乳山亜紀子・・・」[p] +「ついこの前までお堅いキャスターのイメージだったのに、今あんなエロいことしてるなんて・・・信じられないよ」[p] +「芸能界って恐ろしいところだよなぁ・・・」[p] +「とりあえずチンコがビンビンだし、さっさと家に帰って母乳飲みながらオナニーしまくろうっと・・・」[p] +#亜紀子 +「あ、あの・・・」[p] + +[_tb_end_text] + +[stopbgm time="1000" ] +[chara_show name="美里" time="1000" wait="true" storage="chara/1/hiro258-2.png" width="473" height="1183" left="196" top="16" reflect="false" ] +[chara_mod name="ノブオ" time="00" cross="false" storage="chara/7/hiro263-1.png" ] +[playbgm volume="100" time="1000" loop="true" storage="bluenoise.ogg" ] +[tb_start_text mode=1 ] +#ノブオ +「えっ、ち、乳山亜紀子アナ・・・!?」[p] +「な、なんで・・・?」[p] +#亜紀子 +「あ・・・さ、先ほどはどうもありがとうございました」[p] +#ノブオ +「え・・・あ、はいっ、こちらこそ・・・」[p] +#亜紀子 +「そ、それでですね・・・あの・・・」[p] +「先ほど賞金の10万円を手にされたと思うんですけど・・・」[p] +#ノブオ +「あ、はい・・・ここにありますけど・・・」[p] +「えっ、まさか賞金はテレビ上だけで返せって言うんじゃ・・・」[p] +#亜紀子 +「あっ、いえ、そのままお持ち帰りいただいてももちろんかまわないのですが」[p] +「賞金の代わりに・・・もう一つのオプションを選んでいただくこともできるんです」[p] +#ノブオ +「え、オプション・・・ですか?」[p] +#亜紀子 +「は、はい。も、もちろんどちらを選んでいただいても自由なんですが」[p] +#ノブオ +「10万か、もう一個のそのオプションか選べるってことですよね・・・?」[p] +「10万でいいけどなぁ・・・で、どんなオプションなんですか?」[p] +#亜紀子 +「あ、あの・・・その・・・わ、わたしを一晩好きにできる権利なんですが・・・」[p] +#ノブオ +「えっ!!?」[p] +#亜紀子 +「・・・」[p] +#ノブオ +「え・・・ど、ど、どういうことですか?それって・・・」[p] +#亜紀子 +「あ・・・わ、私を一晩好きに・・・」[p] +#ノブオ +「えっ、それって・・・つまり・・・どこかのホテルで・・・とかそういうことですか?」[p] +#亜紀子 +「あ、はい・・・そうです」[p] +[_tb_end_text] + +[chara_mod name="ノブオ" time="600" cross="false" storage="chara/7/hiro263-5.png" ] +[tb_start_text mode=1 ] +#ノブオ +「え、じょ、冗談じゃないんですか?ほほほ、ほ、本当に・・・!?」[p] +#亜紀子 +「はい・・・ど、どうされますか・・・?」[p] +#ノブオ +「え、も、もう一度確認しますけど・・・本当にその・・・乳山アナと、せ、せ、セックス・・とか」[p] +#亜紀子 +「は、はい・・・」[p] +#ノブオ +「ほ、本当になんでもできるんですか!?」[p] +「ど、ドッキリとかじゃなくて!?」[p] +#亜紀子 +「ドッキリではありません。これは一部の番組関係者しか知らないことなので・・・」[p] +「ですから・・・このことは他者には絶対に口外しないでくださいね」[p] +#ノブオ +「て、てことは本当に・・・ってことですよね」[p] +#亜紀子 +「ど、どうされますか・・・?」[p] +#ノブオ +「そ、そりゃもちろん・・・10万円はお返しします!」[p] +#亜紀子 +「あ・・・はい・・・わ、わかりました」[p] +「それでは・・・よ、よろしくお願いします」[p] +#ノブオ +「は、はいっ!」[p] +#亜紀子 +「それでは・・・参りましょうか・・・」[p] +# +・・・・・・[p] +・・・[p] +[_tb_end_text] + +[mask time="1000" effect="fadeIn" color="0x000000" ] +[chara_hide_all time="1000" wait="true" ] +[bg time="1000" method="crossfade" storage="hiro204.jpg" ] +[chara_show name="ノブオ" time="000" wait="true" storage="chara/7/hiro263-1.png" width="470" height="940" left="705" top="42" reflect="false" ] +[mask_off time="1000" effect="fadeOut" ] +[tb_start_text mode=1 ] +#ノブオ +「な、なんか変な部屋につれてこられたけど・・・」[p] +「ほ、本当に乳山亜紀子と・・・セックスできるのか・・・?」[p] +「芸能人とセックスできるなんてそんな上手い話が本当にあるんだろうか・・・?」[p] +「なんか騙されてるんじゃ・・・」[p] +「怖い人が出てきて・・・なんてことになるんじゃ・・・」[p] + +[_tb_end_text] + +[chara_show name="美里" time="1000" wait="true" storage="chara/1/hiro260-6.png" width="616" height="1540" left="48" top="0" reflect="false" ] +[tb_start_text mode=1 ] +#亜紀子 +「ど、どうも・・・お待たせしました」[p] +#ノブオ +「お・・・おぉおお!?」[p] + +[_tb_end_text] + +[chara_mod name="ノブオ" time="600" cross="false" storage="chara/7/hiro263-5.png" ] +[tb_start_text mode=1 ] +#ノブオ +「ほ、本当に・・・で、できるんだ・・・!」[p] +「ゆ、夢じゃないのか・・・!」[p] +#亜紀子 +「・・・ノブオ様、本日はオナペット母乳アナウンサーの乳山亜紀子をお買い上げいただいてありがとうございます」[p] +「今晩はノブオ様の忠実な性奴隷として誠心誠意奉仕させていただきます。どのような命令も拒否いたしませんのでなんでもお申し付けください」[p] +#ノブオ +「せ、性奴隷・・・!?」[p] +「な、なにをしてもいいの!?」[p] +#亜紀子 +「は、はい。ただし、いくつか禁止事項がありますのでそれだけはご容赦ください」[p] +「ひとつは、回復に時間のかかるダメージを与えること」[p] +「これは例えば怪我をさせたり、爪をはがす、髪を切るなどの損傷を与えることです」[p] +#ノブオ +「そ、そんなことしないっす」[p] +#亜紀子 +「もうひとつは、このことを第三者に知られることです」[p] +「他の人にこのことを教えるようなことは絶対にしないでください。映像などの記録を残すことも禁止とさせていただきます」[p] +#ノブオ +「はい、はい、しませんっ」[p] +#亜紀子 +「それ以外のことは何をしてもノブオ様の自由です。亜紀子をノブオ様の所有物と思ってお好きなようにお使いください」[p] +#ノブオ +「じゃ、じゃあ・・・な、中出しも・・・?」[p] +#亜紀子 +「はい、もちろんです。どうぞ好きなだけ中に出してくださいませ♥」[p] +#ノブオ +「あ、アナルとかも・・・?」[p] +#亜紀子 +「はい、あ、亜紀子はアナルが弱点ですので・・・たくさんかわいがってください♥」[p] +#ノブオ +「おぉ・・・ふおおおおおお!!」[p] +「も、もう我慢できない・・・うおおおおおお!」[p] +#亜紀子 +「アアァッ♥」[p] +# +[_tb_end_text] + +[call storage="sr.ks" target="" ] +[tb_start_text mode=1 ] +#ノブオ +「ハァ・・・ハァ・・・」[p] +「・・・さ、さすがにもう無理・・・もう一滴も出ない・・・」[p] +「ゆ、夢のような時間だったな・・・こんなことが現実に起こるなんて・・・」[p] +「あの女子アナの乳山亜紀子と・・・生セックス・・・」[p] +「何回中出ししただろう?アナルにも口にも・・・金玉が空になるまで出しまくったけど・・・」[p] +「10万は安すぎるよな・・・まさかもっと要求されるんじゃないだろうな?」[p] +「・・・なんか急に怖くなってきたぞ」[p] +「もう時間も残ってないし・・・か、帰るか」[p] +「・・・最後にもう一回だけベロチュウしていこう」[p] +「ムチューーッ」[p] +#亜紀子 +「アムッ・・・ンッ・・・チュ・・・ッ♥」[p] +「ンハァッ・・・ハァッ・・・♥」[p] +#ノブオ +「よ、よし、名残惜しいけどもう帰ろう・・・!」[p] +# +ガチャッ・・・バタン![p] +ドタドタドタ・・・[p] +・・・・・・[p] +・・・[p] +[_tb_end_text] + +[bg time="3000" method="crossfade" storage="hiro136-1.jpg" ] +[tb_start_text mode=1 ] +#亜紀子 +「ハァ・・・ハァ・・・ッ♥」[p] +「・・・あ・・・っ」[p] +「・・・ありがとうござい・・・ました・・・♥」[p] +# +エンディングNo.1 「ノブオ」[p] +[_tb_end_text] + +[tb_replay id="reps17" ] +[wait time="3000" ] +[tb_start_text mode=1 ] +# +[_tb_end_text] + +[jump storage="title_screen.ks" target="" ] diff --git a/data/scenario/end2.ks b/data/scenario/end2.ks new file mode 100644 index 0000000..cee2996 --- /dev/null +++ b/data/scenario/end2.ks @@ -0,0 +1,1195 @@ +[_tb_system_call storage=system/_end2.ks] + +[chara_hide_all time="1000" wait="true" ] +[bg time="1000" method="crossfade" storage="hiro999.jpg" ] +[tb_start_text mode=1 ] +# +浣腸で心を折られ完全に躾けられてしまった亜紀子は、従順な性奴隷としての日々を過ごしていた[p] +毎晩のように勝野や梅田に呼び出され、その性欲を満たすために奉仕し、玩具のようになぶられて尊厳を踏みにじられる[p] +心の底では屈辱を覚えつつも、大人しく従っていれば酷い目に遭わされずに済むという奴隷としての生活に徐々に慣れてきてしまっていた[p] +そんなある日・・・[p] +[_tb_end_text] + +[tb_hide_message_window ] +*rep18 + +[tb_replay_start ] +[mask time="1000" effect="fadeIn" color="0x000000" ] +[bg time="1000" method="crossfade" storage="hiro118-0.jpg" ] +[tb_show_message_window ] +[mask_off time="1000" effect="fadeOut" ] +[playbgm volume="50" time="1000" loop="true" storage="オフィスの日常.ogg" ] +[tb_start_text mode=1 ] +#梅田 +「ウメちゃんのディープな話~~~!!」[p] +「さぁ今週も始まりました、みなさん頑張ってまいりましょう」[p] +#若手芸人 +「頑張りまーす!」[p] +#グラドル +「よろしくお願いしま~す」[p] +#梅田 +「それでは早速行きましょう。今日のテーマはなんですか?」[p] +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro120-1.jpg" ] +[tb_start_text mode=1 ] +#亜紀子 +「はい、今日のテーマは『V字水着』です」[p] +#梅田 +「ほーほー、これは解りやすいテーマですね」[p] +#亜紀子 +「はい、今日は裸よりもV字水着が好きというV字水着マニアの皆さんとV字水着について熱く語っていくわけなんですが、梅田さんV字水着ってどういうのかわかりますか?」[p] +#梅田 +「知ってるよ。アレやろ?こう乳のとこからバァーーンとVの字になってるやつやろ?」[p] +#亜紀子 +「そうですね・・・今、モニターに映りました、こういう感じの水着のことなんですが、着る側にとっては非常に頼りないといいますかすぐにずれちゃいそうなんですが・・・梅田さんはお好きですか?」[p] +#梅田 +「ええねぇー。後ろがまたいいよね、こう、ほらもうほとんど裸やもんね」[p] +#亜紀子 +「はい、というわけでそんなV字水着を愛して止まないマニアの方々に早速登場していただきましょう。どうぞ!」[p] + +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro118-0.jpg" ] +[tb_start_text mode=1 ] +#亜紀子 +「マニアA、B、Cさんです。みなさんよろしくお願いします」[p] +#マニアたち +「よろしくお願いします」[p] +#梅田 +「どいつもこいつもスケベそうな顔しとんなー」[p] +#若手芸人 +「ちょっと梅田さん!いきなり失礼でしょw」[p] +#マニアA +「アハハハハ」[p] +#梅田 +「あ、すいません、つい」[p] +「で、皆さんはⅤ字水着が大好きなんですか」[p] +#マニアA +「はい、大好きです」[p] +#マニアB +「無茶苦茶好きです。愛してます」[p] +#マニアC +「同じく」[p] +#梅田 +「でもV字でないとあかんの?こんな小さいビキニとかもあるやんか」[p] +#マニアA +「ダメですね。いや全然ダメじゃないですけど、やっぱりV字は特別ですから」[p] +#マニアC +「基本布の小さい水着は好きなんですけど、その行き着く最終点がV字なんですよね」[p] +#梅田 +「最終点って・・・どこが特別なん?」[p] +#マニアA +「やっぱり女性が一番エロく見えるのがV字水着じゃないですか」[p] +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro120-5.jpg" ] +[tb_start_text mode=1 ] +#マニアB +「ビキニってどんだけ小さくてもやっぱり隠すためのモノじゃないですか。大事な部分を」[p] +「でもV字水着ってむしろ裸より恥ずかしい格好をするためのモノなんですよ」[p] +#梅田 +「え、どういうことどういうこと?」[p] +#マニアB +「V字水着ってちょっと動いたらもうずれて乳首が見えるじゃないですか」[p] +「最初からずれて見えることを想定してる水着なんですよ。隠す気がないんですよ」[p] +#若手芸人 +「なるほど、V字水着を着てる時点でもうこの女はエロいっていうのが確定なんやね」[p] +#マニアC +「そうなんですよ。もう存在そのものがエロ目的のものなんですよ」[p] +#梅田 +「なるほどねぇー。キミなんかグラビアで着たことないの?」[p] +#グラドル +「何度かあります」[p] +#マニアC +「先月出た写真集でも着られてましたよね。オレンジのやつを」[p] +#グラドル +「えーーー、見てくれたんですかw」[p] +#マニアC +「もちろんですよ。グラビアアイドルのV字水着は全てチェックしてますよ。グフフフ」[p] +#梅田 +「キモッ!」[p] +[_tb_end_text] + +[tb_image_show time="1000" storage="default/hiro101-97.jpg" width="414" height="439" x="-3" y="279" _clickable_img="" name="img_18" ] +[tb_start_text mode=1 ] +#マニアB +「グラビアアイドルでもアイドル寄りの人はあまり着ないんですよV字水着は」[p] +「セクシー寄りのグラドルがよく着るんで一番ありがたい存在ですね」[p] +#梅田 +「ランクの低いグラドルってことやんw」[p] +#グラドル +「ちょ、ひどーーーいw」[p] +#マニアA +「そんなことないですよ。我々にとってはまさに女神なわけですから」[p] +#グラドル +「ありがとうございますwでも、あれってやっぱり恥ずかしいんですよね」[p] +#亜紀子 +「こ、こちらがグラドルさんのV字水着写真ですね・・・ンッ♥」[p] +#グラドル +「ヤダーーー恥ずかしいw出さなくていいのにw」[p] +#梅田 +「おぉーー、これはかなりいっとるねぇ」[p] +「これって撮影でポロリとか無いの?」[p] +#グラドル +「ありますよぉー。一応糊みたいなのでずれないようにくっつけるんですけど、それでもたまにポロっと・・・」[p] +#マニアC +「うわぁーーいいなぁー。撮影現場で見てみたい!グフフフ」[p] +#若手芸人 +「やっぱりCさんちょっとキモいですねw」[p] +#梅田 +「キモいよな」[p] +#マニアC +「グフフフフ」[p] +[_tb_end_text] + +[tb_image_hide time="00" ] +[bg time="1000" method="crossfade" storage="hiro118-0.jpg" ] +[tb_start_text mode=1 ] +#亜紀子 +「というわけでですね、今日はV字水着の実物をいくつかご用意しました」[p] +「・・・こちらなんですが、実際手にとってみてどうですか?」[p] +#梅田 +「あーーーーなるほどね。うわーーー、これ見てみ」[p] +「ヒモやんヒモw」[p] +#若手芸人 +「すごいですねこれ。こんなん隠れます?大事なとこ」[p] +#グラドル +「そこまでのは私も着たことないですねー。このくらいのですねグラビアで着たことあるのは」[p] +#梅田 +「でも実際着てるとこ見ないとわからんなぁー」[p] +「キミ、ちょっと着て来てよ」[p] +#グラドル +「えーーー、私が着るんですか~~~?今~~~?」[p] +#梅田 +「ええやん、いつも着てるやつでいいからさ」[p] +#グラドル +「えーー・・・恥ずかしいですぅ~~」[p] +#亜紀子 +「あ、あのですね・・・グラドルさんは今回は残念ながらNGということで・・・」[p] +#梅田 +「そうなん?残念やなー」[p] +#マニアC +「残念です!」[p] +#亜紀子 +「そ、そのかわりにですね・・・せ、僭越ながらわたくしが着させていただこうかと・・・」[p] +#マニアA +「えっ!?」[p] +#若手芸人 +「えっ、千山さんが!?」[p] +#梅田 +「キミが着るんかいな」[p] +#亜紀子 +「は、はい」[p] +#梅田 +「いや、大丈夫なんかいな。アナウンサーやのに」[p] +「無理せんでええで?」[p] +#若手芸人 +「ほんまですよ。無理しないほうがいいんじゃないですか?」[p] +#亜紀子 +「い、いえ・・・あの、ぜひ着させてください!」[p] +#梅田 +「ほんまかいな・・・そんなに言うんやったら来てもらおか」[p] +#亜紀子 +「は、はいっ」[p] +#マニアたち +「やった!!」[p] +#梅田 +「ほな後ろで着替えてきてもらおうか」[p] +「一番布のでかいやつでええからなー!」[p] +#亜紀子 +「は、はい・・・それじゃちょっとお待ちください」[p] + +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro118-3.jpg" ] +[tb_start_text mode=1 ] +#梅田 +「いやー千山はすごいね、売れる気マンマンやね」[p] +#若手芸人 +「積極的ですよね~~」[p] +#グラドル +「すごいです~。グラビアアイドルの私が断ったのがなんか恥ずかしいです」[p] +#梅田 +「ほんまやで自分」[p] +#グラドル +「ごめんなさい~」[p] +#梅田 +「どうよマニアのみなさん、期待してるんちゃうの?」[p] +#マニアA +「めちゃめちゃしてます!僕千山さんのファンなので!」[p] +#マニアB +「スタイルすごいですからね、期待大です!」[p] +#マニアC +「すごい楽しみです・・・グフフフッ」[p] +#梅田 +「そやろなぁ・・・もうそろそろ着替えたんじゃないですかね?」[p] +「どうーー!?着替えたーーー!?」[p] +#亜紀子 +「は、はいーー!き、着替えましたーー!」[p] +#梅田 +「それじゃ登場してもらいましょうか。・・・どうぞー!」[p] +[_tb_end_text] + +[chara_show name="美里" time="1000" wait="true" storage="chara/1/hiro260-6m.png" width="487" height="1218" left="259" top="18" reflect="false" ] +[tb_start_text mode=1 ] +#亜紀子 +「ど、どうですか・・?」[p] +#一同 +「おおおおーーー!!」[p] +#マニアC +「すげぇぇーーー!!」[p] +#グラドル +「キャーーーー!」[p] +#梅田 +「ちょ、お前、それ大丈夫か!?」[p] +「お前それ・・・一番布の細いやつやないか!」[p] +#亜紀子 +「は、はい・・・」[p] +#若手芸人 +「あかんでしょこれ!」[p] +#梅田 +「いや、もっと布の大きいやつあったやろ!なんでそれを選んでん!?」[p] +#亜紀子 +「あの・・・こ、これが一番いいかな・・・って」[p] +# +もちろんこれは台本どおりである[p] +亜紀子がモデルを申し出たのも一番際どい水着をチョイスしたのも台本どおりで、梅田とスタッフは事前に知っている[p] +しかしそれ以外の出演者と視聴者はそんな裏側は知らないので、亜紀子が自ら望んでエッチな格好をする露出狂のように見えてしまうのだ[p] +#グラドル +「千山さんって結構大胆だったんですね~~」[p] +#若手芸人 +「いやぁ~~、エロいなぁ~~~」[p] +#マニアA +「おぉ・・・す、素晴らしい・・・っ」[p] +#梅田 +「お前・・・ちょっと乳輪はみ出てるやないけ!」[p] +#亜紀子 +「あ・・・す、すいません」[p] +#マニアC +「うほっ・・・にゅ、乳輪・・・!」[p] +#梅田 +「股のところも・・・おいおい、食い込みすぎやろ!」[p] +#マニアB +「・・・ゴクリ」[p] +#グラドル +「うわぁ~~・・・でも毛が一本もはみ出てないですね」[p] +#梅田 +「ほんまや!どうなってんのこれ?」[p] +#亜紀子 +「あ、あの・・・ツルツルに剃ってあるので・・・」[p] +#梅田 +「パイパンかいな自分!エロいな!」[p] +#亜紀子 +「アハハハ・・・すいません」[p] +(何度も抱いて知ってるくせに・・・)[p] +#若手芸人 +「千山さんってだいぶイメージと違いますねぇ~」[p] +#亜紀子 +「え・・・と、本題はV字水着ですので・・・。マニアの皆さんどうですか?」[p] +#マニアC +「最高です!グフフフッ」[p] +#マニアB +「たまらないです!」[p] +#マニアA +「いやぁ・・・すごすぎてやばいです」[p] +#亜紀子 +「後ろもこんな感じなんですが・・・」[p] +#梅田 +「うはーーー!あかんあかん!」[p] +#グラドル +「キャーーーー!」[p] +#若手芸人 +「裸やないですか!完全に裸やないですか!」[p] +#梅田 +「こっれは・・・大丈夫なんこれ?」[p] +#マニアたち +「おぉぉぉぉ・・・」[p] +#亜紀子 +「え・・・と、マニアの皆さん、とってほしいポーズとかありますか?」[p] +#マニアA +「えっ、えーーっと・・・」[p] +#梅田 +「あかんあかん!危ないから動くな!」[p] +#グラドル +「見えちゃいますよ~~~」[p] +#亜紀子 +「あ・・・あの、わ、わたし昔新体操をやってたんですよ」[p] +#梅田 +「は?そうなん?」[p] +#亜紀子 +「は、はい・・・だからこんなポーズとかも・・・」[p] +[_tb_end_text] + +[chara_hide name="美里" time="1000" wait="true" pos_mode="true" ] +[bg time="1000" method="crossfade" storage="hiro118-4.jpg" ] +[tb_start_text mode=1 ] +#マニアたち +「うわぁぁぁ!!」[p] +#グラドル +「えーーーーっ!」[p] +#梅田 +「おいおいおい!大丈夫か!?」[p] +#亜紀子 +「大丈夫です・・・新体操やってましたから・・・」[p] +#梅田 +「いやそういうことやなくて!水着がお前これ・・・」[p] +#若手芸人 +「危ない危ない!こぼれそうですよ!」[p] +#亜紀子 +「ま、マニアの皆さん・・・ど、どうですか?」[p] +#マニアC +「さ、最高ですっ!」[p] +#マニアA +「いや・・・すごいです!」[p] +#梅田 +「いや、もうええてもうええて!」[p] +#亜紀子 +「よかったら・・・近くで見てくださいね」[p] +#マニアたち +「はいっ!」[p] +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro118-5.jpg" ] +[tb_start_text mode=1 ] +#マニアたち +「おおおおぉぉ・・・!」[p] +#梅田 +「おい、あかんて!ケツの食い込みが・・・!」[p] +「ちょっと見えてもうてるて!黄門様が見えてもうてるって!」[p] +#グラドル +「きゃーーーやだーーー!」[p] +#亜紀子 +「く、食い込みもV字水着の醍醐味ですから・・・ど、どうぞご覧になってください」[p] +#マニアC +「フゴッ!こ、これは・・・!」[p] +#マニアB +「す、すばらしい・・・っ!」[p] +#マニアA +「やばいですやばいです!」[p] +#グラドル +「千山さん大胆すぎ~~~!」[p] +#若手芸人 +「身体張りすぎですって!」[p] +#梅田 +「はい、終了終了~~!」[p] +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro118-3.jpg" ] +[chara_show name="美里" time="1000" wait="true" storage="chara/1/hiro260-6m.png" width="469" height="1174" left="269" top="27" reflect="false" ] +[tb_start_text mode=1 ] +#梅田 +「キミちょっと無茶しすぎやで。すごいなホンマ」[p] +#亜紀子 +「す、すいません。ちょっと張り切りすぎてしまいました・・・」[p] +#若手芸人 +「いやすごいですよ。女芸人でもなかなかできないですよ」[p] +#グラドル +「千山さんってそんなイメージなかったんでビックリしました~」[p] +#梅田 +「自分で一番小さい水着選ぶし、あんなポーズまで自分からやるし・・・露出狂の気があるんやないの?」[p] +#亜紀子 +「そ、そんなことはないです。は、恥ずかしかったです」[p] +#梅田 +「ほんまかいな・・・」[p] +「ほんでもうええから、着替えてきいな」[p] +#亜紀子 +「あ、もう今日は・・・このままで続けていこうと思います」[p] +#梅田 +「そのままでやるんかいな!」[p] +「やっぱり露出狂やないか!」[p] +#亜紀子 +「アハハハ・・・」[p] +# +・・・・・・[p] +・・・[p] +[_tb_end_text] + +[stopbgm time="1000" ] +[mask time="1000" effect="fadeIn" color="0x000000" ] +[bg time="1000" method="crossfade" storage="hiro203.jpg" ] +[chara_mod name="美里" time="50" cross="false" storage="chara/1/hiro260-5m.png" ] +[mask_off time="1000" effect="fadeOut" ] +[playbgm volume="100" time="1000" loop="true" storage="neonpurple.ogg" ] +[tb_start_text mode=1 ] +#亜紀子 +「はぁ・・・」[p] +「あぁ恥ずかしかった・・・顔から火が出そうだったわ」[p] +「無理やりやらされてるのに・・・自分から積極的にエッチな格好をしてるみたいに思われるし、視聴者にも絶対変態の露出狂だと思われちゃうわ・・・」[p] +「でも、勝野には逆らえないし・・・これからはもうどんどんこういう方向に進んでいくしかないのね・・・」[p] +「・・・とりあえずもう着替えましょう」[p] +「・・・・・・あれ?」[p] +「服が無いわ・・・あれ、たしかここに・・・」[p] +「ど、どこにいったのかしら・・・ん・・・この紙は?」[p] +「・・・『服は預かった。そのままの格好で地下の大道具倉庫まで来い』・・・ええっ!?」[p] +「こ、これって勝野の・・・?」[p] +「そ、そんな・・・この格好で社内を歩くなんて・・・」[p] +「・・・でもどうしようもないし・・・従うしかないわ・・・」[p] +「・・・部屋を出て廊下を急いで歩いて・・・エレベーターに乗れば・・・上手くいけば誰にも会わないで済むかも」[p] +「・・・はぁ・・・こ、怖いけど・・・」[p] +「・・・このままじっとしてても仕方ないわ。・・・い、行きましょう」[p] + +[_tb_end_text] + +[chara_hide_all time="1000" wait="true" ] +[stopbgm time="1000" ] +[bg time="1000" method="crossfade" storage="hiro202.jpg" ] +[chara_show name="美里" time="1000" wait="true" storage="chara/1/hiro260-5m.png" width="42" height="105" left="775" top="379" reflect="false" ] +[playbgm volume="100" time="1000" loop="true" storage="music17.ogg" ] +[tb_start_text mode=1 ] +#亜紀子 +「よ、よし、誰も居ないわ・・・!」[p] +「このままエレベーターまで・・・!」[p] +[_tb_end_text] + +[chara_hide_all time="1000" wait="true" ] +[chara_show name="美里" time="1000" wait="true" storage="chara/1/hiro260-5m.png" width="110" height="275" left="885" top="336" reflect="false" ] +[tb_start_text mode=1 ] +#亜紀子 +「・・・よし・・・いける・・・!」[p] +「お願い・・・誰も来ないで・・・!」[p] + +[_tb_end_text] + +[chara_hide_all time="1000" wait="true" ] +[chara_show name="美里" time="1000" wait="true" storage="chara/1/hiro260-5m.png" width="437" height="1093" left="458" top="32" reflect="false" ] +[tb_start_text mode=1 ] +#亜紀子 +(よし・・・エレベーターに着いたわ!)[p] +(エレベーターは・・・もうすぐ来るわね)[p] +(あ・・・でもエレベーターに誰か乗ってたら・・・)[p] +(ちょっと離れたところで・・・待ちましょう・・・!)[p] +#後輩アナウンサー(男) +「あ・・・えっ!?」[p] + +[_tb_end_text] + +[stopbgm time="1000" ] +[playbgm volume="30" time="1000" loop="true" storage="烈火翔ける.ogg" ] +[tb_start_text mode=1 ] +#亜紀子 +「えっ、キャッ!?」[p] +#後輩アナウンサー(男) +「えっ、千山さん・・・!?」[p] +「どうしたんですかそんな格好で・・・?」[p] +[_tb_end_text] + +[chara_mod name="美里" time="600" cross="false" storage="chara/1/hiro260-6m.png" ] +[tb_start_text mode=1 ] +#亜紀子 +「あ、あのっ・・・ちょ、ちょっと仕事で・・・」[p] +#後輩アナウンサー(男) +「仕事って・・・あぁ深夜の・・・」[p] +「先輩最近はこういう仕事されてるんですねぇ・・・」[p] +#亜紀子 +「そ、そうなの・・・アハハ」[p] +(ジロジロ見ないで・・・っ!)[p] +#後輩アナウンサー(男) +「あの厳しかった千山先輩がこんな・・・すごいですねこれ、ほとんど裸じゃないですか」[p] +#亜紀子 +「え、ええ・・・」[p] +(早く向こうに行ってよ・・・!)[p] +#後輩アナウンサー(男) +「でも、なんでこんな格好でウロウロしてるんですか?」[p] +#亜紀子 +「そ、それは・・・その・・・」[p] +#後輩アナウンサー(男) +「あぁ、みんなに見て欲しいんですね。先輩やっぱりそっちの気が・・・」[p] +#亜紀子 +「ち、違うわ・・・っ!ちょっと手違いで着替えが・・・」[p] +「あ、エレベーターが来た・・・って、ああっ!?」[p] + +[_tb_end_text] + +[chara_show name="局長" time="1000" wait="true" storage="chara/3/hiro262-2.png" width="415" height="996" left="25" top="-29" reflect="false" ] +[tb_start_text mode=1 ] +#局長 +「ん・・・うわっ!?」[p] +「な、なにをしとるんだね千山くん!」[p] +#亜紀子 +「きょ、局長・・・!」[p] +「こ、これはその・・・」[p] +#後輩アナウンサー(男) +「深夜バラエティーの撮影だったそうですよ」[p] +「それでみんなに見て欲しいからそのままウロウロしてるそうです」[p] +#亜紀子 +「ち、ちが・・・っ!」[p] +[_tb_end_text] + +[chara_mod name="局長" time="600" cross="false" storage="chara/3/hiro262-3.png" ] +[tb_start_text mode=1 ] +#局長 +「な、なるほどね・・・そうかそうか」[p] +「最近は身体を張ってがんばってるみたいじゃないか。ん?」[p] +#亜紀子 +「あ・・・はい・・・」[p] +#局長 +「千山くんにこういう素質があったとはねぇ・・・いや良いことだよウンウン」[p] +#亜紀子 +「ど、どうも・・・」[p] +(舐めまわすように身体を見ないで・・・)[p] +#局長 +「いやぁほとんど裸だねぇこれは。オッパイなんかこぼれそうじゃないか」[p] +「まぁ、アナウンサーも芸能人だからね。身体も武器としてどんどん使っていきなさい。ムフフフ」[p] +#亜紀子 +「は、はい・・・」[p] +「あっ、え、エレベーターが来たので失礼します・・・っ!」[p] + + +[_tb_end_text] + +[stopbgm time="1000" ] +[chara_hide name="局長" time="1000" wait="true" pos_mode="true" ] +[bg time="1000" method="crossfade" storage="hiro999.jpg" ] +[chara_mod name="美里" time="600" cross="false" storage="chara/1/hiro260-5m.png" ] +[playbgm volume="100" time="1000" loop="true" storage="music17.ogg" ] +[tb_start_text mode=1 ] +#亜紀子 +「はぁ・・・心臓が止まるかと思ったわ」[p] +「よりによって後輩と局長に会うなんて・・・」[p] +「二人ともスケベな目で私を見てたわ・・・まぁこんな格好をしてるんだから仕方ないけど・・・」[p] +「なんか勘違いされてたし・・・勝野のせいで私がどんどん変態みたいに思われてきてるわ」[p] +「ただ抱かれるならまだ耐えられるけど・・・こういう嫌がらせは本当にやめて欲しい・・・」[p] +「・・・あっ、大道具倉庫のある地下に着いたわ」[p] +[_tb_end_text] + +[mask time="1000" effect="fadeIn" color="0x000000" ] +[mask_off time="1000" effect="fadeOut" ] +[tb_start_text mode=1 ] +#亜紀子 +「き、来たけど・・・勝野はどこかしら・・・?」[p] +「すごく広いし・・・薄暗くて不気味だわ・・・」[p] +「一体どこに行けば・・・」[p] +[_tb_end_text] + +[stopbgm time="1000" ] +[quake time="80" count="7" hmax="5" wait="true" vmax="5" ] +[tb_start_text mode=1 ] +#亜紀子 +「ギャッ!?」[p] +[_tb_end_text] + +[chara_move name="美里" anim="true" time="170" effect="linear" wait="true" left="456" top="552" width="437" height="1093" ] +[tb_start_text mode=1 ] +# +・・・・・・[p] +・・・[p] +[_tb_end_text] + +[mask time="1000" effect="fadeIn" color="0x000000" ] +[chara_hide_all time="1000" wait="true" ] +[mask_off time="1000" effect="fadeOut" ] +[tb_start_text mode=1 ] +#亜紀子 +「・・・ぅ」[p] +「・・・ぁ・・・ハッ!?」[p] +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro122-1.jpg" ] +[playbgm volume="100" time="1000" loop="true" storage="SO_SAD.ogg" ] +[tb_start_text mode=1 ] +#亜紀子 +「こ、これは一体・・・!?」[p] +「あ、脚が・・・つ、吊り下げられてて動かせない・・・っ」[p] +「手も後ろで・・・手錠が掛けられてるわ・・・!」[p] +「いつの間にこんなことを・・・」[p] +#谷田 +「目が覚めましたか千山さん」[p] +[_tb_end_text] + +[chara_show name="谷田" time="1000" wait="true" storage="chara/4/hiro259-5.png" width="587" height="1409" left="783" top="-30" reflect="false" ] +[tb_start_text mode=1 ] +#亜紀子 +「えっ!?た・・・谷田君!?」[p] +「ど、どうしてここに・・・!?」[p] +#谷田 +「どうして?僕が呼び出したんですよ、ほら」[p] +#亜紀子 +「そ、それは私の服・・・!」[p] +「あ、あの書置きは谷田君だったの・・・!?」[p] +#谷田 +「そうですよ。そしてこ、これから千山さんは僕のものになるんです、クフフフフ」[p] +#亜紀子 +「な、何を言ってるの谷田君、すぐにこれを外してちょうだい!」[p] +#谷田 +「千山さんが悪いんですよ・・・変態のくせに僕を拒否するから・・・」[p] +「僕に犯されて気持ちよかったくせに・・・」[p] +#亜紀子 +「ちょっと、ご、誤解よ!私は変態なんかじゃないわ・・・!」[p] +#谷田 +「うそをつくな!今日の収録だって見てたんだぞ。カメラの前でこんなエロい水着を着て興奮してたんだろう!」[p] +#亜紀子 +「ち、違うわ!これには理由が・・・」[p] +#谷田 +「うるさい!ずっと憧れてたのに・・・本当はドスケベで裏では男とヤリまくってたんだろう!」[p] +「これからは僕が犯しまくってやる・・・!」[p] +#亜紀子 +「・・・っ!」[p] +(ダメだわ・・・まともに会話しても通じないわ。ここは強気に・・・)[p] + + +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro122-2.jpg" ] +[chara_mod name="谷田" time="00" cross="false" storage="chara/4/hiro259-4.png" ] +[tb_start_text mode=1 ] +#亜紀子 +「谷田君、自分が何をしてるかわかってるの!?」[p] +「これはれっきとした犯罪よ!すぐに外さないと警察に訴えるわよ!」[p] +#谷田 +「う・・・そ、そんなこと言ってももう騙されないぞ・・・!」[p] +「ほ、本当は興奮してるんだろう、この変態め・・・!」」[p] +#亜紀子 +「いい加減にして!わたしは変態じゃないって言ってるでしょう!」[p] +「あなたの勝手な妄想よ!目を覚ましなさい!」[p] +#谷田 +「く・・・」[p] +#亜紀子 +「今ならまだ許してあげるわ。すぐにこの拘束を外しなさい!」[p] +#谷田 +「う・・・うるさい黙れ!」[p] +「お前は変態だ!こうしてやる!」[p] + +[_tb_end_text] + +[chara_hide name="谷田" time="1000" wait="true" pos_mode="true" ] +[bg time="1000" method="crossfade" storage="hiro122-3.jpg" ] +[tb_start_text mode=1 ] +# +ビシィッ![p] +#亜紀子 +「キャウッ!?」[p] +#谷田 +「フウッ・・・フウッ・・・」[p] +「な、生意気な口をきく変態にはお仕置きだ・・・!」[p] +# +ビシッ!ビシィッ![p] +#亜紀子 +「アウッ!・・・や、やめ・・・キャンッ!」[p] +#谷田 +「クヒックヒヒヒッ・・・実は興奮してるんだろ!ソラッ!」[p] +# +ビシィッ!ビシィッ![p] +#亜紀子 +「キャァッ!・・・い、痛いっ!や、やめてぇっ!」[p] +#谷田 +「うそつけ!これが好きなんだろ!?ホレッ!ホレッ!」[p] +# +ビシィッ!ビシィッ![p] +#亜紀子 +「アヒィッ!やめてぇーーっ!キャゥッ!」[p] +#谷田 +「気持ちいいって言え!ソラッ!ソラッ!ソラァッ!」[p] +# +ビシッ!ビシッ!ビシィッ!」[p] +#亜紀子 +「キャゥッ!・・・イヤァッ!アウゥッ!」[p] +#谷田 +「ハァ・・・ハァッ・・・!」[p] +「ど、どうだ、変態だって認めるか・・・?」[p] +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro122-4.jpg" ] +[tb_start_text mode=1 ] +#亜紀子 +「だ・・・誰が認めるものですか・・・」[p] +「わたしは・・・変態なんかじゃないわ。あなたの勝手な妄想よ・・・!」[p] +#谷田 +「く・・・なんでだよ・・・っ!」[p] +「変態のくせに・・・ドスケベの変態のくせに・・・!」[p] +#亜紀子 +「勝手な妄想で人を拘束して、一方的に暴力をふるって・・・あなたはまともじゃないわ!あなたの方が変態よ!」[p] +#谷田 +「ぼ、僕にそんな口を利くな・・・!」[p] +「お、お前は変態なんだ・・・!そして・・・僕のモノになるんだ!」[p] +#亜紀子 +「バカじゃないの・・・!勝手な事言わないで!」[p] +「さっさとこの拘束を解きなさい!」[p] +#谷田 +「う、うるさい!」[p] + +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro122-5.jpg" ] +[tb_start_text mode=1 ] +# +グイッ![p] +#亜紀子 +「キャァッ!?」[p] +#谷田 +「クヒックヒヒッ・・・このオッパイ・・・何度も思い出してオナニーしたオッパイ・・・」[p] +「僕のモノになるんだ・・・僕のモノに・・・」[p] +#亜紀子 +「く・・・み、見ないで!」[p] +#谷田 +「そしてオ○ンコ・・・グフッグフッグフッ」[p] +「ここにチンポを・・・ん?」[p] +#亜紀子 +「み、見ないでっ!」[p] +#谷田 +「ちょっと濡れてる・・・!?」[p] +「や、やっぱりムチで叩かれて感じてたんじゃないか・・・!」[p] +#亜紀子 +「ち、違うわ・・・っ。これは・・・」[p] +「こんな水着でカメラの前に立ったり、社内を歩いたからで・・・」[p] +#谷田 +「じゃ、じゃあやっぱり変態じゃないか!見られて興奮する露出狂だ!」[p] +#亜紀子 +「そ、それは・・・」[p] +#谷田 +「やっぱりお前はドスケベな女だったんだな!」[p] +#亜紀子 +「ち、違うわ・・・!わたしは・・・!」[p] +#谷田 +「ぼ、僕のモノにればこのドスケベな身体を毎日かわいがってやるぞ・・・」[p] +「どうだ・・・僕のモノになるって言えよ・・・!」[p] +#亜紀子 +「なるわけないでしょ・・・!」[p] +「どうせ変なAVでも見て覚えたセリフでしょう。バカみたいよ・・・!」[p] +#谷田 +「う、うるさい・・・!」[p] +「そんな舐めた口をきけなくしてやる・・・!」[p] +#亜紀子 +「な、何をする気?」[p] +「もういいから外しなさい。あなたにはこんなことは・・・あぐっ!?」[p] + + +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro122-6.jpg" ] +[tb_start_text mode=1 ] +#亜紀子 +「ふ、フガッ・・・い、痛い・・・っ!?」[p] +#谷田 +「フヒッ・・・ど、どうだ、不細工な顔になった気分は!」[p] +#亜紀子 +「な、なにするの!・・・は、外ひて!」[p] +#谷田 +「フヒヒッ、お似合いだよ、変態のお前には」[p] +「今のお前は美人ニュースキャスターじゃない。ドスケベなメス豚なんだよ!」[p] +「ほら、ブヒって鳴いてみろ!」[p] + +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro122-7.jpg" ] +[tb_start_text mode=1 ] +#亜紀子 +「だ、誰が鳴くものでふか!」[p] +「わ、わたひはメス豚なんかじゃないわ!人を馬鹿にするのもいい加減にひて!」[p] +#谷田 +「ププッ、はっきりしゃべってくださいよ。アナウンサーでしょう?」[p] +#亜紀子 +「く・・・は、早く外さないと本当に警察に言うわよ!」[p] +#谷田 +「フン、そんな豚面で怖い顔しても全く迫力ないよ」[p] +「ほら、豚は豚らしくブヒブヒ鳴けよ」[p] +#亜紀子 +「う・・・こ、こんなことをひて私があなたの言いなりになるとでも思っつぇるの?」[p] +#谷田 +「安心しなよ、ちゃんといいものを用意してあるから」[p] +「あぁもっとさっさと言うことを聞いていればよかったって思うものがね・・・クヒヒヒ」[p] +#亜紀子 +「な、なにを・・・」[p] +#谷田 +「怖いのか?今ならまだ許してやるぞ」[p] +「『私は変態です。谷田君のモノになります』って言えよ」[p] +#亜紀子 +「だ、誰が・・・言うもんですか・・・」[p] +#谷田 +「ふん・・・これを見てもまだ強気でいられるかな?」[p] +#亜紀子 +「そ、それは・・・!」[p] +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro122-8.jpg" ] +[tb_start_text mode=1 ] +# +ズプッ[p] +#亜紀子 +「イヤァァァ!!や、ヤメテェェェ!」[p] +#谷田 +「おっ?これがそんなに怖いのか?ムヒヒヒ」[p] +#亜紀子 +「か、浣腸は・・・浣腸はヤメテェェッ!お願い・・・っ!」[p] +#谷田 +「クフフッ、女は浣腸に弱いって本当だったんだな。漫画で見たとおりだ」[p] +#亜紀子 +「あ、あやまるから・・・浣腸は・・・やめて・・・」[p] +#谷田 +「やめてください、だろ?」[p] +#亜紀子 +「や、やめてください・・・お願いします・・・」[p] +#谷田 +「ムヒヒヒヒ・・・あの千山亜紀子が一発で大人しくなるなんて・・・」[p] +「クフフフ、ぶ、豚のしゃべり方で謝れよ」[p] +#亜紀子 +「えっ・・・ぶ、豚のしゃべり方・・・?」[p] +#谷田 +「語尾にブヒって付けるんだよ!早くしないと浣腸をぶち込むぞっ!」[p] +#亜紀子 +「ひっ・・・ご、ごめんなさいブヒ・・・許してくださいブヒ・・・ッ」[p] +#谷田 +「自分がドスケベな変態女だって認めるか?」[p] +#亜紀子 +「み、認めます・・・」[p] +#谷田 +「豚はどうした!?」[p] +#亜紀子 +「ヒッ・・・み、認めますブヒッ・・・わ、わたしはドスケベ変態女ですブヒ・・・ッ」[p] +#谷田 +「ぼ、僕のモノになるか!?」[p] +#亜紀子 +「は、はいブヒ・・・た、谷田く・・・谷田様のモノになりますブヒ・・・ッ」[p] +#谷田 +「やった・・・!ついに言わせた・・・!」[p] +「僕のものになるんだな・・・!?」[p] +#亜紀子 +「な、なりますブヒッ!」[p] +#谷田 +「う・・・うそつけ!」[p] +#亜紀子 +「ヒッ・・・!?」[p] +#谷田 +「あれだけ強情だった千山亜紀子がそんな簡単に屈するわけないだろう!」[p] +「どうせ浣腸が怖いから口先だけ合わせて、解放したらすぐに警察に駆け込むんだろう!」[p] +#亜紀子 +「そ、そんなことは・・・っ」[p] +#谷田 +「僕に舐めた口をきいたことを・・・反省しろっ!」[p] +# +ブチュブチュブチュッ![p] +#亜紀子 +「グヒィイイーーーッ!?」[p] + + +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro122-9.jpg" ] +[tb_start_text mode=1 ] +#亜紀子 +「ヒィイイイーーッ!アッ・・・グゥ・・・ッ!?」[p] +#谷田 +「どうだ、特大浣腸を一気に食らった感想は?」[p] +#亜紀子 +「あぐぅ・・・っ・・・ヒッ・・・ハゥアッ!」[p] +#谷田 +「お店で一番強力な浣腸液をくださいって言って買ってきたんだ。用量を守って使うようにって注意されたけど、一気に全部ぶちこんでやったぞ」[p] +#亜紀子 +「ぐ・・・グヒッ・・・ンンッ・・・ハァッ」[p] +#谷田 +「フヒヒ、我慢しても無駄だよ。ほらウンチをぶちまけなよメス豚!」[p] +#亜紀子 +「フッ・・・ンッ・・・・クッ・・・ハヒィッ」[p] +「と・・・トイレに・・・行かせて・・・ください・・・っ!」[p] +#谷田 +「トイレに行きたかったら本当のことを言えよ!」[p] +「本心を言うんだよ!心の底からの本心を・・・!」[p] +#亜紀子 +「グ・・・ギ・・・わ、わたひは・・・へ、変態です・・・ブヒっ♥」[p] +「ど、ドスケベで・・・ドMの変態です・・・ブヒッ♥」[p] +「で、でも・・・か、浣腸はイヤ・・・なんです・・・ブヒッ・・・許ひてください・・・っブヒ♥」[p] +#谷田 +「僕のモノになるか?」[p] +#亜紀子 +「な・・・なりますブヒィ・・・た、谷田君の・・・アッ・・・やっ・・・く・・・」[p] +「アァ・・・ッ・・・ダメッ・・・♥」[p] + +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro122-10.jpg" ] +[tb_start_text mode=1 ] +# +ブチャーーーーーッ![p] +#亜紀子 +「アッ・・・イヤァーーーーッ♥」[p] +#谷田 +「フヒッ、時間切れだったね。残念」[p] +# +ジョボボボボボ[p] +#亜紀子 +「ンヒッ・・・クゥッ・・・ンハァッ・・・いやぁ♥」[p] +#谷田 +「ムヒヒッ、オシッコまで漏らすなんて。あの千山亜紀子が・・・」[p] +#亜紀子 +「いやぁ・・・ンクッ・・・ハァッ」[p] +「ダメ・・・もう・・・ハゥッ・・・っ♥」[p] +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro122-11.jpg" ] +[tb_cg id="122" ] +[tb_start_text mode=1 ] +# +ムリムリムリムリッ[p] +#亜紀子 +「いやぁぁぁっ!うぅ・・・ダメェ・・・っ♥」[p] +#谷田 +「うわっ!す、すごいウンコだ・・・!」[p] +# +ムリムリムリムリッ[p] +#亜紀子 +「アァッ・・・う、ウンチ見ないでぇ・・・ブヒッ♥」[p] +#谷田 +「あ、あの千山亜紀子が・・・こ、こんな太いウンコを・・・!」[p] +# +ムリムリ・・・ボトッ[p] +#亜紀子 +「あぁ・・・ブヒィ・・・っ♥」[p] +[_tb_end_text] + +[stopbgm time="1000" ] +[mask time="1000" effect="fadeIn" color="0x000000" ] +[bg time="1000" method="crossfade" storage="hiro134-1.jpg" ] +[mask_off time="1000" effect="fadeOut" ] +[playbgm volume="100" time="1000" loop="true" storage="music16.ogg" ] +[tb_start_text mode=1 ] +#亜紀子 +「アンッ・・・アンッ・・・アンッ♥」[p] +#谷田 +「あ、亜紀子のアナル・・・フゥッ!フウッ!」[p] +# +ズチュッ!ズニュッ![p] +#亜紀子 +「アヒッ・・・アフッ・・・ンハァッ♥」[p] +#谷田 +「ど、どうだ・・気持ち良いか!」[p] +#亜紀子 +「アヒッ・・・き、気持ち良いです・・・アァンッ♥」[p] +#谷田 +「フヒヒヒッ・・・メス豚らしく鳴いてみろ!オラッ!」[p] +# +ズムッ!ズムッ![p] +#亜紀子 +「ハ、ハヒィッ!・・・ブヒッ・・・ブヒッ・・・ブヒィッ♥」[p] +#谷田 +「お、お前はもう僕のモノだ・・・いいな!」[p] +# +ズプッ!ズプッ!ズプッ![p] +#亜紀子 +「ハヒィッ!た、谷田様のモノになりますっ・・・ブヒィッ♥」[p] +#谷田 +「や、やった・・・僕のモノだ・・・千山亜紀子は僕のモノだ・・・!」[p] +# +ズプッ!ズプッ!ズムッ![p] +#亜紀子 +「アンッ・・・お尻・・・ダメェ・・・ブヒッ♥」[p] +#谷田 +「あ、あの千山亜紀子が・・・尻の穴でこんなに感じるなんて・・・」[p] +「本当に変態だったんだな・・・ソラッ!」[p] +# +ズプッ!ズプッ![p] +#亜紀子 +「ヒィッ・・・ハヒィッ・・・わたしはアナルで感じる・・・変態ですぅ・・・ブヒィッ♥」[p] +#谷田 +「くそっ・・・今まで僕を騙してたんだな・・・このメス豚め・・・!」[p] +# +ズプッ!ズニュッ!ズプッ![p] +#亜紀子 +「ごめんなさひぃーーーっ!アヒィーーーッ♥」[p] +#谷田 +「知的でステキな女性だと思って・・・憧れてたんだぞ・・・っ!」[p] +# +ズプッ!ズプッ!ズムッ![p] +#亜紀子 +「アヒィンッ!・・・ンヒッ・・・アンンッ♥」[p] +#谷田 +「自分では絶対手が届かないと思って・・・一言しゃべるだけで満足してた・・・」[p] +「その千山亜紀子の・・・アナルを犯してるんだ・・・!」[p] +# +ズチュッ!ヌチュッ!ズプッ![p] +#亜紀子 +「アヒィーッ!お、お尻でイっちゃうブヒィーーーッ♥」[p] +#谷田 +「ぼ、僕ももう・・・イ・・・く・・・っ!」[p] +# +ズムッ!ズムッ!ズムッ![p] +#亜紀子 +「ブヒィーーーーーッ♥」[p] +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro134-2.jpg" ] +[tb_cg id="134" ] +[tb_start_text mode=1 ] +# +ドピュピュッ![p] +#谷田 +「おぉ・・・うっ!」[p] +#亜紀子 +「アフゥッ・・・お腹が・・・熱い・・・ブヒッ♥」[p] +# +ドピュピュピュッ![p] +#谷田 +「おぉぅ・・・亜紀子のアナルに・・・搾り取られ・・・っ」[p] +#亜紀子 +「アンッ・・・ンハァ・・・ブヒッ♥」[p] +#谷田 +「これで・・・亜紀子は・・・僕の・・・」[p] +「フヒヒヒ・・・」[p] +# +・・・・・・[p] +・・・[p] + +[_tb_end_text] + +[stopbgm time="1000" ] +[tb_replay id="reps18" ] +[bg time="1000" method="crossfade" storage="hiro999.jpg" ] +[tb_start_text mode=1 ] +#谷田 +「あ、亜紀子はもう俺のモノだからな、良いな!」[p] +#亜紀子 +「は、はい・・・ブヒ」[p] +#谷田 +「ほ、他の男とは別れるんだ!良いな!」[p] +#亜紀子 +「アッ・・・そ、それは・・・む、ムリです・・・ブヒィッ」[p] +#谷田 +「な、なに!」[p] +「ま、また浣腸されたいのか!」[p] +#亜紀子 +「ヒィッ!そ、それは許してぐださひぃ・・・ブヒィッ!」[p] +#谷田 +「じゃあ他の男と別れろ!そして僕だけのモノになれ!」[p] +#亜紀子 +「む、無理なんですぅ・・・ブヒッ!」[p] +#谷田 +「なんでだ!?なんで無理なんだ!?」[p] +#亜紀子 +「そ、それは・・・」[p] +#谷田 +「言えッ!なんでだ!?」[p] +# +グイッ![p] +#亜紀子 +「ハグッ、い、痛っ・・・よ、弱みを握られて逆らえないからですブヒィーーッ!」[p] +#谷田 +「な・・・だ、誰だ!?誰だよそいつは・・・!?」[p] +#亜紀子 +「ゆ、許して・・・その人に逆らったら・・・」[p] +#谷田 +「・・・・・・勝野だろう?」[p] +#亜紀子 +「えっ・・・!?」[p] +「な、なんで・・・」[p] +#谷田 +「やっぱりそうか・・・!」[p] +「おかしいと思ってたんだ・・・急にあいつの番組で・・・」[p] +「そうだったんだな・・・!あいつに弱みを握られて・・・そうか、あいつが僕の亜紀子をこんな変態にしたんだな!?」[p] +#亜紀子 +「あぁ・・・」[p] +#谷田 +「勝野にどんな弱みを握られてるんだ!?」[p] +#亜紀子 +「そ、それは・・・動画です。公開されたら人生が終わるような動画を山ほど・・・」[p] +#谷田 +「ど、動画・・・そ、それで逆らえないのか・・・」[p] +「そ、それで・・・勝野にどんなことをされたんだ・・・?」[p] +#亜紀子 +「・・・毎日犯されて・・・スケベな身体にされたわ・・・」[p] +「アナルも開発されたし・・・ザーメンも毎日飲まされて・・・性奴隷として色々なことを仕込まれたわ・・・」[p] +#谷田 +「な・・・亜紀子を・・・フゥッ・・・なんてことを・・・ハァッ」[p] +#亜紀子 +「逆らったら酷い目に合うの・・・だからあいつには逆らえない・・・」[p] +#谷田 +「ぼ、僕よりも怖いのか・・・!ええ!?」[p] +#亜紀子 +「・・・比べ物にならないわ」[p] +「とてもじゃないけど谷田君では・・・」[p] +#谷田 +「クソッ・・・!」[p] +「・・・・・・」[p] +#亜紀子 +「ごめんなさい・・・だから私からは手を引いて・・・」[p] +#谷田 +「ふざけるな!あ、亜紀子は・・・ぼ、僕のモノだっ!」[p] +「・・・・・・」[p] +「あいつさえ・・・あいつさえいなければ・・・」[p] +「あいつさえ・・・」[p] +#亜紀子 +「・・・・・・」[p] +# +・・・・・・[p] +・・・[p] + + + +[_tb_end_text] + +[mask time="1000" effect="fadeIn" color="0x000000" ] +[bg time="1000" method="crossfade" storage="hiro202.jpg" ] +[chara_show name="勝野" time="1000" wait="true" storage="chara/5/hiro256-1.png" width="449" height="1078" left="176" top="23" reflect="false" ] +[mask_off time="1000" effect="fadeOut" ] +[playbgm volume="100" time="1000" loop="true" storage="枯れ葉が集う路地裏通り_2.ogg" ] +[tb_start_text mode=1 ] +#勝野 +「ふう・・・やれやれ、会議が長引いちまったぜ」[p] +「亜紀子と明日香を使って数字を稼いできたが・・・だいぶマンネリ化してきたしな・・・」[p] +「ここらでもっと過激な演出を・・・」[p] +「・・・とりあえず亜紀子を呼び出してチンポしゃぶらせるか」[p] +「・・・ん?」[p] +[_tb_end_text] + +[chara_show name="谷田" time="1000" wait="true" storage="chara/4/hiro259-4.png" width="360" height="864" left="694" top="64" reflect="false" ] +[tb_start_text mode=1 ] +#勝野 +「谷田じゃねえか。こんなところで何やってるんだ?」[p] +「サボってねえでさっさと・・・ん、なんだその手に持ってるの―――」[p] +[_tb_end_text] + +[stopbgm time="1000" ] +[playbgm volume="100" time="1000" loop="true" storage="烈火翔ける.ogg" ] +[chara_move name="谷田" anim="true" time="200" effect="linear" wait="false" left="354" top="56" width="360" height="864" ] +[chara_mod name="勝野" time="00" cross="false" storage="chara/5/hiro256-2.png" ] +[quake time="100" count="7" hmax="10" wait="true" vmax="10" ] +[tb_start_text mode=1 ] +#勝野 +「はっ・・・!?」[p] +[_tb_end_text] + +[chara_move name="勝野" anim="true" time="900" effect="linear" wait="true" left="143" top="477" width="449" height="1078" ] +[tb_start_text mode=1 ] +#勝野 +「オイ・・・な・・・お・・・い」[p] +#谷田 +「お前さえいなければ・・・クヒヒヒヒ」[p] +[_tb_end_text] + +[chara_hide name="勝野" time="1000" wait="true" pos_mode="false" ] +[tb_start_text mode=1 ] +#谷田 +「クヒヒヒ・・・これで亜紀子は・・・亜紀子は俺のモノだ・・・!」[p] +「ムヒャヒャヒャヒャヒャ・・・!!」[p] +#通りすがりの局員 +「えっ、なんだ!?」[p] +「お、おい、その血は・・・うわぁぁぁ!?」[p] +「だ、誰か!!」[p] +#谷田 +「ヒャハハハハハハ!!」[p] +# +・・・・・・[p] +・・・[p] +[_tb_end_text] + +[stopbgm time="1000" ] +[call storage="sr.ks" target="" ] +[bg time="1000" method="crossfade" storage="hiro254-9.jpg" ] +[tb_start_text mode=1 ] +#アナウンサー +「昨日夜、ZNNテレビの本社内で社員の男性が刺されて死亡する事件がありました」[p] +「被害者は番組制作スタッフの勝野康平さん(32)で、腹部を刃物で刺され病院に運ばれましたが死亡が確認されました。出血によるショック死でした」[p] +「容疑者は同じく同社の番組制作スタッフの男性で、犯行後すぐに警備員に取り押さえられ警察に引き渡されました。その際、抵抗する様子はなかったということです」[p] +「警察は容疑者を拘留して犯行の動機などを聴取していますが、詳しいことはまだわかっていません」[p] +「同僚に話を聞いたところ、容疑者は大人しい性格で勤務態度も真面目で事件を起こすようなタイプには見えなかったと語ってくれました」[p] +「被害者の勝野康平さんは主にバラエティ番組の制作を担当しており、最近は仕事も順調だったということです」[p] +「続いてのニュースです―――」[p] +# +エンディングNo.2 「谷田」[p] + +[_tb_end_text] + +[wait time="3000" ] +[tb_start_text mode=1 ] +# +[_tb_end_text] + +[jump storage="title_screen.ks" target="" ] diff --git a/data/scenario/end3.ks b/data/scenario/end3.ks new file mode 100644 index 0000000..ca2aeca --- /dev/null +++ b/data/scenario/end3.ks @@ -0,0 +1,866 @@ +[_tb_system_call storage=system/_end3.ks] + +*rep24 + +[tb_replay_start ] +[stopbgm time="1000" ] +[chara_hide_all time="000" wait="false" ] +[tb_show_message_window ] +[bg time="00" method="crossfade" storage="hiro202.jpg" ] +[chara_show name="美里" time="00" wait="false" storage="chara/1/hiro258-1.png" width="517" height="1293" left="123" top="32" ] +[chara_show name="勝野" time="000" wait="false" storage="chara/5/hiro256-1.png" width="559" height="1342" left="647" top="-31" ] +[tb_start_text mode=1 ] +#亜紀子 +「ど・・・奴隷に・・・」[p] +(だ、ダメ・・・言ったらおしまいよ・・・っ!)[p] +「ど、奴隷に・・・戻りたいです・・・っ」[p] +(あぁ・・・言っちゃった・・・!)[p] +#勝野 +「フフンッ、ようやくちっぽけなプライドを捨てて本音が言えたじゃねえか」[p] +「俺のチンポが忘れられないんだろうが、ええ?」[p] +#亜紀子 +「く・・・は、はい・・・」[p] +#勝野 +「とりあえずここじゃ他人に聞かれる危険がある。そこの空き楽屋で話すぞ」[p] +#亜紀子 +「はい・・・」[p] + +[_tb_end_text] + +[mask time="1000" effect="fadeIn" color="0x000000" ] +[bg time="1000" method="crossfade" storage="hiro203.jpg" ] +[mask_off time="1000" effect="fadeOut" ] +[playbgm volume="100" time="1000" loop="true" storage="SO_SAD.ogg" ] +[tb_start_text mode=1 ] +#勝野 +「さてと、もう一回確認するが、お前は自分の意思で自由を捨てて俺の性奴隷に戻りたいんだな?」[p] +#亜紀子 +「う・・・はい・・・っ」[p] +#勝野 +「それじゃどうすればいいか、解ってるよな?ん?」[p] +#亜紀子 +「あ・・・は、はい・・・」[p] +[_tb_end_text] + +[chara_hide_all time="1000" wait="true" ] +[chara_show name="美里" time="1000" wait="true" storage="chara/1/hiro260-5.png" width="556" height="1390" left="339" top="24" reflect="false" ] +[tb_start_text mode=1 ] +#亜紀子 +「か、勝野様・・・どうかわたしをもう一度奴隷にしてください・・・っ」[p] +#勝野 +「おいおい、ちょっとの間自由にさせてやったら、もう奴隷の作法って物を忘れたのか?」[p] +#亜紀子 +「あっ・・・」[p] +[_tb_end_text] + +[chara_hide_all time="1000" wait="true" ] +[bg time="1000" method="crossfade" storage="hiro123-1.jpg" ] +[tb_start_text mode=1 ] +#勝野 +「そうそう、土下座は基本中の基本だぞ」[p] +#亜紀子 +「く・・・」[p] +「も、もう一度・・・奴隷にしてください・・・っ」[p] +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro123-3.jpg" ] +[tb_start_text mode=1 ] +#亜紀子 +「お願いします・・・っ!」[p] +#勝野 +「俺からは何も要求してないし、お前にメリットはなにも無いぞ。それでも奴隷に戻りたいんだな?」[p] +#亜紀子 +「は、はいっ!ただ奴隷に戻りたいです・・・っ!」[p] +#勝野 +「なんで奴隷に戻りたいか言ってみろ」[p] +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro123-1.jpg" ] +[tb_start_text mode=1 ] +#亜紀子 +「それは・・・刺激が欲しいからです・・・」[p] +#勝野 +「カッコつけんな!本当のことを言え!ちゃんと言わないと奴隷にしてやらないぞ!」[p] +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro123-2.jpg" ] +[tb_start_text mode=1 ] +#亜紀子 +「す、すいませんっ!勝野様のおチンポが忘れられないからですっ!」[p] +#勝野 +「低俗なゲス男と蔑んでた男のチンポに屈したのか!?」[p] +#亜紀子 +「ハイィッ、屈しました!おチンポ様には敵いませんでしたっ!おチンポ様に完全敗北しましたぁっ!」[p] +#勝野 +「チンポだけか!?それだけじゃないだろ!」[p] +「肛門舐めさせられたり浣腸されたり、テレビカメラの前で恥ずかしいことさせられたり、こうやって土下座させられたりするのが好きなんだろうが!?」[p] +#亜紀子 +「は、はいっ!好きです・・・!酷いことされるのが・・・好きなんですっ!」[p] +#勝野 +「お前はマゾの変態だ!そうだな?」[p] +#亜紀子 +「ハイッ!わたしはマゾの変態ですっ!」[p] +#勝野 +「今も興奮してるんだろう?」[p] +#亜紀子 +「ハイッ!ゾクゾクしてますっ!」[p] +#勝野 +「奴隷にして欲しけりゃ本気でアピールしてみろ!」[p] +#亜紀子 +「は、ハイッ!」[p] +「わたくし千山亜紀子は酷いことをされて悦ぶマゾの変態のメス豚ですぅっっ♥」[p] +「奴隷を解雇されていた間も勝野様のおチンポを思い出して毎日オナニーしてましたぁっ♥」[p] +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro123-3.jpg" ] +[tb_start_text mode=1 ] +#亜紀子 +「この哀れなドスケベメス豚にもう一度おチンポをお恵み下さいッ♥」[p] +「今度こそ絶対服従を誓いますから、もう一度奴隷として・・・いや家畜として飼育してくださいませぇっっ♥」[p] +「お願いしますぅっ♥」[p] +#勝野 +「ウハハハッ!いいぞ!」[p] +「プライドを完全に捨ててメス豚に成り下がってまでチンポが欲しいか!?」[p] +#亜紀子 +「ハイッ!欲しいですっ!おチンポ欲しいですぅっ♥」[p] +#勝野 +「良いだろう。奴隷に戻してやろう」[p] +#亜紀子 +「ほ、本当ですか!?ありがとうございますっ!」[p] +#勝野 +「ただし、まだチンポはやらん」[p] +「その前に本当にプライドを捨てきったかどうかテストしてやる」[p] +「それがクリアできたら久しぶりのチンポをくれてやるぞ。ククク」[p] +# +・・・・・・[p] +・・・[p] +[_tb_end_text] + +[stopbgm time="1000" ] +[tb_hide_message_window ] +[mask time="1000" effect="fadeIn" color="0x000000" ] +[bg time="1000" method="crossfade" storage="hiro118-0.jpg" ] +[tb_show_message_window ] +[mask_off time="1000" effect="fadeOut" ] +[playbgm volume="100" time="1000" loop="true" storage="オフィスの日常.ogg" ] +[tb_start_text mode=1 ] +#梅田 +「『ウメちゃんのディープな話』~~~!!」[p] +「・・・っさ、今週も始まりました。ゲストの皆さんよろしくお願いします」[p] +#中堅芸人 +「よろしくお願いします」[p] +#バラドル +「よろしくお願いします~~!」[p] +#梅田 +「・・・あれ、キミ戻ってきたんかいな?」[p] + +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro120-1.jpg" ] +[tb_start_text mode=1 ] +#亜紀子 +「はい、戻ってまいりました。ちょっと休んでしまってすいませんでした」[p] +#梅田 +「キミ、こういう仕事止めたんと違うんかいな?なんかやりすぎて苦情が来たんでしょ?」[p] +#亜紀子 +「はい・・・あの・・・ちょっと事情でしばらくお休みしていたんですけど、また復帰させていただくことになりました」[p] +「本当にご迷惑おかけしましたっ」[p] +#梅田 +「もうこんなエロい仕事はイヤや!お断りや!っていうことではないの?」[p] +#亜紀子 +「いえ、そんなことはありませんっ!」[p] +「喜んでくれる視聴者さんが少しでもいる間は、精一杯身体を張って頑張らせていただきたいと思ってます!」[p] +#梅田 +「そうかいな、代わりのアシスタントもかわいかったからもうあっちの娘で良いなと思ってたんやけどな」[p] +#亜紀子 +「梅田さん・・・!そんな!」[p] +#梅田 +「カッカッカ、冗談やがな」[p] +#亜紀子 +「頑張りますので、これからもよろしくお願いしますっ」[p] +#梅田 +「じゃあさっそく今日のテーマを教えてください」[p] +#亜紀子 +「はい、今日のテーマは『足舐め』です」[p] +#梅田 +「脚ナメ?女の子の脚を舐めるのが好きな男ってこと?」[p] +#亜紀子 +「いえ、今回の「足舐め」は女の人に自分の足を舐めさせるのが好きな、ちょっとS気味のマニアの方々なんですね」[p] +#梅田 +「ああ、そっちね!」[p] +#中堅芸人 +「ああー梅田さんが好きなやつですやん」[p] +#梅田 +「おい!俺そんなんやってへんわ!」[p] +#中堅芸人 +「よぉ後輩芸人に靴舐めさせてますやんか」[p] +#梅田 +「お前・・・ええ加減にせえよ!人聞きの悪いこと言うな!w」[p] +#バラドル +「えーー梅田さんそんなのやってるんですかぁーー!?」[p] +#梅田 +「やってへんて!」[p] +#亜紀子 +「というわけでですね、今日は女性に自分の足を舐めさせて興奮する足舐めマニアの方々にお集まりいただいています。さっそく登場してもらいましょう、どうぞ!」[p] + +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro118-0.jpg" ] +[tb_start_text mode=1 ] +#亜紀子 +「マニアAさんBさんCさんです!」[p] +#梅田 +「よろしくお願いします」[p] +#マニアたち +「よろしくお願いします」[p] +#中堅芸人 +「見た目は結構普通の方たちですね」[p] +#梅田 +「ホンマやな。もっと怖そうな人がくるかと思ったら・・・みんな意外と普通やね」[p] +#マニアA +「普通です」[p] +#亜紀子 +「皆さんはやはり「S」なんですか?」[p] +#マニアA +「そうですね、基本的にはSですね」[p] +#マニアB +「Sです」[p] +#マニアC +「僕もまぁSですかねぇ」[p] +#梅田 +「やっぱりアレなん?上に立って女を跪かせてるみたいな感覚に興奮するわけ?」[p] +#マニアA +「そうですね。やっぱり足を舐めるって屈辱的な行為じゃないですか。そこまでやらせてる、それを女性が受け入れているという実感に興奮するんですね」[p] +#マニアC +「関係性に興奮するわけですよね」[p] +#梅田 +「それはアレなん、ムチでしばいたりとかロウソク垂らしたりとかそういうSMとはまた違うの?」[p] +#マニアC +「全然違いますね。僕はそういうのはあんまり好きじゃないですし」[p] +#マニアB +「同じSでも2種類いると思うんですよ。一つはそういうムチとかのようにとにかく痛めつけるのが好きなS」[p] +#中堅芸人 +「梅田さんみたいなタイプね」[p] +#梅田 +「誰がやねん」[p] +#マニアB +「もう一つは精神的なSですよね。屈辱とか恥とか精神的な責めが好きな我々のようなタイプです」[p] +#梅田 +「なるほどねー」[p] +#マニアA +「この精神的なSは相手の気持ちを考えて興奮するSなんですよ」[p] +「今この人は屈辱を感じてるだろうなぁとか恥ずかしいだろうなぁとか、そういう相手の気持ちを想像して楽しむわけです」[p] +「ですからある意味Mでもあるわけなんですよ」[p] +#バラドル +「えーー、どういうことぉ?」[p] +#マニアA +「つまり虐めてる相手の気持ちになって興奮するわけですから、Mのことも解っていないとダメなんです」[p] +「だから精神的Sっていうのは精神的Mと表裏一体なんです」[p] +#中堅芸人 +「なるほどね。だからボケがツッコミの気持ちを考えてボケるみたいなことやね」[p] +#梅田 +「あーお笑いで言うとそういうことか」[p] +#バラドル +「おもしろーーいw」[p] +#亜紀子 +「皆さんは普段はどういった形で足舐めを実践してらっしゃるんですか?」[p] +#マニアA +「まぁ、そういうお店で・・・頼んでやってもらったりしています」[p] +#中堅芸人 +「お店の人はやってくれます?」[p] +#マニアA +「たまに断られますけどたいていはやってくれますね。残念ながらよく洗ってからですけど」[p] +#梅田 +「え、残念ながらってどういうこと?ホンマは洗ってない汚い足を舐めさせたいってこと?」[p] +#マニアA +「そうですね。精神的な屈辱を楽しみたいわけですから、よく洗ってから「ハイ舐めますね」だと作業感が出るというか・・・ちょっと冷めますよね」[p] +#中堅芸人 +「「すいません、足舐めてもらっていいですか?」とか言ってる時点でもうちょっと違うけどね」[p] +#バラドル +「たしかに~w」[p] +#マニアB +「僕はMの子がいる店でやってますね。やっぱりMの子の方がわかってるからごっこでも楽しめます」[p] +#梅田 +「なに、ごっこってなんかシチュエーションを決めてやるわけ?」[p] +#マニアB +「そうですね。女上司と部下とか。普段は高飛車で偉そうにしてる女上司に足を舐めさせる設定とかしてます」[p] +#梅田 +「カッカッカッカwおもろそうやなそれ」[p] +#亜紀子 +「Cさんはどうですか?」[p] +#マニアC +「僕はMの彼女がいるんで」[p] +#中堅芸人 +「あー、恋人同士でそんなんやってるんや」[p] +#バラドル +「それはいいかも」[p] +#マニアA +「うらやましいです」[p] +#梅田 +「カッカッカッカw」[p] +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro120-1.jpg" ] +[tb_start_text mode=1 ] +#亜紀子 +「えー、それではマニアの方々に実際に足舐めをレクチャーしてもらうんですが・・・」[p] +「残念ながら足を舐めてくれる女優さんが用意できなかったんですよ」[p] +#梅田 +「あら、そうなん?」[p] +#中堅芸人 +「やっぱり足を舐めるってかなり抵抗あるんですね、女の人にとっては」[p] +#亜紀子 +「そ、そうなんですよ」[p] +#マニアたち +「あぁーー残念!」[p] +#亜紀子 +「そ、それでですね・・・今回は・・・わ、わたくしが足舐めをさせていただこうと思いますっ」[p] +#全員 +「えーっ!?」[p] +#梅田 +「キミが舐めるの!?この・・・こいつらの足を?アカンアカン!」[p] +#中堅芸人 +「それはやめた方がいいですって!」[p] +#亜紀子 +「あの・・・番組を勝手に休んでしまってご迷惑をかけてしまったので・・・是非やらせてくださいっ!」[p] +#バラドル +「えー、ダメですよ~~!」[p] +#梅田 +「そこまで身体張らんでええって!」[p] +「イヤやろこいつらの足舐めるんやで!?」[p] +#亜紀子 +「いえっ、全然大丈夫です!わ、わたしMですし・・・」[p] +#バラドル +「ええーーーっ!?」[p] +#梅田 +「おいおい、ホンマかいな!」[p] +#亜紀子 +「はいっ、やらせてくださいっ!」[p] +#梅田 +「そこまで言うならやったらええけども・・・」[p] +#マニアA +「えっ、本当に千山アナが舐めてくれるんですか!?」[p] +#マニアC +「ウソ!?」[p] +#亜紀子 +「はい、僭越ながらわたしが舐めさせていただきます」[p] +#マニアB +「やった!」[p] +#梅田 +「大丈夫かぁ~~?」[p] +#亜紀子 +「そ、それでは早速・・・」[p] +#梅田 +「イヤイヤ、ちょぉ待てや。まずキミらよーーく足洗ってきいな」[p] +#マニアA +「はいっ、もちろんです!」[p] +#亜紀子 +「あ、足はそのままで大丈夫です」[p] +#梅田 +「いや、アカンて!汚いて!」[p] +#亜紀子 +「いえ、あの・・・さきほどAさんもおっしゃってましたし、洗っちゃったら醍醐味が半減ですので・・・」[p] +「是非そのままの汚れた足を舐めさせてください」[p] +#マニアA +「え、いいんですか!?け、結構臭いかもしませんけど・・・」[p] +#梅田 +「洗ってもらえて、お前」[p] +#亜紀子 +「いえ・・・く、臭い足の方が興奮しますから。ぜ、是非そのまま舐めさせてください。お願いしますっ」[p] +#梅田 +「お願いしますって・・・ホンマのドMやんか」[p] +#バラドル +「えーー・・・」[p] +#亜紀子 +「は、はい、ドMなんです」[p] +#中堅芸人 +「えっ、もしかしていつも誰かの足舐めてたりするん?」[p] +#亜紀子 +「あ、いえ、初めてです」[p] +#梅田 +「そらそうやろ」[p] +#バラドル +「初足舐めだぁ~~w」[p] +#マニアA +「千山アナのは、初足舐め・・・うほぉっ」[p] +#亜紀子 +「そ、それでは・・・早速舐めさせていただきます」[p] +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro148-1.jpg" ] +[tb_start_text mode=1 ] +#亜紀子 +「そ、それではまずマニアAさんから・・・」[p] +#マニアA +「は、はいっ!」[p] +#梅田 +「おいおい、ちょ、カメラ映せ!これ!」[p] +「汚いなぁ!なんかちょっと湿ってるし、靴下のカスとかも付いてるし・・・うひぃ~~~!」[p] +#バラドル +「キャァーーー!気持ち悪~~~い!」[p] +#マニアA +「す、すいませんっ・・・やっぱり洗ってきましょうか?」[p] +#亜紀子 +「いえ、大丈夫ですっ。わ、わたしに綺麗にさせてください」[p] +#中堅芸人 +「うぇ~~~!?マジで!?」[p] +#梅田 +「アカンてアカンて」[p] +#亜紀子 +「そ、それでは失礼します・・・っ」[p] +「ン・・・ペロ・・・ッ」[p] +#マニアA +「おぉぉぉぉ・・・っ♥」[p] +#梅田 +「うわぁ~~!舐めよった!」[p] +#バラドル +「うぇ~~~~~!」[p] +#亜紀子 +「ンチュッ・・・ペロペロッ・・・」[p] +#マニアA +「うひょ~~~~♥」[p] +#亜紀子 +「ペロペロッ・・・ど、どうですか?」[p] +#マニアA +「さ、最高です!ゾクゾクします♥」[p] +#梅田 +「そらそうやろ・・・キミにとっては夢のような状況なわけでしょ?」[p] +#マニアA +「はいっ、千山アナに足を舐めさせてるなんて・・・」[p] +#梅田 +「お前、臭ないんか?絶対臭いやろこんなん」[p] +#亜紀子 +「そ、そうですね、ちょっと酸っぱい感じの臭いがしますけど・・・」[p] +#バラドル +「うぇぇぇ!!」[p] +#亜紀子 +「でも、癖になるというか・・・臭い足を舐めてるっていうのが・・・こ、興奮します♥」[p] +#中堅芸人 +「変態やん!」[p] +#亜紀子 +「アハハ・・・へ、変態ですかね・・・ペロペロペロッ」[p] +「ペロペロ・・・あ、足舐めのコツとかあるんですか?もっとこうして欲しいとか・・・」[p] +#マニアA +「そ、そうですね・・・指の間とか・・・」[p] +#亜紀子 +「こ、こんな感じですか・・・チュプ・・・レロレロレロッ」[p] +#マニアA +「そ、そうですっ!」[p] +#梅田 +「うぁ~~~きったなぁ~~・・・」[p] +#亜紀子 +「チュバッ・・・レロレロレロ・・・チュムッ♥」[p] +「チュブッ・・・ペロペロペロッ・・・ハムッ♥」[p] +#マニアA +「おぉっ!?」[p] +#梅田 +「うわっこいつ咥えよったで!」[p] +#亜紀子 +「ンムッ・・・チュバチュバッ・・・ゴクンッ♥」[p] +「チュポッ・・・ど、どうですか?」[p] +#マニアA +「す、素晴らしいですっ!」[p] +#梅田 +「う、うぇぇぇ!!」[p] +#亜紀子 +「Aさんの足とっても美味しかったです。もっと舐めてたいですけどそろそろBさんの足のほうに参りたいと思います」[p] +#マニアA +「あ、ありがとうございましたっ!」[p] +#亜紀子 +「それではBさん、よろしくお願いします」[p] +#マニアB +「は、はいっ!お、お願いしますっ!」[p] +#梅田 +「うわっ、お前も汚いなぁ!」[p] +「なんで足舐めマニアが足汚いねん!」[p] +#中堅芸人 +「ホンマですよ。女の人に舐めさせる足やないですやん!」[p] +#マニアB +「これでも昨日の夜洗ったんですけど・・・ここに来るまでに結構歩いたんで」[p] +#梅田 +「蒸れっ蒸れやないか!」[p] +#バラドル +「うぇぇぇぇ~~!!」[p] +#亜紀子 +「わ、わたしがそれを綺麗にしちゃってもいいですか?」[p] +#マニアB +「は、はい、お願いしますっ!」[p] +#亜紀子 +「ありがとうございます。それじゃ・・・」[p] +「ベロベロベロベロッ!」[p] +#梅田 +「うひぃ~~~!」[p] +「なにしてんのこいつマジでぇ~~~」[p] +#亜紀子 +「チュプッ・・・レロレロレロッ・・・ハムッ♥[p] +「チュバッ・・・モゴモゴ・・・チュゥ~~・・・ゴクッ♥」[p] +#マニアB +「おぉおおおおっ!」[p] +#梅田 +「こいつむしゃぶりついてるやん!」[p] +#バラドル +「うぇぇぇぇぇっ!][p] +#亜紀子 +「チュムッ・・・レロレロレロッ・・・チュバッ♥」[p] +「ジュルルル・・・ゴクンッ♥」[p] +「チュポンッ・・・Bさんの足・・・酸っぱ苦くて・・・とっても美味しいですっ♥」[p] +#マニアB +「ハァッ・・・た、たまりません・・・っ!」[p] +#梅田 +「変態やんこいつ!」[p] +#バラドル +「うぇぇぇぇぇっ!!」[p] +#亜紀子 +「ンチュッ・・・Bさんはもっとこうして欲しいとかリクエストはありますか?」[p] +#マニアB +「そ、そうですね・・・手を使わずにもっと這いつくばる感じで舐めてほしいですね」[p] +#亜紀子 +「はい・・・こ、こうですか?・・・ペロペロペロっ♥」[p] +#マニアB +「そうですっ、土下座みたいな感じで・・・」[p] +#亜紀子 +「土下座ですね・・・こういう感じですか・・・レロレロレロッ・・・チュバッ♥」[p] +「レロレロレロッ・・・なにかもっとご命令はありますか・・・?」[p] +#梅田 +「あかん、こいつもう完全にプレイを楽しんどるがな」[p] +#マニアB +「じゃあ・・・もっとケツを上げて」[p] +#亜紀子 +「は、ハイッ・・・こうですかぁ・・・チュプッ・・・レロレロレロッ♥」[p] +#マニアB +「おぉお・・・良いですっ!」[p] +#梅田 +「お前らなにを・・・・・・ってオイ、ちょっと待てぇ!!」[p] +#中堅芸人 +「えっ・・・うわぁっ!?」[p] +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro148-2.jpg" ] +[tb_cg id="148" ] +[tb_start_text mode=1 ] +#梅田 +「お、お前・・・マ○コにバイブ入っとるやないかぁ!!」[p] +#バラドル +「えっ、えっ、キャァァーーーッ!?」[p] +#マニアたち +「えええっ!?」[p] +#亜紀子 +「アンッ・・・いやぁっ・・・見ないでぇっ♥」[p] +#梅田 +「お前なにしとんねん!本番中やぞ!?」[p] +#亜紀子 +「す、すいません・・・この番組久しぶりだったので・・・つい興奮して入れてきてしまいました・・・っ♥」[p] +#梅田 +「ついって・・・お前頭沸いとんのか!?」[p] +#中堅芸人 +「変態ですやん!完全に変態ですやん!」[p] +#バラドル +「へ、変態・・・っ!」[p] +#亜紀子 +「す、すいません・・・レロレロレロッ・・・チュバッ♥」[p] +「チュプッ・・・ジュルルルッ・・・アッ・・・か、カメラさん・・・撮らないでぇ・・・っ♥」[p] +#マニアB +「おぉぉぉ・・・っ!」[p] +#亜紀子 +「ベロベロベロンッ・・・チュバチュバッ・・・ゴクンッ♥」[p] +「チュバチュバッ・・・ンムッ・・・アハァッ・・・レロレロレロッ♥」[p] +# +カチッ[p] +ウィ~~~~~ン・・・[p] +#梅田 +「おい、なにバイブのスイッチ入れとんねん!?」[p] +#亜紀子 +「アムッ・・・チュバッチュバッ・・・あぁっ・・・みんなに見られてるぅ・・・っ♥」[p] +「レロレロレロンッ・・・Bさんのくっさい足を舐めながら・・・バイブでぇっ・・・アンンッ♥」[p] +「チュバッチュプッ・・・ンッ・・・アヒィィ・・・イ、イっちゃうぅぅぅぅっ♥」[p] +「アァァーーーッ・・・みんな見てぇっ・・・亜紀子はマゾの変態ですぅーーーーッ♥」[p] +# +・・・・・・[p] +・・・[p] +[_tb_end_text] + +[stopbgm time="1000" ] +[mask time="1000" effect="fadeIn" color="0x000000" ] +[bg time="1000" method="crossfade" storage="hiro202.jpg" ] +[mask_off time="1000" effect="fadeOut" ] +[playbgm volume="100" time="1000" loop="true" storage="neonpurple.ogg" ] +[tb_start_text mode=1 ] +#マニアC +「いやぁ・・・すごかったなぁ・・・」[p] +「顔出しで自分の性癖を語るなんて、最初は止めておこうかと思ったけど勇気を出して来てよかったよ」[p] +「まさか千山アナのあんなシーンが見れるなんて・・・」[p] +「本番中にバイブを仕込んでるなんて・・・千山アナって本物の変態だったんだなぁ」[p] +「しかもカメラの前でイくなんて・・・」[p] +「・・・あのシーンってオンエアではカットだよな当然」[p] +「ディレクターさんにも絶対口外するなって言われたし」[p] +「・・・でも僕も千山アナに足を舐めてもらいたかったなぁ」[p] +「次は僕の番だったのにあんなことになったから中断になって、結局僕だけ舐めてもらえなかったんだよなぁ」[p] +「はぁ、もうチンコがギンギンだよ。さっさと家に帰って一発抜こう」[p] +#亜紀子 +「あの・・・」[p] +[_tb_end_text] + +[chara_show name="美里" time="1000" wait="true" storage="chara/1/hiro258-2.png" width="550" height="1375" left="373" top="36" reflect="false" ] +[tb_start_text mode=1 ] +#マニアC +「えっ・・・ち、千山アナ!?」[p] +#亜紀子 +「あ、あの、先ほどはどうもありがとうございました」[p] +#マニアC +「あ、はい、、こちらこそ!」[p] +#亜紀子 +「あの・・・今日のことは他の人には絶対に・・・言わないで下さいね」[p] +#マニアC +「は、はいっ、大丈夫です。絶対に言いません」[p] +#亜紀子 +「あ、ありがとうございます」[p] +「そ、それでですね・・・このあとご予定とかありますか?」[p] +#マニアC +「え・・・いえ、何もありませんけど。家に帰るだけです」[p] +#亜紀子 +「そ、そうですか・・・」[p] +「あの・・・もしよかったらこの後ホテルで・・・足を舐めさせていただけませんか?」[p] +#マニアC +「えっ・・・!?」[p] +#亜紀子 +「さっきわたしの失態でCさんの足を舐めて差し上げられなかったので・・・」[p] +#マニアA +「えっ・・・ほ、ホテルで・・・この後ですか?」[p] +#亜紀子 +「は、はいっ・・・もしよろしければ・・・」[p] +#マニアC +「も、もちろんですよ!」[p] +#亜紀子 +「ほ、本当ですか?ありがとうございます」[p] +#マニアC +「えっ、これって・・・プライベートでってことですよね・・・?」[p] +#亜紀子 +「は、はい、わたし個人のお誘いです」[p] +#マニアC +「そ、それって・・・足を舐めるだけ・・・ですか?」[p] +#亜紀子 +「あ、もしよろしかったら他のところも舐めさせていただけますか?」[p] +#マニアC +「ほ、他の部分・・・ゴクリ」[p] +#亜紀子 +「もちろん舐める以外もご要望があれば・・・」[p] +#マニアC +「ま、まさか・・・セックス・・・とか・・・」[p] +#亜紀子 +「あっ・・・はいっ・・・バイブでトロトロになった亜紀子のドスケベおマ○コもよかったらかわいがってくださいませ・・・っ♥」[p] +#マニアA +「ほ、本当に・・・!?」[p] +#亜紀子 +「はい・・・よろしくお願いしますっ♥」[p] +「ホテルの場所と部屋は・・・」[p] +# +・・・・・・[p] +・・・[p] +[_tb_end_text] + +[stopbgm time="1000" ] +[mask time="1000" effect="fadeIn" color="0x000000" ] +[chara_hide_all time="1000" wait="true" ] +[bg time="1000" method="crossfade" storage="hiro999.jpg" ] +[mask_off time="1000" effect="fadeOut" ] +[playbgm volume="100" time="1000" loop="true" storage="bluenoise.ogg" ] +[tb_start_text mode=1 ] +#マニアC +「言われた住所に来たけど・・・ここってホテルじゃなくて普通のマンションだよな・・・」[p] +「やっぱり騙されたのかなぁ・・・」[p] +「芸能人が誘ってくるなんてそんな美味い話があるはずないし・・・でももしかしたらってこともあるし部屋まで行ってみよう」[p] +「ええと・・・この部屋だよな」[p] +「・・・こ、怖いな。入ったら怖い人が出てきて金を要求されたりするんじゃ・・・」[p] +「・・・ええーい、それでもいいや!千山アナとエッチできる可能性があるならそのくらいのリスク・・・!」[p] +「・・・し、失礼します」[p] +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro204.jpg" ] +[tb_start_text mode=1 ] +#マニアC +「うわぁ・・・なんかラブホみたいな部屋だな・・・」[p] +「だ、誰もいないのか・・・?」[p] +#亜紀子 +「C様、お待ちしておりました」[p] +[_tb_end_text] + +[stopbgm time="1000" ] +[chara_show name="美里" time="1000" wait="true" storage="chara/1/hiro260-6.png" width="592" height="1480" left="290" top="17" reflect="false" ] +[tb_start_text mode=1 ] +#マニアC +「お・・・ぉおぉっ・・・!?」[p] +「ち、ち、千山アナ・・・!」[p] +#亜紀子 +「来ていただいてありがとうございます」[p] +「今日はよろしくお願いします」[p] +#マニアC +「は、はいっ、こちらこそ・・・っ」[p] +#亜紀子 +「あの・・・もうご存知の通り・・・亜紀子はマ、マゾの変態ですので・・・奴隷だと思ってなんでも命令してくださいねっ♥」[p] +#マニアC +「ど、奴隷・・・う・・・うひっ」[p] +#亜紀子 +「でも、一つだけ約束を守ってください」[p] +#マニアC +「約束・・・?」[p] +#亜紀子 +「このことは絶対に誰にも言わないでください」[p] +#マニアC +「あ、はい、わかりました」[p] +#亜紀子 +「あと、映像に残したりするのもご遠慮ください」[p] +「今日のことは今日だけのことということで・・・」[p] +#マニアC +「わかりました」[p] +#亜紀子 +「では・・・よろしくお願いします」[p] +#マニアC +「そ、それじゃ・・・あ、亜紀子って呼んでいいのかな」[p] +#亜紀子 +「はいっ、ご主人様」[p] +#マニアC +「よ、よしっ、とりあえず足を・・・いや、もう我慢できないっ!まず一発やらせろ!ケツを出せ!」[p] +#亜紀子 +「はいっ、かしこまりましたっ♥」[p] + +[_tb_end_text] + +[chara_hide name="美里" time="1000" wait="true" pos_mode="true" ] +[stopbgm time="1000" ] +[mask time="1000" effect="fadeIn" color="0x000000" ] +[wait time="1000" ] +[mask_off time="1000" effect="fadeOut" ] +[playbgm volume="100" time="1000" loop="true" storage="music16.ogg" ] +[tb_start_text mode=1 ] +#マニアC +「ハァ・・・ハァ・・・ハァ・・・」[p] +「ざ、残念だけど・・・もう勃たないや・・・」[p] +「いやぁ・・・ヤったなぁ・・・ヤりまくったなぁ・・・最高すぎるよ亜紀子」[p] +「テレビで見てると固いイメージだったけど・・・まさかこんなドスケベだったなんて」[p] +「今日1回だけってのが惜しいなぁ・・・なんとか今後もお付き合いできないかな・・・」[p] +「・・・でもテレビ業界って結構怖いって聞くし・・・危ないかもなぁ」[p] +「そもそもこの部屋って誰の部屋だ・・・?こんな良いマンション・・・やっぱり他のご主人様がいるんだろうな」[p] +「・・・なんか急に怖くなってきたな。・・・も、もう帰ろうかな」[p] +「さ、最後にもう一回だけオッパイ揉んでおこう・・・モミモミモミ」[p] +#亜紀子 +「ンッ・・・アフゥッ・・・アンッ♥」[p] +#マニアC +「よ、よし帰ろう。じゃあな亜紀子・・・」[p] +# +・・・・・・[p] +・・・バタン[p] + +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro136-1.jpg" ] +[tb_start_text mode=1 ] +#亜紀子 +「・・・・・・」[p] +「・・・ン・・・っ」[p] +「・・・ハァ・・・アフゥ♥」[p] +「これで・・・奴隷に・・・戻れる・・・っ♥」[p] +[_tb_end_text] + +[stopbgm time="1000" ] +[call storage="sr.ks" target="" ] +[bg time="1000" method="crossfade" storage="hiro999.jpg" ] +[tb_start_text mode=1 ] +# +パンパンパンパンパンッ![p] +#明日香 +「アンッ!アンッ!アァッ♥」[p] +#亜紀子 +「アヒッ・・・アンッ!アンンッ♥」[p] +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro147.jpg" ] +[tb_cg id="147" ] +[tb_start_text mode=1 ] +#勝野 +「いやぁ新番組、好調ですね」[p] +# +パンパンパンッ![p] +#亜紀子 +「アンッ・・・アヒッ♥」[p] +#梅田 +「おう、数字だいぶええんやろ?」[p] +# +パンパンパンッ![p] +#明日香 +「アンッ!アンッ♥」[p] +#勝野 +「深夜では異例の数字ですよ。やっぱり梅田さんの人気ですね」[p] +# +パンパンパンッ![p] +#梅田 +「いやいや、やっぱりこいつらが体張ってるおかげよ。ナハハハハ」[p] +# +パンパンパンッ![p] +#亜紀子&明日香 +「アンッ♥アンッ♥」[p] +#勝野 +「視聴者も過激なエロを求めてますからね。こっちももっともっと過激な企画を考えていかないと」[p] +# +パンパンパンッ![p] +#梅田 +「もうカメラの前でウンコさせたったらええんちゃうか」[p] +#勝野 +「いやぁさすがにモロで排便映すのは無理でしょうw」[p] +「でも浣腸させてオムツ一枚でゲームさせるとかは面白いかも」[p] +# +パンパンパンッ![p] +#亜紀子 +「アヒィッ♥」[p] +#梅田 +「ここに「豚」って刺青彫るのはどうや?」[p] +# +バシッ![p] +#明日香 +「アアンッ♥」[p] +#勝野 +「いいですね。いっそのこと焼印入れますか。ジューーーってw」[p] +#梅田 +「おお、ええなそれ!」[p] +#亜紀子 +(や、焼印だって・・・明日香・・・♥)[p] +#明日香 +(あぁ・・・ドキドキしちゃいますね・・・先輩っ♥)[p] +# +パンパンパンッ![p] +#亜紀子 +「アヒッ・・・アンッアンッ♥」[p] +(このままじゃ、わたしたち・・・どうなっちゃうのかしら・・・♥)[p] +#明日香 +「ンンッ・・・アハンッ♥」[p] +(もう・・・戻れませんね・・・先輩っ♥)[p] +# +パンパンパンッ![p] +#亜紀子 +「アアッ・・・ンッ・・・アヒィーッ♥」[p] +(堕ちるとこまで堕ちましょう・・・明日香♥)[p] +#梅田 +「オラッ、ラストスパートや!」[p] +# +パンッパンッパンッ![p] +#明日香 +「アンッ・・・ヒッ・・・イ、イっちゃいますぅーーーーッ♥」[p] +(はいっ・・・先輩と一緒に堕ちれるなら・・・わたし幸せです・・・っ♥)[p] +#勝野 +「こっちもいくぞ・・・オラッ!」[p] +# +パンパンパンパンッ![p] +#亜紀子 +「アヒッ・・・わ、わたしも・・・イ、イきますぅーーーーーっ♥」[p] +(わたしも・・・幸せ・・・奴隷・・・最高・・・っ♥)[p] +# +エンディングNo.4 「勝野」[p] +[_tb_end_text] + +[tb_replay id="reps24" ] +[wait time="3000" ] +[tb_start_text mode=1 ] +# + +[_tb_end_text] + +[jump storage="title_screen.ks" target="" ] diff --git a/data/scenario/end4.ks b/data/scenario/end4.ks new file mode 100644 index 0000000..b7cd5ba --- /dev/null +++ b/data/scenario/end4.ks @@ -0,0 +1,567 @@ +[_tb_system_call storage=system/_end4.ks] + +[chara_mod name="美里" time="600" cross="true" storage="chara/1/hiro258-4.png" ] +[tb_show_message_window ] +[playbgm volume="100" time="1000" loop="true" storage="bluenoise.ogg" ] +[tb_start_text mode=1 ] +#亜紀子 +「・・・奴隷になんか戻るわけないでしょ。バカじゃないの?」[p] +#勝野 +「なに?」[p] +#亜紀子 +「たしかにセックスは気持ち良いし私にはマゾの性質があるかもしれない」[p] +「でもそんなことの為に何もかも捨ててあなたの支配を受け入れると思ったら大間違いよ」[p] +「快楽に溺れて人生の意義を見失うなんて、わたしはそんな愚かな人間じゃないわ」[p] +#勝野 +「ふん、やせ我慢しやがって。本当はチンポが欲しくてたまらないくせに」[p] +「せっかく素晴らしい享楽の世界がそこにあるのに、そのちっぽけなプライドで逃すことになるんだぞ?」[p] +#亜紀子 +「あなたはそのちっぽけなプライドすら折ることができないのよ」[p] +「あなたにできるのはセコセコと人の弱みを握って言うことを聞かせることだけ。他人の心を手に入れるなんて一生できないのよ」[p] +[_tb_end_text] + +[chara_mod name="勝野" time="200" cross="false" storage="chara/5/hiro256-2.png" ] +[tb_start_text mode=1 ] +#勝野 +「なんだと・・・!?」[p] +「言っておくけど、まだお前の脱糞動画とか山ほど持ってるんだぞ。あんまり舐めた口叩いてると―――」[p] +#亜紀子 +「だったらどうするんですか、勝野様?犯しますか?お仕置きですか?どうぞご自由に。私は逆らうことができませんからね」[p] +「ご自分で奴隷解雇して二度と犯さないと言った約束を破ることになりますけど。まぁ約束なんて守る必要ありませんものね」[p] +#勝野 +「く・・・てめえ・・・」[p] +#亜紀子 +「それじゃ私は次の仕事があるので」[p] +#勝野 +「お、おい・・・!」[p] +[_tb_end_text] + +[chara_hide name="美里" time="1000" wait="true" pos_mode="true" ] +[chara_mod name="勝野" time="200" cross="false" storage="chara/5/hiro256-1.png" ] +[tb_start_text mode=1 ] +#勝野 +「くそっ・・・亜紀子のやつ・・・!」[p] +「・・・わざと手を出さずに放置しておけば、快楽が忘れられずにむこうから戻ってくると思っていたのに・・・」[p] +「実際刺激を求めてあの服を着てきたから目論見どおりだったはずなんだが・・・」[p] +「あいつは確かに真性のマゾのはず・・・」[p] +「もうちょっと焦らせば耐え切れずに頭を下げてくるか・・・?」[p] +「・・・それとも約束なんか無視してまた浣腸で地獄を見せてやるか・・・」[p] +「いや、それじゃ俺が負けたみたいになるじゃねえか・・・!」[p] +「・・・・・・」[p] +「・・・こうなったら、いっそのこと・・・」[p] +# +・・・・・・[p] +・・・[p] + +[_tb_end_text] + +[stopbgm time="1000" ] +[chara_hide_all time="1000" wait="true" ] +[tb_hide_message_window ] +[mask time="1000" effect="fadeIn" color="0x000000" ] +[bg time="1000" method="crossfade" storage="hiro201.jpg" ] +[tb_show_message_window ] +[mask_off time="1000" effect="fadeOut" ] +[tb_start_text mode=1 ] +# +数日後―――[p] +[_tb_end_text] + +[playbgm volume="100" time="1000" loop="true" storage="neonpurple.ogg" ] +[chara_show name="美里" time="1000" wait="true" storage="chara/1/hiro253-2.png" width="569" height="1366" left="123" top="14" reflect="false" ] +[tb_start_text mode=1 ] +#亜紀子 +「えっ、中止ってどういうことですか!?」[p] +「男根会を脱会した女性にやっとインタビューのアポが取れたんじゃないんですか!?」[p] +#プロデューサー +「いや、それが急に上から企画自体を止めるように言われたんだよ」[p] +#亜紀子 +「えっ、企画自体を・・・?」[p] +「それって・・・どこかから圧力がかかったってことですか?」[p] +#プロデューサー +「お、おい、滅多なことを言うなよ。俺はとにかく制作局長から中止するようにと言われただけなんだ」[p] +#亜紀子 +「そんな・・・」[p] +#プロデューサー +「俺だって悔しいよ、いい企画だと思ってたし。でもどうしようもないだろ。所詮俺らは会社員なんだし組織の決定には逆らえないさ」[p] +#亜紀子 +「・・・わかりました」[p] + +[_tb_end_text] + +[chara_mod name="美里" time="200" cross="false" storage="chara/1/hiro253-1.png" ] +[tb_start_text mode=1 ] +#亜紀子 +(男尊女卑を信奉する自称教育団体『男根会』・・・最近ますます活動が活発になり、メディアへの露出も増えている)[p] +(前に私の番組でも会の代表の一人黒原剛介が出演して、あの時は口論になって派手にやりあっちゃったけど)[p] +(健全な団体だと各所でアピールしてるけど、裏では強引な資金集めや女性会員の洗脳疑惑など黒い噂が耐えない)[p] +(その元会員で脱会した女性へのインタビューを私が企画して準備していたんだけど・・・)[p] +(この段階で潰しにかかってきたってことは・・・どこかから圧力がかかったのは間違いないわね)[p] +(会社の上のほうにも会員が結構いるって言う噂も聞くけど・・・)[p] +(・・・まさか政府からってことはないわよね?瓦斯首相が男根会の会員だっていう噂もあるけど・・・)[p] +(でもこれだけ色々な噂があるのにどの局でも男根会に対して切り込んだ報道をしないっていうのは・・・もしかすると思ってる以上に影響力を持っているのかも)[p] +(この件はぜひ追求したいけど・・・他の仕事も忙しいし、どの道ただの局アナの身ではどうしようもないわ・・・)[p] +(とりあえず今日はもう遅いし帰りましょう)[p] + +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro202.jpg" ] +[tb_start_text mode=1 ] +#亜紀子 +「・・・ん?」[p] +(勝野からのメールだわ・・・なんの用かしら)[p] +(・・・『TKホテルの181号室に来い。奴隷の服で来るように』・・・!?)[p] +(な、なによ・・・結局私を犯す気なの・・・?)[p] +(この前、挑発して怒らせたから・・・酷いお仕置きをされるのかも・・・)[p] +(せっかく快楽への未練を断ち切って仕事に集中しようとしているのに・・・)[p] +(・・・でもなんでいつもの部屋じゃなくてホテルなのかしら?)[p] +(・・・とにかく、行くしかないわ・・・あぁ・・・)[p] +[_tb_end_text] + +[chara_hide_all time="1000" wait="true" ] +[stopbgm time="1000" ] +[mask time="1000" effect="fadeIn" color="0x000000" ] +[bg time="1000" method="crossfade" storage="hiro999.jpg" ] +[chara_show name="美里" time="1000" wait="true" storage="chara/1/hiro258-1.png" width="486" height="1215" left="356" top="28" reflect="false" ] +[mask_off time="1000" effect="fadeOut" ] +[playbgm volume="100" time="1000" loop="true" storage="bluenoise.ogg" ] +[tb_start_text mode=1 ] +#亜紀子 +(TKホテルに着いたけど・・・)[p] +(こんな格好で来るのは恥ずかしいわ・・・わたしだってバレないかしら・・・)[p] +(えーっと、18階ね・・・)[p] +(・・・・・・ここだわ。はぁ・・・緊張する)[p] +# +コンコン[p] +#勝野 +「・・・入れ」[p] +[_tb_end_text] + +[stopbgm time="1000" ] +[chara_hide name="美里" time="1000" wait="true" pos_mode="true" ] +[mask time="1000" effect="fadeIn" color="0x000000" ] +[bg time="1000" method="crossfade" storage="hiro205.jpg" ] +[chara_show name="美里" time="000" wait="true" storage="chara/1/hiro258-1.png" width="600" height="1500" left="337" top="29" reflect="false" ] +[mask_off time="1000" effect="fadeOut" ] +[tb_start_text mode=1 ] +#亜紀子 +「失礼します・・・えっ!?」[p] + +[_tb_end_text] + +[chara_mod name="美里" time="100" cross="false" storage="chara/1/hiro258-5.png" ] +[tb_start_text mode=1 ] +#亜紀子 +「あ・・・あなたは・・・」[p] +[_tb_end_text] + +[chara_hide_all time="400" wait="false" ] +[chara_show name="黒原" time="600" wait="false" storage="chara/6/hiro264-2.png" width="540" height="926" left="106" top="69" reflect="false" ] +[chara_show name="勝野" time="600" wait="true" storage="chara/5/hiro256-1.png" width="552" height="1325" left="609" top="-4" reflect="false" ] +[playbgm volume="100" time="1000" loop="true" storage="music17.ogg" ] +[tb_start_text mode=1 ] +#亜紀子 +「く、黒原剛介・・・!?」[p] +「な、なんであなたが・・・!?」[p] +#黒原 +「こ、この女は・・・!」[p] +#勝野 +「ククク、どうやらお互い紹介する必要は無さそうかな?」[p] +「黒原先生、こいつが先生のためにご用意した女奴隷です」[p] +#黒原 +「千山亜紀子・・・!まさかこの女をわしに譲渡してくれるというのかね・・・!」[p] +#勝野 +「もちろんです。差し上げますのでどうぞご自由にお使いください」[p] +#亜紀子 +「えっ!?ど、どういうこと・・・!?」[p] + +[_tb_end_text] + +[chara_mod name="黒原" time="200" cross="false" storage="chara/6/hiro264-3.png" ] +[tb_start_text mode=1 ] +#黒原 +「これは素晴らしい!これはなによりの贈り物だ!」[p] +「しかし、キミがどうしてこの女を支配下に置いておるのかね?」[p] +#勝野 +「なに、ちょっとした幸運で私の手に転がり込んできましてね」[p] +「これほどの女ですから手放すのは惜しいんですが、黒原先生に喜んでいただけるのならと思いまして」[p] +#黒原 +「喜ぶとも喜ぶとも!あの番組でこの女に恥をかかされて以来、絶対にこの手に入れようと調べさせておったのだ」[p] +「まさかすでにキミの奴隷に堕ちていたとはな、これは驚いたわ、ウハハハ」[p] + +[_tb_end_text] + +[chara_hide_all time="1000" wait="true" ] +[chara_show name="美里" time="1000" wait="true" storage="chara/1/hiro258-5.png" width="578" height="1445" left="361" top="19" reflect="false" ] +[tb_start_text mode=1 ] +#亜紀子 +「ちょ、ちょっと待って・・・ま、まさか・・・」[p] +「わたしを黒原に売るつもりなの・・・!?」[p] +#勝野 +「おい、口を慎め。「黒原様」だろうが」[p] +「今日からお前の新しいご主人様になるのだ」[p] +#亜紀子 +「い・・・イヤァッ!・・・ぜ、絶対にイヤよ!!」[p] +#勝野 +「おい、忘れたのか?お前には選択権なんかないだろうが」[p] +「俺はいつでもお前と明日香の人生を終わらせることができるんだぞ」[p] +#亜紀子 +「く、黒原の奴隷になるくらいなら・・・死んだほうがマシよ・・・!死ぬわ!」[p] +#勝野 +「こら!何てこと言うんだ!・・・先生すいませんね、すぐに言い聞かせますから」[p] +「(小声で亜紀子だけに)お前、俺に何を撮られてるか解ってるのか?」[p] +「お前が自殺したら、お前や明日香がチンポをおねだりしたり笑顔でウンコしてる映像を世界中に流してやるからな」[p] +「お前の両親はどう思うかな?それに明日香の両親もな」[p] +#亜紀子 +「く・・・そ、そんな・・・」[p] +#勝野 +「お前には自殺する自由もないんだよ。理解しろよ」[p] +#亜紀子 +「お・・・お願いです・・・奴隷に戻りますから・・・」[p] +「もう二度と逆らいませんから・・・なんでも素直に言うことを聞きます・・・肛門も舐めますし小便も飲みますから・・・」[p] +「あいつの奴隷はいやです・・・捨てないでください勝野様・・・」[p] +#勝野 +「もう遅いんだよ」[p] +「あの時、土下座して俺の奴隷に戻してくださいって言えばそうしてやったのによ」[p] +「おまえ自身のプライドが招いたことだ。あきらめて受け入れろ」[p] +#亜紀子 +「そ、そんな・・・あぁ・・・」[p] +[_tb_end_text] + +[chara_hide_all time="1000" wait="true" ] +[chara_show name="勝野" time="600" wait="false" storage="chara/5/hiro256-3.png" width="556" height="1334" left="585" top="-12" reflect="false" ] +[chara_show name="黒原" time="600" wait="true" storage="chara/6/hiro264-3.png" width="561" height="962" left="36" top="45" reflect="false" ] +[tb_start_text mode=1 ] +#勝野 +「すいません黒原先生。最近放置してたもんで自分の立場を忘れちゃってたみたいで」[p] +#黒原 +「良い良い。生意気なままの千山亜紀子のほうが調教のし甲斐があるからな」[p] +#勝野 +「あの、それで先生・・・例の話のほうは・・・」[p] +#黒原 +「おお、もちろんもちろん。これでキミは晴れて男根会の上級会員だ」[p] +#勝野 +「ありがとうございます!」[p] +(やったぜ!多額の献金をしないとなれない男根会の上級会員になれたぞ!)[p] +(これで俺は男根会の中では大物政治家や大手企業のトップたちと肩を並べたことになるぜ・・・!)[p] +(女性会員を好きにできるっていう特権もうれしいが、なによりうちの上層部にも会員が多いらしいからな)[p] +(俺はこのコネを使ってもっともっとのし上がってやるぞ・・・!)[p] +#黒原 +「むう、もう我慢ができん。さっそく楽しみたいからキミはそろそろ席を外してくれたまえ」[p] +#勝野 +「あ、はい、わかりました。ごゆっくりお楽しみください」[p] +「おい亜紀子、黒原先生の命令には絶対服従だぞ。逆らったらどうなるか言わなくてもわかってるな」[p] +#亜紀子 +「は、はい・・・」[p] +#勝野 +「一応アナルまで一通りなんでも仕込んでありますんで。存分にお使いください」[p] +「それでは失礼します」[p] +[_tb_end_text] + +[chara_hide name="勝野" time="1000" wait="false" pos_mode="true" ] +[tb_start_text mode=1 ] +#黒原 +「くくく、邪魔者は消えたか」[p] +「さてと、千山亜紀子よ。久しぶりだな、ん?」[p] + +[_tb_end_text] + +[chara_hide_all time="1000" wait="true" ] +[chara_show name="美里" time="1000" wait="true" storage="chara/1/hiro258-1.png" width="534" height="1335" left="348" top="21" reflect="false" ] +[tb_start_text mode=1 ] +#亜紀子 +「・・・・・・」[p] +#黒原 +「あの時はよくもこのわしに恥をかかせてくれたな、ん?」[p] +#亜紀子 +「く・・・っ」[p] +#黒原 +「あれ以来お前に復讐することを夢にまで見たぞ」[p] +「まさかこんな形で会えるとは予想もしていなかったぞ。クククク」[p] +「まぁどのみちどんな手を使ってでもお前はわしのモノにするつもりではあったがな」[p] +「そのためにZテレビの上層部にも手を回しておったのだがその必要もなくなったな。まぁマスコミに手駒が居るのは無駄にはならんが」[p] +#亜紀子 +「な・・・やっぱりうちの局にも男根会の手が伸びていたのね・・・」[p] +「一体どうやってそんなことを・・・」[p] +#黒原 +「なに、簡単なことだ。女をあてがってやるのさ」[p] +#亜紀子 +「お、女・・・?」[p] +#黒原 +「男根会には調教、洗脳によってなんでも言うことを聞く女会員がたくさん居るのだ」[p] +「どんな偉い人間にも色欲はある。女を使えばどんな偉い人間でも仲間に引き入れるのはたやすいことよ」[p] +#亜紀子 +「や、やっぱり・・・汚い手を使って無理やり会員にした女性を洗脳しているっていう噂は本当だったのね!」[p] +#黒原 +「む、そういえば貴様コソコソと男根会のことを探ろうとしていたのだったな」[p] +「まぁ女子アナ風情がいくら頑張ったところで男根会には蚊ほどにも効かんだろうがな、グハハハハ」[p] +[_tb_end_text] + +[chara_mod name="美里" time="200" cross="false" storage="chara/1/hiro258-4.png" ] +[tb_start_text mode=1 ] +#亜紀子 +「あ、あなたが上層部に手を回して企画を潰させたのね・・・!」[p] +#黒原 +「馬鹿な、わしがそんなくだらんことにいちいち関わるはずが無かろう。そんなことは下の者がやったことだ」[p] +「わしの仕事は教育だ。女のな」[p] +#亜紀子 +「きょ、教育・・・?」[p] +#黒原 +「そうだ。女を教育して男に従順で慎み深い一人前の淑女に育て上げることだ」[p] +「どんな生意気な女でもわしが教育すれば男の命令に絶対服従、命じれば小便でも喜んで飲む真の大和撫子になるのだ、ククク」[p] +#亜紀子 +「く、狂ってる・・・女をいったいなんだと思ってるの!」[p] +#黒原 +「わしは女をとても大事に思っておるよ」[p] +「女は大事な道具であり家畜であり、通貨でもある。女はなくてはならないものだよ」[p] +「だからこそしっかりと教育して使えるようにしてやらねばならんのだ」[p] +「お前もしっかりと教育して一人前の価値のある女にしてやるから安心しろ、グフフフ」[p] +[_tb_end_text] + +[chara_mod name="美里" time="200" cross="false" storage="chara/1/hiro258-3.png" ] +[tb_start_text mode=1 ] +#亜紀子 +「あなたなんかに・・・あなたなんかに教育されることは何もないわ!」[p] +「いたぶるならいたぶれば良いわ!そんなことで心を変えられると思ったら大間違いよ!」[p] +#黒原 +「グハハハッ!良いぞ、それでこそ千山亜紀子だ。教育のし甲斐があるというものだ!」[p] +「お前には期待しているぞ。真崎リンも最初は威勢のいい事を言っておったが、ちょっと教育してやったらすぐに泣き喚いて許しを請い出したからな」[p] +[_tb_end_text] + +[chara_mod name="美里" time="200" cross="false" storage="chara/1/hiro258-5.png" ] +[tb_start_text mode=1 ] +#亜紀子 +「真崎リン・・・って、真崎先生もまさか・・・!?」[p] +#黒原 +「あの女なら、あの番組の後すぐに手を回してわしのところに連れてこさせたぞ」[p] +「あのババア投資に手を出してたから巧く騙して借金背負わせて男根会で買い取ったのさ」[p] +「まぁあんな鶏ガラみたいなババアに興味はないから一度だけ犯してすぐに会員の肉便器にしてやったがな」[p] +#亜紀子 +「そ、そんな・・・あの真崎先生が・・・」[p] +#黒原 +「ちなみに察してるとは思うがあの時居た篠原という女精神科医も男根会の会員よ」[p] +「あいつは結構抱いてやったな。今はどこかの政治家の奴隷をやっているがな」[p] +#亜紀子 +「い、一体・・・男根会って・・・」[p] +#黒原 +「さあ、おしゃべりは終りだ。調教を始めるぞ」[p] +「とりあえず服を一枚残らず脱げ」[p] +#亜紀子 +「く・・・」[p] + +[_tb_end_text] + +[stopbgm time="1000" ] +[chara_hide_all time="1000" wait="true" ] +[mask time="1000" effect="fadeIn" color="0x000000" ] +[chara_show name="美里" time="1000" wait="true" storage="chara/1/hiro260-2.png" width="522" height="1305" left="361" top="22" reflect="false" ] +[mask_off time="1000" effect="fadeOut" ] +[playbgm volume="100" time="1000" loop="true" storage="SO_SAD.ogg" ] +[tb_start_text mode=1 ] +#黒原 +「ふん、直立不動か。あの勝野という男に躾けられておるようだな」[p] +「できればお前は一からわしが調教したかったが・・・まぁいい、まだ心は折れておらんようだからな」[p] +「しかしそれにしても良い肉置きをしておるわ。これは優秀な家畜になりそうだわい」[p] +#亜紀子 +「・・・」[p] +(もうこうなったら好きにすれば良いわ・・・無駄に反抗しても苦しむだけなのは勝野のときでわかってる)[p] +#黒原 +「これからお前を男根会の奴隷会員にしてやるのだが、その前に済ませておかねばならんことがあるな」[p] +#亜紀子 +「・・・?」[p] +#黒原 +「この前の無礼の謝罪だ」[p] +「わしにテレビカメラの前で恥をかかせたことを謝罪せい」[p] +#亜紀子 +「く・・・わかりました・・・」[p] +[_tb_end_text] + +[chara_mod name="美里" time="200" cross="false" storage="chara/1/hiro260-3.png" ] +[tb_start_text mode=1 ] +#亜紀子 +「せ、先日は黒原様に楯突いて恥をかかせてしまいまことに申し訳ありませんでした」[p] +#黒原 +「貴様、前の主人から謝罪の仕方も教えられておらんのか?」[p] +「そんな頭の高い謝罪があると思うか、馬鹿者め!」[p] +#亜紀子 +「く・・・っ」[p] +[_tb_end_text] + +[stopbgm time="1000" ] +[tb_hide_message_window ] +*rep25 + +[tb_replay_start ] +[chara_hide_all time="1000" wait="true" ] +[playbgm volume="100" time="1000" loop="true" storage="SO_SAD.ogg" ] +[tb_show_message_window ] +[bg time="1000" method="crossfade" storage="hiro123-4.jpg" ] +[tb_start_text mode=1 ] +#亜紀子 +(土下座をすればいいんでしょ・・・さっさと終らせましょう)[p] +「先日は黒原様に楯突いて公衆の面前で恥をかかせてしまいまことに申し訳ありませんでした」[p] + +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro123-6.jpg" ] +[tb_start_text mode=1 ] +#亜紀子 +「どうぞお許しくださいませ・・っ」[p] +#黒原 +「ダメだ。やり直し」[p] +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro123-4.jpg" ] +[tb_start_text mode=1 ] +#亜紀子 +「く・・・っ」[p] +(もっと謙(へりくだ)れば良いんでしょ・・・バカみたい・・・)[p] +「せ、先日は黒原様にご高説を賜りながら、理解せず愚かにも反論してしまい申し訳ありませんでした・・・!」[p] +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro123-6.jpg" ] +[tb_start_text mode=1 ] +#亜紀子 +「どうぞお許しくださいませ・・・っ!」[p] +#黒原 +「ダメだ。やり直し」[p] +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro123-4.jpg" ] +[tb_start_text mode=1 ] +#亜紀子 +「う・・・っ」[p] +(もっと黒原が喜ぶように・・・)[p] +「わ、わたくし千山亜紀子は・・・愚かな女子アナウンサーでありながら・・・男性である黒原様に逆らうというぐ、愚行を犯してしまい・・・」[p] +「大変申し訳ありませんでした・・・!反省しております・・・っ!」[p] +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro123-6.jpg" ] +[tb_start_text mode=1 ] +#亜紀子 +「どうかお許しくださいませっ!そしてこの愚かなわたくしにご指導よろしくお願いします・・・っ!」[p] +#黒原 +「少し良くなったが、まだまだダメだ。やり直し」[p] +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro123-4.jpg" ] +[tb_start_text mode=1 ] +#亜紀子 +「そ、そんな・・・」[p] +「ど、どうすればいいか教えてください・・・」[p] +#黒原 +「謝罪の言葉を謝罪相手に聞く馬鹿がいるか」[p] +「わしが何に対して怒っているか、自分がどう間違っていたか、その少ない脳みそで考えろ」[p] +#亜紀子 +「く・・・っ」[p] +(偉そうに・・・もっともっと謙ればいいんでしょ・・・こんなのはただの演技なんだから・・・)[p] +「先日、わたくし千山亜紀子は黒原様に女は男に劣り男に従い、男に管理されるべきであるという素晴らしい教えを教授していただくありがたい機会を得ながら愚かにもその教えを理解せず反論するという愚行に及びました」[p] +「心から反省しております。大変申し訳ありませんでした!今一度この愚かな亜紀子に機会をお与えくださいませ!」[p] +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro123-6.jpg" ] +[tb_start_text mode=1 ] +#亜紀子 +「どうかこのわたくしめを黒原様のご指導で一人前のメスにしてくださいませ!お願いいたします!」[p] +#黒原 +「『男』とは何事か!『男性様』と言え!やり直し!」[p] +#亜紀子 +「はいっ!」[p] +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro123-5.jpg" ] +[tb_start_text mode=1 ] +#亜紀子 +(く・・・本当に惨めになってくるわ・・・悔しい・・・!)[p] +「先日、わたくし千山亜紀子は偉大な黒原様に女は男性様に劣り、男性様に絶対服従し、男性様に管理していただくべき存在であるという素晴らしい教えを教授していただくありがた機会に恵まれながらも」[p] +「愚かにもその教えを理解せず反論するという愚行に及んでしまいました!」[p] +「心から反省しております!大変申し訳ありませんでした!今一度この愚かな亜紀子に機会をお与えくださいませ!」[p] +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro123-6.jpg" ] +[tb_start_text mode=1 ] +#亜紀子 +「どうかこのわたくしめを黒原様のご指導で一人前のメス家畜にしてくださいませ!どうかお願いいたします!」[p] +#黒原 +「お前は何者か?」[p] +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro123-5.jpg" ] +[tb_start_text mode=1 ] +#亜紀子 +「わたしは見た目しか取り得のない無能な女子アナウンサーですっ!」[p] +#黒原 +「お前のすべきことは?」[p] +#亜紀子 +「は、早く一人前の奴隷になって男性の皆様方のお役に立つことです!」[p] +#黒原 +「男への永遠の忠誠を誓うか?」[p] +#亜紀子 +「はい!男性様に二度と逆らわず絶対服従することを誓いますっ!」[p] +#黒原 +「自らの意思で男根会に入会を希望するか?」[p] +#亜紀子 +「は、はい・・・わたくし千山亜紀子は自らの意思で男根会へ入会することを希望します!」[p] +#黒原 +「よし、良いだろう。男根会への入会を許可する」[p] +#亜紀子 +「ありがとうございます!」[p] +#黒原 +「それではこの誓約書にサインしろ」[p] +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro123-4.jpg" ] +[tb_image_show time="1000" storage="default/hiro101-d.png" width="567" height="600" x="17" y="103" _clickable_img="" ] +[tb_start_text mode=1 ] +#亜紀子 +「入会誓約書・・・(特別奴隷会員)・・・?」[p] +(なにこの無茶苦茶な内容・・・!?中世の奴隷でももっとましな待遇だったはずよ・・・)[p] +(財産を没収・・・人権を放棄・・・)[p] +#黒原 +「通常は普通の会員として入会させて、その後教育を施して精神を正してから特別奴隷会員に「昇格」するのだが、今回は最初から特別奴隷会員として受け入れてやろう」[p] +「どうだ、嬉しいか」[p] +#亜紀子 +「く・・・は、はい、特別なお計らいありがとうございます・・・っ!」[p] +(こんなの人間を辞める契約書じゃないの・・・)[p] +#黒原 +「よし、署名して拇印を押せ」[p] +#亜紀子 +「は、はい・・・」[p] +(こ、こんなものどうせ法的には無効よ・・・大丈夫・・・)[p] +[_tb_end_text] + +[tb_image_hide time="1000" ] +[tb_image_show time="1000" storage="default/hiro101-e.png" width="567" height="600" x="17" y="103" ] +[tb_start_text mode=1 ] +#黒原 +「うむ、これでお前は正式に男根会の所有物となったわけだ」[p] +#亜紀子 +「・・・・・・」[p] +[_tb_end_text] + +[tb_image_hide time="1000" ] +[tb_start_text mode=1 ] +#黒原 +「お前は今、こんな誓約書は法的にはなんの拘束力も無く無効だ、と思ってるだろう」[p] +#亜紀子 +「え、い、いえ・・・そんなことは・・・」[p] +#黒原 +「先ほどの謝罪も表面上だけのことで心の中では全く自分が悪いなどと思ってはおるまい」[p] +#亜紀子 +「・・・・・・」[p] +#黒原 +「しかしそんなことはすぐに問題ではなくなる」[p] +「お前は喜んで男根会に全てを奉げる忠実な奴隷になるのだからな。わしの教育によって」[p] +#亜紀子 +「う・・・」[p] +(だ、誰がなるものですか・・・!わたしは・・・私の心は絶対に負けない・・・!)[p] +#黒原 +「ククク、それではいよいよ始めるか・・・こんなに心が躍るのは久しぶりだわい」[p] +「夜は長い。じっくりと楽しもうじゃないか、グフフフフ」[p] + +[_tb_end_text] + +[stopbgm time="1000" ] +[tb_hide_message_window ] +[tb_replay id="reps25" ] +[jump storage="end4b.ks" target="" ] diff --git a/data/scenario/end4b.ks b/data/scenario/end4b.ks new file mode 100644 index 0000000..7e5b611 --- /dev/null +++ b/data/scenario/end4b.ks @@ -0,0 +1,881 @@ +[_tb_system_call storage=system/_end4b.ks] + +*rep19 + +[tb_replay_start ] +[mask time="1000" effect="fadeIn" color="0x000000" ] +[bg time="1000" method="crossfade" storage="hiro124-1.jpg" ] +[tb_show_message_window ] +[mask_off time="1000" effect="fadeOut" ] +[playbgm volume="100" time="1000" loop="true" storage="music16.ogg" ] +[tb_start_text mode=1 ] +#亜紀子 +「レロレロレロ・・・」[p] +#黒原 +「おい、生ぬるい。もっと気合を入れて舐めんか」[p] +#亜紀子 +「は、はい・・・レロレロレロッ」[p] +(教育というからどんな恐ろしい調教をされるのかと思ったら・・・アナルを舐めさせられるなんて)[p] +「レロレロ・・・グリュッグリュッ・・・ペロペロ」[p] +(屈辱だけど・・・今さらこんなのなんでもないわ・・・)[p] +「レロレロレロッ」[p] +#黒原 +「もっと肛門のシワを一本一本徹底的に綺麗にしろ」[p] +#亜紀子 +「はい・・・レロッレロッレロッ!」[p] +(やればいいんでしょ・・・シワの間のウンチ汚れを・・・舐めとれば・・・)[p] +「レリュッ・・・ヌリュッ・・・ペロッペロッ!」[p] +(玉袋が鼻に乗ってるわ・・・このずしっとした重み・・・たっぷりとザーメンが入ってるのね・・・)[p] +(強烈な臭い・・・オスの臭いがするわ・・・)[p] +#黒原 +「それが終ったら舌を肛門にねじ込んで中まで綺麗にするのだ」[p] +#亜紀子 +「はい・・・ズニュッ・・・グリグリグリ・・・」[p] +(あぁ・・・黒原の直腸を舌で掃除させられるなんて・・・う・・・苦ッ)[p] +「グリュッ・・・ズププッ・・・」[p] +(何人もの女にこれをやらせてきたんでしょうね・・・何が教育者よ・・・)[p] +#黒原 +「いいか、お前の存在価値はわしの肛門をキレイにする事だ。全霊を込めて肛門を舐めろ」[p] +#亜紀子 +「ヌリュッ・・・は、はい・・・レロレロッ・・・ズプッ」[p] +(く・・・ニュースキャスターの私が・・・惨めだわ・・・)[p] +「ズプッズプッ・・・ヌリュッ・・・レロレロレロンッ」[p] +(はぁ・・・はぁ・・・舌が疲れてきた・・・)[p] +#黒原 +「舌を休めるな!」[p] +#亜紀子 +「は、はいっ・・・!レロレロレロッ!」[p] +(く・・・いつまでやらせる気なの・・・)[p] +「レロレロレロレロッ・・・チュムッ・・・グリグリグリッ」[p] +[_tb_end_text] + +[mask time="1000" effect="fadeIn" color="0x000000" ] +[mask_off time="1000" effect="fadeOut" ] +[tb_start_text mode=1 ] +#亜紀子 +「ハァ・・・レロッ・・・レロレロッ・・・」[p] +(あぁ・・・舌が・・・あごが・・・)[p] +「レロレロッ・・・ズプズプッ・・・」[p] +#黒原 +「手を抜くな無能!」[p] +#亜紀子 +「ハァッ・・・レロレロレロッ・・・チュブッ」[p] +(もう何分くらい肛門を舐めてるの・・・誰か助けて・・・)[p] +#黒原 +「お前はトイレットペーパーだ!復唱しろ!」[p] +#亜紀子 +「は、はいっ・・・わたしは・・・トイレットペーパーです・・・っ!」[p] +「レロレロレロレロッ・・・!」[p] +#黒原 +「お前のような無能に肛門を舐めるという役割を与えてやってるんだ。感謝の気持ちを込めて舐めろ!」[p] +#亜紀子 +「は、はい・・・ありがとうございます・・・っ・・・レロレロレロッ」[p] +(あぁ・・・もう終らせて・・・)[p] +「ペロペロペロペロ・・・レロレロンッ」[p] +(もう十分に綺麗にしました・・・っ)[p] +「レロレロレロ・・・グリグリグリ・・・チュバッ」[p] +#黒原 +「・・・よーし、そろそろいいだろう。止めてよしっ!」[p] +#亜紀子 +「ハァッ・・・ハァッ・・・」[p] +(や、やっと終った・・・)[p] +#黒原 +「なにをしておる」[p] +#亜紀子 +「ハァ・・・え・・・?」[p] +#黒原 +「終ったら挨拶をせんか!まだ舐めさせられたいか!」[p] +#亜紀子 +「あっ・・・は、はいっ!」[p] +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro123-9.jpg" ] +[tb_start_text mode=1 ] +#亜紀子 +「肛門を舐めさせていただき、ありがとうございました黒原様っ!」[p] +#黒原 +「己の立場というものが少しは理解できたか?」[p] +#亜紀子 +「はいっ・・・無能なわたしに黒原様の肛門を舐めさせていただけるなんて光栄ですっ!」[p] +#黒原 +「フン、これからは毎日舐めさせてやろう」[p] +#亜紀子 +「あ、ありがとうございます・・・っ!精一杯頑張りますっ!」[p] +(毎日・・・これを・・・)[p] +#黒原 +「さてと・・・本来ならば教育初日に魔羅をくれてやることは無いのだが」[p] +「お前は特別扱いだ。犯してやるぞ」[p] +#亜紀子 +「は、はい・・・あ、ありがとうございます・・・」[p] + + +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro123-7.jpg" ] +[tb_start_text mode=1 ] +#黒原 +「男根会の奴隷女は肉棒をいただくときも決まった挨拶があるのだが」[p] +「それは追々教えてやるとして、今日は自分なりに考えて挨拶をしてみろ」[p] +#亜紀子 +「は、はい・・・」[p] +(いちいち何をするにも挨拶をさせるのね・・・)[p] +(犯していただく挨拶・・・何を言えば良いの・・・とりあえず勝野に教えられた感じで・・・)[p] +「く、黒原様のおチンポで・・・愚かな亜紀子をみっちりと教育してくださいませ・・・っ!」[p] + +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro123-9.jpg" ] +[tb_start_text mode=1 ] +#亜紀子 +「よろしくお願いしますっ!」[p] +#黒原 +「グハハハハ!それが前の主人に教えられた挨拶か。なかなか悪くない」[p] +「しかし男根会の奴隷女はメスであると同時に最上の淑女でなければいかん。言葉遣いを改めろ」[p] +「男根会では魔羅のことを敬意を込めて尊棒と呼ばせておる。それを踏まえてやり直せ」[p] +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro123-7.jpg" ] +[tb_start_text mode=1 ] +#亜紀子 +「は、はいっ」[p] +(そんぼう・・・「尊棒」・・・かしら?)[p] +(とにかく気に入られるように挨拶しないと・・・)[p] +「この愚かな奴隷を黒原様の御尊棒でご指導くださいませっ!」[p] +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro123-9.jpg" ] +[tb_start_text mode=1 ] +#亜紀子 +「どうぞよろしくお願いいたしますっ!」[p] +#黒原 +「うむ、まぁよかろう。初日だからな」[p] +「魔羅に対する敬意は常に忘れるな」[p] +#亜紀子 +「はいっ」[p] +(御尊棒・・・敬意・・・覚えておかないと)[p] +#黒原 +「それでは犯してやるぞ」[p] +#亜紀子 +「はいっ、ありがとうございますっ!」[p] +(何言ってるの私・・・?)[p] +[_tb_end_text] + +[mask time="1000" effect="fadeIn" color="0x000000" ] +[bg time="1000" method="crossfade" storage="hiro125-1.jpg" ] +[mask_off time="1000" effect="fadeOut" ] +[tb_start_text mode=1 ] +# +パンッパンッパンッ![p] +#亜紀子 +「アンッ!アンッ!アンッ♥」[p] +#黒原 +「なんだ、まだ挿れたばかりなのに甘い声で鳴きおって」[p] +#亜紀子 +「アッ・・・ヒッ・・・アヒンッ♥」[p] +(ひ、久しぶりのチンポ・・・あぁ・・・っ)[p] +#黒原 +「生意気なインテリ女に女の身体が何のためにあるのかじっくり教えてやろうと思ったのに・・・」[p] +# +パンッパンッパンッ![p] +#亜紀子 +「ンンッ・・・アヒッ・・・アァンッ♥」[p] +(か、身体が悦んじゃってる・・・っ♥)[p] +#黒原 +「教えるまでもなく知っておるではないか!」[p] +# +パンッパンッパンッ![p] +#亜紀子 +「アンッ!アッ・・・ンンッ・・・アァンッ♥」[p] +#黒原 +「どうだ、心の中で蔑んでいた男の肉棒は気持ちいいか?」[p] +# +パンッパンッパンッ![p] +#亜紀子 +「アンッ・・・アッ・・・ハヒィッ・・・っ♥」[p] +#黒原 +「自分が孕まされるためだけに存在する肉だと自覚しろ!」[p] +# +パンッパンッパンッ![p] +#亜紀子 +「アヒィッ・・・ンンッ・・・アヒィーーーッ♥」[p] + +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro125-2.jpg" ] +[tb_start_text mode=1 ] +#黒原 +「なにを勝手にイこうとしておるか。イくときは許可を求めろ!」[p] +# +パンパンパンッ![p] +#亜紀子 +「アヒィッ・・・!イ・・・イっても・・・よろしいでしょうかぁぁぁぁあ・・・ッ♥」[p] +「ンンッ・・・ヒィーーーーー・・・・・・ッ♥」[p] +#黒原 +「許可をする前にイくやつがあるか、このメス畜め!」[p] +# +パンパンパンッ![p] +#亜紀子 +「ぐ・・・も、申しわけ・・・アヒッ・・・ありませ・・・ンンーーーッ♥」[p] +#黒原 +「快楽をむさぼるな!教義中だぞ!」[p] +# +パンッパンッパンッ![p] +#亜紀子 +「ヒィッ・・・もっ・・・もうしわけ・・・っ・・・アヒィーーッ♥」[p] +#黒原 +「男の肉棒の前には女は無力だということを教えてやろうというのに」[p] +「もう身をもって体感しておるではないか、ウハハハハ」[p] +# +パンパンパンッ![p] +#亜紀子 +「ハァッ・・・アンッ・・・アァァッ・・・ヒッ♥」[p] +(あぁ・・・チンポに・・・男に・・・屈しちゃう・・・っ♥)[p] +#黒原 +「あんなにでかい口を叩いておきながらたわいもない!」[p] +# +パンパンパンッ![p] +#亜紀子 +「ンァァッ!アァンッ・・・アハァッ・・・アヒィーーーッ♥」[p] +#黒原 +「おい、勝手にイくなよっ」[p] +# +パンパンパンッ[p] +#亜紀子 +「イ、くぅーーっ・・・イ、イかせてください・・・っ♥」[p] +#黒原 +「ダメだ。まだだ」[p] +# +パンパンパンパンッ![p] +#亜紀子 +「アヒィィィ・・・そ、そんなぁ・・・ンンッ・・・アッッ・・・アヒィィイイイーーーッ♥」[p] +「アハァッ・・・アッ・・・も、もうしわけーーーーっ♥」[p] +#黒原 +「また勝手にイきおったかこの堪え性の無いメス豚め!」[p] +# +パンパンパンッ![p] +#亜紀子 +「も、もうしわけぇ・・・アヒッ・・・ご、ございませ・・・ンンーーーッ♥」[p] +[_tb_end_text] + +[mask time="1000" effect="fadeIn" color="0x000000" ] +[wait time="2000" ] +[mask_off time="1000" effect="fadeOut" ] +[tb_start_text mode=1 ] +# +パンパンパンッ![p] +#亜紀子 +「アァァァッ・・・ハァッンッ・・・ンンンッ♥」[p] +(ど、どうなってるの・・・いつまで続くの・・・!?)[p] +# +パンパンパンッ![p] +#亜紀子 +「アッ・・・アアッ・・・も、もうダメ・・・ンヒィーーーーーッ♥」[p] +「イ、イかせてくださィィーーーーッ♥」[p] +#黒原 +「許可を求めながらイくなこのメス豚め!」[p] +# +パンパンパンッ![p] +#亜紀子 +「も、もうしわけぇーーっ・・・ヒィーーッ・・・アヒィッ♥」[p] +(お、おかしくなっちゃう・・・っ!)[p] +「も、もう・・・ゆるしてぇーーーーっ♥」[p] +#黒原 +「何回イくんだこの淫乱め!わしはまだ一回もイってないんだぞ!」[p] +# +パンパンパンッ![p] +#亜紀子 +「ンヒィーーーーッ♥・・・も、もうしわけありませンンーーーーッ♥」[p] +#黒原 +「敗北を認めるか?んん?」[p] +# +パンパンパンッ![p] +#亜紀子 +「み、認めますぅぅぅーーーっ♥」[p] +「お、女はおチンポ様には勝てませんーーーッ♥アヒィーーーーッ♥」[p] +#黒原 +「よし・・・そろそろわしもイくとするか」[p] +「わしの優秀な子種を授けてやるぞ、ありがたく思え!」[p] +# +パンパンパンパンパンッ![p] +#亜紀子 +「アヒィッ♥アンンッ♥ハヒィーーーッ♥」[p] +(えっ・・・な、中・・・?い、イヤ・・・)[p] +#黒原 +「ほれ、感謝しろ・・・っ!」[p] +#亜紀子 +「アッ・・・ありがとうございますぅーーーーッ♥」[p] + + +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro125-3.jpg" ] +[tb_cg id="125" ] +[tb_start_text mode=1 ] +# +ドピュッッッ!![p] +#亜紀子 +「アッ・・・アヒィーーーーーッ♥」[p] +(あっ・・・出てる・・・子宮に・・・♥)[p] +# +ドクドクドクッ[p] +#黒原 +「う・・・む・・・っ」[p] +# +ドピュピュピュッ・・・![p] +#亜紀子 +「イ、イくぅーーーッ・・・ンヒッ♥」[p] +#黒原 +「孕め・・・っ!」[p] +# +ドクドクドクッ[p] +#亜紀子 +「アヒッ・・・ハァンッ♥」[p] +(黒原の・・・受精しちゃう・・・アァッ♥)[p] +#黒原 +「・・・ふぅ、出た出た」[p] +「久しぶりに気の乗ったセックスをしたわ、ヌフフフ」[p] +#亜紀子 +「ハァッ・・・ハァッ・・・ンンッ・・・♥」[p] +「ハァ・・・ハァッ・・・ハッ!」[p] +(あ・・・そ、掃除フェラをしなきゃ・・・)[p] +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro999.jpg" ] +[tb_start_text mode=1 ] +#亜紀子 +「あ・・・た、たっぷりと中出ししていただいてありがとうございました・・・」[p] +「き、綺麗にさせていただきます・・・ンチュッ♥」[p] +#黒原 +「ほお、言われる前に掃除フェラとは、すでに基本はできているようだな」[p] +#亜紀子 +「チュバッ・・・チュムッ・・・ゴクッ♥」[p] +「チュプッ・・・レロレロレロッ♥」[p] +#黒原 +「手際が良いのはいいが、作業的にするなよ。感謝の気持ちを込めて舐めろ」[p] +#亜紀子 +「チュプッ・・・は、はいっ・・・ンチュッ♥」[p] +(か、感謝の気持ち・・・)[p] +「レロレロレロッ・・・チュプッ・・・ゴクンッ♥」[p] +「ピチュッ・・・ペロペロペロ・・・チュバッ♥」[p] +#黒原 +「よし、そのくらいでよかろう」[p] +「・・・挨拶っ!」[p] +#亜紀子 +「は、ハイッッ!」[p] +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro123-9.jpg" ] +[tb_cg id="123" ] +[tb_start_text mode=1 ] +#亜紀子 +「ご、御尊棒で教育していただきありがとうございましたっ!」[p] +#黒原 +「・・・それだけか」[p] +#亜紀子 +「え・・・あ、あの・・・あ、貴重な子種を授けていただきありがとうございました・・・っ!」[p] +#黒原 +「貴様、わしが一度射精する間に何度気をやった?」[p] +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro123-7.jpg" ] +[tb_start_text mode=1 ] +#亜紀子 +「え・・・わ、わかりません・・・」[p] +#黒原 +「6回だ。お前は先ほどのまぐわいで六度気をやった」[p] +#亜紀子 +「も、もうしわけ・・・」[p] +#黒原 +「謝る必要はない。それでよいのだ」[p] +#亜紀子 +「・・・?」[p] +#黒原 +「生殖行為において女は男の何倍も快楽を得るようになっておるのだ」[p] +「そしてそれは相手が誰であろうが、無理やりであろうが変わらない」[p] +「男は気に入った相手との行為でしか興奮しないが女は肉棒ならなんでも受け入れ快感を感じる動物なのだ」[p] +#亜紀子 +「・・・」[p] +(そんなはず無いじゃない・・・そんなはず・・・)[p] +#黒原 +「女は肉欲に溺れ感情に流されやすい動物だ。だから男が管理し教育してやらねばならない」[p] +「そして女は教育していただくこと、守ってもらっていること、養ってもらっていること、肉の悦びを与えてもらっていること、子供を産み育てる幸せを与えられていることに感謝し、男に仕えるべきなのだ」[p] +「理解できたか?」[p] +#亜紀子 +「は、はい・・・っ」[p] +(無茶苦茶な理論だけど・・・今は話をあわせましょう・・・)[p] +#黒原 +「フン、今は理解したふりをしているだけだろうが、すぐに身体で理解するようになる」[p] +#亜紀子 +(なってたまるものですか・・・!)[p] +#黒原 +「それではそろそろ本格的に教育を始めるとするか」[p] +#亜紀子 +「えっ・・・ほ、本格的・・・!?」[p] +「今までのは・・・」[p] +#黒原 +「まだ何も教育というようなことはしていないだろうが」[p] +「夜はまだ長い。これからが本番だ」[p] +#亜紀子 +「そ、そんな・・・」[p] + +[_tb_end_text] + +[mask time="1000" effect="fadeIn" color="0x000000" ] +[bg time="1000" method="crossfade" storage="hiro146-1.jpg" ] +[mask_off time="1000" effect="fadeOut" ] +[tb_start_text mode=1 ] +#亜紀子 +「フガ・・・アゥゥ・・・」[p] +(い、痛い・・・っ!鼻が・・・とれちゃう・・・っ)[p] +#黒原 +「ククク、なかなか良い面になってるぞ」[p] +#亜紀子 +「は・・・はりがとうございまふ・・・っ」[p] +(く・・・こんなみっともない顔を見て楽しんでるのね・・・悔しい・・・っ)[p] +#黒原 +「それでは問う。お前は何者だ!?」[p] +#亜紀子 +「は、はひっ・・・愚かな家畜でふっ!」[p] +#黒原 +「女とはどういう生き物か!?」[p] +#亜紀子 +「だ・・・男性様に管理していただかないとなにもでひない愚かな動物でふっ!」[p] +#黒原 +「なぜこんな格好をさせられているか解るか?」[p] +#亜紀子 +「え・・・あ・・・わ、わかりません・・・っ」[p] +#黒原 +「自分が家畜であるということを自覚するためだ!」[p] +#亜紀子 +「は、はひっ!」[p] +#黒原 +「家畜とは何か!?」[p] +#亜紀子 +「え・・・あ、人間が利用しゅるために飼育する動物・・・でふっ!」[p] +#黒原 +「人間とは何か!?」[p] +#亜紀子 +「え・・・に、人間とは・・・あ・・・哺乳類・・・」[p] + + +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro146-2.jpg" ] +[tb_start_text mode=1 ] +#黒原 +「人間とは男のことだ!」[p] +# +バシィッ![p] +#亜紀子 +「ヒギィーーーッ!?」[p] +#黒原 +「復唱!」[p] +# +バシィッ![p] +#亜紀子 +「ハヒィーーッ!に、人間とは男のことでふぅーーーっ!」[p] +#黒原 +「男性様だろうが!」[p] +# +バシィッ![p] +#亜紀子 +「ヒィーーーッ!だ、男性様でふっ・・・人間とは男性様のことでふーーーーっ!」[p] +#黒原 +「女とは何か!?」[p] +#亜紀子 +「女は・・・か、家畜でふっ!女は家畜でふぅーーーーっ!」[p] +[_tb_end_text] + +[tb_eval exp="f.qp=0" name="qp" cmd="=" op="t" val="0" val_2="undefined" ] +*q + +[bg time="1000" method="crossfade" storage="hiro146-1.jpg" ] +[jump storage="end4b.ks" target="*qend" cond="f.qp==3" ] +[tb_start_text mode=1 ] +#黒原 +「女は男に!?」[p] +#亜紀子 +「お、女は男に・・・」[p] +(も、もう打たれたくない・・・な、なんて答えたらいいの・・・?)[p] +[_tb_end_text] + +[glink color="black" storage="end4b.ks" size="20" target="*a1" text="劣る生き物" x="497" y="312" width="" height="" _clickable_img="" ] +[glink color="black" storage="end4b.ks" size="20" target="*a2" text="絶対服従" x="504" y="392" width="" height="" _clickable_img="" ] +[glink color="black" storage="end4b.ks" size="20" text="孕まされる為の存在" x="459" y="475" width="" height="" _clickable_img="" target="*a3" ] +[s ] +*a1 + +[tb_start_text mode=1 ] +#亜紀子 +「お、劣る生き物でふっ!」[p] +#黒原 +「そんなことは当たり前だろ!」[p] +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro146-3.jpg" ] +[tb_start_text mode=1 ] +# +バシィッ![p] +#亜紀子 +「ハヒィーーーーッ!も、もうひわけありませんーーーっ!」[p] + +[_tb_end_text] + +[tb_eval exp="f.qp+=1" name="qp" cmd="+=" op="t" val="1" val_2="undefined" ] +[jump storage="end4b.ks" target="*q" ] +*a2 + +[tb_start_text mode=1 ] +#亜紀子 +「あ・・・ぜ、絶対服従でふっ!!」[p] +#黒原 +「当たり前だ!」[p] +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro146-3.jpg" ] +[tb_start_text mode=1 ] +# +バシィッ![p] +#亜紀子 +「アギィーーーーッ!もっ、もうひわけありませんんーーーーっ!!」[p] +[_tb_end_text] + +[tb_eval exp="f.qp+=1" name="qp" cmd="+=" op="t" val="1" val_2="undefined" ] +[jump storage="end4b.ks" target="*q" ] +*a3 + +[tb_start_text mode=1 ] +#亜紀子 +「は、孕まされる為の存在でふっ!」[p] +#黒原 +「おこがましいわ!「孕ませていただく」だろうが!」[p] +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro146-3.jpg" ] +[tb_start_text mode=1 ] +# +バシィッ![p] +#亜紀子 +「ハグゥーーーーッ!!も、もうひわけございませんーーーーっ!!」[p] +[_tb_end_text] + +[tb_eval exp="f.qp+=1" name="qp" cmd="+=" op="t" val="1" ] +[jump storage="end4b.ks" target="*q" ] +*qend + +[tb_start_text mode=1 ] +#亜紀子 +(い、一体なんて答えたらいいの・・・!?)[p] +(女は家畜で・・・男性様に飼育されて・・・飼育していただいて・・・)[p] +(調教していただいて・・・孕ませていただいて・・・あっ・・・わかった!)[p] +「か、感謝でふーーーーっ!!」[p] +#黒原 +「そうだ、感謝だ!」[p] +「女は男に常に感謝の気持ちを忘れるな!」[p] +「感謝しろ!」[p] + +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro146-3.jpg" ] +[tb_cg id="146" ] +[tb_start_text mode=1 ] +# +バシィッ![p] +#亜紀子 +「ヒギィーーーッ!!あ、ありがとうございまふぅーーーーっ!!」[p] +#黒原 +「感謝!」[p] +# +バシィッ![p] +#亜紀子 +「教育していただいてありがとうございまふーーーーっ!!」[p] +#黒原 +「感謝!」[p] +# +バシィッ![p] +#亜紀子 +「調教ひていただいてありがとうございまふぅーーーーっ!!」[p] +#黒原 +「感謝!」[p] +# +バシィッ![p] +#亜紀子 +「ありがとうございまふぅーーーーっ!!」[p] +# +・・・・・・[p] +・・・[p] +[_tb_end_text] + +[mask time="1000" effect="fadeIn" color="0x000000" ] +[bg time="1000" method="crossfade" storage="hiro123-8.jpg" ] +[mask_off time="1000" effect="fadeOut" ] +[tb_start_text mode=1 ] +#亜紀子 +「この愚かなメスを調教していただいてありがとうございましたっ!!」[p] +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro123-9.jpg" ] +[tb_start_text mode=1 ] +#亜紀子 +「黒原様のご期待にこたえられるよう一日も早く一人前の家畜となるよう努力いたします!」[p] +「今後ともよろしくお願いいたしますっっ!」[p] +#黒原 +「ククク、先ほどよりはだいぶ従順になってきたではないか」[p] +「今ならもっと心の底から謝罪ができるのではないか?ん?」[p] + +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro123-8.jpg" ] +[tb_start_text mode=1 ] +#亜紀子 +「は、ハイッッ!先日は本当に本当にもうしわけありませんでしたーーーーっ!!」[p] +「愚かな家畜の分際で偉大な黒原様に楯突いた罪は償うとしても償いきれません!」[p] +「これからは心を入れ替えて一人前の家畜に近づけるように努力いたしますっ!!」[p] +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro123-9.jpg" ] +[tb_start_text mode=1 ] +#亜紀子 +「どうかご指導のほどお願いいたしますっっ!!」[p] +#黒原 +「ククク、ポーズだけとはいえなかなか初日でここまではできんぞ」[p] +「元々奴隷の素質十分だったようだな」[p] +#亜紀子 +「あ、ありがとうございますっ!」[p] +#黒原 +「これからみっちりと奴隷としての心得を叩き込んでやるからな。覚悟しておけよ」[p] +#亜紀子 +「は、ハイッ!ありがとうございますぅっ!!」[p] +# +・・・・・・[p] +・・・[p] +[_tb_end_text] + +[stopbgm time="1000" ] +[tb_hide_message_window ] +[tb_replay id="reps19" ] +*rep20 + +[tb_replay_start ] +[mask time="1000" effect="fadeIn" color="0x000000" ] +[bg time="1000" method="crossfade" storage="hiro999.jpg" ] +[tb_show_message_window ] +[mask_off time="1000" effect="fadeOut" ] +[tb_start_text mode=1 ] +# +数週間後―――[p] +[_tb_end_text] + +[playbgm volume="100" time="1000" loop="true" storage="music15.ogg" ] +[tb_start_text mode=1 ] +#亜紀子 +「みなさん・・・こんばんは・・・っ。に、日曜ジャーナル特別版・・・始まりました・・・っ」[p] +「今回のテーマは・・・『男尊女卑の素晴らしさ』・・・ですっ」[p] +「ゲストは・・・教育団体「男根会」の代表であられまして、日々日本の若者の教育に・・・心血を注いでおられます・・・偉大な思想家の・・・黒原剛介様です!」[p] +「黒原様、今日はようこそお越しくださいました・・・っ!」[p] +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro103-1.jpg" ] +[tb_start_text mode=1 ] +#黒原 +「よろしく」[p] +#亜紀子 +「そして、男尊女卑の合理性、素晴らしさを長年・・・説いてこられた・・・麻羅川大学教授の倉本峯吉様です・・・っ」[p] +「本日はお忙しい中、足をお運びいただいて・・・誠にありがとうございます・・・っ!」[p] +#倉本 +「よろしくお願いします」[p] +#亜紀子 +「そ、そして・・・最近男尊女卑の・・・す、素晴らしさに目覚め、過去の己を反省し・・・男根会に入会した元御楚々大学教授の真崎リカさんです」[p] +#リカ +「ど・・・どうぞ・・・よろしく・・・お、おねがいいたします・・・っ!」[p] +#亜紀子 +「そ、そして進行役は・・・わたくし千山亜紀子が務めさせていただきます・・・っ」[p] +「ほ、本日はわたくしたっての希望で・・・こうして椅子として黒原様に座っていただく形で・・・進めさせていただきます・・・っ」[p] +「御見苦しいところあるかもしれませんが・・・どうぞご了承ください・・・っ」[p] +#リカ +「わ、わたくしも・・・自らお願いして・・・倉本先生に座っていただきたくて・・・椅子をさせていただいております・・・っ」[p] +#黒原 +「いやぁわしはそこまでする必要は無いと断ったんだがね」[p] +「彼女が前回の暴言を反省してくれたようで、どうしても椅子をさせてくださいというものだから、仕方なく座らせてもらっておるのだ」[p] +#亜紀子 +「はいっ・・・わたくし・・・前回黒原様とご一緒させていただいた折に・・・愚かにも黒原様の素晴らしいお考えに・・・反論するという失態をしてしまいました・・・っ」[p] +「あの後・・・黒原様にご薫陶いただき・・・自分の愚かさに気づき・・・その場で男根会への入会を希望して・・・寛大にも認めていただきました」[p] +「それ以来黒原様に・・・お導きいただいて・・・い、一人前の淑女となれるように努力している・・・ところでございます・・・っ」[p] +#リカ +「わたくしも前回・・・黒原様に数々の暴言を吐いてしまいましたが・・・黒原様はこんな頑迷なわたくしにも・・・懇切丁寧に真理を解いてくださって・・・」[p] +「すっかり心服いたしまして・・・是非とお願いして・・・男根会の末席に加えていただきました・・・ッ」[p] +#黒原 +「気持ちはうれしいがね、わしは結構体重もあるし重いだろう。無理をしているんじゃないか?」[p] +#亜紀子 +「いえっ、とんでもありません・・・っ!偉大な黒原様に逆らったせめてもの償いです・・・!どうか椅子をやらせてくださいませっ!」[p] +#黒原 +「まぁキミがそこまで言うなら座らせてもらうがね」[p] +「しかしなにも全裸でなくても良かったのじゃないかね?」[p] +#亜紀子 +「いえっ!わたくしなんの能も無い・・・女子アナウンサーですから・・・せ、せめて裸を見ていただいて視聴者様に・・・た、楽しんでいただければと思いまして・・・っ!」[p] +#倉本 +「キミまで裸になることはなかろうに」[p] +#リカ +「い、いえ・・・っ・・・は、反省の証でございます・・・っ・・・み、みすぼらしい身体ですが・・・どうぞご覧ください・・・っ」[p] +#黒原 +「まぁ彼女らのように女の中には男尊女卑のことを良く知らずにただ忌み嫌う者も多いわけだが、きちんと教えれば男尊女卑の正しさを理解するようになるのだ」[p] +「なぜなら女は元来、男に従い、男に尽くすことに幸せを感じるようにできた生き物だからだ」[p] +「この二人がまさに良い例で、こやつらは少し前までは男尊女卑を馬鹿げたことと頭から否定しておったが、今はこうして男に支配され、男の役に立つことに喜びを見出しておる」[p] +「そうだな?」[p] +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro103-2.jpg" ] +[tb_start_text mode=1 ] +# +パンッ[p] +#亜紀子 +「ハイッ!わたくしは・・・黒原様に出会って・・・初めて女の真の幸せと・・・いうものにっ・・・出会いました・・・っ」[p] +「こうして椅子として・・・黒原様の身体を支えることに・・・心からの幸せを・・・感じております・・・っ」[p] + +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro103-1.jpg" ] +[tb_start_text mode=1 ] +#倉本 +「いやしかし、わたしもそちらの座り心地の良さそうな椅子がよかったですな」[p] +「こちらの椅子はどうも不安定で・・・」[p] +#黒原 +「ハハハ、先生それは申し訳ない。なんせ、そちらの鶏ガラ女ではわしの体重は支えられませんのでな」[p] +#倉本 +「それはそうですな、ハハハ」[p] +#リカ +「も・・・もうしわけ・・・ありません・・・っ」[p] +#亜紀子 +「そ、それではまずは・・・「フェミニズムの毒性」ということで・・・男尊女卑の観点から現代の・・・に、日本の社会における問題点を探って・・・いきたいと思うのですが」[p] +「倉本先生、フェミ・・・ニズムはなぜ社会にとって有害・・・なのでしょうか・・・っ?」[p] +#倉本 +「フェミニズムというものはですね、そもそも江戸時代までの日本にはその概念すらなかったんですね」[p] +「明治に開国してその思想が欧米文化とともに流入してきたわけですが―――」[p] +#亜紀子 +(お、重い・・・気を抜いたら潰されちゃう・・・)[p] +(でも・・・耐えないと・・・感謝よ・・・感謝・・・感謝・・・)[p] +# +・・・・・・[p] +・・・[p] +[_tb_end_text] + +[mask time="1000" effect="fadeIn" color="0x000000" ] +[bg time="1000" method="crossfade" storage="hiro103-3.jpg" ] +[mask_off time="1000" effect="fadeOut" ] +[tb_start_text mode=1 ] +#亜紀子 +(う・・・腕が・・・もう感覚がなくなってきたわ・・・)[p] +(でも・・・頑張らないと・・・感謝・・・感謝感謝感謝感謝感謝・・・)[p] +#倉本 +「一度侵され、汚れてしまった思想は簡単には元には戻らない」[p] +#黒原 +「それを正すことができるのは教育だけなのだ」[p] +「結局は教育が間違っているから以前のこやつらのような、勘違いした馬鹿フェミ女が生まれるのだ」[p] +「そうだろう?」[p] +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro103-4.jpg" ] +[tb_cg id="103" ] +[tb_start_text mode=1 ] +# +バシッ![p] +#亜紀子 +「ハイッッ!おっしゃるとおりでございますっ!!」[p] + +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro103-3.jpg" ] +[tb_start_text mode=1 ] +#黒原 +「そこで我々男根会は日本の未来のためには教育こそ重要と悟り、健全な若者を育成するために教育機関を立ち上げた」[p] +「男根会が経営する礼愛学園では道徳教育にも力を入れており、正しい人間を育てるための教育が行われておる」[p] +#亜紀子 +「そ、そうなんですね。そんな理想の教育を行っている礼愛学園なんですが、その様子をちょっとご覧いただきましょう」[p] +# +男根会が経営する礼愛学園の紹介VTRが流される[p] +その内容は礼愛学園を礼賛するもので、充実した施設を紹介したり進学実績をデータで示したりした後、生徒や保護者が登場し学園がいかに素晴らしいかを語るというものだった[p] +#亜紀子 +「ということで・・・礼愛学園は・・・とても素晴らしい・・・学園だということがよく・・・わかりましたねっ。せ、生徒さんも・・・生き生きとしてました・・・しっ」[p] +「わ、わたしたちも・・・この学園に通っていたら・・・っ・・・こんな無知で・・・程度の低い人間には・・・ならなかったでしょうね・・・」[p] +#リカ +「ほっ・・・本当に・・・っ・・・そ、そのとおりだと・・・思います・・・っ」[p] +#黒原 +「キミらは確かに愚かで間違った道を歩んでおったが、それは日本社会全体が間違った方向に進んでいたことが原因なのだ」[p] +「これからは日本人一人ひとりが正しい道を選び、日本を強く健全な、未来への希望が溢れる国にしていかなければならない」[p] +「それではキミがまとめたまえ」[p] + + + +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro103-4.jpg" ] +[tb_start_text mode=1 ] +# +バシッ![p] +#亜紀子 +「ハイッッ!こ、今回は・・・男尊女卑がいかに・・・正しいか・・・男尊女卑こそが人間本来の形であるということを・・・お二人にわかりやすく学ばせて・・・いただきましたっ」[p] +「男性が女の上に立ち・・・しっかりと管理していただく・・・そして女は男性を敬い・・・男性に服従し・・・男性に尽くす・・・そうした理想の社会を作っていかなければ・・・なりません・・・っ」[p] +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro103-3.jpg" ] +[tb_start_text mode=1 ] +#亜紀子 +「そのためには・・・有害な思想であるフェミニズム・・・男女平等といった毒を・・・社会から排除しっ・・・」[p] +「きょ、教育によって・・・幼少期から・・・男性に敬意を持ち・・・男性に従順であるべきという・・・当たり前のことを・・・教えることが大事になります・・・っ」[p] + +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro103-4.jpg" ] +[tb_start_text mode=1 ] +#黒原 +「声が震えておる!」[p] +# +バシッ![p] +#亜紀子 +「申し訳ありませんッ!」[p] +「い、今この番組を・・・視聴されている女の人にも・・・男尊女卑を否定している人は多いと思います」[p] +「でも、決して男尊女卑は抑圧ではありません・・・っ!・・・男尊女卑は・・・解放です・・・っ!」[p] +「女は・・・男性様に服従し、導いていただくことに幸せを感じる生き物ですっ!」[p] +「皆さんもくだらないプライドを捨てて・・・自分を解放して・・・男性様の足元に跪きましょうっ!」[p] +「そこに本当の悦び・・・幸せがありますっ!」[p] +「以上、日曜ジャーナル特別版でした。黒原様、倉本様、今日はありがとうございましたっ!!」[p] +「それではまた来週・・・」[p] +# +[_tb_end_text] + +[call storage="sr.ks" target="" ] +[mask time="1000" effect="fadeIn" color="0x000000" ] +[bg time="1000" method="crossfade" storage="hiro124-2.jpg" ] +[tb_cg id="124" ] +[mask_off time="1000" effect="fadeOut" ] +[tb_start_text mode=1 ] +#亜紀子 +「チュバッ・・・チュムッ・・・レロレロレロレロッ♥」[p] +「ペロペロペロペロッ・・・チュバッ・・・ゴクンッ♥」[p] +#黒原 +「どうだ、糞をしたばかりの肛門を舐める気分は?」[p] +#亜紀子 +「チュバッ・・・ハイッ、黒原様の肛門を綺麗にさせていただくことに幸せを感じておりますっ!レロレロレロレロッ♥」[p] +#黒原 +「そうか。ペーパーで拭いてないからウンコがいっぱい付いているだろう」[p] +#亜紀子 +「ペロペロペロッ・・・ハイッ、わたくしをトイレットペーパーとしてお使いくださってありがとうございますっ!チュムッ♥」[p] +#黒原 +「わしのウンコはどんな味がする?」[p] +#亜紀子 +「レロレロレロッ・・・ハイッ、とても美味しいですっ♥」[p] +(黒原様のウンチ・・・美味しい・・・っ♥)[p] +「チュバッ・・・ペロペロペロッ・・・ゴクンッ♥」[p] +(あぁっ・・・わたしはなんて幸せなの・・・っ♥)[p] +# +エンディングNo.4 「黒原」[p] +[_tb_end_text] + +[wait time="3000" ] +[tb_start_text mode=1 ] +# + +[_tb_end_text] + +[tb_replay id="reps20" ] +[jump storage="title_screen.ks" target="" ] diff --git a/data/scenario/end5.ks b/data/scenario/end5.ks new file mode 100644 index 0000000..419f4eb --- /dev/null +++ b/data/scenario/end5.ks @@ -0,0 +1,983 @@ +[_tb_system_call storage=system/_end5.ks] + +*rep27 + +[tb_replay_start ] +[chara_hide_all time="00" wait="false" ] +[tb_show_message_window ] +[bg time="000" method="crossfade" storage="hiro201.jpg" ] +[chara_show name="美里" time="000" wait="false" storage="chara/1/hiro258-1.png" width="569" height="1423" left="100" top="15" reflect="false" ] +[playbgm volume="100" time="1000" loop="true" storage="bluenoise.ogg" ] +[tb_start_text mode=1 ] +#亜紀子 +(悔しいけど仕方がないわ・・・。逆らっても無駄なのは身に染みてわかったし・・・)[p] +(私にできるのは心を殺してただ従順に従うだけ・・・)[p] +#局長 +「千山君」[p] +[_tb_end_text] + +[chara_show name="局長" time="1000" wait="true" storage="chara/3/hiro262-3.png" width="572" height="1372" left="622" top="-84" reflect="false" ] +[tb_start_text mode=1 ] +#亜紀子 +「局長・・・なにか?」[p] +#局長 +「いやぁ見たよ、深夜のアレ」[p] +「良かったよ、うん。体を張ってよく頑張ってるじゃないか。視聴率もかなり良かったみたいだねぇ」[p] +#亜紀子 +「どうも・・・」[p] +(局長にも見られたのね、あぁ・・・。わざわざ言いに来ないでよ・・・)[p] +#局長 +「批判の声もあるようだけど気にすることはないよ。アナウンサーもタレントのようなものだからね」[p] +「キミの武器はその男好きのする身体なんだから、どんどんアピールしていきたまえ。ムフフ」[p] +#亜紀子 +「はぁ・・・」[p] +(全く嬉しくないわ・・・。早くどこかへ行ってくれないかしら)[p] +#局長 +「・・・ところで、例の話は覚えてるかね?」[p] +#亜紀子 +「例の話・・・?」[p] +#局長 +「ほら、愛人のことだよ」[p] +#亜紀子 +「そのことならはっきりと断ったはずですが」[p] +「次に誘ってきたら他の人にしゃべりますよと言ったはずですよね」[p] +#局長 +「いやいや、もちろんわかっとるよ。でももしかしたら気が変わってるかもしれないと思ってね」[p] +「改めて聞くが、わたしの愛人になる気は無いかね?」[p] +[_tb_end_text] + +[chara_mod name="美里" time="200" cross="false" storage="chara/1/hiro258-4.png" ] +[tb_start_text mode=1 ] +#亜紀子 +「ありません!愛人なんかなるわけがないでしょう!」[p] +「わたしをなんだと思ってるんですか!?あんな仕事をしてるからって簡単に抱けると思わないで下さい!」[p] +#局長 +「ああ、すまんすまん。わかったわかった」[p] +「あんなスケベな仕事をしてるんだから、さぞチンポ好きだろうし誘えば簡単に抱けると思ってしまったよ」[p] +#亜紀子 +「なっ・・・ふ、ふざけないでください!」[p] +#局長 +「あーすまんすまん。もう二度と誘わないから」[p] +「それじゃ仕事頑張ってくれたまえ」[p] +[_tb_end_text] + +[chara_hide name="局長" time="600" wait="true" pos_mode="false" ] +[chara_mod name="美里" time="200" cross="false" storage="chara/1/hiro258-1.png" ] +[tb_start_text mode=1 ] +#亜紀子 +「・・・」[p] +(一体どういう神経してるのかしら・・・?前にあれだけきつく言ったのにまた誘ってくるなんて・・・)[p] +(・・・やっぱり番組であんな下品な身体を張った仕事をしてるから、そういう女に見えちゃうのかしら・・・)[p] +(局長がそう思ってるってことはみんなもそういう風に見てるってことよね・・・私はそんな女じゃないのに・・・)[p] +(でも・・・それも受け入れていくしかないのね・・・)[p] +[_tb_end_text] + +[stopbgm time="1000" ] +[mask time="1000" effect="fadeIn" color="0x000000" ] +[chara_hide_all time="1000" wait="true" ] +[bg time="1000" method="crossfade" storage="hiro202.jpg" ] +[chara_show name="美里" time="1000" wait="true" storage="chara/1/hiro258-1.png" width="532" height="1330" left="177" top="45" reflect="false" ] +[mask_off time="1000" effect="fadeOut" ] +[playbgm volume="100" time="1000" loop="true" storage="neonpurple.ogg" ] +[tb_start_text mode=1 ] +#亜紀子 +(はぁ・・・次の仕事は、と)[p] +(仕事だけはきっちりやらないとね・・・ん?)[p] +(勝野からメールだわ。・・・『仕事が終ったらTKホテルの702号室に来い』・・・?)[p] +(なんでいつもの部屋じゃなくてホテルなんかに・・・?)[p] +(・・・わからないけど、行くしかないわね)[p] +# +・・・・・・[p] +・・・[p] +[_tb_end_text] + +[chara_hide_all time="1000" wait="true" ] +[stopbgm time="1000" ] +[mask time="1000" effect="fadeIn" color="0x000000" ] +[bg time="1000" method="crossfade" storage="hiro999.jpg" ] +[chara_show name="美里" time="1000" wait="true" storage="chara/1/hiro258-1.png" width="512" height="1280" left="388" top="29" reflect="false" ] +[mask_off time="1000" effect="fadeOut" ] +[tb_start_text mode=1 ] +#亜紀子 +(TKホテルに着いたけど・・・この格好でこんなところにくるのは恥ずかしいわ)[p] +(みんなにジロジロ見られてる気がする・・・。娼婦とでも思われてるんでしょうね。わたしだってバレないかしら・・・)[p] +(702号室・・・ここね)[p] +コンコン[p] +「失礼します・・・」[p] + +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro205.jpg" ] +[tb_start_text mode=1 ] +#亜紀子 +「勝野様・・・?」[p] +「誰もいないのかしら・・・」[p] +#?? +「よく来たね」[p] +[_tb_end_text] + +[chara_mod name="美里" time="200" cross="false" storage="chara/1/hiro258-5.png" ] +[tb_start_text mode=1 ] +#亜紀子 +「えっ!?あ、あなたは・・・!」[p] +[_tb_end_text] + +[chara_hide_all time="1000" wait="true" ] +[chara_show name="局長" time="1000" wait="true" storage="chara/3/hiro262-3.png" width="530" height="1272" left="327" top="-39" reflect="false" ] +[playbgm volume="100" time="1000" loop="true" storage="SO_SAD.ogg" ] +[tb_start_text mode=1 ] +#亜紀子 +「きょ、局長・・・!?」[p] +#局長 +「いやぁ、待ってたよ、千山くん。ムフフフ」[p] +#亜紀子 +「な、なんで局長がここに・・・!?」[p] +#局長 +「なぜだろうねぇ、ムフフフ」[p] +「キミは誰に呼び出されたのかね?」[p] +#亜紀子 +「そ、それは・・・」[p] +#局長 +「勝野君だろう?隠す必要はないよ。事情は彼から聞かせてもらったからね」[p] +#亜紀子 +「・・・!」[p] +#局長 +「いやぁまさかキミが勝野君の言うことを何でも聞く奴隷だったなんてねぇ~」[p] + +[_tb_end_text] + +[chara_hide_all time="600" wait="true" ] +[chara_show name="美里" time="600" wait="true" storage="chara/1/hiro258-5.png" width="560" height="1400" left="344" top="22" reflect="false" ] +[tb_start_text mode=1 ] +#亜紀子 +「・・・っ」[p] +#局長 +「それで彼がキミを一晩好きにしていいと言ってくれてね」[p] +#亜紀子 +「そ、そんな・・・」[p] +#局長 +「この話は彼の方からもち掛けてくれたんだよ」[p] +「いやぁ出世というのはしておくものだねぇ。こんな美味しい話が転がり込んでくるんだから。ムフフフッ」[p] +#亜紀子 +「・・・」[p] +(私に性接待をしろっていうの・・・?しかも、よりによって局長に・・・)[p] +#局長 +「というわけで今夜は私がキミのご主人様だ」[p] +#亜紀子 +「く・・・っ」[p] +#局長 +「不服かね?疑うなら勝野君に電話で確認してもいいぞ。ん?」[p] +[_tb_end_text] + +[chara_mod name="美里" time="200" cross="false" storage="chara/1/hiro258-1.png" ] +[tb_start_text mode=1 ] +#亜紀子 +「い、いえ・・・わかりました・・・」[p] +#局長 +「そうかねそうかね。それならボケっとしてないですることがあるんじゃないのかね?」[p] +「ご主人様に挨拶したまえ。勝野君にみっちりと奴隷としての作法を仕込まれてるんだろう?」[p] +#亜紀子 +「はい・・・わかりました」[p] +(今さら逆らっても無駄だわ・・・。相手が局長でもやることは同じよ。感情を無にしてさっさと終らせちゃいましょう)[p] +[_tb_end_text] + +[chara_hide_all time="1000" wait="true" ] +[chara_show name="美里" time="1000" wait="true" storage="chara/1/hiro260-5n.png" width="609" height="1523" left="305" top="20" reflect="false" ] +[tb_start_text mode=1 ] +#局長 +「ほほぉ~!これが夢にまで見た千山君の裸かね!」[p] +「想像通りだよ、ウムウム。まさに男に抱かれるために在るような身体じゃないか」[p] +#亜紀子 +「・・・っ」[p] +(初めて会ったときからいつも私をいやらしい目で見てた局長・・・)[p] +(こいつにだけは絶対に抱かれたくなかったわ・・・)[p] +[_tb_end_text] + +[chara_hide_all time="1000" wait="true" ] +[stopbgm time="1000" ] +[bg time="1000" method="crossfade" storage="hiro133-1.jpg" ] +[playbgm volume="100" time="1000" loop="true" storage="music16.ogg" ] +[tb_start_text mode=1 ] +#亜紀子 +「ご、ご主人様・・・今日はドスケベな肉奴隷の亜紀子をご主人様のおチンポでみっちりと教育してくださいませ」[p] +「亜紀子は・・・ご主人様の性処理をするためだけに存在する・・・か、家畜です。・・・ご自由にお使い下さい」[p] +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro133-2.jpg" ] +[tb_start_text mode=1 ] +#亜紀子 +「どうぞよろしくお願いします・・・っ」[p] +#局長 +「んほぉ~~、これはよく躾けられているじゃないか!あのプライドの高い千山君の全裸土下座を見られる日が来るとは思わなかったよ。ムフフフ」[p] +「しかし後半声が小さくてよく聞こえなかったな。自分のことをなんと言ったのかな?」[p] +「たしか家畜とか聞こえた気がしたが・・・まさか千山君がそんなことを言うわけはないか」[p] +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro133-1.jpg" ] +[tb_start_text mode=1 ] +#亜紀子 +「せ、性処理用の・・・家畜です・・・っ」[p] +#局長 +「なんと!聞き間違いじゃなかったか!わたしの誘いを断った千山君が実は家畜だったとはねぇ、いやはや」[p] +#亜紀子 +「・・・っ」[p] +(今日の昼に愛人にならないかと誘ってきた時には、すでに勝野との間で話がついていたのね・・・)[p] +(こうやって私を弄るために、断られるのがわかっててわざわざあんなことを言ってきたんだわ。なんて嫌な性格なのかしら・・・)[p] +#局長 +「キミは今日わたしになんて言ったっけねぇ?」[p] +「愛人になんか絶対にならない、わたしはそんな軽い女じゃないとか言ってたような気がしたが・・・ん?」[p] +#亜紀子 +(うるさいわね、ネチネチと・・・)[p] +(でもここで悔しがったら思う壺だわ。心を無にして従順な奴隷を演じておきましょう)[p] +「奴隷の分際で生意気なことを言って申し訳ありませんでした」[p] +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro133-2.jpg" ] +[tb_start_text mode=1 ] +#亜紀子 +「どうぞお許しくださいませ」[p] +#局長 +「いやいや、別に怒っているわけじゃないんだよ」[p] +「ただもっと早くキミが愛人になることに同意していれば、対等に近い形で愛を交し合えたのではないかと思うと残念でねぇ」[p] +「こんな主人と奴隷のような関係はわたしも本意ではないんだがねぇ、ヌフフフ」[p] +#亜紀子 +「・・・わたしが愚か者でした。申し訳ありません」[p] +#局長 +「キミは入社当時から私に対する敬意が足りなかったんだよ。アナウンサーの大先輩であり報道局長でもあるこの私に対しての敬意というものがね」[p] +「キミは学歴を鼻にかけて自分が賢いと思って、回りの人間を見下す傾向があった。わたしは常々危惧していたんだよ。このままじゃキミ自身にとってもよくないとね」[p] +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro133-1.jpg" ] +[tb_start_text mode=1 ] +#局長 +「今なら自分がいかに愚かだったかが理解できるんじゃないかね?ん?」[p] +#亜紀子 +「はい・・・わたしは生意気な馬鹿女でした。申し訳ありません」[p] +#局長 +「よしよし、今からでも遅くはない。わたしがみっちりと教育しなおしてやるから心して聞きたまえ」[p] + +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro133-2.jpg" ] +[tb_start_text mode=1 ] +#亜紀子 +「はい、どうぞ愚かな亜紀子をご指導のほどよろしくお願いします!」[p] + +[_tb_end_text] + +[mask time="1000" effect="fadeIn" color="0x000000" ] +[bg time="1000" method="crossfade" storage="hiro135-1.jpg" ] +[mask_off time="1000" effect="fadeOut" ] +[tb_start_text mode=1 ] +# +ニュプッ・・・ニチュッ・・・[p] +#局長 +「それでは女子アナにとって一番大事なのは何かわかるかね?」[p] +#亜紀子 +「・・・見栄えの良さですか?」[p] +#局長 +「それは最低限必要なものだ。あって当たり前のものだ」[p] +# +ニュルッ・・・ムニュッ・・・[p] +#亜紀子 +「・・・せ、セックスの技術でしょうか」[p] +#局長 +「それも大事だが一番ではない」[p] +#亜紀子 +「・・・わかりません。教えていただけますか?」[p] +#局長 +「キミの知能が低いのは仕方のないことだが、考えるのを止めたら成長も止まってしまうんだぞ、千山」[p] +#亜紀子 +「も、申し訳ありません・・・」[p] +(そっちが望んでそうな答えを言ってるのに・・・)[p] +#局長 +「まぁいい、教えてやろう」[p] +「女子アナにとって一番大事なのは「忠誠心」だ」[p] +「局に対する忠誠心、先輩上司に対する絶対服従の姿勢。これが女子アナには最も大事なのだ。わかるか?」[p] +#亜紀子 +「はい」[p] +# +ニュプッ・・・ムニュッ・・・[p] +#局長 +「視聴率のためにパンツを見せろといわれたら「はい、よろこんで」と答えてミニスカートを穿いてくる」[p] +「局のためならその身を進んで差し出す。先輩がしゃぶれと言ったら口答えせずに一生懸命チンポをしゃぶる。女子アナとはそうでなければいけないのだ。そうだろう?」[p] +#亜紀子 +「はい・・・その通りだと思います」[p] +# +ムギュッ・・・ヌリュッ・・・[p] +#局長 +「それを今の女子アナは無駄にプライドだけ高くて一端のジャーナリストを気取りおって、「男に奉仕する」という女子アナの本分を忘れておる」[p] +「あげくの果てにはちょっと売れたらフリーになるだのとほざきおって。全くけしからん。お前もそう思うだろう千山」[p] +#亜紀子 +「はい・・・局長のおっしゃる通りです」[p] +# +ニュプッ・・・ヌリュッ・・・[p] +#局長 +「本当にわかっとるのか?お前のことを言っているんだぞ千山」[p] +#亜紀子 +「・・・わたしが愚かでした。反省して、もう二度と逆らいません」[p] +#局長 +「本当にお前はバカだからな。だいたい巨乳の女はバカだと決まっておるんだ」[p] +「頭にいく栄養が全部乳にいってしまってるんだ。そうだろう千山」[p] +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro135-2.jpg" ] +[tb_start_text mode=1 ] +#亜紀子 +「く・・・っ」[p] +#局長 +「ん~~、なんだその目は?なにか異論でもあるのか?いいぞ、言ってみろ」[p] +#亜紀子 +「い、いえ・・・おっしゃるとおりです・・・」[p] +#局長 +「なにがおっしゃる通りなんだ?自分の口で言ってみろ」[p] +#亜紀子 +「わ、わたしは乳に栄養を取られてしまった・・・脳の足りない女です・・・っ」[p] +#局長 +「そうだ。お前はまず自分がバカ女だということを心に刻み込め。まずはそこからだ」[p] +「お前の中身にはなんの価値もないんだ。お前の取り得はなんだ?」[p] +#亜紀子 +「く・・・乳の大きさです」[p] +#局長 +「そうだ、それだけだ。お前にプライドなんか必要ないんだ。お前は乳のでかいのだけが取り得の無能な女なんだから」[p] +「自分で口に出して言ってみろ。ほら、お前はなんだ?」[p] +#亜紀子 +「く・・・わたしは、乳が大きいことだけが取り得の無能な女です」[p] +#局長 +「そうだ。そして、女子アナというのはそれでいいのだ。お前は優秀な女子アナになれる素質がある」[p] +「女子アナの仕事は短いスカートを穿いて男性司会者の横で愛想を振りまくことだ。それはわかるな?」[p] +#亜紀子 +「は、はい・・・」[p] +(この人はずっと女子アナをそういう目で見てたのね・・・)[p] +# +ニュプッ・・・ヌチュッ・・・[p] +#局長 +「しかしもっと大事な仕事が女子アナにはある。それは男性局員の性処理だ」[p] +「男はみんな頭脳や体力を使って仕事をしているんだ。ニコニコ笑っていれば良いだけの女子アナがそのケアをするのは当然のことだ。そうだろうが?」[p] +#亜紀子 +「はい・・・おっしゃるとおりです・・・」[p] +#局長 +「そもそも女子アナというのは採用の段階で性処理要員、性接待要員としての能力を査定されて入社してきておるのだ」[p] +「だから本来ならば自分から進んで性処理を申し出るべきなのだ」[p] +「女子アナはマイクの前にチンポを握れ、だ。そういう意味ではまさに今のお前は正しい女子アナの姿とも言える。わかるな千山」[p] +#亜紀子 +「はい・・・」[p] +# +ニュプッ・・・ムニュッ・・・[p] +#局長 +「どうせお前も面接官に色目を使って入社したんだろう?チンポくらいはしゃぶったか?」[p] +#亜紀子 +「そ、そんなことはしてません」[p] +#局長 +「口答えをするな!お前は面接官のチンポをしゃぶって入社したんだ。そうだな!?」[p] +#亜紀子 +「は、はい・・・わたしは面接官の・・・おチンポをしゃぶって入社しました・・・」[p] +# +ニュプッ・・・ヌチュッ・・・[p] +#局長 +「お前はT大だったよな。T大にはどうやって入ったんだ?ん?」[p] +#亜紀子 +「それは・・・」[p] +#局長 +「どうした、どうやってT大に入ったか言ってみろ」[p] +#亜紀子 +「う・・・裏口で・・・おチンポをしゃぶって入学しました・・・っ」[p] +# +ニュチュッ・・・ヌプッ・・・[p] +#局長 +「そうだろう、お前みたいなバカがT大に入学できるわけがないからな。そのスケベな身体を使ったに決まっとる」[p] +「関係者とセックスしたんだろう?どうだ?」[p] +#亜紀子 +「は、はい・・・関係者とセックスして・・・入学しました・・・」[p] +# +ムニュッ・・・ヌチュッ・・・[p] +#局長 +「身体を使って入学したんだから授業には付いていけなかっただろう」[p] +「お前みたいな乳だけ女がまともに単位なんか取れるわけがないわな。どうやって卒業したんだ?正直に答えろ」[p] +#亜紀子 +「く・・・教授と寝ました・・・っ」[p] +#局長 +「そうだろうそうだろう、何人もの教授と愛人関係だったんだろう」[p] +「チンポをしゃぶり、股を開いてお前はここまで生きてきたんだ。お前はそういう女だ。そうだな?」[p] +#亜紀子 +「はい・・・わたしは唯一の取り柄である・・・スケベな身体を使ってここまで生きてきました・・・」[p] +# +ニュプッ・・・ニュプッ・・・[p] +#局長 +「そんなお前が「ミニスカートを穿きたくない」とか「愛人になりたくない」などとよくも言えたものだな。ん?」[p] +#亜紀子 +「も、申し訳ありませんでした・・・思い上がっておりました・・・」[p] +(しつこいわね・・・ていうかいつまでパイズリをさせるのよ・・・)[p] +# +ニュプッ・・・・ニュプッ・・・[p] +#局長 +「お前にもう一度チャンスをやろう。どうだ、わたしの愛人にならないか?」[p] +#亜紀子 +「はい・・・局長の愛人にさせてくださいませ・・・」[p] +# +ニュプッ・・・ニュプッ・・・[p] +#局長 +「思い上がるな!お前みたいな無能のずべたが報道局長であるこのわたしの愛人になれるとでも思ってるのか!」[p] + +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro135-3.jpg" ] +[tb_start_text mode=1 ] +#亜紀子 +「く・・・っ」[p] +# +ニュプッ・・・ニュプッ・・・[p] +#局長 +「わたしの愛人になりたいだなどと、身の程を知らんやつだ。全く・・・無能のくせにまだプライドを捨てられんのか」[p] +「だいたいもうすでに性奴隷の女を愛人になどするわけがなかろう。よく考えろバカ者め」[p] +#亜紀子 +「も、申し訳ありません・・・っ」[p] +(く・・・ぶん殴ってやりたいわ・・・っ!)[p] +#局長 +「お前は、そうだな・・・わたし専用の性処理用肉便器女子アナに任命してやる。どうだ嬉しいか」[p] +#亜紀子 +「はい・・・ありがとうございます・・・っ」[p] +# +ニュプッ・・・ニュプッ・・・[p] +#局長 +「光栄だろうが、尊敬するわたしの性処理ができるなんて、え?」[p] +#亜紀子 +「はい・・・そ、尊敬する局長の肉便器になれて・・・光栄です・・・っ」[p] +# +ニュプッ・・・ニュプッ・・・[p] +#局長 +「お前が一番尊敬するアナウンサーは誰だ?」[p] +#亜紀子 +「きょ、局長です・・・」[p] +#局長 +「お前は誰に憧れてアナウンサーになったんだ?」[p] +#亜紀子 +「局長です・・・っ」[p] +# +ニュプッ!ニュプッ![p] +#局長 +「入社したときからわたしに抱かれたいと思っていたんだろう?」[p] +#亜紀子 +「はい・・・局長に抱かれたくてZテレビに入社しました・・・」[p] +#局長 +「そうだろうそうだろう。ずっと欲しかったチンポだぞ、真心を込めてしごけよ」[p] +#亜紀子 +「はい・・・っ」[p] +# +ニュプッ!ヌチュッ![p] +#局長 +「ほらもっとしっかりしごくんだ」[p] +#亜紀子 +「はいっ」[p] +# +ヌプッ!ニュプッ!ムニュッ![p] +#局長 +「もっと速く!刺激が足りんぞ!」[p] +#亜紀子 +「はいっ!」[p] +# +ヌリュッ!ヌリュッ!ヌリュッ![p] +#局長 +「感謝の気持ちを忘れるな!パイズリさせていただいてると思え!」[p] +#亜紀子 +「はいっ・・・パイズリさせていただいて、ありがとうございます・・・っ!」[p] +# +ヌチュッ!ヌチュッ!ヌチュッ![p] +#局長 +「よし・・・出すぞ!」[p] +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro135-4.jpg" ] +[tb_cg id="135" ] +[tb_start_text mode=1 ] +# +ドピュッ![p] +#局長 +「おぉ・・・っ!」[p] +# +ドピュピュピュッ![p] +#亜紀子 +「ン・・・ッ」[p] +# +ヌリュッ!ヌリュッ![p] +# +ピュ・・・ピュピュッ・・・![p] +#局長 +「おぉ・・・年甲斐もなく大量に出してしまったよ」[p] +「パイズリというのは実際にはたいして気持ちよくはないものと思っていたが・・・やるじゃないか千山」[p] +#亜紀子 +「ん・・・あ、ありがとうございます・・・」[p] +#局長 +「おっと、顔にまでかかってしまったな。それじゃ風呂で洗いっこしようじゃないか」[p] +「夜はまだまだ長いからねぇ・・・ムフフフ」[p] +#亜紀子 +「はい・・・」[p] +[_tb_end_text] + +[mask time="1000" effect="fadeIn" color="0x000000" ] +[bg time="1000" method="crossfade" storage="hiro137-1.jpg" ] +[mask_off time="1000" effect="fadeOut" ] +[tb_start_text mode=1 ] +# +ズプッ・・・[p] +#局長 +「どうだ千山、わたしのチンポがお前の中に入ってるぞぉ」[p] +「尊敬する大先輩と一つになった気分はどうだ、ん~?」[p] +#亜紀子 +「は、はい・・・とても嬉しいです・・・っ」[p] +# +ヌチュッ・・・[p] +#局長 +「女はよく「顔が見える体位が好き」と言うが、お前もそうか?千山」[p] +#亜紀子 +「はい・・・す、好きです・・・」[p] +(あなたの顔なんか見たいわけないでしょ・・・気持ちが悪い)[p] +# +スプッ・・・[p] +#局長 +「そうかそうか、こうやってキスもできるしな。ムチュッ」[p] +#亜紀子 +「ンッ・・・ンムッ・・・」[p] +(うげぇ・・・局長とキスだなんて・・・)[p] +#局長 +「レロレロッ・・・チュバッ・・・ムチュ~~ッ」[p] +「ほれ、敬愛する男のキスだぞぉ・・・チュパッ・・・もっと舌を絡めてこい・・・レロレロ」[p] +#亜紀子 +「アムッ・・・レロレロッ・・・はい・・・ンッ・・・チュバッ♥」[p] +(うぅ・・・気持ち悪い・・・年寄りの味がするわ・・・)[p] +#局長 +「ムチュ・・・もっとギュッと抱きついてきなさい。遠慮は要らんぞ・・・チュバッ・・・」[p] +#亜紀子 +「は、はい・・・チュッ♥」[p] +(やればいいんでしょ・・・)[p] +# +ヌチュッ・・・[p] +#局長 +「千山のひだひだがチンポに絡み付いてくるのがわかるぞぉ」[p] +「スケベなマ○コをしてるじゃないか千山ぁ、ムフフフ」[p] +#亜紀子 +「ンッ・・・あ、ありがとうございます・・・」[p] +(ゆっくりと・・・出し入れしないでよ・・・っ)[p] +# +ヌプッ・・・[p] +#局長 +「ドスケベなのは良いことだぞぉ。優秀な女子アナにはかかせないことだからな。チュムッ」[p] +#亜紀子 +「ンムッ・・・はい・・・チュパッ♥」[p] +(なんてネチっこいセックスなの・・・勝野とは全然違う・・・)[p] +#局長 +「さっきは色々きついことを言ったが、わたしはお前に期待しているんだぞぉ」[p] +「お前は一流の肉便器になれる素質がある」[p] +#亜紀子 +「ンッ・・・はい・・・頑張ります・・・っ」[p] +(ずっとしゃべりながらセックスする気・・・?なんて気持ち悪いセックスなのかしら・・・あんっ)[p] +[_tb_end_text] + +[mask time="1000" effect="fadeIn" color="0x000000" ] +[bg time="1000" method="crossfade" storage="hiro137-2.jpg" ] +[mask_off time="1000" effect="fadeOut" ] +[tb_start_text mode=1 ] +#局長 +「わたしはお前が入社してきたときからずっと目をつけていたんだぞぉ、千山」[p] +「このスケベな身体をいつかわたしのチンポでヒィヒィ言わせてやろうと思ってたんだ。わかるか?」[p] +# +ズチュッ・・・ヌプッ・・・[p] +#亜紀子 +「アンッ・・・は、はい・・・ンンッ♥」[p] +(わかってたわよ・・・いやらしい目で見られているのは・・・)[p] +#局長 +「生意気なお前をチンポで教育してやることを想像して、何度抜いたかわからないぞ」[p] +# +ズプッ・・・ヌチュッ・・・[p] +#亜紀子 +「アッ・・・ン・・・な、生意気な態度をとって・・・すいませんでした・・・アフッ♥」[p] +(こっちは・・・あなたにだけは抱かれたくなかったわ・・・クッ・・・)[p] +#局長 +「ついにお前にチンポをぶち込んでやったんだ・・・じっくりと楽しませてもらわないとなぁ・・・ムヒヒヒ」[p] +# +ヌチュッ・・・ヌプッ・・・[p] +#亜紀子 +「アフゥ・・・アンッ・・・ハァッ・・・♥」[p] +(こんなにジワジワ攻められたら・・・アァッ)[p] +#局長 +「お?だんだん吐息が荒くなってきたんじゃないかぁ?どうなんだ千山?」[p] +#亜紀子 +「アフッ・・・は、はい・・・感じてます・・・ハンッ♥」[p] +(く、悔しいけど・・・ほんとに感じちゃってる・・・)[p] +#局長 +「子宮が降りてきてチンポの先っぽに当たってるのがわかるぞぉ・・・ホレッ」[p] +# +ツンッ[p] +#亜紀子 +「アヒッ・・・アァ・・・ンッ♥」[p] +(あぁっ・・・ペニスの先で入り口をチョンチョン突っつかないで・・・ッ♥)[p] +#局長 +「勝野とわたしとどっちのチンポが気持ち良い?ん?」[p] +# +ヌチュッ・・・ズプッ・・・[p] +#亜紀子 +「そ・・・それは・・・アンッ♥」[p] +#局長 +「ほれっ、正直に答えてみなさい・・・ほれっ」[p] +# +ツンッ・・・ツンッ![p] +#亜紀子 +「アヒッ・・・アッ・・・きょ・・・局長です・・・ッ・・・ハァンッ♥」[p] +#局長 +「そうかそうか!よしよし、ご褒美のキスだ・・・ムチュゥ・・・レロレロレロッ」[p] +#亜紀子 +「アムッ・・・ンンッ・・・チュプッ・・・っ♥」[p] +(アンッ・・・いやっ・・・子宮口を突っつきながら・・・キスしないでぇ・・・っ♥)[p] +「アフゥン・・・ッ・・・ハンッ・・・レロレロンッ♥」[p] +#局長 +「ほれ、わたしのツバを飲ませてやるぞ・・・チュブッ・・・ベロベロッ・・・ムチュチュ~~ッ」[p] +#亜紀子 +「ンッ・・・ンムゥ・・・チュブッ・・・ゴクッ♥」[p] +(あぁ・・・局長の唾液が・・・アッ・・・飲んじゃったぁ・・・んっ♥)[p] +#局長 +「ンムフフ・・・キスするたびにマ○コをキュウキュウ締め付けおって」[p] +「そんなにわたしのチンポが気持ち良いか?ん?・・・ブチュゥ~~ッ」[p] +#亜紀子 +「アヒッ・・・ンムッ・・・き、気持ち・・・いいですぅ・・・チュバッ・・・ゴクッ♥」[p] +(く・・・このままじゃ・・・本当に局長のチンポに・・・堕ちちゃう・・・んっ♥)[p] +#局長 +「肉便器のくせに勝手に気持ち良くなるとはけしからんやつだ・・・ホレッ」[p] +# +ヌプッ・・・ズムッ[p] +#亜紀子 +「ンハァ・・・も、申し訳・・・ござ・・・アヒッ♥」[p] +(あぁ・・・ジワジワ攻めないで・・・もっと激しく突いてぇ・・・っ♥)[p] +#局長 +「ほら、どうして欲しいかちゃんと口に出して言いなさい」[p] +# +ヌプッ・・・ツンッ・・・ツンッ[p] +#亜紀子 +「アッ・・・ンッ・・・も、もっと・・・激しくして下さい・・・ハァンッ♥」[p] +(これは・・・肉便器としてのセリフ・・・望んでそうな言葉を言ってるだけよ・・・)[p] +#局長 +「そんなんじゃ伝わらないぞ!アナウンサーならもっときちんと状況を説明するんだ。はっきりと明確にな!」[p] +# +ヌプッ・・・ズプッ・・・[p] +#亜紀子 +「ンッ・・・は、はい・・・アンッ・・・亜紀子のお、おマ○コを・・・局長のおチンポでもっと・・・激しく突いて下さい・・・っ♥」[p] +(こんなの・・・ただのセリフだから・・・っ)[p] +#局長 +「なんでそうして欲しいのか、理由も言わないといかんだろうが、ん?」[p] +# +ヌチュッ・・・ズチュッ・・・[p] +#亜紀子 +「アンッ・・・も、もっと・・・気持ちよく・・・なりたいからですぅ・・・アフッ♥」[p] +(もっと・・・おチンポで気持ちよくなりたい・・・っ♥)[p] +#局長 +「このスケベめ。そんなにわたしのチンポがたまらないか?ん?ムチュッ・・・レロレロレロッ」[p] +#亜紀子 +「アムッ・・・ンチュゥ・・・は、はいっ・・・局長のおチンポ・・・たまりません・・・ンムッ♥」[p] +(あぁ・・・局長のいやらしい舌・・・口を犯されてる・・・っ♥)[p] +#局長 +「よーし、それじゃそろそろペースを上げてやるとするか。・・・ホレッ」[p] + + +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro137-3.jpg" ] +[tb_start_text mode=1 ] +# +ヌチュッ!グチュッ![p] +#亜紀子 +「アヒィッ!・・・アッ・・・ンンーーーーッ♥」[p] +#局長 +「ホレッ、これが欲しかったのか?」[p] +# +ズチュッ!ズムッ!ズムッ![p] +#亜紀子 +「アヒッ!・・・アンッ、アンンッ・・・ダメェーーッ♥」[p] +(身体の・・・奥を・・・愛撫されてる・・・っ♥・・・これには逆らえない・・・っ♥)[p] +#局長 +「もうイキそうか?ん?イくときはちゃんと報告するんだぞ?」[p] +# +ズチュッ!ヌチュッ!ズムッ!ズムッ![p] +#亜紀子 +「アァンッ!・・・も、もう・・・イく・・・イきますぅーーーーッ♥」[p] +「ンンンッ・・・ィィーーーーーーーッ♥」[p] +#局長 +「ムフフ、イったな。あの生意気な千山がわたしのチンポであっさりイきおった」[p] +「ギュッとしがみつきおって、わたしのチンポがそんなに気持いいか?」[p] +# +ヌチュッ・・・ズチュッ![p] +#亜紀子 +「アヒッ・・・き、気持ち良いですぅ・・・アンッ♥」[p] +#局長 +「ほれっ、口もかわいがってやるぞ。ムチュッ・・・レロッ」[p] +#亜紀子 +「ンムッ・・・レロレロレロッ・・・チュバッ・・・ンムッ♥」[p] +#局長 +「マ○コをぎゅっとしめつけおって・・・わたしの精液を搾り取ろうとしてるな?」[p] +# +ヌチュッ・・・ズプッ・・・[p] +#亜紀子 +「ンンッ・・・ハァッ♥」[p] +(そ、そんなわけ・・・ない・・・)[p] +#局長 +「だがそうはいかんぞぉ。そう簡単にわたしをイかせられると思うなよ!」[p] +# +ズチュッ!ズプッ!ズプッ![p] +#亜紀子 +「アヒッ!?・・・ンンッ・・・アンッ♥」[p] +(そ、そんな・・・また・・・!?)[p] +#局長 +「ホレッ・・・ホレッ!」[p] +# +ズプッ!ズプッ!ズプッ![p] +#亜紀子 +「ンハァッ・・・アヒッ・・・アァンッ♥」[p] +#局長 +「ほれっ・・・またイかせてやるぞっ」[p] +# +ズムッ!ズムッ!ズムッ![p] +#亜紀子 +「アヒィーーーッ・・・ンンーーーーッ・・・・・・ッ♥」[p] +#局長 +「どうした千山、イったならちゃんと報告しないとダメだろう。アナウンサーは伝えることが仕事だぞぉ」[p] +# +ヌプッ・・・ズプッ・・・[p] +#亜紀子 +「ンフゥッ・・・あ・・・イ、イきましたぁ・・・アンッ♥」[p] +#局長 +「よしよし・・・まだまだイかせてやるからな・・・ムハァァ」[p] +#亜紀子 +「そ、そんな・・・アヒィッ♥」[p] +[_tb_end_text] + +[mask time="1000" effect="fadeIn" color="0x000000" ] +[mask_off time="1000" effect="fadeOut" ] +[tb_start_text mode=1 ] +# +バチュッ!バチュッ!バチュッ![p] +#亜紀子 +「ンヒィィィーーーっ・・・アンッアンッ・・・ンハァァァッ♥」[p] +#局長 +「ホレッ、ここか?ん?ホレッ!」[p] +# +バチュッ!バチュッ!バチュッ![p] +#亜紀子 +「ンンーーーッ・・・クッ・・・アヒィィーーーーッ♥」[p] +#局長 +「ほれ、イったら報告!」[p] +#亜紀子 +「アヒィッ・・・イ、イきましたぁぁーーー・・・ッ♥」[p] +#局長 +「何回目だ?このスケベ女めっ・・・ムチュ・・・レロッ」[p] +#亜紀子 +「アムッ・・・ンチュッ・・・わ、わかりませんんんーーーッ・・・アフゥッ♥」[p] +#局長 +「わたしもそろそろフィニッシュといくか・・・ウムッ」[p] +# +バチュンッ!バチュンッ!バチュンッ![p] +#亜紀子 +「アヒッ!アンッアンッアンンッ♥」[p] +#局長 +「ふぅぅ・・・来たぞぉ・・・来たぞぉ・・・!」[p] +# +バチュンッ!バチュン!バチュンッ![p] +#亜紀子 +「ンンーーーーッ・・・アヒィッ・・・ンハァァッ♥」[p] +#局長 +「ぅ・・・で・・・出るっ!」[p] +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro137-4.jpg" ] +[tb_cg id="137" ] +[tb_start_text mode=1 ] +# +ドピュッッ![p] +#亜紀子 +「ンヒィィーーーッ・・・アァッ♥」[p] +#局長 +「ンホッ・・・ぉおおぅ・・・っ」[p] +# +ドピュドピュッ・・・![p] +#亜紀子 +「あぁ・・・ンッ・・・ヤッ・・・♥」[p] +(あぁ・・・中に・・・出てる・・・ぅっ♥)[p] +#局長 +「んふぅ・・・っ」[p] +# +ピュピュッ・・・ピュッ![p] +#亜紀子 +「アッ・・・ンッ・・・アフゥッ♥」[p] +(局長の・・・精子で・・・受精しちゃぅ・・・ンッ♥)[p] +#局長 +「はぁ・・・はぁ・・・」[p] +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro205.jpg" ] +[tb_start_text mode=1 ] +#局長 +「いやぁ年甲斐もなくハッスルしてしまったよ。ンフフフ」[p] +「大量に膣出しをしてしまったが、かまわないだろうね?肉便器なんだから」[p] +#亜紀子 +「はぁ・・・はぁ・・・は、はい・・・」[p] +#局長 +「いやあさすがに疲れたよ。のどが渇いたな・・・ドリンクをいただこうかな」[p] +「3回戦の前にちょっと休憩をしよう」[p] +#亜紀子 +「えっ・・・さ、3回戦・・・?」[p] +#局長 +「なんだ、わたしが年寄りだから2回も出したらもう終りだろうとでも思ったかね?」[p] +「たしかに体力は落ちたが、まだまだこっちの方は若い者に負ける気はないんだよ、ムフフフフ」[p] +#亜紀子 +「そ、そんな・・・」[p] +(こんなの・・・もう一回されたらわたし・・・どうなっちゃうの・・・?)[p] +# +・・・・・・[p] +・・・[p] + + +[_tb_end_text] + +[stopbgm time="1000" ] +[mask time="1000" effect="fadeIn" color="0x000000" ] +[bg time="1000" method="crossfade" storage="hiro205.jpg" ] +[chara_show name="局長" time="1000" wait="true" storage="chara/3/hiro262-3.png" width="598" height="1435" left="307" top="-22" reflect="false" ] +[mask_off time="1000" effect="fadeOut" ] +[tb_start_text mode=1 ] +#局長 +「それではわたしは先に帰らせてもらうよ。家庭があるのでね」[p] +「明日からはまた良好な関係で仕事ができそうだ。ムフフフ」[p] +[_tb_end_text] + +[chara_hide_all time="1000" wait="true" ] +[tb_start_text mode=1 ] +# +・・・バタン[p] +・・・[p] +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro136-2.jpg" ] +[tb_cg id="136" ] +[tb_start_text mode=1 ] +#亜紀子 +「ハァ・・・ハァ・・・ッ」[p] +(やっと終った・・・いったい何回イかされたのかしら・・・)[p] +(悔しいけど・・・完全に局長のおチンポに屈服させられちゃったわ・・・)[p] +(虫唾が走るほど毛嫌いしてた局長とのセックスがあんなに気持ち良いなんて・・・)[p] +(・・・いえ、嫌いだからかも・・・わたしやっぱりマゾなんだわ・・・)[p] +(・・・・・・)[p] +(どうせ今の状況から抜け出す手立てがないなら・・・性奴隷という自分を受け入れちゃったほうが楽なのかもね・・・)[p] +(以前のわたしは周りに負けまいと肩肘張って仕事をして・・・家に帰ったら毎晩欲求不満でオナニーしてた)[p] +(あのままだったらわたし、こんな快楽を知らないまま歳を取っていたでしょうね・・・)[p] +(そう考えたらこのまま従順な性奴隷としておチンポに屈して生きていくのも・・・悪くないわ)[p] +(・・・・・・)[p] +(・・・でもただ従順にしてたら飽きられちゃうから、時々反抗的な演技もしてあげないとね)[p] +(だってわたしは・・・女子アナ(肉便器)なんだから・・・)[p] +[_tb_end_text] + +[stopbgm time="1000" ] +[call storage="sr.ks" target="" ] +[mask time="1000" effect="fadeIn" color="0x000000" ] +[bg time="1000" method="crossfade" storage="hiro254-0.jpg" ] +[mask_off time="1000" effect="fadeOut" ] +[chara_show name="谷田" time="1000" wait="true" storage="chara/4/hiro259-2.png" width="500" height="1200" left="142" top="15" reflect="false" ] +[playbgm volume="100" time="1000" loop="true" storage="neonpurple.ogg" ] +[tb_start_text mode=1 ] +#谷田 +「これをこうして・・・あれは準備できてるな」[p] +「・・・よし大丈夫だ。そろそろ千山さんが来る時間かな?」[p] +「・・・前は千山さんに会うのが毎日の楽しみだったけど・・・アレ以来、避けられてるんだよなぁ。声も掛けてくれないし」[p] +「アレは一体なんだったんだろうなぁ。夢だったんじゃないだろうな・・・?」[p] +「千山さんとあんなこと・・・もう二度とできないのかな・・・はぁ」[p] +「・・・あ、来たッ」[p] + + + +[_tb_end_text] + +[chara_hide_all time="1000" wait="true" ] +[chara_show name="美里" time="1000" wait="true" storage="chara/1/hiro258-6.png" width="591" height="1478" left="91" top="15" reflect="false" ] +[tb_start_text mode=1 ] +#亜紀子 +「おはようございます」[p] +#スタッフ +「あ、おはようございます」[p] +#亜紀子 +「あら、シャツが出てるわよ?シャキッとして。今日もはりきっていきましょう」[p] +#スタッフ +「え、あ・・・はい」[p] +(な、なんか今日の千山さんいつもと違うな・・・)[p] +#カメラマン +「おはようございます千山さん」[p] +「今日も衣装似合ってますね」[p] +#亜紀子 +「そう?ありがとう。今日もセクシーに撮ってね♥」[p] +#カメラマン +「え、はい、もちろんです!」[p] +(どうしたんだ?今日はやけに機嫌が良いな)[p] +[_tb_end_text] + +[chara_show name="谷田" time="1000" wait="true" storage="chara/4/hiro259-2.png" width="500" height="1200" left="708" top="-9" reflect="false" ] +[tb_start_text mode=1 ] +#谷田 +「お、おはようございます千山さん・・・」[p] +#亜紀子 +「おはよう谷田君」[p] +「どうしたの?元気ないじゃない」[p] +#谷田 +「え・・・い、いや・・・そんなことは・・・」[p] +#亜紀子 +「そんなんじゃ女の子にモテないわよ?ウフフ」[p] +#谷田 +「え、あ・・・」[p] +(ど、どうしたんだ?急にこんなに優しくなって・・・)[p] +#亜紀子 +(小声で)「また今度ミルクの搾りっこしましょうネ♥」[p] +[_tb_end_text] + +[chara_mod name="谷田" time="200" cross="false" storage="chara/4/hiro259-3.png" ] +[tb_start_text mode=1 ] +#谷田 +「えっ・・・ええっ・・・!?」[p] +#亜紀子 +「ウフフ、じゃあちゃんと仕事頑張ってね」[p] + +[_tb_end_text] + +[chara_hide name="美里" time="1000" wait="true" pos_mode="false" ] +[tb_start_text mode=1 ] +#谷田 +「ど、どういうこと・・・?一体・・・?」[p] +[_tb_end_text] + +[mask time="1000" effect="fadeIn" color="0x000000" ] +[chara_hide_all time="1000" wait="true" ] +[bg time="1000" method="crossfade" storage="hiro999.jpg" ] +[mask_off time="1000" effect="fadeOut" ] +[stopbgm time="1000" ] +[tb_start_text mode=1 ] +#ディレクター +「本番5秒前!4・・・3・・・」[p] +# +・・・・・・[p] +・・・[p] +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro254-13.jpg" ] +[playbgm volume="100" time="1000" loop="false" storage="music13.ogg" ] +[tb_start_text mode=1 ] +#亜紀子 +「こんばんは、ニュースプライムZ。キャスターの千山亜紀子です」[p] +(さぁ今日もパンチラサービスしちゃうわよっ)[p] +「まずは新型コロコロウイルスのニュースです。今日成田空港の入国審査で―――」[p] +(テレビを見てる皆さん、今日も亜紀子でシコシコしてねっ♥)[p] +# +エンディングNo.5  「局長」[p] +[_tb_end_text] + +[stopbgm time="1000" ] +[tb_replay id="reps27" ] +[wait time="3000" ] +[tb_start_text mode=1 ] +# + +[_tb_end_text] + +[jump storage="title_screen.ks" target="" ] diff --git a/data/scenario/end6.ks b/data/scenario/end6.ks new file mode 100644 index 0000000..327e252 --- /dev/null +++ b/data/scenario/end6.ks @@ -0,0 +1,721 @@ +[_tb_system_call storage=system/_end6.ks] + +[playbgm volume="100" time="1000" loop="true" storage="bluenoise.ogg" ] +[tb_start_text mode=1 ] +#亜紀子 +(そんなのは絶対に嫌よ・・・!)[p] +(このまま勝野の性奴隷として屈従しながら、世間にも仕事のためなら何でもやる露出狂の変態女と思われるんじゃ何のために耐えているのかわからないわ)[p] +(こうなったら・・・もうやるしかないわ)[p] +(・・・想像しただけで足が震えるけど・・・覚悟を決めるしかない・・・!)[p] +(・・・でもやるなら明日香にだけは話しておかないといけないわね)[p] +[_tb_end_text] + +[chara_hide_all time="1000" wait="true" ] +[bg time="1000" method="crossfade" storage="hiro202.jpg" ] +[chara_show name="美里" time="1000" wait="true" storage="chara/1/hiro258-1.png" width="488" height="1220" left="207" top="36" reflect="false" ] +[tb_start_text mode=1 ] +#亜紀子 +(明日香はどこかしら・・・?)[p] +(ん・・・あれは・・・?)[p] +[_tb_end_text] + +[chara_show name="明日香" time="1000" wait="true" storage="chara/2/hiro257-2.png" width="34" height="81" left="820" top="383" reflect="false" ] +[chara_show name="勝野" time="1000" wait="true" storage="chara/5/hiro256-1.png" width="43" height="103" left="848" top="380" reflect="false" ] +[chara_move name="美里" anim="true" time="300" effect="linear" wait="true" left="-27" top="37" width="488" height="1220" ] +[tb_start_text mode=1 ] +#亜紀子 +(あれは・・・明日香と勝野・・・?)[p] +(明日香にはもう手を出さないと約束したはず・・・なんでまだあの二人が・・・)[p] +(あ、部屋に入ったわ)[p] +[_tb_end_text] + +[chara_hide name="明日香" time="1000" wait="false" pos_mode="false" ] +[chara_hide name="勝野" time="1000" wait="false" pos_mode="false" ] +[chara_move name="美里" anim="true" time="300" effect="linear" wait="false" left="267" top="36" width="488" height="1220" ] +[tb_start_text mode=1 ] +#亜紀子 +(二人で何をしてるのかしら・・・)[p] +(会話が聞こえないか部屋の前まで行ってみましょう)[p] +# +・・・[p] +[_tb_end_text] + +[chara_hide_all time="1000" wait="true" ] +[bg time="1000" method="crossfade" storage="hiro999.jpg" ] +[tb_start_text mode=1 ] +#明日香 +「お願いします、勝野様・・・っ」[p] +#勝野 +「本気で言ってるのか?」[p] +#明日香 +「本気です!わたし・・・勝野様の奴隷に戻りたいんです!」[p] +#亜紀子 +(え・・・!?)[p] +(あ、明日香・・・?)[p] +#勝野 +「俺のチンポが忘れられないってか?」[p] +#明日香 +「はい、勝野様のおチンポが忘れられなくて・・・ずっとそのことを考えてしまうんです・・・」[p] +「それに・・・調教されたりお仕置きされたり・・・わたしやっぱり奴隷でいたいんです・・・っ」[p] +#勝野 +「ククク、完全にマゾの変態じゃねえか」[p] +「亜紀子が身体を張って助け出してくれたってのに、申し訳ないと思わないのか?」[p] +#明日香 +「そ、それは・・・」[p] +#勝野 +「言っておくがお前が奴隷に戻っても亜紀子は奴隷のままだからな」[p] +「お前が勝手に戻りたいって言うんだからな」[p] +#明日香 +「・・・はい、それでかまいません」[p] +「先輩も・・・きっと解ってくれるはずです・・・」[p] +#亜紀子 +(明日香・・・あなた・・・)[p] +#勝野 +「ククク、まぁいいだろう」[p] +「だが奴隷に戻りたいならどうすればいいかわかってるな?」[p] +「とりあえず裸で土下座だ」[p] +#明日香 +「は、はいっ!」[p] +#亜紀子 +(・・・・・・)[p] +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro202.jpg" ] +[chara_show name="美里" time="1000" wait="true" storage="chara/1/hiro258-1.png" width="423" height="1058" left="252" top="50" reflect="false" ] +[tb_start_text mode=1 ] +#亜紀子 +(明日香・・・)[p] +(・・・悪いけどわたしはあなたとは違うわ)[p] +(たしかにわたしだって性奴隷として身体も精神も開発されたし、快楽に負けそうになる気持ちも解るわ)[p] +(でも、あんなクズ男に支配されたまま堕落した悦びに浸って生きていくなんてまっぴらよ)[p] +(わたしは・・・結果がどうなろうと自分で人生を決める)[p] +(恨まないでね・・・明日香)[p] +[_tb_end_text] + +[chara_hide_all time="1000" wait="true" ] +[tb_start_text mode=1 ] +# +・・・・・・[p] +・・・[p] +[_tb_end_text] + +[stopbgm time="1000" ] +[mask time="1000" effect="fadeIn" color="0x000000" ] +[bg time="1000" method="crossfade" storage="hiro254-10.jpg" ] +[mask_off time="1000" effect="fadeOut" ] +[playbgm volume="100" time="1000" loop="false" storage="music13.ogg" ] +[tb_start_text mode=1 ] +#亜紀子 +「こんばんは、ニュースプライムZ。キャスターの千山亜紀子です」[p] +[_tb_end_text] + +[stopbgm time="1000" ] +[playbgm volume="100" time="1000" loop="true" storage="Green&Dance_2.ogg" ] +[tb_start_text mode=1 ] +#亜紀子 +「最初のニュースです。2025年にデザインが変更される予定の新紙幣に描かれる肖像画の人物が決定しました」[p] +「新紙幣の一万円札は日本地図を書いたことで有名な伊能忠敬、五千円札には平安時代の歌人で六歌仙の一人小野小町、千円札には講道館柔道の創始者嘉納治五郎が選ばれました」[p] +「財務省は選考理由について「知名度があり国民に親しみがある人物で世界に誇れる実績を―――」[p] +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro101-10.jpg" ] +[tb_start_text mode=1 ] +#ノブオ +「おー、今日のパンツは白か」[p] +「やっぱり良いな千山亜紀子は・・・」[p] +「この前の「ディープな話」ではすごかったよなぁ。ほぼ裸で鼻フックされて・・・」[p] +「あんな恥ずかしい仕事してたのに真面目にニュース読んでるのがなんかギャップがあって余計にエロく感じちゃうんだよな」[p] +「でも、どうせ大物芸能人かどっかの社長とかに抱かれてるんだろうなぁー。あーうらやましい」[p] +・・・・・・[p] +・・・[p] +#キヨヒコ +「おはよう俺の亜紀子・・・元気かい?」[p] +「今日はどんなメッセージをくれるんだい・・・」[p] +・・・・・・[p] +・・・[p] +#子供 +「あ、パパの好きなおっぱいお姉さんだよ」[p] +#ママ +「あら?チャンネル変えておいたのになんで戻ってるのよ」[p] +「そんなにパンツが見たいの?まったくあきれた・・・」[p] +#パパ +「ち、違うよ。今時どこのチャンネルの女子アナも似たような格好じゃないか」[p] +#ママ +「じゃあ他のチャンネルで良いじゃない。なんでZテレビにこだわるのよ」[p] +「千山亜紀子が好きなんでしょ!おっぱいがでかいのが好きなんでしょ!」[p] +#パパ +「そ、そんなことないって。報道の傾向が好きなだけで・・・」[p] +#子供 +「ねえ、今日のおっぱいお姉さんなんか変だよ」[p] +#パパ +「ん・・・変?どこが変なんだい・・・?」[p] +#子供 +「んー・・・なんかわからないけど変だよ」[p] +#パパ +「・・・・・・」[p] +#ママ +「そんなのどうでもいいでしょ!さっさとご飯食べちゃいなさい!」[p] +# +・・・・・・[p] +・・・[p] + +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro254-10.jpg" ] +[tb_start_text mode=1 ] +#亜紀子 +「房総半島の南部で野生化したコモドオオトカゲが多数目撃され、ペットの犬や猫が食べられるなどの被害が相次いでいます」[p] +「コモドオオトカゲはインドネシアのコモド島などの限られた地域に生息する世界最大のトカゲで、最大で体長は3m体重150kgにもなります」[p] +「I市などではニ十年ほど前から目撃例が報告されており、ペットとして飼育していたものが脱走し繁殖したものと見られています」[p] +「専門家によるとコモドオオトカゲは牙に毒があり食欲が旺盛であり、カモシカやイノシシ、同じく野生化した外来種のキョンなどを食べて生きているのだろうということです」[p] +「県では「危険な生物なので、見かけても近づかずに警察に通報して欲しい」と住民に注意を促しています」[p] +「以上ニュースをお伝えしました」[p] +「・・・・・・」[p] +#ディレクター +(ん・・・?)[p] +(どうしたの千山ちゃん、天気予報に振って!)[p] +[_tb_end_text] + +[stopbgm time="1000" ] +[bg time="1000" method="crossfade" storage="hiro254-12.jpg" ] +[playbgm volume="100" time="1000" loop="true" storage="music17.ogg" ] +[tb_start_text mode=1 ] +#亜紀子 +「・・・ここでわたくし千山亜紀子から皆様に個人的にお伝えすることがあります」[p] +「・・・わたくし千山亜紀子は、この数ヶ月間プロデューサーの勝野康平という人物に脅迫されていました」[p] +#カメラマン +(え・・・?な、なにこれ!?)[p] +#スタッフ +(ど、どうします!?天気予報に切り替えますか!?)[p] +#ディレクター +(いや、いい!・・・このまま流せ!)[p] +#亜紀子 +「私は母乳体質で妊娠していませんが母乳が出ます。そのことをネタに勝野に脅迫されて、肉体関係を強要されていました」[p] +「そしてさらに多くの猥褻な写真や動画を撮られて、従わなければそれを公開すると脅されて逆らうことができず性奴隷のような立場に置かれていました」[p] +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro101-11.jpg" ] +[tb_start_text mode=1 ] +#ノブオ +「は・・・?急になに言ってるんだ・・・?」[p] +「脅迫・・・!?」[p] +「え、これドッキリじゃないの・・・?」[p] +「おいおいおい、なんかヤバいことが起こってるぞ!?」[p] +・・・・・・[p] +・・・[p] +#キミヒコ +「亜紀子・・・?」[p] +「こ、これは・・・?」[p] +「お、俺へのメッセージなのか・・・?それとも不確定要素・・・・・・いやしかし運命点はまだ・・・」[p] +・・・・・・[p] +・・・[p] +#ママ +「え・・・なにこれ?」[p] +「ねえあなた、これ・・・」[p] +#パパ +「・・・・・・」[p] +#子供 +「コロッケ美味し~い」[p] +#ママ +「ねえ、これってドッキリ?それとも本当なの?」[p] +#パパ +「・・・・・・」[p] +# +・・・・・・[p] +・・・[p] +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro201.jpg" ] +[chara_show name="局長" time="1000" wait="true" storage="chara/3/hiro262-2.png" width="560" height="1344" left="93" top="-20" reflect="false" ] +[chara_show name="明日香" time="1000" wait="true" storage="chara/2/hiro257-2.png" width="560" height="1344" left="656" top="42" reflect="false" ] +[tb_start_text mode=1 ] +#局長 +「なっ・・・なんだこれは!?」[p] +「ち、千山のやつなにを言っておるんだ!?」[p] +「なにやってるんだ、誰か止めさせろ!おい!」[p] +#明日香 +「せ、先輩・・・!?」[p] +「・・・・・・!」[p] +# +[_tb_end_text] + +[chara_hide_all time="1000" wait="true" ] +[bg time="1000" method="crossfade" storage="hiro254-12.jpg" ] +[tb_start_text mode=1 ] +#亜紀子 +「毎夜勝野の部屋に呼び出され犯されました。アナルも犯されましたしアナルを犯した後のペニスもしゃぶらされました」[p] +「足やアナルも舐めさせられましたし、あらゆる屈辱的な性奉仕をさせられました」[p] +「逆らえばお仕置きをされました。浣腸をされてアナルに栓をされて長時間放置されたこともあります。わたしは泣いて許しを乞い、絶対服従を誓いました」[p] +「仕事中も度々フェラチオをさせられました。この露出の多い服装も勝野に強要されて着ているものです」[p] +「勝野の担当する深夜番組への出演も強いられ、色々恥ずかしいこともさせられました」[p] +「勝野の命令で大物芸能人に性接待もさせられました。その名前はここでは明かしません」[p] +「ですがもし勝野が報復でわたしの猥褻動画を公開したらその大物芸能人の名前も公表します」[p] +「そして・・・」[p] +[_tb_end_text] + +[glink color="black" storage="end6.ks" size="20" target="*ask1" text="明日香の名前を出す" x="488" y="371" width="" height="" _clickable_img="" ] +[glink color="black" storage="end6.ks" size="20" target="*ask0" text="明日香の名前は出さない" x="472" y="471" width="" height="" _clickable_img="" ] +[s ] +*ask1 + +[tb_start_text mode=1 ] +#亜紀子 +「・・・同じくアナウンサーの後輩である岡明日香も勝野に脅迫され、性奴隷のような状況に置かれていました」[p] +「私と岡は親友であり、彼女は私を守るために勝野の要求を呑んでしまいました。彼女はわたしに巻き込まれた被害者です」[p] +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro201.jpg" ] +[chara_show name="明日香" time="1000" wait="true" storage="chara/2/hiro257-2.png" width="567" height="1361" left="313" top="8" reflect="false" ] +[tb_start_text mode=1 ] +#明日香 +「せ、先輩・・・どうして・・・」[p] +「・・・・・・」[p] +[_tb_end_text] + +[chara_hide_all time="1000" wait="true" ] +[bg time="1000" method="crossfade" storage="hiro254-12.jpg" ] +[tb_eval exp="f.ask=1" name="ask" cmd="=" op="t" val="1" val_2="undefined" ] +[jump storage="end6.ks" target="*ask2" ] +*ask0 + +[tb_start_text mode=1 ] +#亜紀子 +(明日香まで巻き込むわけにはいかないわ)[p] +[_tb_end_text] + +[jump storage="end6.ks" target="*ask2" cond="f.tp==0" ] +[tb_eval exp="f.ask=2" name="ask" cmd="=" op="t" val="2" val_2="undefined" ] +*ask2 + +[tb_start_text mode=1 ] +#亜紀子 +「私は勝野を告訴します。すでに警察にも連絡しています」[p] +「今回のことは私の弱さが招いたことでもあります。もっと早く告発していればよかったと今は思っています」[p] +「でも私にはその勇気がありませんでした。私や友人の痴態が晒されることを恐れて卑劣な欲求に屈してしまいました」[p] +「しかし私はジャーナリストです。悪に屈さず真実を伝えることが私の使命です」[p] +「これから大変な困難が待っているかもしれません。ですが私は決して屈しません・・・!」[p] +「以上私事でした。失礼しました」[p] +# + +[_tb_end_text] + +[stopbgm time="1000" ] +[bg time="1000" method="crossfade" storage="hiro204.jpg" ] +[tb_start_text mode=1 ] +# +ピンポーーン!ピンポーーン![p] + +[_tb_end_text] + +[chara_show name="勝野" time="1000" wait="true" storage="chara/5/hiro256-1.png" width="562" height="1349" left="295" top="-16" reflect="false" ] +[tb_start_text mode=1 ] +#勝野 +「ん・・・・・・」[p] +「なんだ・・・?こんな時間に・・・」[p] +「昨日も遅くまで亜紀子を抱いて、まだ眠いっていうのに・・・」[p] +# +ピンポーーン!ピンポーーン![p] +#勝野 +「うるせえな・・・今出るよ」[p] +# +ガチャ[p] +#警察 +「勝野康平さんですね?」[p] +[_tb_end_text] + +[playbgm volume="100" time="1000" loop="true" storage="烈火翔ける.ogg" ] +[chara_mod name="勝野" time="200" cross="false" storage="chara/5/hiro256-2.png" ] +[tb_start_text mode=1 ] +#勝野 +「な、なんだ!?け、警察・・・!?」[p] +#警察 +「ちょっと署までご同行願います」[p] +#勝野 +「ちょ、な・・・おい!どういうことだよ!」[p] +「おい・・・待て・・・!」[p] +#警察 +「携帯とパソコンを押収しろ」[p] +#勝野 +「おい、待て・・・!」[p] +「まさか・・・亜紀子か・・・!?」[p] +「クソッ・・・!」[p] +# +・・・・・・[p] +・・・[p] +[_tb_end_text] + +[stopbgm time="1000" ] +[chara_hide_all time="1000" wait="true" ] +[jump storage="end7.ks" target="" cond="f.ask==0" ] +[mask time="1000" effect="fadeIn" color="0x000000" ] +[bg time="1000" method="crossfade" storage="hiro999.jpg" ] +[mask_off time="1000" effect="fadeOut" ] +[tb_start_text mode=1 ] +# +数ヵ月後―――[p] +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro201.jpg" ] +[playbgm volume="100" time="1000" loop="true" storage="neonpurple.ogg" ] +[chara_show name="美里" time="1000" wait="true" storage="chara/1/hiro253-1.png" width="500" height="1200" left="95" top="33" reflect="false" ] +[tb_start_text mode=1 ] +#亜紀子 +「原稿は問題無いわね・・・」[p] +「・・・久しぶりのニュースだから緊張するわ」[p] + +[_tb_end_text] + +[chara_show name="明日香" time="1000" wait="true" storage="chara/2/hiro252-3.png" width="886" height="1216" left="389" top="45" reflect="false" ] +[chara_mod name="美里" time="200" cross="false" storage="chara/1/hiro253-3.png" ] +[tb_start_text mode=1 ] +#明日香 +「先輩、おつかれさまです」[p] +#亜紀子 +「明日香、おつかれさま」[p] +#明日香 +「先輩・・・よかったですね、無事復帰できて」[p] +#亜紀子 +「ええ、裁判中は実質謹慎状態だったものね」[p] +「正直、もうアナウンサーとして復帰はできないかと思ってたわ」[p] +# +亜紀子の告白は芸能界を震撼させた[p] +現役の人気女子アナが過去の話ではなく現在進行形でプロデューサーに陵辱されていた、しかもそれをニュースの生本番でカミングアウトしたのだからその衝撃は大きかった[p] +ワイドショーでも連日このニュースを取り上げ色々な憶測を交えて議論された[p] +亜紀子の出演した深夜バラエティでの痴態やニュースでのパンチラ映像も繰り返し流された[p] +中でも世間の関心を集めたのが、亜紀子が性接待をさせられていたという大物芸能人は誰かということだった[p] +共演の経緯から梅田雅人に最も疑いの目が向けられたが、本人は断固として否定した[p] +亜紀子には取材の依頼が殺到したが、局が用意してくれたホテルに篭って一切応じなかった[p] +そして裁判が始まった[p] +勝野は脅迫を否定し、亜紀子とは普通の恋愛関係にあり証拠映像は「プレイ」であると主張した[p] +しかし明日香の証言やそもそもの発端となった盗撮映像などが証拠となり、有罪の判決が下された[p] +#亜紀子 +「明日香の証言が無かったらどうなってたか・・・本当にありがとう」[p] +#明日香 +「なに言ってるんですか、当然じゃないですか。先輩が勇気を出してくれなかったら私は今頃・・・」[p] +#亜紀子 +「・・・」[p] +[_tb_end_text] + +[jump storage="end6.ks" target="*a2" cond="f.ask==2" ] +*a1 + +[tb_start_text mode=1 ] +# +あの日、明日香は勝野に奴隷に戻して欲しいと頼んでいた[p] +明日香は亜紀子にそのことを聞かれていたことを知らない[p] +明日香ははたしてこれで良かったと思っているのだろうか[p] +しかし亜紀子は明日香のためにもこれで良かったと思っているし、あの生放送で明日香の名前を出さなかったとしても明日香は自分のために証言してくれただろうと確信している[p] +[_tb_end_text] + +[jump storage="end6.ks" target="*a3" ] +*a2 + +[tb_start_text mode=1 ] +# +あの生本番での告白で亜紀子は明日香を巻き込むまいとして明日香の名前を出さなかったが、結局明日香は裁判に証人として来てくれた[p] +自分が陵辱されていたことを世間に知られることもいとわずに亜紀子を助ける為に出てきてくれたのだ[p] +あの日、明日香は勝野に奴隷に戻して欲しいと頼んでいた[p] +明日香は亜紀子にそのことを聞かれていたことを知らない[p] +しかし、もうそんなことはどうでもいい[p] +明日香は正しい道に進める強さを持っていることを自ら証明して見せたのだから[p] +[_tb_end_text] + +*a3 + +[chara_mod name="美里" time="300" cross="false" storage="chara/1/hiro253-1.png" ] +[chara_mod name="明日香" time="300" cross="false" storage="chara/2/hiro252-1.png" ] +[tb_start_text mode=1 ] +#亜紀子 +「気がかりなのは・・・動画ね・・・」[p] +#明日香 +「警察や検察や裁判官たちには見られちゃいましたね・・・」[p] +#亜紀子 +「それは仕方ないんだけど・・・」[p] +# +勝野の動画はパソコンや端末類と一緒に押収された[p] +裁判ではその内容も検証されて亜紀子は恥ずかしい思いをしたが、それに関しては仕方がないし納得している[p] +しかし、たしか勝野は動画を海外のサーバーに保存しているようなことを言っていた[p] +それらに関しては警察も手が出せない[p] +勝野は脅迫や盗撮などの罪が確定したが強姦罪は適用されていない[p] +2年後には出てくるのだ[p] +そのときに勝野が報復で動画を世界中にばら撒くのではないかという不安が残っている[p] +#亜紀子 +「・・・まぁとりあえず今悩んでも仕方がないわ」[p] +「なにがあっても私は負けない」[p] +[_tb_end_text] + +[chara_mod name="美里" time="300" cross="false" storage="chara/1/hiro253-3.png" ] +[chara_mod name="明日香" time="300" cross="false" storage="chara/2/hiro252-3.png" ] +[tb_start_text mode=1 ] +#明日香 +「先輩・・・」[p] +#亜紀子 +「・・・おっと、そろそろ時間ね」[p] +「それじゃ久しぶりの本番行ってくるわ」[p] +#明日香 +「はい、頑張ってください先輩!」[p] +# +・・・・・・[p] +・・・[p] + + +[_tb_end_text] + +[chara_hide_all time="1000" wait="true" ] +[stopbgm time="1000" ] +[call storage="sr.ks" target="" ] +[mask time="1000" effect="fadeIn" color="0x000000" ] +[bg time="1000" method="crossfade" storage="hiro999.jpg" ] +[mask_off time="1000" effect="fadeOut" ] +[tb_start_text mode=1 ] +# +2年後―――[p] +[_tb_end_text] + +[chara_show name="勝野" time="1000" wait="true" storage="chara/5/hiro256-1.png" width="500" height="1200" left="345" top="24" reflect="false" ] +[playbgm volume="100" time="1000" loop="true" storage="枯れ葉が集う路地裏通り_2.ogg" ] +[tb_start_text mode=1 ] +#勝野 +「ふう・・・ようやく出られたぜ」[p] +「シャバの空気は美味い、なんて映画ではよく言うが・・・本当に美味いな」[p] +「しかし誰も迎えに来ないな・・・」[p] +「親父にも見捨てられちまったし当然と言えば当然か・・・」[p] +「・・・これから俺はどうやって生きていったらいいんだ?」[p] +「日本中に顔が知られちまったし、どこにも行き場がねえよ」[p] +「あるものと言えば例の動画・・・世間にも存在がバレてねえようだし、アレだけが俺に残された手札だよな」[p] +「さてどうするか・・・」[p] +#??? +「勝野康平さんですね?」[p] +#勝野 +「ん、あんたは・・・?」[p] +#??? +「週刊○○の記者です」[p] +#勝野 +「あぁ、記者さん・・・」[p] +「出所早々取材かい・・・しかしよく出所日が判ったね。公開されてないはずだが・・・」[p] +#記者 +「そこは蛇の道は蛇ってことで・・・」[p] +「車でお送りしますから道中話をお聞かせ願えませんか?」[p] +#勝野 +「ああ・・・いいぜ」[p] +(雑誌記者か・・・どうせ俺にはもう何も無いんだ。なんとか巧く金を引き出してやる)[p] +#記者 +「それじゃどうぞ、乗ってください」[p] +# + +[_tb_end_text] + +[chara_hide_all time="1000" wait="true" ] +[tb_start_text mode=1 ] +#記者 +「○○町まででいいですか?」[p] +#勝野 +「ん・・・ああ・・・」[p] +「俺の家の場所まで知ってるのかい」[p] +#記者 +「そりゃそうですよ。あの時はさんざん取材しましたからね」[p] +#勝野 +「そうか・・俺も有名人になったもんだ」[p] +#記者 +「ビールありますけど飲みますか?冷えてますよ」[p] +#勝野 +「え、ビール?」[p] +(なんだ気持ち悪いな。こんな犯罪者によ・・・)[p] +(逆にそれだけの価値が俺にはあるってことか。ここは卑屈にならずに偉そうにしておこう)[p] +「ああ・・・いただこうか」[p] +#記者 +「まず飲みたいだろうなと思いましてね」[p] +#勝野 +「ああ・・・ンクッ・・・ぁー・・・美味ぇ」[p] +#記者 +「例の部屋にも行きましたよ。千山アナとナニしてたっていうヤリ部屋にも」[p] +「叔父さんの持ち物なんでしたっけ。今はもう売却されたらしいですけれど」[p] +#勝野 +「そうか・・・」[p] +#記者 +「で、実際どうだったんですか?千山アナの告白は事実だったんですか?」[p] +#勝野 +「おいおい、そんな簡単にしゃべれる話じゃないだろ」[p] +「ちゃんとした記事にしたいなら正式にオファーしてくれ」[p] +#記者 +「ええ、もちろんですもちろんです」[p] +「実はうちとしてはせこい記事じゃなくて暴露本のような形で出せたらと思ってるんですよ」[p] +「絶対に売れますよ。いやらしい話、お金のほうもかなりの額入ることになると思います」[p] +#勝野 +「暴露本・・・なるほどな」[p] +(その手があったか。それなら印税で・・・どのくらいになる?とりあえず食うに困らないくらいは稼げるんじゃねえか)[p] +#記者 +「ところで例の・・・脅迫に使ったとされてる動画ですけども、あれはどうなってるんですか?」[p] +#勝野 +「どうなってる?警察に押収されたよ。それくらい知ってるだろ」[p] +#記者 +「でもまだ残ってるんですよね?」[p] +#勝野 +「・・・どういう意味だ?」[p] +(動画のことは誰も知らないはずだ。ハッタリか?ふん、ひっかかるかよ)[p] +「そんなもん無いよ。あるはずがない」[p] +#記者 +「いや、あるのは知ってるんですよ」[p] +#勝野 +「適当なことを言うなよ。本人が無いって言ってるんだ。ねえよ」[p] +#記者 +「千山亜紀子がね、あなたが釈放された後の報復として動画がばら撒かれるんじゃないかって不安を口にしてるんですよ」[p] +「ということは千山アナはあなたが動画を別に隠しているのを知っているってことですよね」[p] +#勝野 +「・・・」[p] +(亜紀子が・・・?たしかにあいつは知ってる・・・)[p] +(しかしあいつがそんなことをマスコミに話したのか?塀の中でも一応自分関連のニュースはチェックしてたが・・・)[p] +#記者 +「隠すことは無いじゃないですか。どうせそのことであなたを逮捕することなんてできないんだから」[p] +「見たいなんて言いませんよ。わたしなんかの給料じゃ到底払えないくらいの価値があるモノですからね」[p] +「ただ在るかどうかだけ教えてくださいよ」[p] +#勝野 +「・・・わかったよ、あるよ。ある」[p] +「ただし内容とかどこにあるかは言えねえ」[p] +#記者 +「やっぱり在るんですね。あなたしか絶対にわからない場所に」[p] +#勝野 +「ああ」[p] +#記者 +「つまりあなたが死んだらそれは誰の目にも触れることなく永遠に闇に消えてしまうわけだ」[p] +#勝野 +「・・・?まぁそういうことだ」[p] +[_tb_end_text] + +[stopbgm time="1000" ] +[tb_start_text mode=1 ] +#記者 +「・・・・・・」[p] +#勝野 +「・・・?」[p] +「おい、ここは何処だ?なんでこんな山道に入っていくんだ」[p] +#記者 +「・・・」[p] +#勝野 +「おい!何とか言えよ!おい!」[p] +#記者 +「静かにしろ」[p] +#勝野 +「・・・!?」[p] +「お、おまえ・・・記者じゃないのか・・・?だ・・・誰だ?」[p] +#記者? +「わたしが誰かはどうでも良い」[p] +「動画がまだあると判った以上、お前には死んでもらう」[p] +#勝野 +「ちょ、ちょっと待て!待ってくれ!」[p] +「ど、動画・・・?ハッ・・・もしかして梅田さんに雇われた殺し屋か!?」[p] +#謎の男 +「・・・」[p] +#勝野 +「ち、違うんだ!俺は動画をばら撒くつもりなんて・・・!」[p] +「クソッ・・・シートベルトが外れねえ!」[p] +「な、なんか・・・体に力が・・・まさかビールに・・・?」[p] +「や・・・やめ・・・命だけは・・・」[p] +# +・・・・・・[p] +・・・[p] + + +[_tb_end_text] + +[mask time="1000" effect="fadeIn" color="0x000000" ] +[bg time="1000" method="crossfade" storage="hiro999.jpg" ] +[mask_off time="1000" effect="fadeOut" ] +[tb_start_text mode=1 ] +#亜紀子 +「私は勝野を告訴します。すでに警察にも連絡しています」[p] + +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro254-12.jpg" ] +[tb_start_text mode=1 ] +#亜紀子 +「今回のことは私の弱さが招いたことでもあります。もっと早く告発していればよかったと今は思っています」[p] +「でも私にはその勇気がありませんでした。私や友人の痴態が晒されることを恐れて卑劣な欲求に屈してしまいました」[p] +「しかし私はジャーナリストです。悪に屈さず真実を伝えることが私の使命です」[p] +「これから大変な困難が待っているかもしれません。ですが私は決して屈しません・・・!」[p] +「以上私事でした。失礼しました」[p] + +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro101-11.jpg" ] +[tb_start_text mode=1 ] +#ノブオ +「うぉ・・・」[p] +「今の・・・ヤラセじゃなくてマジのやつだよな?」[p] +「千山亜紀子が・・・脅迫されて・・・性奴隷になっていた・・・!?」[p] +「そ、それで急にあんなセクシー路線になってたのか!脅されてやらされてたんだ・・・!」[p] +「し、しかしニュースの本番でカミングアウトするなんて・・・すごいことするな!」[p] +「それもあんなに具体的に内容まで・・・想像したらメチャクチャエロい話だよな」[p] +「なんか興奮してきた」[p] +# +・・・・・・[p] +・・・[p] +#キミヒコ +「亜紀子・・・俺の亜紀子・・・」[p] +「そうか・・・運命の分岐点は・・・ここから・・・」[p] +「亜紀子が・・・ついに・・・俺だけのものに・・・」[p] +# +・・・・・・[p] +・・・[p] +#ママ +「びっくりした・・・」[p] +「いきなりニュースであんな告白するなんて・・・」[p] +「でもやっぱり無理やりやらされてたのよ!あんな破廉恥な格好おかしいと思ってたのよ!」[p] +「だからわたし言ったじゃない、千山アナは良い人だって。ねえ、あなた!」[p] +#パパ +「・・・・・・」[p] +#子供 +「ピーマンおいしくない~」[p] +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro101-12.jpg" ] +[tb_cg id="101" ] +[playbgm volume="100" time="1000" loop="true" storage="music16.ogg" ] +[tb_start_text mode=1 ] +#パパ +(・・・そうだったのか)[p] +(キミは強くなったんだね)[p] +(12年前のあの日以来キミのことを忘れたことはなかった)[p] +(キミがアナウンサーになってテレビに出始めたときは驚いたよ)[p] +(それ以来ずっとキミのことをテレビで見させてもらっている)[p] +(最近のキミの変わり様をとても心配していたんだが、そんな理由があったんだね)[p] +(・・・キミがテレビに出始めたのとちょうど同じ頃に僕には娘が生まれた)[p] +(娘の顔を見るたびに、キミにしたことへの後悔が僕の心を痛めつけた)[p] +(あの日僕は欲望が抑えきれなくなってキミをレイプした)[p] +(あの後僕は毎日警察におびえながら過ごした。でもいつまで経っても新聞に事件の記事が載ることはなく、僕はキミが誰にも話さなかったことを知った)[p] +(僕はそのことを心の奥底に封じ込め、何事もなかったかのように、まるで自分が普通の人間であるかのように過ごし、やがて結婚した)[p] +(でもキミがテレビに現れて一生懸命仕事をしているのを見て僕は罪の意識に苛まれるようになった)[p] +(画面上の輝くキミの目は、娘の笑顔以上に僕の心を責めつけた)[p] +(君を見続けること、罪悪感に悩まされることがせめてもの自分に対する罰だと思っていた)[p] +(キミに会いに行って謝ろうと思ったことも何度もある。でも娘や妻のことを考えると行動に移すことはできなかった)[p] +(・・・今キミは再び卑劣な男の手によって汚された)[p] +(生本番で犯人を告発したキミに比べて、僕はなんて勇気のない男だったのだろう)[p] +(キミのためになにかできることが僕にあるだろうか・・・?)[p] +(僕にも勇気を出すことができるだろうか・・・?)[p] +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro101-11.jpg" ] +[stopbgm time="1000" ] +[tb_start_text mode=1 ] +#ママ +「ねえ、聞いてるのあなた?」[p] +#パパ +「え、ああ。うん」[p] +#ママ +「やっぱり千山アナってすごいわよねぇ」[p] +#パパ +「・・・そうだね。すごく強い女性だね」[p] +#子供 +「ごちそうさま~」[p] +# +エンディングNo.6 「パパ」[p] +[_tb_end_text] + +[wait time="3000" ] +[tb_start_text mode=1 ] +# + +[_tb_end_text] + +[jump storage="title_screen.ks" target="" ] diff --git a/data/scenario/end7.ks b/data/scenario/end7.ks new file mode 100644 index 0000000..3c1072f --- /dev/null +++ b/data/scenario/end7.ks @@ -0,0 +1,395 @@ +[_tb_system_call storage=system/_end7.ks] + +[call storage="sr.ks" target="" ] +[mask time="1000" effect="fadeIn" color="0x000000" ] +[bg time="1000" method="crossfade" storage="hiro119-4.jpg" ] +[mask_off time="1000" effect="fadeOut" ] +[tb_start_text mode=1 ] +# +ムリムリムリムリッ![p] +#亜紀子 +「で、出ましたぁぁーーっ!亜紀子の極太ウンチが・・・っ!ひねり出されましたぁぁーーっ!」[p] +# +ムリムリムリブリブリブリ・・・っ![p] +#亜紀子 +「あぁ・・・まだ出ちゃう・・・っ!亜紀子のぉ排便っ見てぇ~~~っ♥」[p] +# +ボトッ![p] +#亜紀子 +「ハァッ・・・ハァッ・・・あ、亜紀子の排便いかがでしたでしょうか?」[p] +「み、皆様にウンチするところを見られて・・・あ、亜紀子はすごく興奮してしまいました・・・っ♥」[p] +「キャスターのくせに・・・太くて臭いウンチをしてしまったことを・・・お詫び申し上げます。大変申し訳ありませんでした・・・っ」[p] +「わたくし千山亜紀子は・・・これからもカメラの前でふ、太いウンチをひり出していくことを約束いたします。視聴者の皆様には温かく見守っていただければ幸いです」[p] +「それでは・・・あ、亜紀子のウンチブリブリ排便ニュースをお伝えしました・・・っ。明日も・・・見てねっ♥」[p] +「・・・・・・」[p] + + + +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro999.jpg" ] +[tb_start_text mode=1 ] +# +・・・・・・[p] +[_tb_end_text] + +[mask time="1000" effect="fadeIn" color="0x000000" ] +[bg time="1000" method="crossfade" storage="hiro206.jpg" ] +[mask_off time="1000" effect="fadeOut" ] +[playbgm volume="100" time="1000" loop="true" storage="SO_SAD.ogg" ] +[chara_show name="美里" time="1000" wait="true" storage="chara/1/hiro253-6.png" width="542" height="1301" left="3" top="268" reflect="false" ] +[tb_start_text mode=1 ] +#原告側弁護士 +「以上が証拠番号甲12号の内容になります」[p] +「動画の中で原告は無理やり排便をさせられてそれを撮影されています」[p] +「この動画の直前に原告は被告に全裸で拘束され、1リットルの浣腸液を注射型の浣腸器で肛門から注入されています」[p] +「その上、肛門にゴム製のプラグで栓をされて排便ができない状態にされ、およそ1時間放置されるという暴行を受けています」[p] +「なお、そのときに使用されたものと同じと見られるゴム製プラグが被告の部屋で発見されています。証拠番号甲22号がそれです」[p] +#裁判長 +「被告はこの証拠の内容について異議はありますか?」[p] + +[_tb_end_text] + +[chara_show name="勝野" time="1000" wait="true" left="720" top="209" width="546" height="1310" reflect="false" storage="chara/5/hiro256-1.png" ] +[tb_start_text mode=1 ] +#被告側弁護士 +「証拠の動画に映っているのは原告が排便をしている場面であり、その前後に関してはなんら証拠とはなりません」[p] +「原告は動画の中で笑顔で扇情的な言葉をしゃべりながら排便しており、強制されている様子はありません」[p] +「この動画は先ほどの被告の説明どおり、原告には露出願望・非虐待願望の性質があり、双方同意の下の行為であるということの裏づけになります」[p] +#裁判長 +「原告側」[p] +#原告側弁護士 +「この動画の前半部分、排便前にもかかわらず床に大量の液体が見られます」[p] +「これは原告が浣腸をされたことの証拠であり、暴行があったことの証拠です」[p] +#裁判長 +「被告側」[p] +#被告側弁護士 +「被告は原告に対して浣腸をした事は否定していません」[p] +「しかしそれは原告が希望したことであり、双方の同意の下の行為でした」[p] +「原告に質問しますが、動画において両手が後ろに回されていますが、この時両手は拘束されていましたか?」[p] +#裁判長 +「原告」[p] +#亜紀子 +「・・・いえ、されていませんでした」[p] +#被告側弁護士 +「わかりました」[p] +「一般的に年頃の未婚の女性がいくら脅されたからといって、手で隠すこともせずにしかも笑顔でカメラに向かって排便ができるでしょうか?」[p] +「しかも下品で挑発的な内容のセリフを大きな声ではっきりと発しています。これらはこの動画が脅迫や暴行によるものではなく同意の上での性的遊戯であることを示しています」[p] +#原告側弁護士 +「異議あり」[p] +「当時原告は激しい暴行を受けており、恐怖から被告に対して逆らえない状況にありました」[p] +「笑顔で大きい声でセリフを言わないとまた浣腸をするぞと脅されて、原告はやむを得ずそれに従ったのです」[p] +「カメラの前で排便しながらも笑顔ではっきりとしゃべることができるのは、原告がアナウンサーという職業柄カメラに向かって明確にしゃべることが得意だからであり、一般的な女性と比較するべきではありません」[p] +#裁判長 +「異議を認めます」[p] +「続いて証拠番号甲13号の動画をお願いします」[p] +# +・・・・・・[p] +・・・[p] + + +[_tb_end_text] + +[mask time="1000" effect="fadeIn" color="0x000000" ] +[chara_hide_all time="1000" wait="true" ] +[mask_off time="1000" effect="fadeOut" ] +[chara_show name="谷田" time="1000" wait="true" storage="chara/4/hiro259-5.png" width="480" height="1152" left="354" top="128" reflect="false" ] +[tb_start_text mode=1 ] +#被告側弁護士 +「あなたの名前は?」[p] +#谷田 +「谷田知宏です」[p] +#被告側弁護士 +「仕事は何をされていますか?」[p] +#谷田 +「Zテレビのアシスタントディレクターです」[p] +#被告側弁護士 +「原告とはどういう関係ですか?」[p] +#谷田 +「番組の収録で何度も一緒になっていました」[p] +#被告側弁護士 +「6月の27日にあったことを話してもらえますか?」[p] +#谷田 +「はい。・・・あの日テレビ局で千山さんに声を掛けられて、「頼みたいことがあるから」と空き部屋に連れて行かれました」[p] +「そこで千山さんはいきなり服を脱いで裸になって僕を誘ってきました」[p] +#被告側弁護士 +「具体的にはどういうことをされましたか?」[p] +#谷田 +「オッパイを吸って欲しいと言われました。そして僕にも裸になって欲しいと言われて、裸になるとその・・・握ってきました」[p] +#被告側弁護士 +「原告から谷田さんの男性器を握ってきたのですね?」[p] +#谷田 +「はい」[p] +#被告側弁護士 +「それからどうしました?」[p] +#谷田 +「それで・・・千山さんのオッパイを吸いながら、だ、男性器をしごかれて・・・しゃ、射精しました」[p] +#被告側弁護士 +「手で刺激されて射精したのですね?そのときの原告の様子はどうでしたか?」[p] +#谷田 +「え・・・と、興奮していていやらしかったです」[p] +#被告側弁護士 +「なるほど。それからどうしましたか?」[p] +#谷田 +「その後「わたしもミルクが飲みたい」みたいなことを言って、その・・・男性器をくわえられました」[p] +#被告側弁護士 +「原告があなたの男性器を強引に口で咥えてきたのですね?どんな体勢でしたか?」[p] +#谷田 +「上に乗っかられて・・・いわゆるシックスナインの体勢でした。そして股間を僕の顔に押し付けてきました」[p] +#被告側弁護士 +「なるほど、男性器を口で刺激しながら下腹部を押し付けてきたんですね。あなたはどうしましたか?」[p] +#谷田 +「はい、舐めろという意味だと受け取って、じょ、女性器を舐めました」[p] +#被告側弁護士 +「なるほど、上に乗られて顔に裸の股間を押し付けてきたのですからそう受け取るのは自然ですね。それからどうなりましたか?」[p] +#谷田 +「千山さんに男性器をしゃぶられて、僕も女性器を舐めて・・・射精しました」[p] +#被告側弁護士 +「口の中に射精したんですね?原告はあなたの精液をどうしましたか?」[p] +#谷田 +「飲みました」[p] +#被告側弁護士 +「なるほど。それからどうしましたか?」[p] +#谷田 +「それから、もう仕事に行かないといけない時間だったので服を着ました。千山さんも服を着ました」[p] +「部屋を出ようとしたら千山さんに呼び止められてキスをされました」[p] +「たしか「精液がすごく美味しかった」とか「今度はもっとエッチなことをしようね」みたいなことを言われたと思います」[p] +#被告側弁護士 +「わかりました。確認しますが、それまでにあなたと原告はそういう行為をするような間柄ではなかったんですね?」[p] +#谷田 +「はい、ただの仕事上の関係で、時々短い会話をする程度の仲でした」[p] +#被告側弁護士 +「わかりました。ありがとうございました」[p] + + +[_tb_end_text] + +[chara_hide name="谷田" time="1000" wait="false" pos_mode="false" ] +[tb_start_text mode=1 ] +#被告側弁護士 +「証人の証言から、原告は日頃から顔見知り程度の間柄の男性を仕事中に誘惑して強引に性行為に及ぶような性欲の強い女性であることがうかがえます」[p] +「このことから、脅迫などの事実は無く双方合意の下で性的交渉が行われていたという被告の主張が信用できるかと思われます」[p] +#裁判長 +「原告、今の証言に同意できない部分はありますか?」[p] +[_tb_end_text] + +[chara_show name="美里" time="1000" wait="true" storage="chara/1/hiro253-6.png" width="584" height="1401" left="30" top="205" reflect="false" ] +[tb_start_text mode=1 ] +#亜紀子 +「内容に関しては・・・事実ですが、これも勝野に命令されてやったことです」[p] +「決して自分の意思でやったわけではありません」[p] + +[_tb_end_text] + +[tb_start_text mode=1 ] +#被告側弁護士 +「命令されて谷田氏を誘惑して性行為に及んだと言いますが、手で射精させるとか覆いかぶさって男性器を口に含むとか、精液を飲むとか、最後に言葉を掛けてキスをするとか、全て命令だったのですか?」[p] +#亜紀子 +「ええと・・・命令はたしか乳を吸わせること、2回射精させること、そして最後に言葉を掛けてキスをすることだったと思います」[p] +#被告側弁護士 +「それでは口で男性器を刺激するとか精液を飲み込むといった行為は命令されていないということですね?」[p] +#亜紀子 +「それは・・・はい。命令されていません」[p] +#被告側弁護士 +「命令されていないのにシックスナインで男性器を咥えたり股間を相手の顔に押し付けたりしたんですね?「ミルクを飲ませて」というセリフは自分で思いついたものですか?」[p] +#亜紀子 +「そ、それは・・・そうです。でも―――!」[p] +#被告側弁護士 +「あなたが谷田氏と性行為をしたとき、部屋には二人きりだったわけですよね?」[p] +「それならばたとえ命令だったとしても忠実に行う必要はないのでは?やったことにすればよかったのではないのですか?」[p] +#亜紀子 +「それは・・・隠しカメラをセットしておくから後で映像をチェックするぞ、と言われたんです」[p] +#被告側弁護士 +「ほお、隠しカメラ。しかし被告のパソコン及びスマートフォンからはそのような動画は見つかっていません」[p] +#亜紀子 +「えっ、そんなはずは・・・!」[p] +#被告側弁護士 +「もし隠しカメラで撮っていたならその動画は他の動画と同じ場所に保存されているはずです。その動画だけを消す理由は無いですから」[p] +「それが無いということは原告が嘘をついている可能性が高いわけで―――」[p] +#原告側弁護士 +「異議あり!」[p] +「動画が無いことはその事実だけをもって原告が嘘をついているということの証拠にはなりません」[p] +#裁判長 +「異議を認めます」[p] +# +・・・・・・[p] +・・・[p] +[_tb_end_text] + +[mask time="1000" effect="fadeIn" color="0x000000" ] +[chara_hide_all time="1000" wait="true" ] +[bg time="1000" method="crossfade" storage="hiro999.jpg" ] +[mask_off time="1000" effect="fadeOut" ] +[tb_start_text mode=1 ] +#原告側弁護士 +「千山さん、証人として岡明日香さんを呼ぶことをお勧めします」[p] +#亜紀子 +「・・・・・・」[p] +「いえ、呼びません。明日香を巻き込むわけにはいかないわ」[p] +「まだマスコミにも明日香が関わってることは知られてないんだから」[p] +#原告側弁護士 +「しかし、今の流れでは無罪になる可能性がありますよ。もちろん力は尽くしますが・・・」[p] +#亜紀子 +「わかってます・・・なんとかお願いします」[p] +# +・・・・・・[p] +・・・[p] +[_tb_end_text] + +[mask time="1000" effect="fadeIn" color="0x000000" ] +[bg time="1000" method="crossfade" storage="hiro206.jpg" ] +[mask_off time="1000" effect="fadeOut" ] +[tb_start_text mode=1 ] +#被告側弁護士 +「ホルモン研究の第一人者であるT医大の増本先生に証言をしていただいています」[p] +「一般的に未産女性で母乳が分泌されるのは脳下垂体でナンヤラミンというホルモンの分泌が過剰になることが原因で―――」[p] +・・・・・・[p] +・・・・・・[p] +「――つまり原告は異常性欲の疑いがあり通常の性行為では飽き足らずに露出願望や被虐待行為を好み、被告に対して変態的な行為を要求し――」[p] + +[_tb_end_text] + +[chara_show name="美里" time="1000" wait="true" storage="chara/1/hiro253-4.png" width="555" height="1332" left="24" top="214" reflect="false" ] +[tb_start_text mode=1 ] +#亜紀子 +「わたしは異常性欲なんかじゃありません!わたしは―――!」[p] +#裁判長 +「静かに!勝手な発言は控えてください!」[p] +#亜紀子 +「くっ・・・!」[p] +# +・・・・・・[p] +・・・[p] +[_tb_end_text] + +[stopbgm time="1000" ] +[mask time="1000" effect="fadeIn" color="0x000000" ] +[chara_hide_all time="1000" wait="true" ] +[chara_show name="美里" time="1000" wait="true" storage="chara/1/hiro253-6.png" width="553" height="1327" left="19" top="184" reflect="false" ] +[chara_show name="勝野" time="1000" wait="true" storage="chara/5/hiro256-1.png" width="556" height="1335" left="722" top="137" reflect="false" ] +[mask_off time="1000" effect="fadeOut" ] +[tb_start_text mode=1 ] +#裁判長 +「それでは判決を言い渡します」[p] +#亜紀子 +「・・・・・・」[p] +#勝野 +「・・・」[p] +#裁判長 +「原告の訴えを棄却し、被告を無罪とします」[p] +[_tb_end_text] + +[chara_mod name="美里" time="200" cross="false" storage="chara/1/hiro253-5.png" ] +[chara_mod name="勝野" time="600" cross="true" storage="chara/5/hiro256-3.png" ] +[playbgm volume="100" time="1000" loop="true" storage="music22.ogg" ] +[tb_start_text mode=1 ] +#亜紀子 +「そんな・・・!」[p] +#勝野 +「ニヤリ」[p] +#裁判長 +「尚、訴訟費用は原告の負担とします。判決理由については後日判決文の送達を―――」[p] +#原告側弁護士 +「・・・残念です」[p] +#亜紀子 +「そんな・・・こんなの・・・間違ってる・・・」[p] +# +・・・・・・[p] +・・・[p] + +[_tb_end_text] + +[stopbgm time="1000" ] +[mask time="1000" effect="fadeIn" color="0x000000" ] +[chara_hide_all time="1000" wait="true" ] +[mask_off time="1000" effect="fadeOut" ] +[playbgm volume="100" time="1000" loop="true" storage="bluenoise.ogg" ] +[tb_start_text mode=1 ] +# +裁判の敗訴は亜紀子のキャリアにとって致命傷となった[p] +ニュース生本番での告白で勇気ある強い女性として賞賛されていた亜紀子の評価は一転して地に堕ちた[p] +「逆恨みで交際相手を訴えたウソつき女」「トチ狂った露出願望の変態女子アナ」[p] +「知的で正義感の強いニュースキャスター」だったはずの千山亜紀子は、事件以降世間から徹底的に叩かれ嘲笑され蔑まれ、まるで犯罪者のような扱いを受ける存在になった[p] +実際に勝野は亜紀子を名誉毀損で訴え、亜紀子はその裁判でも敗訴した[p] +その結果、亜紀子は自分を脅迫し陵辱した憎い男に、多額の慰謝料を支払わなければいけないという屈辱を味わった[p] +当然会社はクビになり、フリーになったもののイメージの悪さから完全に仕事がなくなり、テレビ業界から追われる事になった[p] +さらに慰謝料や違約金、裁判費用で貯蓄はなくなり借金を背負うこととなった亜紀子にもはや気力は無く、糸が切れた錘のようにひたすら堕ちていくだけだった[p] +そして・・・[p] +[_tb_end_text] + +[stopbgm time="1000" ] +[mask time="1000" effect="fadeIn" color="0x000000" ] +[bg time="1000" method="crossfade" storage="hiro999.jpg" ] +[mask_off time="1000" effect="fadeOut" ] +[tb_start_text mode=1 ] +# +『お名前をお願いします』[p] +#亜紀子 +「・・・千山亜紀子です」[p] +# +『年齢は?』[p] +#亜紀子 +「29歳です」[p] +# +『スリーサイズを教えてください』[p] +[_tb_end_text] + +[chara_show name="美里" time="1000" wait="true" storage="chara/1/hiro260-6.png" width="582" height="1455" left="322" top="30" reflect="false" ] +[tb_start_text mode=1 ] +#亜紀子 +「・・・上から、105cm、64cm、98cmです」[p] +# +『お仕事は何をされていましたか?』[p] +#亜紀子 +「・・・元Zテレビのアナウンサーです』[p] +# +『AVに出ようと思った理由は?』[p] +#亜紀子 +「・・・借金があってお金が必要だからです」[p] +# +『なんでそんなに借金ができちゃったの?』[p] +#亜紀子 +「裁判費用とか、慰謝料とか、スポンサーの違約金とかで・・・」[p] +# +『無実の人を訴えちゃったんだよね?反省してるの?』[p] +#亜紀子 +「は、はい・・・反省してます」[p] +# +『色々な人に迷惑を掛けたよね?』[p] +#亜紀子 +「はい、皆様色々ご迷惑をおかけしました。本当に申し訳ありません」[p] +「これからはAV女優として頑張っていくので、どうかよろしくお願いします」[p] +[_tb_end_text] + +[chara_hide_all time="1000" wait="true" ] +[bg time="1000" method="crossfade" storage="hiro151.jpg" ] +[playbgm volume="100" time="1000" loop="true" storage="music16.ogg" ] +[tb_cg id="151" ] +[tb_start_text mode=1 ] +# +『NGは無しなんだよね?』[p] +#亜紀子 +「はい、どんなことでもさせていただきます」[p] +「中出し、ごっくん、アナル、スカトロ、ハードSM、なんでもいたします」[p] +「生まれ変わった亜紀子をどうぞよろしくお願いします」[p] +# +『それじゃ早速フェラチオから始めようか。男優のゴリ田肉棒丸さんに挨拶して』[p] +#亜紀子 +「ご、ゴリ田様、よろしくお願いします」[p] +#ゴリ田 +「俺様の特大仕置き棒でヒィヒィ言わせてやるから覚悟しろよ」[p] +#亜紀子 +「は、はいっ」[p] +# +エンディングNo.7  「亜紀子」 - true end -[p] +[_tb_end_text] + +[wait time="3000" ] +[tb_start_text mode=1 ] +# + +[_tb_end_text] + +[stopbgm time="1000" ] +[jump storage="q2.ks" target="" cond="f.qpt==20" ] +[jump storage="title_screen.ks" target="" ] diff --git a/data/scenario/first.ks b/data/scenario/first.ks new file mode 100644 index 0000000..b2d4443 --- /dev/null +++ b/data/scenario/first.ks @@ -0,0 +1,35 @@ + + +;メニューボタン非表示 +;[hidemenubutton] + + +;ゲームに必要なライブラリ読み込み +[call storage="system/tyrano.ks"] +[call storage="system/builder.ks"] +[call storage="system/chara_define.ks"] + +;live2D対応 + + +[layopt layer=2 visible=true] +[layopt layer="message0" visible=false] +[call storage="system/message_window.ks"] + +;プラグインの設定 +[call storage="system/plugin.ks"] +[call storage="system/plugin_third.ks"] + +;タイトルの設定 +;[title name="now loading"] + +;タイトル画面表示 +[jump storage="title_screen.ks"] + +;-------------------------- + +[s] + + + + diff --git a/data/scenario/make.ks b/data/scenario/make.ks new file mode 100644 index 0000000..8d47712 --- /dev/null +++ b/data/scenario/make.ks @@ -0,0 +1,9 @@ +;このファイルは削除しないでください! +; +;make.ks はデータをロードした時に呼ばれる特別なKSファイルです。 +;Fixレイヤーの初期化など、ロード時点で再構築したい処理をこちらに記述してください。 +; +; +; +;return 必須 +[return] \ No newline at end of file diff --git a/data/scenario/q1.ks b/data/scenario/q1.ks new file mode 100644 index 0000000..96810b0 --- /dev/null +++ b/data/scenario/q1.ks @@ -0,0 +1,1530 @@ +[_tb_system_call storage=system/_q1.ks] + +*q1-1 + +[mask time="1000" effect="fadeIn" color="0x000000" ] +[bg time="1000" method="crossfade" storage="hiro254-10.jpg" ] +[mask_off time="1000" effect="fadeOut" ] +[playbgm volume="10" time="1000" loop="true" storage="Green&Dance_2.ogg" ] +[tb_eval exp="f.qp=0" name="qp" cmd="=" op="t" val="0" val_2="undefined" ] +[tb_eval exp="f.qpt=0" name="qpt" cmd="=" op="t" val="0" val_2="undefined" ] +[tb_start_text mode=1 ] +#亜紀子 +「こんばんは、ニュースプライムZ。アナウンサーの千山亜紀子です」[p] +(さぁ、気を取り直してしっかりニュースを読みましょう)[p] +「最初のニュースです。今日午後千葉県の―――」[p] +(あれ、これなんて読むんだったかしら・・・?)[p] +[_tb_end_text] + +[glink color="black" storage="q1.ks" size="20" text="匝瑳市(こうさし)" x="499" y="301" width="" height="" _clickable_img="" target="*a0101a" ] +[glink color="black" storage="q1.ks" size="20" text="匝瑳市(あそうし)" x="497" y="368" width="" height="" _clickable_img="" target="*a0101b" ] +[glink color="black" storage="q1.ks" size="20" text="匝瑳市(そうさし)" x="499" y="438" width="" height="" _clickable_img="" target="*a0101c" ] +[s ] +*a0101a + +[tb_start_text mode=1 ] +#亜紀子 +「千葉県こうさ市で・・・」[p] +(なんか違う気がするわ)[p] +[_tb_end_text] + +[jump storage="q1.ks" target="*q0102" ] +*a0101b + +[tb_start_text mode=1 ] +#亜紀子 +「千葉県あそう市で・・・」[p] +(そうだったかしら・・・?)[p] +[_tb_end_text] + +[jump storage="q1.ks" target="*q0102" ] +*a0101c + +[tb_start_text mode=1 ] +#亜紀子 +「千葉県そうさ市で・・・」[p] +(うん、これが正解ね)[p] +[_tb_end_text] + +[tb_eval exp="f.qp+=1" name="qp" cmd="+=" op="t" val="1" val_2="undefined" ] +[jump storage="q1.ks" target="*q0102" ] +*q0102 + +[tb_start_text mode=1 ] +#亜紀子 +「住宅街でペットの・・・」[p] +(これなんて読むんだっけ・・・?)[p] +[_tb_end_text] + +[glink color="black" storage="q1.ks" size="20" text="鬼天竺鼠(ビーバー)" x="499" y="279" width="" height="" _clickable_img="" target="*a0102a" ] +[glink color="black" storage="q1.ks" size="20" text="鬼天竺鼠(ビントロング)" x="484" y="361" width="" height="" _clickable_img="" target="*a0102b" ] +[glink color="black" storage="q1.ks" size="20" text="鬼天竺鼠(カピバラ)" x="502" y="446" width="" height="" _clickable_img="" target="*a0102c" ] +[s ] +*a0102a + +[tb_start_text mode=1 ] +#亜紀子 +「ペットのビーバーが逃げ出し・・・」[p] +(そうだったっけ・・・?)[p] +[_tb_end_text] + +[jump storage="q1.ks" target="*q0103" ] +*a0102b + +[tb_start_text mode=1 ] +#亜紀子 +「ペットのビントロングが逃げ出し・・・」[p] +(なんか違う・・・ような)[p] +[_tb_end_text] + +[jump storage="q1.ks" target="*q0103" ] +*a0102c + +[tb_start_text mode=1 ] +#亜紀子 +「ペットのカピバラが・・・」[p] +(そうそう、カピバラよ)[p] +[_tb_end_text] + +[tb_eval exp="f.qp+=1" name="qp" cmd="+=" op="t" val="1" val_2="undefined" ] +*q0103 + +[tb_start_text mode=1 ] +#亜紀子 +「・・・捜索に当たっていましたが、15時ごろに近くの河川の・・・」[p] +(えーっと、なんて読むんだったかしら・・・?)[p] +[_tb_end_text] + +[glink color="black" storage="q1.ks" size="20" text="粗朶(そだ)" x="522" y="281" width="" height="" _clickable_img="" target="*a0103a" ] +[glink color="black" storage="q1.ks" size="20" text="粗朶(そのう)" x="516" y="361" width="" height="" _clickable_img="" target="*a0103b" ] +[glink color="black" storage="q1.ks" size="20" text="粗朶(そじ)" x="523" y="441" width="" height="" _clickable_img="" target="*a0103c" ] +[s ] +*a0103a + +[tb_start_text mode=1 ] +#亜紀子 +「そだの上で寝ているところを発見し・・・」[p] +(そだだ。そーだそーだ)[p] +[_tb_end_text] + +[tb_eval exp="f.qp+=1" name="qp" cmd="+=" op="t" val="1" val_2="undefined" ] +[jump storage="q1.ks" target="*q0104" ] +*a0103b + +[tb_start_text mode=1 ] +#亜紀子 +「そのうの上で眠っているところを発見し・・・」[p] +(そうだったかしら?)[p] +[_tb_end_text] + +[jump storage="q1.ks" target="*q0104" ] +*a0103c + +[tb_start_text mode=1 ] +#亜紀子 +「そじの上で眠っているところを発見し・・・」[p] +(違ったような・・・)[p] +[_tb_end_text] + +*q0104 + +[tb_start_text mode=1 ] +#亜紀子 +「続いてのニュースです。岐阜県の・・・」[p] +(えーっと、これは確か・・・)[p] +[_tb_end_text] + +[glink color="black" storage="q1.ks" size="20" target="*a0104a" text="各務原市(かかみがはらし)" x="450" y="263" width="" height="" _clickable_img="" ] +[glink color="black" storage="q1.ks" size="20" target="*a0104b" text="各務原市(かがみはらし)" x="454" y="343" width="" height="" _clickable_img="" ] +[glink color="black" storage="q1.ks" size="20" target="*a0104c" text="各務原市(かがみのはらし)" x="445" y="430" width="" height="" _clickable_img="" ] +[s ] +*a0104a + +[tb_start_text mode=1 ] +#亜紀子 +「岐阜県のかかみがはらしで・・・」[p] +(うん、合ってるはずよ)[p] +[_tb_end_text] + +[tb_eval exp="f.qp+=1" name="qp" cmd="+=" op="t" val="1" val_2="undefined" ] +[jump storage="q1.ks" target="*q0105" ] +*a0104b + +[tb_start_text mode=1 ] +#亜紀子 +「岐阜県のかがみはらしで・・・」[p] +(うーん・・・間違えたかも)[p] +[_tb_end_text] + +[jump storage="q1.ks" target="*q0105" ] +*a0104c + +[tb_start_text mode=1 ] +#亜紀子 +「岐阜県のかがみのはらしで・・・」[p] +(あれ?なんか違う?)[p] +[_tb_end_text] + +*q0105 + +[tb_start_text mode=1 ] +#亜紀子 +「今回の選挙は市政の行く末の・・・」[p] +(これの読み方は・・・)[p] +[_tb_end_text] + +[glink color="black" storage="q1.ks" size="20" target="*a0105a" text="分水嶺(ふんすいりょう)" x="476" y="361" width="" height="" _clickable_img="" ] +[glink color="black" storage="q1.ks" size="20" target="*a0105b" text="分水嶺(ぶんすいれい)" x="476" y="278" width="" height="" _clickable_img="" ] +[glink color="black" storage="q1.ks" size="20" text="分水嶺(わきみどころ)" target="*a0105c" x="479" y="446" width="" height="" _clickable_img="" ] +[s ] +*a0105a + +[tb_start_text mode=1 ] +#亜紀子 +「市政の行く末のふんすいりょうになると見られており・・・」[p] +(間違えちゃったかも・・・)[p] +[_tb_end_text] + +[jump storage="q1.ks" target="*q0106" ] +*a0105b + +[tb_start_text mode=1 ] +#亜紀子 +「市政の行く末のぶんすいれいになると見られており・・・」[p] +(そう、ぶんすいれい。分かれ目ってことね)[p] +[_tb_end_text] + +[tb_eval exp="f.qp+=1" name="qp" cmd="+=" op="t" val="1" val_2="undefined" ] +[jump storage="q1.ks" target="*q0106" ] +*a0105c + +[tb_start_text mode=1 ] +#亜紀子 +「市政の行く末のわきみどころになると観られており・・・」[p] +(しまった!違うわこれは)[p] +[_tb_end_text] + +*q0106 + +[tb_start_text mode=1 ] +#亜紀子 +「それだけに今回の選挙は与党にとっても・・・」[p] +(えーっと、これはたしか・・・)[p] +[_tb_end_text] + +[glink color="black" storage="q1.ks" size="20" target="*a0106a" text="鼎(つつみ)の軽重を問う" x="475" y="313" width="" height="" _clickable_img="" ] +[glink color="black" storage="q1.ks" size="20" target="*a0106b" text="鼎(あかね)の軽重を問う" x="473" y="389" width="" height="" _clickable_img="" ] +[glink color="black" storage="q1.ks" size="20" target="*a0106c" text="鼎(かなえ)の軽重を問う" x="477" y="466" width="" height="" _clickable_img="" ] +[s ] +*a0106a + +[tb_start_text mode=1 ] +#亜紀子 +「与党にとってもつつみの軽重を問うことになります」[p] +(そんなの聞いたこと無いわ・・・)[p] +[_tb_end_text] + +[jump storage="q1.ks" target="*q0107" ] +*a0106b + +[tb_start_text mode=1 ] +#亜紀子 +「与党にとってもあかねの軽重を問うことになります」[p] +(あれ・・・?なんか違和感が・・・)[p] +[_tb_end_text] + +[jump storage="q1.ks" target="*q0107" ] +*a0106c + +[tb_start_text mode=1 ] +#亜紀子 +「与党にとってもかなえの軽重を問うことになります」[p] +(そうそう、「かなえ」ね)[p] +[_tb_end_text] + +[tb_eval exp="f.qp+=1" name="qp" cmd="+=" op="t" val="1" val_2="undefined" ] +*q0107 + +[tb_start_text mode=1 ] +#亜紀子 +「続いてのニュースです。大分県の・・・」[p] +(今日は難読地名が多いわね。これはたしか・・・)[p] +[_tb_end_text] + +[glink color="black" storage="q1.ks" size="20" target="*a0107a" text="国東市(こうとうし)" x="511" y="299" width="" height="" _clickable_img="" ] +[glink color="black" storage="q1.ks" size="20" target="*a0107b" text="国東市(あがたし)" x="511" y="377" width="" height="" _clickable_img="" ] +[glink color="black" storage="q1.ks" size="20" target="*a0107c" text="国東市(くにさきし)" x="510" y="454" width="" height="" _clickable_img="" ] +[s ] +*a0107a + +[tb_start_text mode=1 ] +#亜紀子 +「大分県こうとうしの・・・」[p] +(これは違ったわね・・・)[p] +[_tb_end_text] + +[jump storage="q1.ks" target="*q0108" ] +*a0107b + +[tb_start_text mode=1 ] +#亜紀子 +「大分県あがたしの・・・」[p] +(こんな読み方じゃなかったような・・・)[p] +[_tb_end_text] + +[jump storage="q1.ks" target="*q0108" ] +*a0107c + +[tb_start_text mode=1 ] +#亜紀子 +「大分県くにさきしの・・・」[p] +(そうそう、国東半島の「くにさき」ね)[p] +[_tb_end_text] + +[tb_eval exp="f.qp+=1" name="qp" cmd="+=" op="t" val="1" val_2="undefined" ] +*q0108 + +[tb_start_text mode=1 ] +#亜紀子 +「公園で市民の目を楽しませているのは満開の・・・」[p] +(えーっと知ってるんだけど・・・)[p] +[_tb_end_text] + +[glink color="black" storage="q1.ks" size="20" target="*a0108a" text="木瓜(ぼけ)" x="520" y="296" width="" height="" _clickable_img="" ] +[glink color="black" storage="q1.ks" size="20" target="*a0108b" text="木瓜(くちなし)" x="515" y="370" width="" height="" _clickable_img="" ] +[glink color="black" storage="q1.ks" size="20" target="*a0108c" text="木瓜(あけび)" x="515" y="448" width="" height="" _clickable_img="" ] +[s ] +*a0108a + +[tb_start_text mode=1 ] +#亜紀子 +「ぼけの花です・・・」[p] +(たしかそうだったはず)[p] +[_tb_end_text] + +[tb_eval exp="f.qp+=1" name="qp" cmd="+=" op="t" val="1" val_2="undefined" ] +[jump storage="q1.ks" target="*q0109" ] +*a0108b + +[tb_start_text mode=1 ] +#亜紀子 +「くちなしの花です・・・」[p] +(くちなしはこんな漢字じゃないような・・・)[p] +[_tb_end_text] + +[jump storage="q1.ks" target="*q0109" ] +*a0108c + +[tb_start_text mode=1 ] +#亜紀子 +「あけびの花です・・・」[p] +(うーん、自信が無いわ・・・)[p] +[_tb_end_text] + +*q0109 + +[tb_start_text mode=1 ] +#亜紀子 +「公園の管理者は地面に・・・」[p] +(これは・・・うーん)[p] +[_tb_end_text] + +[glink color="black" storage="q1.ks" size="20" target="*a0109a" text="毛氈(ござ)" x="529" y="287" width="" height="" _clickable_img="" ] +[glink color="black" storage="q1.ks" size="20" target="*a0109b" text="毛氈(もうせん)" x="517" y="373" width="" height="" _clickable_img="" ] +[glink color="black" storage="q1.ks" size="20" target="*a0109c" text="毛氈(むしろ)" x="527" y="458" width="" height="" _clickable_img="" ] +[s ] +*a0109a + +[tb_start_text mode=1 ] +#亜紀子 +「地面にござを敷いて・・・」[p] +(ござだったっけ・・・?)[p] +[_tb_end_text] + +[jump storage="q1.ks" target="*q0110" ] +*a0109b + +[tb_start_text mode=1 ] +#亜紀子 +「地面にもうせんを敷いて・・・」[p] +(「もうせん」が正解ね)[p] +[_tb_end_text] + +[tb_eval exp="f.qp+=1" name="qp" cmd="+=" op="t" val="1" val_2="undefined" ] +[jump storage="q1.ks" target="*q0110" ] +*a0109c + +[tb_start_text mode=1 ] +#亜紀子 +「地面にむしろを敷いて・・・」[p] +(違うような気がするわ・・・)[p] +[_tb_end_text] + +*q0110 + +[tb_start_text mode=1 ] +#亜紀子 +「しかし雨天が続いていることもあり、人出は・・・」[p] +(なんでフリガナを打ってくれないのかしら・・・!えーっとこれは・・・)[p] +[_tb_end_text] + +[glink color="black" storage="q1.ks" size="20" target="*a0110a" text="疎ら(もっぱら)" x="509" y="298" width="" height="" _clickable_img="" ] +[glink color="black" storage="q1.ks" size="20" target="*a0110b" text="疎ら(うっすら)" x="510" y="384" width="" height="" _clickable_img="" ] +[glink color="black" storage="q1.ks" size="20" target="*a0110c" text="疎ら(まばら)" x="517" y="473" width="" height="" _clickable_img="" ] +[s ] +*a0110a + +[tb_start_text mode=1 ] +#亜紀子 +「人出はもっぱらで・・・」[p] +(これじゃ意味が合わないわ・・・)[p] +[_tb_end_text] + +[jump storage="q1.ks" target="*q01end" ] +*a0110b + +[tb_start_text mode=1 ] +#亜紀子 +「人出はうっすらで・・・」[p] +(変な日本語ね・・・)[p] +[_tb_end_text] + +[jump storage="q1.ks" target="*q01end" ] +*a0110c + +[tb_start_text mode=1 ] +#亜紀子 +「人出はまばらで・・・」[p] +(そうね。しっくりくるわ)[p] +[_tb_end_text] + +[tb_eval exp="f.qp+=1" name="qp" cmd="+=" op="t" val="1" val_2="undefined" ] +*q01end + +[tb_eval exp="f.qpt+=f.qp" name="qpt" cmd="+=" op="h" val="qp" val_2="undefined" ] +[tb_start_text mode=1 ] +#亜紀子 +「以上ニュースをお伝えしました」[p] +・・・・・・[p] +・・・[p] + +[_tb_end_text] + +[stopbgm time="1000" ] +[mask time="1000" effect="fadeIn" color="0x000000" ] +[bg time="000" method="crossfade" storage="hiro254-0.jpg" ] +[chara_show name="美里" time="1000" wait="true" storage="chara/1/hiro258-2.png" width="713" height="1783" left="58" top="9" reflect="false" ] +[mask_off time="1000" effect="fadeOut" ] +[tb_start_text mode=1 ] +#亜紀子 +(ふう・・・なんとか終ったけど・・・)[p] +(今日はやたら難読漢字が多かったわね!)[p] +(ミスは無かったかしら・・・?)[p] +[_tb_end_text] + +[playbgm volume="50" time="1000" loop="true" storage="neonpurple.ogg" ] +[jump storage="q1.ks" target="*q01good" cond="f.qp==10" ] +[jump storage="q1.ks" target="*q01hell" cond="f.qp==0" ] +*q01bad + +[tb_start_text mode=1 ] +#局長 +「千山くん!」[p] +[_tb_end_text] + +[chara_show name="局長" time="1000" wait="true" storage="chara/3/hiro262-1.png" width="697" height="1673" left="593" top="-92" reflect="false" ] +[tb_start_text mode=1 ] +#亜紀子 +「あ、局長・・・」[p] +#局長 +「あ、局長、じゃない!なんだねさっきの収録は!」[p] +「漢字の読み間違いがあったじゃないか!」[p] +#亜紀子 +「えっ・・・?」[p] +#局長 +「視聴者から指摘の電話やメールが来ていたぞ!」[p] +「ちゃんとニュースを読むことも出来んのかね君は!」[p] +#亜紀子 +「す、すいません・・・」[p] +#局長 +「まったく・・・理想を語る前に実力をつけたまえ!」[p] +「分岐には影響しないとはいえたるんどるぞ!もっと勉強しろ!」[p] + +[_tb_end_text] + +[chara_hide name="局長" time="1000" wait="true" pos_mode="true" ] +[tb_start_text mode=1 ] +#亜紀子 +(はぁ・・・大目玉を食らってしまったわ)[p] +(わたしが間違えたんだから仕方ないけど・・・ちょっと言いすぎじゃない?)[p] +(愛人の誘いをはねつけたもんだから、ここぞとばかりに恨みを晴らしてきたんだわ)[p] +(分岐にはえいきょうしないようだから良かったけど・・・)[p] +(・・・・・・分岐?)[p] +(まぁいいわ、とにかく疲れたから戻りましょう)[p] +・・・・・・[p] +・・・[p] +# +[_tb_end_text] + +[jump storage="scene7.ks" target="*s7a" ] +*q01good + +[chara_show name="谷田" time="1000" wait="true" storage="chara/4/hiro259-2.png" width="559" height="1342" left="699" top="-30" reflect="false" ] +[tb_start_text mode=1 ] +#谷田 +「千山さん、おつかれさまです!」[p] +#亜紀子 +「おつかれさま、谷田君」[p] +#谷田 +「今日も完璧でした!難しい漢字も一つも間違えないなんて、さすがです千山さん!」[p] +#亜紀子 +「ありがとう、ウフフッ」[p] +(どうやら一問も間違えなかったみたいね)[p] +#谷田 +「ちなみにこの結果は分岐には特に関係ないらしいです。それじゃおつかれさまでした!」[p] +[_tb_end_text] + +[chara_hide name="谷田" time="1000" wait="true" pos_mode="true" ] +[tb_start_text mode=1 ] +#亜紀子 +(特に分岐には影響しないのね)[p] +(・・・分岐ってなに?)[p] +(・・・とにかく無事に終ってよかったわ)[p] +・・・・・・[p] +・・・[p] +# +[_tb_end_text] + +[jump storage="scene7.ks" target="*s7a" ] +*q01hell + +[chara_show name="明日香" time="1000" wait="true" storage="chara/2/hiro257-1.png" width="743" height="1784" left="571" top="-9" reflect="false" ] +[tb_start_text mode=1 ] +#明日香 +「先輩・・・」[p] +#亜紀子 +「あ、明日香。どうしたのそんな深刻な顔して?」[p] +#明日香 +「すごく言い難いんですが・・・」[p] +#亜紀子 +「え・・・なに?」[p] +#明日香 +「・・・全問不正解です」[p] +[_tb_end_text] + +[chara_mod name="美里" time="600" cross="false" storage="chara/1/hiro258-5.png" ] +[tb_start_text mode=1 ] +#亜紀子 +「えっ・・・全問不正解・・・!?」[p] +「う、うそでしょ・・・?」[p] +#明日香 +「本当です」[p] +「こんな先輩は見たくありませんでした・・・」[p] +#亜紀子 +「そ、そんな・・・」[p] +#明日香 +「・・・残念ながら先輩にはこの世から消えてもらいます」[p] +「さようなら先輩・・・」[p] +#亜紀子 +「そんな・・・ちょっと・・・待っ―――」[p] +[_tb_end_text] + +[chara_hide name="美里" time="1000" wait="true" pos_mode="false" ] +[tb_start_text mode=1 ] +#明日香 +「ゲームオーバーです。今度は間違わないでくださいね」[p] +# +G A M E O V E R [p] +[_tb_end_text] + +[chara_hide_all time="1000" wait="true" ] +[stopbgm time="1000" ] +[tb_hide_message_window ] +[wait time="3000" ] +[jump storage="title_screen.ks" target="" ] +[s ] +*q1-2 + +[mask time="1000" effect="fadeIn" color="0x000000" ] +[bg time="1000" method="crossfade" storage="hiro254-3.jpg" ] +[mask_off time="1000" effect="fadeOut" ] +[tb_eval exp="f.qp=0" name="qp" cmd="=" op="t" val="0" val_2="undefined" ] +[playbgm volume="100" time="1000" loop="false" storage="music13.ogg" ] +[tb_start_text mode=1 ] +#亜紀子 +「こんばんは、ニュースプライムZ。アナウンサーの千山亜紀子です」[p] + +[_tb_end_text] + +[stopbgm time="1000" ] +[playbgm volume="30" time="1000" loop="true" storage="Green&Dance_2.ogg" ] +[tb_start_text mode=1 ] +#亜紀子 +(さぁ、今日もしっかりニュースを読みましょう)[p] +「最初のニュースです。今日午後兵庫県の―――」[p] +(あれ、これなんて読むんだったかしら・・・?)[p] +[_tb_end_text] + +[glink color="black" storage="q1.ks" size="20" target="*a0201a" text="宍粟市(あおうし)" x="514" y="332" width="" height="" _clickable_img="" ] +[glink color="black" storage="q1.ks" size="20" target="*a0201b" text="宍粟市(あわし)" x="518" y="412" width="" height="" _clickable_img="" ] +[glink color="black" storage="q1.ks" size="20" target="*a0201c" text="宍粟市(しそうし)" x="516" y="492" width="" height="" _clickable_img="" ] +[s ] +*a0201a + +[tb_start_text mode=1 ] +#亜紀子 +「あおう市の市長である・・・」[p] +(間違えた気がするわ・・・)[p] +[_tb_end_text] + +[jump storage="q1.ks" target="*q0202" ] +*a0201b + +[tb_start_text mode=1 ] +#亜紀子 +「あわ市の市長である・・・」[p] +(兵庫にそんな市あったかしら・・・)[p] +[_tb_end_text] + +[jump storage="q1.ks" target="*q0202" ] +*a0201c + +[tb_start_text mode=1 ] +#亜紀子 +「しそう市の市長である・・・」[p] +(そうそう、これが正解ね)[p] +[_tb_end_text] + +[tb_eval exp="f.qp+=1" name="qp" cmd="+=" op="t" val="1" val_2="undefined" ] +*q0202 + +[tb_start_text mode=1 ] +#亜紀子 +「魚住市長は『これが新制度の・・・」[p] +(なんて読むんだっけ・・・)[p] +[_tb_end_text] + +[glink color="black" storage="q1.ks" size="20" target="*a0202a" text="嚆矢(こうし)" x="535" y="340" width="" height="" _clickable_img="" ] +[glink color="black" storage="q1.ks" size="20" target="*a0202b" text="嚆矢(いっし)" x="535" y="420" width="" height="" _clickable_img="" ] +[glink color="black" storage="q1.ks" size="20" target="*a0202c" text="嚆矢(はなや)" x="532" y="500" width="" height="" _clickable_img="" ] +[s ] +*a0202a + +[tb_start_text mode=1 ] +#亜紀子 +「『これが新制度のこうしとなれば』と・・・」[p] +(そう、こうしね。最初の矢ってことね)[p] +[_tb_end_text] + +[tb_eval exp="f.qp+=1" name="qp" cmd="+=" op="t" val="1" val_2="undefined" ] +[jump storage="q1.ks" target="*q0203" ] +*a0202b + +[tb_start_text mode=1 ] +#亜紀子 +「『これが新制度のいっしとなれば』」と・・・」[p] +(なんか違ったような・・・)[p] +[_tb_end_text] + +[jump storage="q1.ks" target="*q0203" ] +*a0202c + +[tb_start_text mode=1 ] +#亜紀子 +「『これが新制度のはなやとなれば』と・・・」[p] +(ミスったわ・・・わたしのバカ!)[p] +[_tb_end_text] + +*q0203 + +[tb_start_text mode=1 ] +#亜紀子 +「夫の隆文氏は『長年連れ添ってきた・・・」[p] +(えーと・・・この漢字は・・・)[p] +[_tb_end_text] + +[glink color="black" storage="q1.ks" size="20" target="*a0203a" text="糟糠の妻(こぬかのつま)" x="460" y="336" width="" height="" _clickable_img="" ] +[glink color="black" storage="q1.ks" size="20" target="*a0203b" text="糟糠の妻(はじかみのつま)" x="446" y="424" width="" height="" _clickable_img="" ] +[glink color="black" storage="q1.ks" size="20" target="*a0203c" text="糟糠の妻(そうこうのつま)" x="456" y="510" width="" height="" _clickable_img="" ] +[s ] +*a0203a + +[tb_start_text mode=1 ] +#亜紀子 +「長年連れ添ってきたこぬかの妻であり・・・」[p] +(うーん・・・)[p] +[_tb_end_text] + +[jump storage="q1.ks" target="*q0204" ] +*a0203b + +[tb_start_text mode=1 ] +#亜紀子 +「長年連れ添ってきたはじかみの妻であり・・・」[p] +(それは別の言葉じゃ・・・?)[p] +[_tb_end_text] + +[jump storage="q1.ks" target="*q0204" ] +*a0203c + +[tb_start_text mode=1 ] +#亜紀子 +「長年連れ添ってきたそうこうの妻であり・・・」[p] +(そうだわ、一緒に苦労を重ねてきたって意味ね)[p] +[_tb_end_text] + +[tb_eval exp="f.qp+=1" name="qp" cmd="+=" op="t" val="1" val_2="undefined" ] +*q0204 + +[tb_start_text mode=1 ] +#亜紀子 +「鳥取県の・・・」[p] +(えーっと、これは確か・・・)[p] +[_tb_end_text] + +[glink color="black" storage="q1.ks" size="20" target="*a0204a" text="大山(おおやま)" x="494" y="339" width="" height="" _clickable_img="" ] +[glink color="black" storage="q1.ks" size="20" target="*a0204b" text="大山(おおのやま)" x="491" y="424" width="" height="" _clickable_img="" ] +[glink color="black" storage="q1.ks" size="20" target="*a0204c" text="大山(だいせん)" x="496" y="509" width="" height="" _clickable_img="" ] +[s ] +*a0204a + +[tb_start_text mode=1 ] +#亜紀子 +「鳥取県のおおやまで・・・」[p] +(これじゃないわね・・・)[p] +[_tb_end_text] + +[jump storage="q1.ks" target="*q0205" ] +*a0204b + +[tb_start_text mode=1 ] +#亜紀子 +「鳥取県のおおのやまで・・・」[p] +(それっぽくはあるけども・・・)[p] +[_tb_end_text] + +[jump storage="q1.ks" target="*q0205" ] +*a0204c + +[tb_start_text mode=1 ] +#亜紀子 +「鳥取県のだいせんで・・・」[p] +(そうそう、だいせんだわ。伯耆富士とも言うのよね)[p] +[_tb_end_text] + +[tb_eval exp="f.qp+=1" name="qp" cmd="+=" op="t" val="1" val_2="undefined" ] +*q0205 + +[tb_start_text mode=1 ] +#亜紀子 +「鎌倉時代のものと見られる・・・」[p] +(これは・・・知ってるはずなんだけど)[p] +[_tb_end_text] + +[glink color="black" storage="q1.ks" size="20" target="*a0205a" text="払子(はっし)" x="505" y="355" width="" height="" _clickable_img="" ] +[glink color="black" storage="q1.ks" size="20" target="*a0205b" text="払子(ほっす)" x="505" y="431" width="" height="" _clickable_img="" ] +[glink color="black" storage="q1.ks" size="20" target="*a0205c" text="払子(ふっこ)" x="504" y="511" width="" height="" _clickable_img="" ] +[s ] +*a0205a + +[tb_start_text mode=1 ] +#亜紀子 +「鎌倉時代のものと見られるはっしが見つかり・・・」[p] +(間違えた・・・!)[p] +[_tb_end_text] + +[jump storage="q1.ks" target="*q0206" ] +*a0205b + +[tb_start_text mode=1 ] +#亜紀子 +「鎌倉時代のものと見られるほっすが見つかり・・・」[p] +(ほっす。仏教の法具ね)[p] +[_tb_end_text] + +[tb_eval exp="f.qp+=1" name="qp" cmd="+=" op="t" val="1" val_2="undefined" ] +[jump storage="q1.ks" target="*q0206" ] +*a0205c + +[tb_start_text mode=1 ] +#亜紀子 +「鎌倉時代のものと見られるふっこが見つかり・・・」[p] +(そんなの聞いたこと無いわ・・・)[p] +[_tb_end_text] + +*q0206 + +[tb_start_text mode=1 ] +#亜紀子 +「瀬戸住職は『当山・・・」[p] +(なんて読むんだっけ?)[p] +[_tb_end_text] + +[glink color="black" storage="q1.ks" size="20" target="*a0206a" text="開闢以来(かいべきいらい)" x="473" y="280" width="" height="" _clickable_img="" ] +[glink color="black" storage="q1.ks" size="20" target="*a0206b" text="開闢以来(かいびゃくいらい)" x="467" y="379" width="" height="" _clickable_img="" ] +[glink color="black" storage="q1.ks" size="20" target="*a0206c" text="開闢以来(かいだいいらい)" x="475" y="478" width="" height="" _clickable_img="" ] +[s ] +*a0206a + +[tb_start_text mode=1 ] +#亜紀子 +「当山かいべきいらいのことで・・・」[p] +(かいべき・・・なにそれ)[p] +[_tb_end_text] + +[jump storage="q1.ks" target="*q0207" ] +*a0206b + +[tb_start_text mode=1 ] +#亜紀子 +「当山かいびゃくいらいのことで・・・」[p] +(そうそう、はじまってからずっとのことね)[p] +[_tb_end_text] + +[tb_eval exp="f.qp+=1" name="qp" cmd="+=" op="t" val="1" val_2="undefined" ] +[jump storage="q1.ks" target="*q0207" ] +*a0206c + +[tb_start_text mode=1 ] +#亜紀子 +「当山かいだいいらいのことで・・・」[p] +(違うわ違うわ・・・)[p] +[_tb_end_text] + +*q0207 + +[tb_start_text mode=1 ] +#亜紀子 +「明日6日、岐阜県の・・・」[p] +(これは読めるはず・・・)[p] +[_tb_end_text] + +[glink color="black" storage="q1.ks" size="20" target="*a0207a" text="郡上八幡市(こおりはちまんし)" x="452" y="289" width="" height="" _clickable_img="" ] +[glink color="black" storage="q1.ks" size="20" target="*a0207b" text="郡上八幡市(かみやわたし)" x="460" y="382" width="" height="" _clickable_img="" ] +[glink color="black" storage="q1.ks" size="20" target="*a0207c" text="郡上八幡市(ぐじょうはちまんし)" x="443" y="475" width="" height="" _clickable_img="" ] +[s ] +*a0207a + +[tb_start_text mode=1 ] +#亜紀子 +「岐阜県のこおりはちまんしで・・・」[p] +(なんかちゃう気がするわー)[p] +[_tb_end_text] + +[jump storage="q1.ks" target="*q0208" ] +*a0207b + +[tb_start_text mode=1 ] +#亜紀子 +「岐阜県のかみやわたしで・・・」[p] +(これは違うような・・・)[p] +[_tb_end_text] + +[jump storage="q1.ks" target="*q0208" ] +*a0207c + +[tb_start_text mode=1 ] +#亜紀子 +「岐阜県の郡上八幡市で・・・」[p] +(これね。城下町よ)[p] +[_tb_end_text] + +[tb_eval exp="f.qp+=1" name="qp" cmd="+=" op="t" val="1" val_2="undefined" ] +*q0208 + +[tb_start_text mode=1 ] +#亜紀子 +「高さ6メートルの・・・」[p] +(これは・・・前にも見たことがあるんだけど・・・)[p] +[_tb_end_text] + +[glink color="black" storage="q1.ks" size="20" target="*a0208a" text="山鉾(やまぼこ)" x="499" y="313" width="" height="" _clickable_img="" ] +[glink color="black" storage="q1.ks" size="20" target="*a0208b" text="山鉾(だし)" x="517" y="400" width="" height="" _clickable_img="" ] +[glink color="black" storage="q1.ks" size="20" target="*a0208c" text="山鉾(はるこま)" x="501" y="487" width="" height="" _clickable_img="" ] +[s ] +*a0208a + +[tb_start_text mode=1 ] +#亜紀子 +「高さ6メートルのやまぼこが練り歩き・・・」[p] +(大丈夫、合ってるわ)[p] +[_tb_end_text] + +[tb_eval exp="f.qp+=1" name="qp" cmd="+=" op="t" val="1" val_2="undefined" ] +[jump storage="q1.ks" target="*q0209" ] +*a0208b + +[tb_start_text mode=1 ] +#亜紀子 +「高さ6メートルのだしが練り歩き・・・」[p] +(だしは「山車」だったわ・・・)[p] +[_tb_end_text] + +[jump storage="q1.ks" target="*q0209" ] +*a0208c + +[tb_start_text mode=1 ] +#亜紀子 +「高さ6メートルのはるこまが練り歩き・・・」[p] +(さすがにこれじゃないわ・・・)[p] +[_tb_end_text] + +*q0209 + +[tb_start_text mode=1 ] +#亜紀子 +「古代からの儀式である・・・」[p] +(これは難しいわ。確か・・・)[p] +[_tb_end_text] + +[glink color="black" storage="q1.ks" size="20" target="*a0209a" text="大嘗会(おおなえかい)" x="481" y="289" width="" height="" _clickable_img="" ] +[glink color="black" storage="q1.ks" size="20" target="*a0209b" text="大嘗会(だいじょうえ)" x="494" y="377" width="" height="" _clickable_img="" ] +[glink color="black" storage="q1.ks" size="20" target="*a0209c" text="大嘗会(たいしょうのげ)" x="484" y="468" width="" height="" _clickable_img="" ] +[s ] +*a0209a + +[tb_start_text mode=1 ] +#亜紀子 +「古代から続く儀式であるおおなえかいで・・・」[p] +(これはダメだわ・・・)[p] +[_tb_end_text] + +[jump storage="q1.ks" target="*q0210" ] +*a0209b + +[tb_start_text mode=1 ] +#亜紀子 +「古代から続く儀式であるだいじょうえで・・・」[p] +(そう、だいじょうえね。我ながらよく読めたわ)[p] +[_tb_end_text] + +[tb_eval exp="f.qp+=1" name="qp" cmd="+=" op="t" val="1" val_2="undefined" ] +[jump storage="q1.ks" target="*q0210" ] +*a0209c + +[tb_start_text mode=1 ] +#亜紀子 +「古代から続く儀式であるたいしょうのげで・・・」[p] +(間違って覚えてたかも・・・)[p] +[_tb_end_text] + +*q0210 + +[tb_start_text mode=1 ] +#亜紀子 +「人形のテーマとなっているのは古の行者・・・」[p] +(昔、本で読んだような・・・)[p] +[_tb_end_text] + +[glink color="black" storage="q1.ks" size="20" target="*a0210a" text="役小角(くにのとばり)" x="485" y="337" width="" height="" _clickable_img="" ] +[glink color="black" storage="q1.ks" size="20" target="*a0210b" text="役小角(えんのおづぬ)" x="478" y="425" width="" height="" _clickable_img="" ] +[glink color="black" storage="q1.ks" size="20" target="*a0210c" text="役小角(かものこおに)" x="488" y="511" width="" height="" _clickable_img="" ] +[s ] +*a0210a + +[tb_start_text mode=1 ] +#亜紀子 +「古代の行者くにのとばりで・・・」[p] +(当てずっぽうで読もうとしても無理ね・・・)[p] +[_tb_end_text] + +[jump storage="q1.ks" target="*q02end" ] +*a0210b + +[tb_start_text mode=1 ] +#亜紀子 +「古代の行者えんのおづぬで・・・」[p] +(確かそうよ。修験道の開祖とも言われてるわね)[p] +[_tb_end_text] + +[tb_eval exp="f.qp+=1" name="qp" cmd="+=" op="t" val="1" val_2="undefined" ] +[jump storage="q1.ks" target="*q02end" ] +*a0210c + +[tb_start_text mode=1 ] +#亜紀子 +「古代の行者かものこおにで・・・」[p] +(なにを言ってるのかしら私・・・)[p] +[_tb_end_text] + +*q02end + +[tb_eval exp="f.qpt+=f.qp" name="qpt" cmd="+=" op="h" val="qp" val_2="undefined" ] +[tb_start_text mode=1 ] +#亜紀子 +「・・・以上ニュースをお伝えしました」[p] +# +・・・・・・[p] +・・・[p] +[_tb_end_text] + +[stopbgm time="1000" ] +[mask time="1000" effect="fadeIn" color="0x000000" ] +[bg time="1000" method="crossfade" storage="hiro254-0.jpg" ] +[chara_show name="美里" time="1000" wait="true" storage="chara/1/hiro258-2.png" width="757" height="1893" left="55" top="-2" reflect="false" ] +[mask_off time="1000" effect="fadeOut" ] +[tb_start_text mode=1 ] +#亜紀子 +「ふう・・・なんとか読み終えたけど・・・」[p] +「誤読がなかったか心配だわ・・・」[p] +「大丈夫・・・よね?」[p] +[_tb_end_text] + +[jump storage="q1.ks" target="*q02good" cond="f.qp==10" ] +[jump storage="q1.ks" target="*q02hell" cond="f.qp==0" ] +*q02bad + +[chara_show name="局長" time="1000" wait="true" storage="chara/3/hiro262-1.png" width="787" height="1889" left="551" top="-124" reflect="false" ] +[playbgm volume="100" time="1000" loop="true" storage="bluenoise.ogg" ] +[tb_start_text mode=1 ] +#局長 +「千山君!」[p] +#亜紀子 +「あ、局長、どうかしましたか?」[p] +#局長 +「どうかしましたかじゃない!なんだねさっきのニュースは!」[p] +「読み間違いがあったぞ!」[p] + +[_tb_end_text] + +[chara_mod name="美里" time="600" cross="false" storage="chara/1/hiro258-5.png" ] +[tb_start_text mode=1 ] +#亜紀子 +「えっ!?」[p] +#局長 +「あれしきの漢字が読めなくてアナウンサーが務まるか!」[p] +「新人じゃないんだからなんだからしっかりしたまえ!」[p] +#亜紀子 +「す、すいません・・・」[p] +#局長 +「まったく・・・色気づいてる暇があったら勉強したまえ!」[p] + + +[_tb_end_text] + +[chara_hide name="局長" time="1000" wait="false" pos_mode="true" ] +[chara_mod name="美里" time="600" cross="false" storage="chara/1/hiro258-1.png" ] +[tb_start_text mode=1 ] +#亜紀子 +「く・・・あんな言い方しなくても・・・」[p] +「・・・でも自分のミスだから仕方ないわ」[p] +「分岐に影響が無いとはいえ落ち込むわ・・・」[p] +「はぁ・・・」[p] +# +・・・・・・[p] +・・・[p] +[_tb_end_text] + +[stopbgm time="1000" ] +[jump storage="scene10.ks" target="*s10-n" ] +*q02good + +[chara_show name="明日香" time="1000" wait="true" storage="chara/2/hiro252-3.png" width="1344" height="1844" left="331" top="-21" reflect="false" ] +[playbgm volume="100" time="1000" loop="true" storage="neonpurple.ogg" ] +[tb_start_text mode=1 ] +#明日香 +「先輩おつかれさまです」[p] +#亜紀子 +「あ、明日香。お疲れさま」[p] +#明日香 +「さっきのニュースすごかったです。あの難読漢字の連続を一つも間違わずに読むなんて」[p] +「さすがです先輩」[p] +#亜紀子 +「ありがとう」[p] +(よかった、間違わずに読めたみたいだわ)[p] +#明日香 +「分岐には影響ないですけど、満点はすごいです」[p] +#亜紀子 +「分岐には影響は無いのね」[p] +(分岐って何かしら?)[p] +# +・・・・・・[p] +・・・[p] + +[_tb_end_text] + +[stopbgm time="1000" ] +[jump storage="scene10.ks" target="*s10-n" ] +*q02hell + +[chara_show name="局長" time="1000" wait="true" storage="chara/3/hiro262-1.png" width="758" height="1819" left="558" top="-115" reflect="false" ] +[tb_start_text mode=1 ] +#局長 +「千山くん」[p] +#亜紀子 +「あ、局長」[p] +#局長 +「全問不正解だ」[p] +[_tb_end_text] + +[chara_mod name="美里" time="600" cross="false" storage="chara/1/hiro258-5.png" ] +[playbgm volume="100" time="1000" loop="true" storage="SO_SAD.ogg" ] +[tb_start_text mode=1 ] +#亜紀子 +「えっ・・・全問不正解・・・!?」[p] +「そ、そんな・・・!」[p] +#局長 +「キミはクビだ。荷物をまとめて去りたまえ」[p] +#亜紀子 +「か、解雇・・・!?そんな・・・!」[p] +# +・・・・・・[p] +・・・[p] +[_tb_end_text] + +[chara_hide_all time="1000" wait="true" ] +[tb_start_text mode=1 ] +# +TV局をクビになった亜紀子は、その後OLになりキミヒコと結婚して幸せに暮らした[p] +[_tb_end_text] + +[tb_ptext_show x="459" y="359" size="51" color="0x000000" time="1000" text="ゲームオーバー" anim="false" face="undefined" edge="undefined" shadow="undefined" ] +[tb_hide_message_window ] +[stopbgm time="1000" ] +[wait time="3000" ] +[tb_ptext_hide time="1000" ] +[jump storage="title_screen.ks" target="" ] +[s ] +*q1-3 + +[mask time="1000" effect="fadeIn" color="0x000000" ] +[chara_hide_all time="1000" wait="true" ] +[bg time="1000" method="crossfade" storage="hiro254-3.jpg" ] +[mask_off time="1000" effect="fadeOut" ] +[playbgm volume="100" time="0" loop="false" storage="music13.ogg" ] +[tb_start_text mode=1 ] +#亜紀子 +「こんばんは、ニュースプライムZ、キャスターの千山亜紀子です」[p] +[_tb_end_text] + +[stopbgm time="1000" ] +[playbgm volume="20" time="1000" loop="true" storage="Green&Dance_2.ogg" ] +[tb_start_text mode=1 ] +#亜紀子 +(乳の張りも気になるけど・・・ニュースはしっかりと読みましょう)[p] +(・・・なんだか読み間違いをすると母乳があふれちゃうような気がするわ。考えすぎかもしれないけど)[p] +「最初のニュースです。今日午後1時ごろ鹿児島県・・・」[p] +(あれ、これは何て読むんだったかしら・・・?)[p] +[_tb_end_text] + +[glink color="black" storage="q1.ks" size="20" target="*a0301a" text="垂水市(たるみずし)" x="489" y="319" width="" height="" _clickable_img="" ] +[glink color="black" storage="q1.ks" size="20" target="*a0301b" text="垂水市(たるみし)" x="502" y="410" width="" height="" _clickable_img="" ] +[s ] +*a0301a + +[tb_start_text mode=1 ] +#亜紀子 +「鹿児島県たるみずしで・・・」[p] +(そう、正解のはずだわ)[p] +[_tb_end_text] + +[jump storage="q1.ks" target="*q0302" ] +*a0301b + +[tb_start_text mode=1 ] +#亜紀子 +「鹿児島県のたるみしで・・・」[p] +(あっ、違うわ・・・!)[p] +[_tb_end_text] + +[jump storage="q1.ks" target="*q03bad" ] +*q0302 + +[tb_start_text mode=1 ] +#亜紀子 +「工場では原料である・・・」[p] +(えーっと、これは・・・)[p] +[_tb_end_text] + +[glink color="black" storage="q1.ks" size="20" target="*a0302a" text="粳米(もみごめ)" x="500" y="351" width="" height="" _clickable_img="" ] +[glink color="black" storage="q1.ks" size="20" target="*a0302b" text="粳米(うるちまい)" x="496" y="443" width="" height="" _clickable_img="" ] +[s ] +*a0302a + +[tb_start_text mode=1 ] +#亜紀子 +「原料であるもみごめを・・・」[p] +(違うような・・・)[p] +[_tb_end_text] + +[jump storage="q1.ks" target="*q03bad" ] +*a0302b + +[tb_start_text mode=1 ] +#亜紀子 +「原料であるうるちまいを・・・」[p] +(そうそう、うるちまいね)[p] +[_tb_end_text] + +*q0303 + +[tb_start_text mode=1 ] +#亜紀子 +「工場長は『繁忙期も終り・・・」[p] +(間違えやすい漢字だわ。たしか・・・)[p] +[_tb_end_text] + +[glink color="black" storage="q1.ks" size="20" target="*a0303a" text="一段落(いちだんらく)" x="478" y="342" width="" height="" _clickable_img="" ] +[glink color="black" storage="q1.ks" size="20" target="*a0303b" text="一段落(ひとだんらく)" x="476" y="439" width="" height="" _clickable_img="" ] +[s ] +*a0303a + +[tb_start_text mode=1 ] +#亜紀子 +「繁忙期も終りいちだんらくして・・・」[p] +(そうね、こっちが正解よ。覚えておきましょう)[p] +[_tb_end_text] + +[jump storage="q1.ks" target="*q0304" ] +*a0303b + +[tb_start_text mode=1 ] +#亜紀子 +「繁忙期も終りひとだんらくして・・・」[p] +(こう読んじゃいがちなのよね・・・あぁ)[p] +[_tb_end_text] + +[jump storage="q1.ks" target="*q03bad" ] +*q0304 + +[tb_start_text mode=1 ] +#亜紀子 +「山口県の・・・」[p] +(えーっと、これは2択ね・・・)[p] +[_tb_end_text] + +[glink color="black" storage="q1.ks" size="20" target="*a0304a" text="美祢市(みやし)" x="505" y="352" width="" height="" _clickable_img="" ] +[glink color="black" storage="q1.ks" size="20" target="*a0304b" text="美祢市(みねし)" x="505" y="449" width="" height="" _clickable_img="" ] +[s ] +*a0304a + +[tb_start_text mode=1 ] +#亜紀子 +「山口県のみやしで・・・」[p] +(逆を引いちゃったかも・・・)[p] +[_tb_end_text] + +[jump storage="q1.ks" target="*q03bad" ] +*a0304b + +[tb_start_text mode=1 ] +#亜紀子 +「山口県のみねしで・・・」[p] +(うん、正解だわ)[p] +[_tb_end_text] + +*q0305 + +[tb_start_text mode=1 ] +#亜紀子 +「鍾乳洞に棲む新種の・・・」[p] +(これは難しいわ・・・うーん)[p] +[_tb_end_text] + +[glink color="black" storage="q1.ks" size="20" target="*a0305a" text="蛞蝓(みみず)" x="509" y="358" width="" height="" _clickable_img="" ] +[glink color="black" storage="q1.ks" size="20" target="*a0305b" text="蛞蝓(なめくじ)" x="511" y="443" width="" height="" _clickable_img="" ] +[s ] +*a0305a + +[tb_start_text mode=1 ] +#亜紀子 +「新種のみみずが発見され・・・」[p] +(あちゃー・・・間違っちゃった)[p] +[_tb_end_text] + +[jump storage="q1.ks" target="*q03bad" ] +*a0305b + +[tb_start_text mode=1 ] +#亜紀子 +「新種のなめくじが発見され・・・」[p] +(なめくじで合ってるはず・・・!)[p] +[_tb_end_text] + +*q0306 + +[tb_start_text mode=1 ] +#亜紀子 +「成体は腹部に・・・」[p] +(これは・・・そんなに難しくないはず)[p] +[_tb_end_text] + +[glink color="black" storage="q1.ks" size="20" target="*a0306a" text="緑青色(りょくせいしょく)" x="470" y="358" width="" height="" _clickable_img="" ] +[glink color="black" storage="q1.ks" size="20" target="*a0306b" text="緑青色(ろくしょういろ)" x="474" y="458" width="" height="" _clickable_img="" ] +[s ] +*a0306a + +[tb_start_text mode=1 ] +#亜紀子 +「成体は腹部にりょくせいしょくのラインがあり・・・」[p] +(こっちじゃないわ・・・ダメね)[p] +[_tb_end_text] + +[jump storage="q1.ks" target="*q03bad" ] +*a0306b + +[tb_start_text mode=1 ] +#亜紀子 +「成体は腹部にろくしょういろのラインがあり・・・」[p] +(そうね、銅が錆びた色のことね)[p] +[_tb_end_text] + +*q0307 + +[tb_start_text mode=1 ] +#亜紀子 +「今日長野県の・・・」[p] +(なんでこんな難読地名ばっかり・・・)[p] +[_tb_end_text] + +[glink color="black" storage="q1.ks" size="20" target="*a0307a" text="東御市(とうごし)" x="499" y="327" width="" height="" _clickable_img="" ] +[glink color="black" storage="q1.ks" size="20" target="*a0307b" text="東御市(とうみし)" x="499" y="421" width="" height="" _clickable_img="" ] +[s ] +*a0307a + +[tb_start_text mode=1 ] +#亜紀子 +「長野県のとうごしで・・・」[p] +(こっちじゃないわ・・・)[p] +[_tb_end_text] + +[jump storage="q1.ks" target="*q03bad" ] +*a0307b + +[tb_start_text mode=1 ] +#亜紀子 +「長野県のとうみしで・・・」[p] +(そうそう。合併で出来た比較的新しい市ね)[p] +[_tb_end_text] + +*q0308 + +[tb_start_text mode=1 ] +#亜紀子 +「多額の投資を・・・」[p] +(うわーなにこれ)[p] +[_tb_end_text] + +[glink color="black" storage="q1.ks" size="20" target="*a0308a" text="慫慂した(しょうようした)" x="449" y="368" width="" height="" _clickable_img="" ] +[glink color="black" storage="q1.ks" size="20" target="*a0308b" text="慫慂した(じゅやくした)" x="454" y="472" width="" height="" _clickable_img="" ] +[s ] +*a0308a + +[tb_start_text mode=1 ] +#亜紀子 +「多額の投資を慫慂したとされ・・・」[p] +(しょうようね。しきりに誘って勧めることよ)[p] +[_tb_end_text] + +[jump storage="q1.ks" target="*q0309" ] +*a0308b + +[tb_start_text mode=1 ] +#亜紀子 +「多額の投資をじゅやくしたとされ・・・」[p] +(違うわ。もっと勉強しなきゃ・・・)[p] +[_tb_end_text] + +[jump storage="q1.ks" target="*q03bad" ] +*q0309 + +[tb_start_text mode=1 ] +#亜紀子 +「日頃からワンマンで・・・」[p] +(これは簡単だけど・・・)[p] +[_tb_end_text] + +[glink color="black" storage="q1.ks" size="20" target="*a0309a" text="上意下達(じょういげたつ)" x="439" y="330" width="" height="" _clickable_img="" ] +[glink color="black" storage="q1.ks" size="20" target="*a0309b" text="上意下達(じょういかたつ)" x="437" y="427" width="" height="" _clickable_img="" ] +[s ] +*a0309a + +[tb_start_text mode=1 ] +#亜紀子 +「ワンマンでじょういげたつが徹底されて・・・」[p] +(しまった、ケアレスミスだわ・・・)[p] +[_tb_end_text] + +[jump storage="q1.ks" target="*q03bad" ] +*a0309b + +[tb_start_text mode=1 ] +#亜紀子 +「ワンマンでじょういかたつが徹底されて・・・」[p] +(そう、上の指示を下の者にちゃんと伝えることね)[p] +[_tb_end_text] + +*q0310 + +[tb_start_text mode=1 ] +#亜紀子 +「社長は『・・・」[p] +(これは大丈夫・・・よね?)[p] +[_tb_end_text] + +[glink color="black" storage="q1.ks" size="20" target="*a0310a" text="浅薄(あさはか)" x="504" y="329" width="" height="" _clickable_img="" ] +[glink color="black" storage="q1.ks" size="20" target="*a0310b" text="浅薄(せんぱく)" x="505" y="427" width="" height="" _clickable_img="" ] +[s ] +*a0310a + +[tb_start_text mode=1 ] +#亜紀子 +「社長は『あさはかだった・・・」[p] +(ちがうわ・・・勘違いしてた!)[p] +[_tb_end_text] + +[jump storage="q1.ks" target="*q03bad" ] +*a0310b + +[tb_start_text mode=1 ] +#亜紀子 +「社長は『せんぱくだった・・・」[p] +(そう、意味は同じだけどね)[p] +# +・・・・・・[p] +・・・[p] +#亜紀子 +「以上、夕方のニュースをお伝えしました。それではまた明日」[p] +[_tb_end_text] + +[stopbgm time="1000" ] +[mask time="1000" effect="fadeIn" color="0x000000" ] +[bg time="1000" method="crossfade" storage="hiro254-0.jpg" ] +[chara_show name="美里" time="1000" wait="true" storage="chara/1/hiro258-2.png" width="737" height="1843" left="62" top="1" reflect="false" ] +[mask_off time="1000" effect="fadeOut" ] +[playbgm volume="100" time="1000" loop="true" storage="neonpurple.ogg" ] +[tb_start_text mode=1 ] +#亜紀子 +(ふぅ・・・なんとか読み終えたわ)[p] +(母乳の方もなんとか耐えてくれたみたいだし・・・よかったわ)[p] +[_tb_end_text] + +[chara_show name="明日香" time="1000" wait="true" storage="chara/2/hiro257-1.png" width="753" height="1807" left="625" top="-12" reflect="false" ] +[tb_start_text mode=1 ] +#明日香 +「先輩、大丈夫でしたか?」[p] +#亜紀子 +「ええ、なんとかね」[p] +#明日香 +「よかった・・・」[p] +「きっと一回も読み間違えなかったのが良かったのかもしれませんね」[p] +#亜紀子 +「そうね、漢字を読み間違えてたらきっと溢れちゃっていたわね。根拠はないけど」[p] +#明日香 +「今回は分岐にも影響があるようですし」[p] +#亜紀子 +「えっ、今回は分岐に影響あるのね」[p] +「・・・とにかく母乳が出ないうちに戻りましょう」[p] +[_tb_end_text] + +[chara_hide_all time="1000" wait="true" ] +[tb_start_text mode=1 ] +# +・・・・・・[p] +・・・[p] +[_tb_end_text] + +[stopbgm time="1000" ] +[jump storage="scene12.ks" target="*qb" ] +*q03bad + +[stopbgm time="1000" ] +[tb_start_text mode=1 ] +#亜紀子 +(しまった!読み間違えちゃったわ・・・!)[p] +(あ・・・おっぱいが・・・!)[p] +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro254-6.jpg" ] +[playbgm volume="30" time="1000" loop="true" storage="Green&Dance_2.ogg" ] +[tb_start_text mode=1 ] +#亜紀子 +(あぁ・・・出てる・・・っ!)[p] +(でも・・・ニュースを読み続けないと・・・)[p] +「こ、ここ数年のキャンプブームで気軽にキャンプを楽しむ人が増えていますが、一方でキャンプ中の遭難や事故も増加しており―――」[p] +(あっ・・・服に・・・染み出してる・・・!)[p] +「警視庁では十分な準備をした上でキャンプを楽しんで欲しいと注意を呼びかけるとともに安全対策を―――」[p] +#カメラマン +(あれ・・・?なんだあのシミ・・・?)[p] +(えっ・・・まさか・・・母乳が出てる!?)[p] +#ディレクター +(おいっ!これはすごいぞ!)[p] +(カメラマン、撮り逃すなよ!)[p] +#カメラマン +(わかってます!)[p] +# +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro101-6.jpg" ] +[tb_start_text mode=1 ] +#ノブオ +「・・・今日もエロいなぁ千山アナ」[p] +「最近は各局のアナも負けじと超ミニスカートでパンツを見せるようになってきたけど、やっぱり千山が一番エロいぜ」[p] +「やっぱり知性と品があるし、オッパイもでかいし・・・ん?」[p] +「お・・・おぉ!?」[p] +「なんか、胸の部分にシミが出来てるぞ!?」[p] +「なんだあれ・・・?汗ならあそこだけ濡れるのはおかしいし・・・」[p] +「もしかして母乳・・・?母乳が出てるんじゃ・・・!?」[p] +「すげえ・・・!これじゃホントに乳山じゃねえか!」[p] +・・・・・・[p] +・・・[p] +#キミヒコ +「こ、これは一体・・・!?」[p] +「ぼ、母乳が・・・!?」[p] +「亜紀子・・・俺だけの・・・」[p] +「もしかして・・・これはなにかの啓示・・・?・・・いやしかし・・・ブツブツ」[p] +・・・・・・[p] +・・・[p] +#子供 +「ねえ、あの人オッパイ出てるよ」[p] +#パパ +「・・・!?」[p] +#ママ +「まぁ、なにあれ・・・?」[p] +「子供も産んでないのに母乳が出るなんて・・・」[p] +「あんないやらしい格好してるだけじゃ飽き足らずに、母乳まで出すなんて、変態じゃないの!」[p] +「あなた、チャンネル変えてください!」[p] +#パパ +「・・・え?」[p] +#ママ +「まぁ!あなた変態女がお乳を垂らすのを見て興奮してるんでしょう!」[p] +「なんていやらしい・・・!」[p] +#パパ +「い、いや違うよ。ボクはただニュースをだね・・・」[p] +#ママ +「ウソおっしゃい!他のチャンネルでもニュースはやってるのにいつもこの時間はしれっとZ局に変えて・・・」[p] +「そんなにあのデカ乳女が好きですか!」[p] +#パパ +「いや、そんなことは・・・」[p] +#ママ +「そうなんでしょう!?どうせわたしは胸が小さいですよ!すいませんでしたね!」[p] +「そんなにでかいのが好きならああいうホルスタイン女と結婚したらよかったんじゃないですか!」[p] +#パパ +「ちょ、ちょっと落ち着いて・・・」[p] +#子供 +「知ってる!ママってひんにゅーなんでしょ?」[p] +#パパ +「こ、こらっ・・・!」[p] +#ママ +「キィーーーーー!」[p] +・・・・・・[p] +・・・[p] + + +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro254-6.jpg" ] +[tb_start_text mode=1 ] +#亜紀子 +「夏の全国高校野球選手権大会の沖縄予選が始まりました。全国4000校以上の頂点を決める熱い戦いがいよいよ―――」[p] +(あぁ・・・とうとう恐れてたことが起こっちゃったわ・・・)[p] +「各地で熱戦が繰り広げられることになります。甲子園での本大会は8月4日に開会式を行う予定で―――」[p] +(でも、もう十分にかける恥はかいたし・・・なるようになれだわ・・・)[p] +「それではお天気のコーナーです。佐藤さんよろしくお願いします」[p] +# +・・・・・・[p] +・・・[p] +[_tb_end_text] + +[stopbgm time="1000" ] +[jump storage="end1.ks" target="" ] diff --git a/data/scenario/q2.ks b/data/scenario/q2.ks new file mode 100644 index 0000000..d5c0869 --- /dev/null +++ b/data/scenario/q2.ks @@ -0,0 +1,336 @@ +[_tb_system_call storage=system/_q2.ks] + +[stopbgm time="1000" ] +[chara_hide_all time="1000" wait="true" ] +[tb_show_message_window ] +[mask time="1000" effect="fadeIn" color="0x000000" ] +[bg time="1000" method="crossfade" storage="hiro254-13.jpg" ] +[mask_off time="1000" effect="fadeOut" ] +[playbgm volume="100" time="1000" loop="true" storage="オフィスの日常.ogg" ] +[tb_start_text mode=1 ] +#亜紀子 +「あ、どうも宮崎さんお疲れ様です」[p] +「この度は本作品をお買い上げいただき、そして最後までプレイしていただき、まことにありがとうございました」[p] +「まさか宮崎さんにこのゲームをプレイしていただけるとは思ってもいませんでした」[p] +「え・・・?宮崎って誰のことだって・・・?」[p] +「またまたー」[p] +「ここに来られたという事は、漢字クイズを全問正解されたということですよね?」[p] +「そんなことができるのは宮○美子さん以外に居る訳ないじゃないですか」[p] +「そんな漢字検定一級の宮崎さんにはオマケの漢字クイズのプレゼントです」[p] +「頑張って全問正解してくださいね」[p] +「それではどうぞ!」[p] +[_tb_end_text] + +[stopbgm time="1000" ] +[tb_eval exp="f.qp=0" name="qp" cmd="=" op="t" val="0" val_2="undefined" ] +[playbgm volume="100" time="1000" loop="true" storage="Green&Dance_2.ogg" ] +[tb_start_text mode=1 ] +# +問題1 「就中」の読みは?[p] +[_tb_end_text] + +[glink color="black" storage="q2.ks" size="20" text="とどのつまり" x="535" y="305" width="" height="" _clickable_img="" target="*a1b" ] +[glink color="black" storage="q2.ks" size="20" target="*a1b" text="めっきり" x="556" y="382" width="" height="" _clickable_img="" ] +[glink color="black" storage="q2.ks" size="20" target="*a1a" text="なかんずく" x="545" y="460" width="" height="" _clickable_img="" ] +[s ] +*a1a + +[tb_start_text mode=1 ] +# +○[p] +[_tb_end_text] + +[tb_eval exp="f.qp+=1" name="qp" cmd="+=" op="t" val="1" val_2="undefined" ] +[jump storage="q2.ks" target="*q02" ] +*a1b + +[tb_start_text mode=1 ] +# +×[p] +[_tb_end_text] + +*q02 + +[tb_start_text mode=1 ] +# +問題2 「漸次」の意味は?[p] +[_tb_end_text] + +[glink color="black" storage="q2.ks" size="20" target="*a2b" text="しばらく" x="545" y="330" width="" height="" _clickable_img="" ] +[glink color="black" storage="q2.ks" size="20" target="*a2b" text="いきなり" x="545" y="408" width="" height="" _clickable_img="" ] +[glink color="black" storage="q2.ks" size="20" target="*a2a" text="だんだん" x="542" y="484" width="" height="" _clickable_img="" ] +[s ] +*a2a + +[tb_start_text mode=1 ] +# +○[p] +[_tb_end_text] + +[tb_eval exp="f.qp+=1" name="qp" cmd="+=" op="t" val="1" val_2="undefined" ] +[jump storage="q2.ks" target="*q03" ] +*a2b + +[tb_start_text mode=1 ] +# +×[p] +[_tb_end_text] + +*q03 + +[tb_start_text mode=1 ] +# +問題3 「かんばせ」を漢字にすると?[p] +[_tb_end_text] + +[glink color="black" storage="q2.ks" size="20" target="*a3b" text="花" x="573" y="358" width="" height="" _clickable_img="" ] +[glink color="black" storage="q2.ks" size="20" target="*a3a" text="顔" x="574" y="431" width="" height="" _clickable_img="" ] +[glink color="black" storage="q2.ks" size="20" target="*a3b" text="鼻" x="573" y="503" width="" height="" _clickable_img="" ] +[s ] +*a3a + +[tb_start_text mode=1 ] +# +○[p] +[_tb_end_text] + +[tb_eval exp="f.qp+=1" name="qp" cmd="+=" op="t" val="1" val_2="undefined" ] +[jump storage="q2.ks" target="*q04" ] +*a3b + +[tb_start_text mode=1 ] +# +×[p] +[_tb_end_text] + +*q04 + +[tb_start_text mode=1 ] +# +問題4 「目を大きく開き、怒ったり決意したりすること」を意味する言葉は?[p] +[_tb_end_text] + +[glink color="black" storage="q2.ks" size="20" target="*a4b" text="頤を決する" x="536" y="288" width="" height="" _clickable_img="" ] +[glink color="black" storage="q2.ks" size="20" target="*a4b" text="眇を決する" x="540" y="362" width="" height="" _clickable_img="" ] +[glink color="black" storage="q2.ks" size="20" target="*a4a" text="眦を決する" x="535" y="436" width="" height="" _clickable_img="" ] +[s ] +*a4a + +[tb_start_text mode=1 ] +# +○[p] +[_tb_end_text] + +[tb_eval exp="f.qp+=1" name="qp" cmd="+=" op="t" val="1" val_2="undefined" ] +[jump storage="q2.ks" target="*q05" ] +*a4b + +[tb_start_text mode=1 ] +# +×[p] +[_tb_end_text] + +*q05 + +[tb_start_text mode=1 ] +# +問題5 「吾亦紅」の読み方は?[p] +[_tb_end_text] + +[glink color="black" storage="q2.ks" size="20" target="*a5a" text="われもこう" x="537" y="331" width="" height="" _clickable_img="" ] +[glink color="black" storage="q2.ks" size="20" target="*a5b" text="さるすべり" x="536" y="412" width="" height="" _clickable_img="" ] +[glink color="black" storage="q2.ks" size="20" target="*a5b" text="いたどり" x="543" y="491" width="" height="" _clickable_img="" ] +[s ] +*a5a + +[tb_start_text mode=1 ] +# +○[p] +[_tb_end_text] + +[tb_eval exp="f.qp+=1" name="qp" cmd="+=" op="t" val="1" val_2="undefined" ] +[jump storage="q2.ks" target="*q06" ] +*a5b + +[tb_start_text mode=1 ] +# +×[p] +[_tb_end_text] + +*q06 + +[tb_start_text mode=1 ] +# +問題6 火葬することを意味する「だびにふす」の正しい漢字は?[p] +[_tb_end_text] + +[glink color="black" storage="q2.ks" size="20" target="*a6b" text="荼火に賦す" x="530" y="337" width="" height="" _clickable_img="" ] +[glink color="black" storage="q2.ks" size="20" target="*a6a" text="荼毘に付す" x="532" y="407" width="" height="" _clickable_img="" ] +[glink color="black" storage="q2.ks" size="20" text="拿火に伏す" x="531" y="479" width="" height="" _clickable_img="" ] +[s ] +*a6a + +[tb_start_text mode=1 ] +# +○[p] +[_tb_end_text] + +[tb_eval exp="f.qp+=1" name="qp" cmd="+=" op="t" val="1" val_2="undefined" ] +[jump storage="q2.ks" target="*q07" ] +*a6b + +[tb_start_text mode=1 ] +# +×[p] +[_tb_end_text] + +*q07 + +[tb_start_text mode=1 ] +# +問題7 「毛氈を被る」の意味は?[p] +[_tb_end_text] + +[glink color="black" storage="q2.ks" size="20" target="*a7b" text="貧しい" x="560" y="359" width="" height="" _clickable_img="" ] +[glink color="black" storage="q2.ks" size="20" target="*a7b" text="卑下する" x="553" y="434" width="" height="" _clickable_img="" ] +[glink color="black" storage="q2.ks" size="20" target="*a7a" text="失敗する" x="556" y="509" width="" height="" _clickable_img="" ] +[s ] +*a7a + +[tb_start_text mode=1 ] +# +○[p] +[_tb_end_text] + +[tb_eval exp="f.qp+=1" name="qp" cmd="+=" op="t" val="1" val_2="undefined" ] +[jump storage="q2.ks" target="*q08" ] +*a7b + +[tb_start_text mode=1 ] +# +×[p] +[_tb_end_text] + +*q08 + +[tb_start_text mode=1 ] +# +問題8 岩手県の市「八幡平市」の読み方は?[p] +[_tb_end_text] + +[glink color="black" storage="q2.ks" size="20" text="やまひらし" target="*a8b" x="533" y="305" width="" height="" _clickable_img="" ] +[glink color="black" storage="q2.ks" size="20" target="*a8b" text="やわたびらし" x="523" y="386" width="" height="" _clickable_img="" ] +[glink color="black" storage="q2.ks" size="20" target="*a8a" text="はちまんたいし" x="517" y="464" width="" height="" _clickable_img="" ] +[s ] +*a8a + +[tb_start_text mode=1 ] +# +○[p] +[_tb_end_text] + +[tb_eval exp="f.qp+=1" name="qp" cmd="+=" op="t" val="1" val_2="undefined" ] +[jump storage="q2.ks" target="*q09" ] +*a8b + +[tb_start_text mode=1 ] +# +×[p] +[_tb_end_text] + +*q09 + +[tb_start_text mode=1 ] +# +問題9 岡山県の市「浅口市」の正しい読み方は?[p] +[_tb_end_text] + +[glink color="black" storage="q2.ks" size="20" target="*a9a" text="あさくちし" x="536" y="315" width="" height="" _clickable_img="" ] +[glink color="black" storage="q2.ks" size="20" target="*a9b" text="あさぐちし" x="536" y="397" width="" height="" _clickable_img="" ] +[glink color="black" storage="q2.ks" size="20" target="*a9b" text="あざぐちし" x="537" y="475" width="" height="" _clickable_img="" ] +[s ] +*a9a + +[tb_start_text mode=1 ] +# +○[p] +[_tb_end_text] + +[tb_eval exp="f.qp+=1" name="qp" cmd="+=" op="t" val="1" val_2="undefined" ] +[jump storage="q2.ks" target="*q10" ] +*a9b + +[tb_start_text mode=1 ] +# +×[p] +[_tb_end_text] + +*q10 + +[tb_start_text mode=1 ] +# +問題10 「ひきがえる」を漢字で書くと?[p] +[_tb_end_text] + +[glink color="black" storage="q2.ks" size="20" target="*a0b" text="螻蛄" x="564" y="277" width="" height="" _clickable_img="" ] +[glink color="black" storage="q2.ks" size="20" text="蟾蜍" x="563" y="355" width="" height="" _clickable_img="" target="*a0a" ] +[glink color="black" storage="q2.ks" size="20" target="*a0b" text="蟋蟀" x="564" y="433" width="" height="" _clickable_img="" ] +[glink color="black" storage="q2.ks" size="20" target="*a0b" text="どれでもない" x="1071" y="25" width="" height="" _clickable_img="" ] +[s ] +*a0a + +[tb_start_text mode=1 ] +# +○[p] +[_tb_end_text] + +[tb_eval exp="f.qp+=1" name="qp" cmd="+=" op="t" val="1" val_2="undefined" ] +[jump storage="q2.ks" target="*qend" ] +*a0b + +[tb_start_text mode=1 ] +# +×[p] +[_tb_end_text] + +*qend + +[stopbgm time="1000" ] +[playbgm volume="100" time="1000" loop="true" storage="オフィスの日常.ogg" ] +[tb_start_text mode=1 ] +#亜紀子 +「お疲れ様です。全問終了です」[p] +[_tb_end_text] + +[jump storage="q2.ks" target="*sp" cond="f.qp==10" ] +[tb_start_text mode=1 ] +#亜紀子 +「残念ながら全問正解はなりませんでしたね」[p] +「さすがの宮崎さんも難しかったですか?」[p] +「このゲームのエンディングは7つありますので、よかったら全部見ていってくださいね」[p] +「それではまたお会いしましょう。さようなら」[p] +[_tb_end_text] + +[stopbgm time="1000" ] +[wait time="3000" ] +[jump storage="title_screen.ks" target="" ] +*sp + +[tb_start_text mode=1 ] +#亜紀子 +「おお!素晴らしい!全問正解です!」[p] +「さすが宮崎さん、すごいですね~。よっ漢字女王!」[p] +「それでは全問正解のご褒美に次回作の画像をちょこっとだけお見せします」[p] +「どうぞ~」[p] +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="game159.jpg" ] +[tb_start_text mode=1 ] +#亜紀子 +「次回作は女教師モノになる予定です。お楽しみに」[p] +「それではまたお会いしましょう。さようなら」[p] +[_tb_end_text] + +[stopbgm time="1000" ] +[wait time="3000" ] +[jump storage="title_screen.ks" target="" ] diff --git a/data/scenario/rep1.ks b/data/scenario/rep1.ks new file mode 100644 index 0000000..84224dc --- /dev/null +++ b/data/scenario/rep1.ks @@ -0,0 +1,24 @@ +[_tb_system_call storage=system/_rep1.ks] + +[tb_clear_images] + +[stopbgm time="1000" ] +[mask time="200" ] +[bg time="1" storage="bg_base.png" _tb_parts_type="bg" ] +[button graphic="c_btn_back.png" storage="title_screen.ks" target="" time="1" width="100" height="100" x="1150" y="600" _tb_parts_type="button" ] +[tb_image_show storage="default/kaiso.png" name="_tb_system" time="1" width="320" height="100" x="50" y="650" _tb_parts_type="image" ] +[tb_replay_image_button graphic="hiro106-1.jpg" storage="scene2.ks" target="*rep1" role="sleepgame" no_graphic="&sf._tb_replay_noimage" time="1" width="300" height="200" x="100" y="100" _tb_parts_type="replay_image_button" id="reps1" ] + +[tb_replay_image_button graphic="hiro116-1.jpg" storage="scene4.ks" target="*rep2" role="sleepgame" no_graphic="&sf._tb_replay_noimage" time="1" width="300" height="200" x="470" y="100" _tb_parts_type="replay_image_button" id="reps2" ] + +[tb_replay_image_button graphic="hiro109-1.jpg" storage="scene4.ks" target="*rep3" role="sleepgame" no_graphic="&sf._tb_replay_noimage" time="1" width="300" height="200" x="840" y="100" _tb_parts_type="replay_image_button" id="reps3" ] + +[tb_replay_image_button graphic="hiro104-1.jpg" storage="scene5.ks" target="*rep4" role="sleepgame" no_graphic="&sf._tb_replay_noimage" time="1" width="300" height="200" x="100" y="370" _tb_parts_type="replay_image_button" id="reps4" ] + +[tb_replay_image_button graphic="hiro115.jpg" storage="scene6.ks" target="*rep5" role="sleepgame" no_graphic="&sf._tb_replay_noimage" time="1" width="300" height="200" x="470" y="370" _tb_parts_type="replay_image_button" id="reps5" ] + +[tb_replay_image_button graphic="hiro114-1.jpg" storage="scene7.ks" target="*rep6" role="sleepgame" no_graphic="&sf._tb_replay_noimage" time="1" width="300" height="200" x="840" y="370" _tb_parts_type="replay_image_button" id="reps6" ] + +[button graphic="arrow_next.png" storage="rep2.ks" target="" time="1" width="100" height="100" x="1000" y="600" _tb_parts_type="button" ] +[mask_off time="200" ] +[s ] diff --git a/data/scenario/rep2.ks b/data/scenario/rep2.ks new file mode 100644 index 0000000..a4e0834 --- /dev/null +++ b/data/scenario/rep2.ks @@ -0,0 +1,24 @@ +[_tb_system_call storage=system/_rep2.ks] + +[tb_clear_images] + +[mask time="200" ] +[bg time="1" storage="bg_base.png" _tb_parts_type="bg" ] +[tb_image_show storage="default/kaiso.png" name="_tb_system" time="1" width="320" height="100" x="50" y="650" _tb_parts_type="image" ] +[button graphic="c_btn_back.png" storage="title_screen.ks" target="" time="1" width="100" height="100" x="1150" y="600" _tb_parts_type="button" ] +[button graphic="arrow_prev.png" storage="rep1.ks" target="" time="1" width="100" height="100" x="850" y="600" _tb_parts_type="button" ] +[tb_replay_image_button graphic="hiro132-1.jpg" storage="scene7.ks" target="*rep7" role="sleepgame" no_graphic="&sf._tb_replay_noimage" time="1" width="300" height="200" x="100" y="100" _tb_parts_type="replay_image_button" id="reps7" ] + +[tb_replay_image_button graphic="hiro141-1.jpg" storage="scene8.ks" target="*rep8" role="sleepgame" no_graphic="&sf._tb_replay_noimage" time="1" width="300" height="200" x="470" y="100" _tb_parts_type="replay_image_button" id="reps8" ] + +[tb_replay_image_button graphic="hiro117-1.jpg" storage="scene8.ks" target="*rep9" role="sleepgame" no_graphic="&sf._tb_replay_noimage" time="1" width="300" height="200" x="840" y="100" _tb_parts_type="replay_image_button" id="reps9" ] + +[tb_replay_image_button graphic="hiro254-4.jpg" storage="scene8.ks" target="*rep10" role="sleepgame" no_graphic="&sf._tb_replay_noimage" time="1" width="300" height="200" x="100" y="370" _tb_parts_type="replay_image_button" id="reps10" ] + +[tb_replay_image_button graphic="hiro139-1.jpg" storage="scene9.ks" target="*rep11" role="sleepgame" no_graphic="&sf._tb_replay_noimage" time="1" width="300" height="200" x="470" y="370" _tb_parts_type="replay_image_button" id="reps11" ] + +[tb_replay_image_button graphic="hiro127-1.jpg" storage="scene9.ks" target="*rep12" role="sleepgame" no_graphic="&sf._tb_replay_noimage" time="1" width="300" height="200" x="840" y="370" _tb_parts_type="replay_image_button" id="reps12" ] + +[button graphic="arrow_next.png" storage="rep3.ks" target="" time="1" width="100" height="100" x="1000" y="600" _tb_parts_type="button" ] +[mask_off time="200" ] +[s ] diff --git a/data/scenario/rep3.ks b/data/scenario/rep3.ks new file mode 100644 index 0000000..a50b74e --- /dev/null +++ b/data/scenario/rep3.ks @@ -0,0 +1,24 @@ +[_tb_system_call storage=system/_rep3.ks] + +[tb_clear_images] + +[mask time="200" ] +[bg time="1" storage="bg_base.png" _tb_parts_type="bg" ] +[tb_image_show storage="default/kaiso.png" name="_tb_system" time="1" width="320" height="100" x="50" y="650" _tb_parts_type="image" ] +[button graphic="c_btn_back.png" storage="title_screen.ks" target="" time="1" width="100" height="100" x="1150" y="600" _tb_parts_type="button" ] +[button graphic="arrow_prev.png" storage="rep2.ks" target="" time="1" width="100" height="100" x="850" y="600" _tb_parts_type="button" ] +[tb_replay_image_button graphic="hiro105-1.jpg" storage="scene10.ks" target="*rep13" role="sleepgame" no_graphic="&sf._tb_replay_noimage" time="1" width="300" height="200" x="100" y="100" _tb_parts_type="replay_image_button" id="reps13" ] + +[tb_replay_image_button graphic="hiro121-1.jpg" storage="scene11.ks" target="*rep14" role="sleepgame" no_graphic="&sf._tb_replay_noimage" time="1" width="300" height="200" x="470" y="100" _tb_parts_type="replay_image_button" id="reps14" ] + +[tb_replay_image_button graphic="hiro143-1.jpg" storage="end1.ks" target="*rep15" role="sleepgame" no_graphic="&sf._tb_replay_noimage" time="1" width="300" height="200" x="840" y="100" _tb_parts_type="replay_image_button" id="reps15" ] + +[tb_replay_image_button graphic="hiro254-7.jpg" storage="end1.ks" target="*rep16" role="sleepgame" no_graphic="&sf._tb_replay_noimage" time="1" width="300" height="200" x="100" y="370" _tb_parts_type="replay_image_button" id="reps16" ] + +[tb_replay_image_button graphic="hiro142-1.jpg" storage="end1.ks" target="*rep17" role="sleepgame" no_graphic="&sf._tb_replay_noimage" time="1" width="300" height="200" x="470" y="370" _tb_parts_type="replay_image_button" id="reps17" ] + +[tb_replay_image_button graphic="hiro122-1.jpg" storage="end2.ks" target="*rep18" role="sleepgame" no_graphic="&sf._tb_replay_noimage" time="1" width="300" height="200" x="840" y="370" _tb_parts_type="replay_image_button" id="reps18" ] + +[button graphic="arrow_next.png" storage="rep4.ks" target="" time="1" width="100" height="100" x="1000" y="600" _tb_parts_type="button" ] +[mask_off time="200" ] +[s ] diff --git a/data/scenario/rep4.ks b/data/scenario/rep4.ks new file mode 100644 index 0000000..39b2fdf --- /dev/null +++ b/data/scenario/rep4.ks @@ -0,0 +1,24 @@ +[_tb_system_call storage=system/_rep4.ks] + +[tb_clear_images] + +[mask time="200" ] +[bg time="1" storage="bg_base.png" _tb_parts_type="bg" ] +[tb_image_show storage="default/kaiso.png" name="_tb_system" time="1" width="320" height="100" x="50" y="650" _tb_parts_type="image" ] +[button graphic="c_btn_back.png" storage="title_screen.ks" target="" time="1" width="100" height="100" x="1150" y="600" _tb_parts_type="button" ] +[button graphic="arrow_prev.png" storage="rep3.ks" target="" time="1" width="100" height="100" x="850" y="600" _tb_parts_type="button" ] +[tb_replay_image_button graphic="hiro146-1.jpg" storage="end4b.ks" target="*rep19" role="sleepgame" no_graphic="&sf._tb_replay_noimage" time="1" width="300" height="200" x="100" y="100" _tb_parts_type="replay_image_button" id="reps19" ] + +[tb_replay_image_button graphic="hiro103-1.jpg" storage="end4b.ks" target="*rep20" role="sleepgame" no_graphic="&sf._tb_replay_noimage" time="1" width="300" height="200" x="470" y="100" _tb_parts_type="replay_image_button" id="reps20" ] + +[tb_replay_image_button graphic="hiro144.jpg" storage="scene12.ks" target="*rep21" role="sleepgame" no_graphic="&sf._tb_replay_noimage" time="1" width="300" height="200" x="840" y="100" _tb_parts_type="replay_image_button" id="reps21" ] + +[tb_replay_image_button graphic="hiro107-1.jpg" storage="scene13.ks" target="*rep22" role="sleepgame" no_graphic="&sf._tb_replay_noimage" time="1" width="300" height="200" x="100" y="370" _tb_parts_type="replay_image_button" id="reps22" ] + +[tb_replay_image_button graphic="hiro107-1.jpg" storage="scene14.ks" target="*rep23" role="sleepgame" no_graphic="&sf._tb_replay_noimage" time="1" width="300" height="200" x="470" y="370" _tb_parts_type="replay_image_button" id="reps23" ] + +[tb_replay_image_button graphic="hiro147.jpg" storage="end3.ks" target="*rep24" role="sleepgame" no_graphic="&sf._tb_replay_noimage" time="1" width="300" height="200" x="840" y="370" _tb_parts_type="replay_image_button" id="reps24" ] + +[button graphic="arrow_next.png" storage="rep5.ks" target="" time="1" width="100" height="100" x="1000" y="600" _tb_parts_type="button" ] +[mask_off time="200" ] +[s ] diff --git a/data/scenario/rep5.ks b/data/scenario/rep5.ks new file mode 100644 index 0000000..3a4bec4 --- /dev/null +++ b/data/scenario/rep5.ks @@ -0,0 +1,9 @@ +[tb_clear_images][mask time=200][bg time="1" storage="bg_base.png" _tb_parts_type="bg" ] +[tb_image_show storage="default/kaiso.png" name="_tb_system" time="1" width="320" height="100" x="50" y="650" _tb_parts_type="image" ] +[button graphic="arrow_prev.png" storage="rep4.ks" target="" time="1" width="100" height="100" x="850" y="600" _tb_parts_type="button" ] +[button graphic="c_btn_back.png" storage="title_screen.ks" target="" time="1" width="100" height="100" x="1150" y="600" _tb_parts_type="button" ] +[tb_replay_image_button graphic="hiro123-4.jpg" storage="end4.ks" target="*rep25" role="sleepgame" no_graphic="&sf._tb_replay_noimage" time="1" width="300" height="200" x="100" y="100" _tb_parts_type="replay_image_button" id="reps25" ] +[tb_replay_image_button graphic="hiro149-1.jpg" storage="scene14.ks" target="*rep26" role="sleepgame" no_graphic="&sf._tb_replay_noimage" time="1" width="300" height="200" x="470" y="100" _tb_parts_type="replay_image_button" id="reps26" ] +[tb_replay_image_button graphic="hiro135-1.jpg" storage="end5.ks" target="*rep27" role="sleepgame" no_graphic="&sf._tb_replay_noimage" time="1" width="300" height="200" x="840" y="100" _tb_parts_type="replay_image_button" id="reps27" ] +[mask_off time=200] +[s] diff --git a/data/scenario/scene1.ks b/data/scenario/scene1.ks new file mode 100644 index 0000000..e885aeb --- /dev/null +++ b/data/scenario/scene1.ks @@ -0,0 +1,289 @@ +[_tb_system_call storage=system/_scene1.ks] + +[cm ] +[stopbgm time="1000" ] +[chara_hide_all time="1000" wait="true" ] +[bg time="1000" method="crossfade" storage="hiro999.jpg" ] +[glink color="black" storage="scene1.ks" size="20" target="*txt1" x="482" y="323" width="" height="" _clickable_img="" text="テキストスピード速い" ] +[glink color="black" storage="scene1.ks" size="20" target="*txt2" text="テキストスピード普通" x="482" y="424" width="" height="" _clickable_img="" ] +[s ] +*txt1 + +[delay speed="1" ] +[jump storage="scene1.ks" target="*ss" ] +*txt2 + +[delay speed="30" ] +*ss + +[tb_show_message_window ] +[tb_start_text mode=1 ] +本番始まりまーす![p] +5秒前![p] +4![p] +・・・・・・・・・[p] +・・・・・・[p] +・・・[p] +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro254-1.jpg" ] +[playbgm volume="100" time="10" loop="false" storage="music13.ogg" ] +[tb_start_text mode=1 ] +#亜紀子 +「こんばんは、ニュースプライムZ、キャスターの千山亜紀子(ちやまあきこ)です」[p] + +[_tb_end_text] + +[playbgm volume="10" time="1000" loop="true" storage="Green&Dance_2.ogg" fadein="true" ] +[tb_start_text mode=1 ] +#亜紀子 +「まずは大雨関連のニュースです」[p] +「14日に起きたK県S市の土砂崩れで行方不明となっていた17名のうち2人が今日の昼ごろ発見され救出されました」[p] +「救出されたのは土田圧死郎さん99歳と水川溺子さん98歳の二人で、共に公民館の地下室に閉じ込められていたところを救助隊によって発見されました」[p] +「二人は市内の病院に運ばれましたが特に怪我は無く意識もしっかりしているということです」[p] +「現場は引き続きの雨で地盤が脆くなっており再び土砂崩れが起こる危険もある中、捜索作業は難航しているようです」[p] +「捜索は明日も早朝から行われるということです」[p] +「西日本では大雨による洪水が各地で起きています」[p] +「T県県北部では8千世帯が避難しており―――」[p] + +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro101-1.jpg" ] +[tb_start_text mode=1 ] +#独身男性(左上) +「お、千山亜紀子じゃん。やっぱ乳でけーなぁー」[p] +「相変わらずスカートじゃなくてズボン穿いてるんだな」[p] +「・・・たしか女子アナのアイドル化に反対の意思を示すためにスカート穿くのを止めたんだっけ」[p] +「よくテレビ局も許してるよな」[p] +「人気があるしキャスターとして勢いあるから干すわけにもいかないんだろうな」[p] +「性格きつそうだよな。めっちゃ頭良さそうだし」[p] +「でも一回あのでかパイをモミまくってヒィヒィ言わせてやりてえなぁ」[p] +「男いるのかな?お堅いイメージだけど・・・」[p] +「・・・まぁいいや、どうせ俺らみたいな庶民が付き合えるわけないし」[p] +「ニュースつまんねえしアニメでも観よっと」[p] +・・・[p] +・・・[p] +#独身男性(左下) +「亜紀子・・・俺の亜紀子・・・ハァハァ」[p] +「今日も美しい声を聞かせておくれ・・・俺だけのために・・・」[p] +・・・[p] +・・・[p] +#既婚女性 +「洪水怖いわねぇ・・・。このあたりは大丈夫かしら?」[p] +#既婚男性 +「大丈夫だろう、川からは離れてるし」[p] +#小学生女子 +「ねえ、ニュースつまんない。チャンネル変えていい?」[p] +#既婚女性 +「ダメよ、パパが観てるんだから。もうちょっと待ちなさい」[p] +#小学生女子 +「はーい・・・」[p] +#既婚女性 +「それにしても千山アナウンサーって感じ良いわよね。頭も良さそうだし。ねえあなた」[p] +#既婚男性 +「え?ああ・・・うん、そうだね」[p] +# +・・・・・・[p] + +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro254-1.jpg" ] +[tb_start_text mode=1 ] +#亜紀子 +「続いてH市長選挙のニュースです」[p] +「民生党と男尊党の一騎打ちとなり注目を集めていたH市長選ですが、今日投開票が行われ男尊党の鏑木権造氏が初の当選を果たしました」[p] +「速報によりますと得票率は鏑木氏が49%、民生党の松浦氏が46%とかなりの接戦だった模様です」[p] +「選挙管理委員会の公表した数字では投票率が52%と前回より18ポイントの上昇となり、今回の市長選の注目度の高さがうかがえます」[p] +「連日与党の大物議員たちが応援に駆けつけ磐石かと思われていた松浦候補でしたが」[p] +「汚職の一掃や『革新』を掲げ無党派層の支持を集めた鏑木氏に追い上げられまさかの敗北となりました」[p] +「市民からは市政に新しい風を吹かせてくれるのではないかと期待の声が上がっています」[p] +「しかし一方では鏑木氏の過去の女性蔑視の発言などから、政治的方向性に対する不安の声もあるようです」[p] +「続いてはお天気です」[p] +# +・・・・・・[p] +・・・[p] + + +[_tb_end_text] + +[stopbgm time="1000" ] +[mask time="1000" effect="fadeIn" color="0x000000" ] +[bg time="1000" method="crossfade" storage="hiro254-0.jpg" ] +[mask_off time="1000" effect="fadeOut" ] +[playbgm volume="100" time="1000" loop="true" storage="neonpurple.ogg" ] +[chara_show name="美里" time="1000" wait="true" storage="chara/1/hiro253-1.png" width="544" height="1306" left="209" top="9" reflect="false" ] +[tb_start_text mode=1 ] +#ディレクター +「はいオーケーでーす!おつかれさまー」[p] +#亜紀子 +「お疲れ様です」[p] +(ふう・・・)[p] +# +カメラが止まりほっと大きく息を吐く[p] +5年目で多少慣れてきたとはいえ、やはり生本番は緊張する[p] +カメラの向こうで何百万人もの人が見ていると思うと、いまだにパニックになりそうな瞬間もある[p] +#亜紀子 +(まぁそれだけやり甲斐があるってことでもあるけど)[p] + + + +[_tb_end_text] + +[chara_show name="谷田" time="1000" wait="true" storage="chara/4/hiro259-2.png" width="441" height="1058" left="721" top="13" reflect="false" ] +[tb_start_text mode=1 ] +#谷田 +「ち、千山さん、おつかれさまでしたっ!」[p] +#亜紀子 +「おつかれさま谷田君」[p] +#谷田 +「きょ、今日も完璧でした・・・!」[p] +#亜紀子 +「ありがとう」[p] +# +いつもどおりAD(アシスタント・ディレクター)の谷田が真っ先に亜紀子のもとに駆け寄り労いの言葉をかけてくる[p] +後輩とはいえ歳もそれほど変わらないのだが、亜紀子のことを女神様か何かと思っているようで、顔を真っ赤にして好意を隠そうともしない[p] +亜紀子も悪い気はしないのだが、亜紀子のほうから谷田に対して特別な感情は生まれそうにない[p] +#亜紀子 +(人を見た目で判断するわけじゃないけど・・・さすがにね)[p] +#ディレクター +「おい谷田!ちょっと来い!」[p] +#谷田 +「は、はい!あ、千山さん失礼します!」[p] + +[_tb_end_text] + +[chara_hide name="谷田" time="1000" wait="true" pos_mode="true" ] +[tb_start_text mode=1 ] +#亜紀子 +「ふう・・・とりあえず報道室まで戻りましょう」[p] +[_tb_end_text] + +[chara_hide name="美里" time="1000" wait="true" pos_mode="true" ] +[bg time="1000" method="crossfade" storage="hiro202.jpg" ] +[chara_show name="美里" time="1000" wait="true" storage="chara/1/hiro253-1.png" width="437" height="1049" left="225" top="33" reflect="false" ] +[tb_start_text mode=1 ] +#局長 +「千山!」[p] +[_tb_end_text] + +[chara_show name="局長" time="1000" wait="true" storage="chara/3/hiro262-1.png" width="437" height="1049" left="627" top="-38" reflect="false" ] +[tb_start_text mode=1 ] +#亜紀子 +「局長、お疲れ様です」[p] +#局長 +「おつかれさまじゃない!一体どういうつもりだ!」[p] +#亜紀子 +「は?なんのことでしょう?」[p] +#局長 +「とぼけるんじゃない!その服装だよ!」[p] +「あれだけスカートを穿いて来いと言ったのに、またズボンを穿いてきおって!」[p] +「女子アナは脚を見せるのも仕事のうちと何度言ったら分かるのかね!」[p] +#亜紀子 +「わたしの方こそ何度も言わせてもらいますが、わたしはジャーナリストです。タレントじゃありません」[p] +「ジャーナリストは真実を伝えるのが仕事です。色気は必要ありません」[p] +#局長 +「どんなニュースだって見てもらえなければ意味がないんだよ!」[p] +「他局の女子アナがこぞってスカートの短さを競い合って数字を稼いでいるというのに・・・」[p] +「スポンサー様からもお叱りを受けているんだぞ。私の立場も考えてくれたまえ!」[p] +#亜紀子 +「報道がスポンサーの意向に影響を受けるのは禁忌(タブー)のはずですが」[p] +#局長 +「それは建前だ。ニュース番組だってスポンサーがいなければ作れないんだよ」[p] +#亜紀子 +「でもズボンを穿くようになってからも視聴率は落ちていないはずですが」[p] +#局長 +「む・・・それは今のところはそうかもしれんが・・・」[p] +#亜紀子 +「誰もがパンチラを目当てにニュースを観ているわけではありません。世の中の半分は女だということをお忘れなく」[p] +「それでは次の仕事の準備があるので」[p] + +[_tb_end_text] + +[chara_hide name="美里" time="1000" wait="true" pos_mode="true" ] +[tb_start_text mode=1 ] +#局長 +「お、おい、待ちたまえ君・・・!」[p] +「・・・くそっなんて扱いづらいやつなんだ」[p] +「ちょっと人気があるからって最近は言いたいことを言うようになりおって」[p] +「・・・しかしあいつの場合実力も伴ってるからなかなか文句も言えんのだよな」[p] +「T大卒で若手では一番優秀。・・・しかも美人でスタイルも抜群」[p] +「特にあのでかい乳ときたら・・・まったくけしからん!」[p] +「くそっ、一度で良いからあの乳を思い切り揉んでやりたいもんだが・・・」[p] + + +[_tb_end_text] + +[chara_hide name="局長" time="700" wait="false" pos_mode="false" ] +[bg time="1000" method="crossfade" storage="hiro201.jpg" ] +[chara_show name="美里" time="1000" wait="true" storage="chara/1/hiro253-1.png" width="487" height="1169" left="172" top="27" reflect="false" ] +[tb_start_text mode=1 ] +#亜紀子 +(さてと、次の仕事は・・・)[p] +#明日香 +「先輩、お疲れ様です」[p] + +[_tb_end_text] + +[chara_show name="明日香" time="1000" wait="true" left="467" top="10" width="881" height="1207" reflect="false" storage="chara/2/hiro252-3.png" ] +[chara_mod name="美里" time="600" cross="false" storage="chara/1/hiro253-3.png" ] +[tb_start_text mode=1 ] +#亜紀子 +「明日香、おつかれさま」[p] +# +彼女は岡明日香(おか あすか)[p] +3年目の後輩アナウンサーで、その人形のような愛らしい見た目で人気急上昇中の若手だ[p] +しかし最近のアイドル女子アナのようにキャピキャピと浮ついたところはなく、考え方もしっかりしている[p] +亜紀子のことをよく慕っていて、一番仲が良い同僚だ[p] +#明日香 +「また局長の小言ですか?」[p] +#亜紀子 +「まぁね・・・意見の相違ってやつかしら」[p] +#明日香 +「わたしもこの前ネチネチとやられました。もっと愛想よくしろとか露出を増やせとか」[p] +#亜紀子 +「まぁ局長といっても中間管理職だから。上から色々言われてるんでしょう」[p] +「適当に聞き流しておけばいいわ」[p] +#明日香 +「でも言い方がイラっとしちゃうんですよね。一回あのカツラを引っぺがしてやろうかな」[p] +#亜紀子 +「ウフフ、止めておきなさい。本人はバレてないと思ってるんだから」[p] + + + + + + +[_tb_end_text] + +[chara_mod name="明日香" time="600" cross="false" storage="chara/2/hiro252-1.png" ] +[tb_start_text mode=1 ] +#明日香 +「ところで・・・(声を小さくして辺りを気にしながら)あっちの方は大丈夫ですか?」[p] + +[_tb_end_text] + +[chara_mod name="美里" time="600" cross="false" storage="chara/1/hiro253-1.png" ] +[tb_start_text mode=1 ] +#亜紀子 +「ええ・・・ちょっと張ってる・・・かも」[p] +#明日香 +「やっぱり!急いでやっておきましょう」[p] +#亜紀子 +「あ、でもまだそこまでじゃないかも・・・」[p] +#明日香 +「ダメですよ!この後すぐまた情報番組のMCですよね?」[p] +「収録中に漏れてきたらどうするんですか」[p] +#亜紀子 +「そ、そうね・・・」[p] +#明日香 +「ほら、空き楽屋に行きましょう」[p] +#亜紀子 +「わ、わかったわ・・・」[p] + + + +[_tb_end_text] + +[stopbgm time="1000" ] +[jump storage="scene2.ks" target="" ] +[s ] diff --git a/data/scenario/scene10.ks b/data/scenario/scene10.ks new file mode 100644 index 0000000..06195db --- /dev/null +++ b/data/scenario/scene10.ks @@ -0,0 +1,743 @@ +[_tb_system_call storage=system/_scene10.ks] + +[mask time="1000" effect="fadeIn" color="0x000000" ] +[tb_show_message_window ] +[bg time="00" method="crossfade" storage="hiro201.jpg" ] +[chara_show name="美里" time="1000" wait="true" storage="chara/1/hiro258-1.png" width="568" height="1420" left="96" top="5" reflect="false" ] +[mask_off time="1000" effect="fadeOut" ] +[playbgm volume="100" time="1000" loop="true" storage="neonpurple.ogg" ] +[tb_start_text mode=1 ] +# +翌日―――[p] +#亜紀子 +(昨日は最悪だったわ・・・)[p] +(谷田君とあんなことになるなんて・・・今日顔を合わせるのが怖いわ・・・)[p] +(まさか勝野があんなことをさせてくるなんて、考えてもみなかったわ)[p] +(自分の欲望を満たすだけだと思ってたのに・・・何のためにあんなことをさせるのかしら?)[p] +(とにかくこのままあいつの奴隷でいたら、また他の男とやらされるかもしれない)[p] +(自分の出世のために権力のある人間にわたしを抱かせるとか・・・いずれそんなことになりそうだわ)[p] +(そんな売春婦みたいなマネは絶対に嫌よ・・・!そうなる前になんとか手を打たないと)[p] +(・・・そのために今日は打開策を考えてきたんだけど・・・)[p] +(かなりの強攻策だけど・・・もうじっと待っていられないわ。やるしかない・・・!)[p] + +[_tb_end_text] + +[chara_show name="明日香" time="1000" wait="true" storage="chara/2/hiro252-2.png" width="1028" height="1410" left="427" top="-11" reflect="false" ] +[tb_start_text mode=1 ] +#明日香 +「先輩・・・おはようございます」[p] +#亜紀子 +「明日香・・・おはよう」[p] +#明日香 +「あの・・・先輩、わたし・・・」[p] +#亜紀子 +「ううん、何も言わなくていいわ明日香」[p] +「わたしはなんとか上手くやってるから。心配しないで」[p] +#明日香 +「でも・・・わたし・・・」[p] +#亜紀子 +「明日香が罪悪感を感じる必要はないわ。そもそもわたしの問題なんだから」[p] +「わたしのことは気にしないで明日香は仕事に集中して。ここのところずっとちゃんと読めてないわよ」[p] +#明日香 +「それは・・・その・・・」[p] +#亜紀子 +「わたしの方は大丈夫。・・・実は、解決策もちゃんと考えてあるの」[p] +#明日香 +「えっ・・・解決策・・・?」[p] +#亜紀子 +「上手くいくかは判らないけど・・・もしかしたら全て解決するかもしれないわ」[p] +#明日香 +「ど、どんな方法ですか・・・?」[p] +#亜紀子 +「それは秘密にしておくわ。明日香は何も心配しないで」[p] +#明日香 +「先輩・・・あいつを甘く見ないほうが・・・」[p] +#亜紀子 +「大丈夫よ。失敗したってこれ以上状況が悪くなることはないし」[p] +#明日香 +「で、でも・・・」[p] +#亜紀子 +「あ、そろそろ本番だから行かないと」[p] +「じゃあまた後でね、明日香」[p] + + +[_tb_end_text] + +[chara_hide name="美里" time="1000" wait="false" pos_mode="true" ] +[tb_start_text mode=1 ] +#明日香 +「あっ、先輩・・・っ」[p] +「・・・・・・」[p] +「あぁ・・・先輩になんて言えば・・・」[p] +# +・・・・・・[p] +・・・[p] + +[_tb_end_text] + +[chara_hide_all time="1000" wait="true" ] +[stopbgm time="1000" ] +[jump storage="q1.ks" target="*q1-2" ] +*s10-n + +[chara_hide_all time="1000" wait="true" ] +[mask time="1000" effect="fadeIn" color="0x000000" ] +[bg time="1000" method="crossfade" storage="hiro202.jpg" ] +[chara_show name="美里" time="1000" wait="true" storage="chara/1/hiro258-1.png" width="459" height="1148" left="202" top="44" reflect="false" ] +[mask_off time="1000" effect="fadeOut" ] +[playbgm volume="100" time="1000" loop="true" storage="bluenoise.ogg" ] +[tb_start_text mode=1 ] +#亜紀子 +(さて、本番が終ったわ)[p] +(いよいよね・・・)[p] +(本番の後はいつも空き部屋でフェラさせられるのが決まりだから・・・もうすぐあいつが呼びに来るはず・・・)[p] +(あいつが来たら、こいつで・・・!)[p] + +[_tb_end_text] + +[stopbgm time="1000" ] +[tb_image_show time="1000" storage="default/hiro101-98.jpg" width="361" height="318" x="689" y="216" _clickable_img="" name="img_23" ] +[playbgm volume="100" time="1000" loop="true" storage="music17.ogg" ] +[tb_start_text mode=1 ] +# +B社製の「BRマスター900k」[p] +通販で買った小型のスタンガンだ[p] +護身用の手ごろな価格のものだが、成人男性を一発で気絶させるだけの威力はある[p] +とはいえ試す相手がいないので、手元に届いてからまだ一度も使ったことはない[p] +バチッ![p] +#亜紀子 +(充電はバッチリね)[p] +(絶対に失敗するわけにはいかないわ・・・)[p] +# +勝野の支配から脱出するために考えた作戦はいたってシンプルだ[p] +脅迫動画には脅迫動画で対抗する[p] +勝野をスタンガンで気絶させた隙に、勝野の恥ずかしい映像を撮って保存する[p] +これで立場は同じになるはずだ[p] +こっちは奴隷宣言を始め、ネットに出回ったら人生が終るような動画を大量に撮られてしまっている[p] +それに対抗するにはどんな画像を撮ればいいか、色々考えたがまだ具体的には決まっていない[p] +とにかく勝野が死んでも他人に見られたくないような映像を撮れれば、対等の立場に立てるはずだ[p] +かなりリスクは高い作戦だが、このまま奴隷でい続ければアナウンサーとしてのキャリアにも人生そのものにも未来は無い[p] +やるしかないのだ[p] +#亜紀子 +(拘束用のバンドも用意したし・・・準備は万端だわ)[p] +(・・・あっ、勝野が来たわ!)[p] +[_tb_end_text] + +[tb_image_hide time="200" ] +[chara_show name="勝野" time="1000" wait="true" storage="chara/5/hiro256-1.png" width="500" height="1200" left="673" top="-6" reflect="false" ] +[tb_start_text mode=1 ] +#勝野 +「おい、こんなところに居たのか。行くぞ」[p] +「今日もたっぷりとザーメンを飲ませてやるからな、クックック」[p] +#亜紀子 +「はい・・・」[p] +(そのにやけた面・・・今日でお仕舞よ・・・!)[p] + +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro203.jpg" ] +[tb_start_text mode=1 ] +#勝野 +「よし、この部屋でいいだろう」[p] +「しかし今日は暑いな。エアコンを・・・」[p] +#亜紀子 +(勝野が向こうを向いてる・・・今がチャンスよ!」[p] +#勝野 +「えーっと設定温度を・・・ん?」[p] +[_tb_end_text] + +[stopbgm time="1000" ] +[tb_image_show time="1000" storage="default/hiro101-98.jpg" width="317" height="279" x="504" y="312" _clickable_img="" name="img_32" ] +[playbgm volume="70" time="1000" loop="true" storage="烈火翔ける.ogg" ] +[tb_start_text mode=1 ] +#亜紀子 +(食らえ・・・っ!!)[p] +[_tb_end_text] + +[chara_move name="美里" anim="true" time="150" effect="linear" wait="false" left="550" top="53" width="459" height="1148" ] +[quake time="300" count="3" hmax="10" wait="true" ] +[tb_start_text mode=1 ] +#勝野 +「うおっ!?」[p] +[_tb_end_text] + +[chara_mod name="勝野" time="00" cross="false" storage="chara/5/hiro256-2.png" ] +[chara_move name="勝野" anim="true" time="100" effect="linear" wait="true" left="833" top="-6" width="500" height="1200" ] +[tb_start_text mode=1 ] +#勝野 +「こいつ・・・っ!」[p] +#亜紀子 +(しまった・・・!かわされた!)[p] +[_tb_end_text] + +[chara_move name="勝野" anim="true" time="300" effect="linear" wait="true" left="652" top="-3" width="500" height="1200" ] +[tb_start_text mode=1 ] +#勝野 +「てめえ、スタンガンなんか・・・!」[p] +#亜紀子 +「くっ・・・今までの恨み・・・!」[p] +#勝野 +「こいつ・・・よこせっ!」[p] +[_tb_end_text] + +[chara_mod name="勝野" time="0" cross="false" storage="chara/5/hiro256-1.png" ] +[chara_move name="美里" anim="true" time="60" effect="linear" wait="true" left="17" top="65" width="459" height="1148" ] +[quake time="70" count="3" hmax="7" wait="true" vmax="4" ] +[tb_start_text mode=1 ] +#亜紀子 +「アウッ!」[p] +#勝野 +「てめえ、こんなもの用意して・・・」[p] +#亜紀子 +「く・・・っ!」[p] +(す、スタンガンを取られちゃった・・・!)[p] +「う、後ろから攻撃したのに、なんで・・・」[p] +#勝野 +「ふん、鏡にお前がなにか懐から取り出すのが見えたんだよ」[p] +「これでやられてたら危なかったぜ・・・!」[p] +#亜紀子 +「く・・・そんな・・・」[p] +#勝野 +「大人しく従ってるふりして・・・心の中では反逆することを考えてやがったのか・・・!」[p] +「順調に調教が進んでると思ってたのに・・・」[p] +[_tb_end_text] + +[chara_mod name="美里" time="200" cross="false" storage="chara/1/hiro258-3.png" ] +[tb_start_text mode=1 ] +#亜紀子 +「当たり前でしょ!誰があなたみたいな下衆に心まで屈するものですか・・・!」[p] +#勝野 +「ふ・・・どうやら俺の躾けが優しすぎたみたいだな」[p] +「俺に逆らうとどうなるか・・・もっと徹底的に調教してやらないといけないってことか、クククク」[p] +#亜紀子 +「く・・・っ」[p] +「や、やるなら好きにすればいいわ!いくら痛めつけられてもわたしの心は折れないわ!」[p] +#勝野 +「面白い、お望みどおり痛めつけてやるぜ。オラッ!」[p] + +[_tb_end_text] + +[chara_mod name="勝野" time="00" cross="false" storage="chara/5/hiro256-3.png" ] +[chara_move name="勝野" anim="true" time="100" effect="linear" wait="true" left="248" top="-3" width="500" height="1200" ] +[chara_mod name="美里" time="00" cross="false" storage="chara/1/hiro258-5.png" ] +[quake time="500" count="10" hmax="3" wait="true" vmax="3" ] +[tb_start_text mode=1 ] +#亜紀子 +「ァーーーーッ!?」[p] +[_tb_end_text] + +[chara_move name="美里" anim="true" time="300" effect="linear" wait="true" left="15" top="663" width="459" height="1148" ] +[tb_start_text mode=1 ] +#勝野 +「ヒュー・・・本当に一発で気絶しやがった」[p] +「こいつこんな危険なものを俺に・・・」[p] +「俺に逆らうとどうなるか、身体にきっちりと教えてやるぜ・・・ククククク」[p] +# +・・・・・・[p] +・・・[p] +[_tb_end_text] + +[tb_hide_message_window ] +[stopbgm time="1000" ] +*rep13 + +[tb_replay_start ] +[mask time="1000" effect="fadeIn" color="0x000000" ] +[tb_image_hide time="1000" ] +[chara_hide_all time="1000" wait="true" ] +[bg time="000" method="crossfade" storage="hiro999.jpg" ] +[tb_show_message_window ] +[mask_off time="1000" effect="fadeOut" ] +[playbgm volume="100" time="1000" loop="true" storage="SO_SAD.ogg" ] +[tb_start_text mode=1 ] +#亜紀子 +「う・・・」[p] +「・・・ハッ!?」[p] +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro105-1.jpg" ] +[tb_start_text mode=1 ] +#亜紀子 +「こ、これは・・・!?」[p] +#勝野 +「よぉ、目が覚めたか。気分はどうだ?」[p] +#亜紀子 +「は、外して・・・っ!」[p] +#勝野 +「ククク、びびってるのか?これから俺に逆らったお仕置きをされるってのがわかってるようだな」[p] +#亜紀子 +「む、無駄よ!なにをされようがあなたに心から屈することなんかないわ!」[p] +「さっさと外しなさい!」[p] +#勝野 +「なんだその口の聞き方は。すっかり奴隷としての立場を忘れちまったようだな」[p] +#亜紀子 +「もうわたしはあなたの奴隷なんかじゃないわ!」[p] +#勝野 +「おいおい、動画がたっぷりあることを忘れたか?」[p] +「マ○コも肛門もバッチリ映った変態宣言動画バラまいてやってもいいんだぞ?」[p] +#亜紀子 +「す、好きにしたらいいわ・・・!あなたの言いなりになり続けるよりマシよ!」[p] +#勝野 +「ククク、すっかり頭に血が上ってるみたいだな」[p] +「明日香の動画もあるんだぞ?かわいい後輩も一緒に地獄に落ちていいのか?」[p] +#亜紀子 +「くっ・・・ひ、卑怯者!あなたには人間の心が無いの!?」[p] +#勝野 +「プププッ、結局また負け犬の遠吠えか?」[p] +「・・・良いことを教えてやろう。お前が俺の奴隷になる代わりに明日香には手を出すなって約束だったが」[p] +「あれはウソだ」[p] +#亜紀子 +「な・・・っ!?」[p] +#勝野 +「まぁ一旦はお前の調教に忙しくて明日香は放っていたが、最近はちょくちょく犯してやってるぞ」[p] +#亜紀子 +「なんてこと・・・」[p] +「こ、このクズ・・・っ!!外道!!」[p] +「わたしは何のために・・・グギギギ・・・ッ!」[p] +#勝野 +「それでな、お前が梅田さんを怒らせた件あっただろ」[p] +「あれも実は梅田さんに明日香を譲ることで解決したんだ」[p] +#亜紀子 +「な・・・っ!?」[p] +#勝野 +「なんでも好きにしていい肉奴隷ですって明日香を渡したら、機嫌直してくれたよ」[p] +「それどころかあれから梅田さんに気に入られちゃって、何度か飲みにも連れて行ってもらってるんだぜ」[p] +「梅田さんドSだからきっと明日香も徹底的に調教されちゃってるだろうなぁ、ククク」[p] +#亜紀子 +「そ、そんな・・・」[p] +(明日香が今朝わたしに言いたがってたのはこのことだったんだわ・・・)[p] +(そんなことも知らずに私は・・・)[p] +#勝野 +「そういや梅田さんから送られてきた動画があったな。見せてやるよ、ほれ」[p] +#亜紀子 +「こ、これは・・・明日香!?」[p] +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro110-2.jpg" ] +[tb_start_text mode=1 ] +#明日香 +『・・・グスッ・・・ヒグッ・・・ッ』[p] +『ご、ご主人様・・・ほ、本日も明日香を・・・おチンポで教育していただいて・・・ありがとうございました!』[p] +#亜紀子 +「明日香・・・!あぁ・・・っ!」[p] + +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro110-1.jpg" ] +[tb_cg id="110" ] +[tb_start_text mode=1 ] +#明日香 +『こ、これからも・・・メス豚の明日香を・・・いっぱいかわいがってください・・・』[p] +『よろしくお願いします・・・』[p] +#梅田 +『声が小さい!』[p] +#明日香 +『ヒッ・・・す、すいまぜんっ!よろしくおねがいじますぅっ!!』[p] +#梅田 +『カッカッカッカ』[p] + +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro105-1.jpg" ] +[tb_start_text mode=1 ] +#亜紀子 +「あぁ・・・明日香・・・なんてこと・・・」[p] +#勝野 +「くくく、明日香のやつ鼻水垂らして泣いてやがる」[p] +「梅田さんだいぶ調教に熱が入ったみたいだな」[p] +#亜紀子 +「明日香・・・くっ・・・!」[p] +#勝野 +「まぁ梅田さんはお前もよこせって言ってるんだが・・・」[p] +「お前は俺専用として飼っておきたいんで断ってたが、こうなったら一晩くらい貸してやってもいいな」[p] + +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro105-5.jpg" ] +[tb_start_text mode=1 ] +#亜紀子 +「こ、この・・・っ!」[p] +「絶対に許さない・・・!殺してやる!!」[p] +#勝野 +「おーおー、アナル丸見えでイキがるじゃねえか」[p] +「心配しなくてもこれからお前も地獄を見るんだよ」[p] +#亜紀子 +「ぐ・・・っ、す、好きにするがいいわ・・・」[p] +「わたしを殺さない限り、絶対に復讐してやるから・・・っ!」[p] +#勝野 +「ププププッ、あぁ怖い怖い」[p] +「まぁお前はすぐに涙流しながら「もう一回俺の奴隷にしてください」って懇願することになるんだがな、クヒヒヒヒ」[p] +#亜紀子 +「だ、誰が・・・っ!」[p] +「絶対に負けない・・・絶対に・・・っ!」[p] +#勝野 +「よし、それじゃ始めるとするか。本気の調教ってやつを」[p] +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro105-2.jpg" ] +[tb_start_text mode=1 ] +#亜紀子 +「アッ!?」[p] +#勝野 +「どうした?ただの浣腸器だぞ。1リットルの大型サイズだが」[p] +「そういえばアナルは一通り開発してやったが浣腸はしたことがなかったな。俺はスカトロの趣味はないんでな」[p] +「しかし、女を屈服させるにはこれが一番。昔からの定番だぜ、ククク」[p] +# +チュウゥゥゥ・・・[p] +#亜紀子 +「アアアァァ・・・ヒッ!?」[p] +「は、入って・・・ンヒィッ!」[p] +#勝野 +「ちなみにこれは俺のじゃないぞ。大道具倉庫に置いてあったやつだ。ほんとテレビ局ってのはなんでもあるよな」[p] +「液は酢とか石鹸水とかで適当に作ったやつだ。身体にどういう影響があるかは知らんぜ、ククク」[p] +# +チュゥゥゥゥゥ・・・[p] +#亜紀子 +「ハァッ・・・くうぅぅぅ・・・ヒッ!」[p] +「や、やめて・・・お、お腹が・・・っ!」[p] +#勝野 +「おいおい、まだ半分くらいだぜ。もうちょっと我慢しろよ」[p] +# +チュゥウウウウ・・・[p] +#亜紀子 +「ヒギィーーーッ・・・も、もぅ・・・無理・・っ!」[p] +「グゥウ・・・ッ・・・ハァッハァッ・・・ンンッ!」[p] +#勝野 +「よし、もうちょっとだぞ・・・むっ」[p] +「・・・入りにくくなってきたな。あとちょっとなのに」[p] +# +グッグッ[p] +#亜紀子 +「アグゥ・・・っ!」[p] +「も、もう無理・・・それ以上は・・・っ」[p] +#勝野 +「くそっ、腹圧で押し返してくるな」[p] +「オラッ、入れッ!」[p] +# +グンッ![p] +ブチュブチュブチュッ![p] +#亜紀子 +「ィィーーーーーーーッ・・・!!」[p] +「あ・・・ヒッ・・・ハァッ・・・フゥッ!」[p] +「く・・・苦しい・・・っ!」[p] +#勝野 +「よし、全部入ったぞ」[p] +「出すんじゃないぞ・・・」[p] +# +チュポンッ[p] +#亜紀子 +「ヒィッ・・・フゥッ・・・む、無理・・・っ」[p] +「あぐ・・・で、出ちゃう・・・っ!」[p] +#勝野 +「おっと・・・!」[p] +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro105-3.jpg" ] +[tb_start_text mode=1 ] +# +ズポッ![p] +#亜紀子 +「アヒッ!?」[p] +#勝野 +「よし、アナルプラグで栓をしてやったぞ」[p] +「特大のやつだ。これでウンコしたくても出来ないだろう」[p] +#亜紀子 +「ハゥッ・・・グ・・・ハァッ」[p] +#勝野 +「どうだ、お腹がパンパンだろう」[p] +#亜紀子 +「フゥッ・・・ハァッ・・・」[p] +#勝野 +「早くも俺に逆らったことを後悔してるんじゃないのか?ククク」[p] +#亜紀子 +「グッ・・・ハフゥッ・・・クゥッ・・・」[p] +[_tb_end_text] + +[bg time="000" method="crossfade" storage="hiro105-6.jpg" ] +[tb_start_text mode=1 ] +#亜紀子 +「こ・・・これくらい・・・なんでも・・・ないわっ!」[p] +#勝野 +「ほぉー、これでも我慢するとはたいした気力だ」[p] +「それだけ俺に対する憎しみが強いってことか」[p] +#亜紀子 +「ハァッ・・・フゥッ・・・」[p] +「し・・・死んでも・・・屈したり・・・しない・・・っ」[p] +#勝野 +「ウヒャヒャヒャ、馬鹿だこいつww我慢しても何の意味もないのによww」[p] +「どのみち最後には屈することになるんだから。滑稽だねぇ、ブヒャヒャヒャ」[p] +#亜紀子 +「フゥッ・・・ハァッ・・・キッ」[p] +#勝野 +「俺に謝罪して、ウンコさせてくださいってお願いしたらさせてやるぜ?ん?」[p] +#亜紀子 +「く・・・っ・・・だ・・・誰が・・・!」[p] +「もう・・・絶対に・・・負けない・・・っ!」[p] +#勝野 +「あっそ。それじゃ俺はちょっと打ち合わせがあるから行って来るぜ」[p] +「せいぜい頑張って耐えるんだな、ククク」[p] +#亜紀子 +「な、な・・・っ!?」[p] +#勝野 +「大声で助けを呼んでもいいぜ。誰かにお前の姿を見られてもいいんならな」[p] +「まぁこの階にはほとんど人は来ないだろうがね。それじゃな」[p] +#亜紀子 +「ちょっ・・・ま、待っ・・・!」[p] +# +バタン[p] +#亜紀子 +「あぁ・・・そんな・・・グッ・・・」[p] +# +ギュルギュルギュル・・・![p] +#亜紀子 +「ハゥァッ・・・フゥッ・・・お、お腹が・・・い、痛・・・ハァッ」[p] +「ク・・・で、でも・・・ここであいつに・・・屈するなんて・・・っ!」[p] +「絶対に・・・絶対に・・・っ!」[p] +「フゥッ・・・ハァッ・・・」[p] +# +・・・・・・[p] +・・・[p] +[_tb_end_text] + +[stopbgm time="1000" ] +[mask time="1000" effect="fadeIn" color="0x000000" ] +[mask_off time="1000" effect="fadeOut" ] +[tb_start_text mode=1 ] +#亜紀子 +「グ・・・グヒッ・・・ッ・・・ンハァッ・・・!」[p] +「だ・・・ダメ・・・プラグが・・・抜けない・・・っ」[p] +「く・・・苦しい・・・っ・・・アグゥゥゥ・・・ンッ」[p] +「で、でも・・・絶対に・・・あんなやつには・・・屈しない・・・っ!」[p] +「死んでも・・・負けない・・・っ!」[p] +# +・・・・・・[p] +・・・[p] +[_tb_end_text] + +[mask time="1000" effect="fadeIn" color="0x000000" ] +[bg time="1000" method="crossfade" storage="hiro105-4.jpg" ] +[mask_off time="1000" effect="fadeOut" ] +[tb_start_text mode=1 ] +#亜紀子 +「ウギィィィ・・・ッ・・・ハァッ・・・」[p] +「もう・・・ダメ・・・グ・・・だ、誰か・・・」[p] +「誰か・・・助けてぇ・・・っ!」[p] +「誰か・・・誰か・・・居ないの!?」[p] +「ハグゥッ・・・ンヒッ・・・助け・・・てぇ・・・」[p] +「も・・・もう参りました・・・グヒッ・・・」[p] +「もう・・・参りましたから・・・」[p] +「アグッ・・・ゆ、許して・・・ください・・・っ」[p] +# +・・・・・・[p] +・・・[p] + + +[_tb_end_text] + +[mask time="1000" effect="fadeIn" color="0x000000" ] +[bg time="1000" method="crossfade" storage="hiro203.jpg" ] +[mask_off time="1000" effect="fadeOut" ] +[playbgm volume="100" time="1000" loop="true" storage="枯れ葉が集う路地裏通り_2.ogg" ] +[chara_show name="勝野" time="1000" wait="true" storage="chara/5/hiro256-1.png" width="604" height="1449" left="323" top="-22" reflect="false" ] +[tb_start_text mode=1 ] +# +ガチャッ[p] +#勝野 +「やれやれ、打ち合わせが長引いちまったぜ」[p] +「どうだ、楽しんでるか?」[p] +[_tb_end_text] + +[chara_hide name="勝野" time="1000" wait="true" pos_mode="true" ] +[stopbgm time="1000" ] +[bg time="1000" method="crossfade" storage="hiro105-4.jpg" ] +[tb_cg id="105" ] +[playbgm volume="100" time="1000" loop="true" storage="SO_SAD.ogg" ] +[tb_start_text mode=1 ] +#亜紀子 +「・・・ぅ・・・して・・・」[p] +#勝野 +「あん?聞こえねえぞ」[p] +#亜紀子 +「も・・・もう・・・許して・・・ください・・・」[p] +#勝野 +「なんだ、もう降参するのか?二度と屈しないとか言ってなかったっけ?」[p] +#亜紀子 +「ご、ごめん・・・なさい・・・っ・・・」[p] +#勝野 +「ごめんじゃ解らないだろ。何に対して謝ってるんだよ?」[p] +#亜紀子 +「さ、逆らって申し訳ありませんでした・・・っ、もう・・・二度と逆らいません・・・っ・・・う、ウンチさせてください・・・っ!」[p] +#勝野 +「なんで敬語なの?奴隷やめたんじゃなかったっけ?」[p] +#亜紀子 +「す、すいませんでした・・・っ・・・ど、奴隷です・・・っ・・・わたしは性奴隷です・・・っ!」[p] +#勝野 +「奴隷ですって言われてもなぁ。俺はもうどっちでもいいんだけど?」[p] +#亜紀子 +「あっ・・・も、もう一度奴隷にしてください・・・っ!も、もう一度・・・勝野様の奴隷にしてください・・・っ!お願いしますっ!」[p] +#勝野 +「でも絶対殺すとか言ってたしなぁ。ほんとに反省してるのかぁ?」[p] +#亜紀子 +「は、反省してますぅっ!・・・お、お願いします・・・う、ウンチさせて・・・くださいっ!」[p] +#勝野 +「ん、結局ウンコしたいだけじゃん。心から言ってないよね」[p] +#亜紀子 +「いえ・・・っ・・・ど、奴隷になりたいですっ・・・か、勝野様の奴隷になりたいです・・・っ!」[p] +#勝野 +「でも下衆の外道だよ?お前を騙してたし明日香も保身のために売ったし。そんなゲス男の奴隷になりたいの?」[p] +#亜紀子 +「は、はいっ・・・!か、勝野様の奴隷になりたいですぅぅ!」[p] +#勝野 +「これからもお前と明日香を家畜扱いしてバンバン中出しとかしちゃうけど、それでもいい?」[p] +#亜紀子 +「あぐ・・・は、はいっ・・・バンバン中出し・・・してください・・・っ」[p] +#勝野 +「・・・自分がどれだけバカだったか理解したか?」[p] +#亜紀子 +「は、はいっ!あ、亜紀子はバカでした・・・っ!これからも・・・勝野様のおチンポで・・・みっちり教育してくださいませ・・・っ!お願いしますっ!」[p] +#勝野 +「ふん・・・まぁいいだろ」[p] +「じゃ、これから縄をほどいてやるけど、勝手にウンコするなよ」[p] +「勝手にウンコしたらもう一回同じこと繰り返すからな」[p] +#亜紀子 +「はいっ!!」[p] + +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro119-1.jpg" ] +[tb_start_text mode=1 ] +#勝野 +「オラッ、手は後ろっ・・・股を限界まで開いて。顔はにっこり笑えよっ」[p] +#亜紀子 +「は、はいぃっ!」[p] +#勝野 +「録画するからな。まだ漏らすなよ」[p] +#亜紀子 +「は、はい・・・っ・・・ん・・・くっ」[p] +#勝野 +「よし、準備オーケーだ。台詞はアナウンサーらしく愛想良くはっきりとだぞ」[p] +「おーし・・・スタート!」[p] +#亜紀子 +「こ、こんばんは、Zテレビアナウンサーの千山亜紀子です・・・っ」[p] +「わ、わたしは今Zテレビの楽屋に来て・・・います。・・・グヒッ!」[p] +#勝野 +「カット!やり直し!」[p] +#亜紀子 +「アギィィ・・・も、漏れちゃいます・・・っ!」[p] +#勝野 +「うんこしたかったらNG無しで決めて見せろ」[p] +「よし、スタート!」[p] +#亜紀子 +「こんばんはっ!Zテレビアナウンサーの千山亜紀子ですっ!」[p] +「わたしは今・・・っZテレビの楽屋に来ています・・・っ!」[p] +「こ、これからっここでぇっウンチをしたいと思いますぅっ!」[p] +「皆様・・・っ亜紀子がウンチするところをぉ見ててくださいね・・・っ♥」[p] +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro119-2.jpg" ] +[tb_start_text mode=1 ] +# +ブビビビビッ![p] +ビチャビチャビチャ![p] +#亜紀子 +「アッ!?・・・そっ、それでは亜紀子っ・・・ウンチしまぁ~~~すっ♥」[p] + +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro119-3.jpg" ] +[tb_start_text mode=1 ] +# +ミチチチ・・・っ[p] +#亜紀子 +「た、ただいま・・・亜紀子のぉ肛門からっ!極太のウンチが・・・顔を出してきましたっっ・・・!」[p] +# +ムリリリ・・・ッ[p] +#亜紀子 +「あ、亜紀子の巨大で・・・くっさいウンチが・・・っ!今っ・・・!出・・・ますぅぅーーーっ!」[p] +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro119-4.jpg" ] +[tb_cg id="119" ] +[tb_start_text mode=1 ] +# +ムリムリムリムリッ![p] +#亜紀子 +「で、出ましたぁぁーーっ!亜紀子の極太ウンチが・・・っ!ひねり出されましたぁぁーーっ!」[p] +# +ムリムリムリブリブリブリ・・・っ![p] +#亜紀子 +「あぁ・・・まだ出ちゃう・・・っ!亜紀子のぉ排便っ見てぇ~~~っ♥」[p] +# +ボトッ![p] +#亜紀子 +「ハァッ・・・ハァッ・・・あ、亜紀子の排便いかがでしたでしょうか?」[p] +「み、皆様にウンチするところを見られて・・・あ、亜紀子はすごく興奮してしまいました・・・っ♥」[p] +「キャスターのくせに・・・太くて臭いウンチをしてしまったことを・・・お詫び申し上げます。大変申し訳ありませんでした・・・っ」[p] +「わたくし千山亜紀子は・・・これからもカメラの前でふ、太いウンチをひり出していくことを約束いたします。視聴者の皆様には温かく見守っていただければ幸いです」[p] +「それでは・・・あ、亜紀子のウンチブリブリ排便ニュースをお伝えしました・・・っ。明日も・・・見てねっ♥」[p] +「・・・・・・」[p] +「・・・」[p] +#勝野 +「よし、カット!」[p] +#亜紀子 +「ハァッ・・・ハァッ・・・うぅ・・・」[p] + + +[_tb_end_text] + +[stopbgm time="1000" ] +[mask time="1000" effect="fadeIn" color="0x000000" ] +[bg time="1000" method="crossfade" storage="hiro203.jpg" ] +[chara_show name="美里" time="1000" wait="true" storage="chara/1/hiro260-5n.png" width="583" height="1458" left="90" top="30" reflect="false" ] +[chara_show name="勝野" time="1000" wait="true" storage="chara/5/hiro256-3.png" width="585" height="1404" left="639" top="-31" reflect="false" ] +[mask_off time="1000" effect="fadeOut" ] +[playbgm volume="100" time="1000" loop="true" storage="bluenoise.ogg" ] +[tb_start_text mode=1 ] +#勝野 +「お前、ちょっとフライングでウンコ漏らしただろ」[p] +#亜紀子 +「ヒッ、す、すいません・・・っ!」[p] +#勝野 +「ったくしまりの無いケツの穴しやがって」[p] +「本来なら撮り直しするところだが、もう一回あんなでかいウンコ出せって言っても無理だろうしな」[p] +「・・・まぁいい。なかなか良い映像が撮れたぜ」[p] +「これをネットに流してやったらどうなるだろうなぁ、ククク」[p] +#亜紀子 +「そ、それだけは・・・っ!」[p] +#勝野 +「俺の奴隷で居続けるぐらいなら見られてもいいんじゃなかったか?」[p] +#亜紀子 +「すいませんでしたっ!ずっと勝野様の奴隷でいさせてください・・・っ!」[p] +#勝野 +「クプププッ、よっぽどお仕置きがこたえたみたいだな。ギャハハハ」[p] +「女ってのは本当に情けない生き物だぜ。浣腸一つでプライドも何も全部捨てちまうんだからな。なぁ?」[p] +#亜紀子 +「は、はい・・・おっしゃるとおりです・・・っ」[p] +#勝野 +「・・・しっかし臭いな。なんてでかいウンコだよ。恥ずかしくないのか、こんなでかいのひり出して」[p] +#亜紀子 +「も、申し訳ありません・・・っ」[p] +#勝野 +「ちゃんと毎日ウンコしないからだ」[p] +「これからは毎日『亜紀子のウンチブリブリ排便ニュース』を撮るからな。勝手にウンコするなよ」[p] +#亜紀子 +「えっ・・・は、はい・・・」[p] +#勝野 +「ウンコしたくなったら必ず俺に報告だ」[p] +「もし俺の許可なくウンコしたって判ったら・・・お仕置きだからな」[p] +#亜紀子 +「ヒッ・・・ハイッ!勝手にウンチしませんっ!」[p] +#勝野 +「ふむ、これからは心を入れ替えて忠実な性奴隷として励めよ」[p] +#亜紀子 +「はい・・・っ!が、頑張ります・・・!」[p] +#勝野 +「よし・・・それじゃ早速明日の『ウメちゃんのディープな話』の収録だが・・・」[p] +# +・・・・・・[p] +・・・[p] +[_tb_end_text] + +[stopbgm time="1000" ] +[tb_replay id="reps13" ] +[jump storage="scene11.ks" target="" ] diff --git a/data/scenario/scene11.ks b/data/scenario/scene11.ks new file mode 100644 index 0000000..d06d194 --- /dev/null +++ b/data/scenario/scene11.ks @@ -0,0 +1,845 @@ +[_tb_system_call storage=system/_scene11.ks] + +*rep14 + +[tb_replay_start ] +[mask time="1000" effect="fadeIn" color="0x000000" ] +[chara_hide_all time="1000" wait="true" ] +[bg time="1000" method="crossfade" storage="hiro118-0.jpg" ] +[tb_show_message_window ] +[mask_off time="1000" effect="fadeOut" ] +[tb_start_text mode=1 ] +#ディレクター +「本番5秒前!4!3!・・・・・・」[p] +[_tb_end_text] + +[playbgm volume="30" time="1000" loop="true" storage="オフィスの日常.ogg" ] +[tb_start_text mode=1 ] +#梅田 +「ウメちゃんのディープな話~~~!」[p] +「・・・さっ、今週も始まりました。ゲストの皆さんよろしくお願いします」[p] +#若手芸人 +「よろしくお願いします!」[p] +#アイドル +「よろしくお願いしまーす」[p] +#梅田 +「さて、千山ちゃん、今週のテーマはなんですか?」[p] +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro120-1.jpg" ] +[tb_start_text mode=1 ] +#亜紀子 +「はい、あの・・・今週のテーマを発表する前にですね・・・わたくし千山から一つ良いでしょうか・・・?」[p] +#梅田 +「ん?あなたから?なんですか?」[p] +#亜紀子 +「はい・・・あのですね・・・前回わたくし、その・・・梅田さんにお尻を触られまして・・・」[p] +#梅田 +「ちょ・・・あのことかいな。もう謝ったやん。許してよぉー」[p] +#亜紀子 +「あっ、いえ、そうではなくて・・・その・・・それで私がカッとなって梅田さんに・・・ビンタをしてしまいまして・・・」[p] +#梅田 +「あーされたされた。結構きつかったで、カカカカ」[p] +#若手芸人 +「え!梅田さんにビンタしたんですか!?すごいアナウンサーさんやな!」[p] +#アイドル +「えーーーーw」[p] +#亜紀子 +「そ、それで・・・あの・・・そのことを梅田さんに謝らないといけないと思いまして・・・」[p] +#梅田 +「えっ?なんでぇな。ええよええよ俺が悪いんやし」[p] +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro118-0.jpg" ] +[tb_start_text mode=1 ] +#亜紀子 +「いえっ・・・私が間違ってました・・・っ!」[p] +#若手芸人 +「あっ、えっ!?」[p] +#アイドル +「エーー?エーーーッ!?」[p] +[_tb_end_text] + +[stopbgm time="1000" ] +[bg time="1000" method="crossfade" storage="hiro118-1.jpg" ] +[playbgm volume="20" time="1000" loop="true" storage="烈火翔ける.ogg" ] +[tb_start_text mode=1 ] +#亜紀子 +「梅田さん、本当に申し訳ありませんでしたっ!!」[p] +#梅田 +「オイオイオイ、ちょ、やめてーや!ちょっとぉー!」[p] +#ディレクター +(おい、どういうことだ!?こんなの台本に無いぞ!)[p] +#勝野 +(いいから続けさせろ!)[p] +#亜紀子 +「う、梅田さんがバラエティに慣れてない私の緊張をほぐそうとして、気を利かせてくれたにもかかわらず、それに気づかない愚か者でした!」[p] +#梅田 +「ちょっとちょっと!なんか俺が悪モンみたいになるやーん!やめてってー!」[p] +#亜紀子 +「心のどこかで自分はキャスターだからとお高くとまってバラエティを下に見ていたんだと思います。本当に申し訳ありませんでした!」[p] +#梅田 +「ええてええて、全然怒ってへんから!立って立って!」[p] +# +実は梅田は前もってこのことを勝野から聞いて知っている[p] +というか勝野と梅田で企んで亜紀子にこの土下座の指示を出しているのだ[p] +しかし梅田は自分の好感度を下げないようにひたすら慌てて恐縮する演技をしている[p] +#亜紀子 +「前回の無礼を許していただけますか?」[p] +#梅田 +「許す許す!だから立って立って!」[p] +#亜紀子 +「ありがとうございますっ!」[p] +[_tb_end_text] + +[stopbgm time="1000" ] +[bg time="1000" method="crossfade" storage="hiro120-1.jpg" ] +[playbgm volume="100" time="1000" loop="true" storage="オフィスの日常.ogg" ] +[tb_start_text mode=1 ] +#梅田 +「いや、俺もいきなりお尻触ったの悪かったんやしさ。そない謝らんでもええがな。おあいこやんおあいこ」[p] +#亜紀子 +「寛大なお言葉ありがとうございます!もう二度と嫌な顔しませんので、これからは好きなだけセクハラしてください」[p] +#梅田 +「セクハラて、人聞き悪いがな。スキンシップやスキンシップ、な?」[p] +#亜紀子 +「あ、はいっ!すいません、スキンシップです。どんどんスキンシップしてください!」[p] +#梅田 +「そうそう、緊張をほぐしてあげようと思ってやってるんやから。どや、今日は緊張してへんか?」[p] +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro120-5.jpg" ] +[tb_start_text mode=1 ] +# +サワサワサワ[p] +#亜紀子 +「アンッ・・・は、はい、ちょっと緊張してます」[p] +#梅田 +「そらあかん、リラックスしいや。ほれ」[p] +# +モミモミモミ[p] +#亜紀子 +「アッ・・・はい、おかげさまでだいぶ緊張がほぐれてきました・・・ンッ♥」[p] +#若手芸人 +「うわぁ、いいなー!ボクもスキンシップしたいなぁー!」[p] +#梅田 +「アホ、これは司会者の特権・・・いや仕事やないか」[p] +「アシスタントの子にも気を遣ってあげる。これが良い司会者や、なっ?」[p] +# +モミモミモミ[p] +#亜紀子 +「は、はい・・・ンッ♥あ、ありがとうございます」[p] +#梅田 +「ほな、そろそろ今日のテーマいきましょか」[p] +#亜紀子 +「あ、はい、今日のテーマは・・・ンッ!?」[p] +[_tb_end_text] + +[tb_image_show time="1000" storage="default/hiro101-97.jpg" width="388" height="411" x="0" y="307" _clickable_img="" ] +[tb_start_text mode=1 ] +#梅田 +「どうした?しっかりしいや。まだ緊張してんのか?」[p] +# +グイッ[p] +#亜紀子 +「あっ!?す、すいません・・・今日のテーマはこちら・・・『無乳』です」[p] +(やっ・・・パンティを・・・)[p] +#梅田 +「無乳?なにそれ?」[p] +# +ズプッ・・・クチュッ・・・[p] +#亜紀子 +「アンッ♥・・・えー、胸の大きい女性を・・・ンッ♥・・・よ、よく「巨乳」って言いますよね」[p] +(イヤァ・・・指を・・・入れないで・・・っ)[p] +#梅田 +「言うよ。ボインちゃんやろ」[p] +# +ニュプッ・・・クニュッ・・・[p] +#若手芸人 +「それはちょっと古いっす」[p] +#亜紀子 +「ンンッ・・・♥そ、その逆でおっぱいの小さな女性は・・・ハァッ・・・「貧乳」ってよく言われますよね」[p] +(あぁ・・・カメラで撮られてるのに・・・アソコに指入れられてる・・・)[p] +#梅田 +「あー言う言う。貧乳な。キミなんかそうやん」[p] +#アイドル +「ヒドーーーーイ!私はちゃんとありますー!」[p] +# +グチュッ・・・クチュッ・・・[p] +#亜紀子 +「・・・ンンッ・・・♥」[p] +(お、音が聞こえちゃう・・・っ!)[p] +#梅田 +「なんぼよ。サイズ言ってみいや」[p] +#アイドル +「えーー・・・秘密です。でもちゃんとありますっ!」[p] +#亜紀子 +「えーー、で、「無乳」というのは・・・ンッ♥・・・その貧乳の中でも本当に小さい、あ、あるかないかよく判らないような・・・ハンッ♥・・・お、オッパイのことを言うんですね」[p] +#若手芸人 +「ちょっと梅田さんずっとお尻触ってるけど触りすぎちゃいます?千山さん大丈夫?」[p] +#亜紀子 +「あ、はい、大丈夫です!う、梅田さんにお尻を触っていただいてるおかげでだいぶリラックスできてます」[p] +#梅田 +「そやろそやろ、カッカッカ」[p] +「ほら、進行進行」[p] +# +グチュッ・・・クチュッ[p] +#亜紀子 +「アッ・・・♥は、はいっ・・・本日はそんな「無乳」を愛する「無乳」マニアの皆さんに・・・アフゥッ♥・・・お集まりいただきました。どうぞ!」[p] + + + +[_tb_end_text] + +[stopbgm time="1000" ] +[mask time="1000" effect="fadeIn" color="0x000000" ] +[tb_image_hide time="1000" ] +[bg time="1000" method="crossfade" storage="hiro118-0.jpg" ] +[mask_off time="1000" effect="fadeOut" ] +[playbgm volume="30" time="1000" loop="true" storage="オフィスの日常.ogg" ] +[tb_start_text mode=1 ] +# +番組はいつものようにマニアを称する3人をスタジオに迎え、今回は「無乳」に関して熱く語り始めるところからスタートした[p] +#梅田 +「ただ痩せてるのが好きってことじゃないん?」[p] +#マニアA +「うーん、違うんですけど、基本的に無乳って痩せてる人しか居ないんですよね」[p] +#若手芸人 +「あーそうか、ぽっちゃりしてたらその時点で胸はあるもんね」[p] +#マニアB +「そうなんですよ」[p] +#梅田 +「ロリコンとは違うん?」[p] +#マニアA、B、C +「違います!」[p] +#梅田 +「おわ!ごめんごめん、そらそうやねw」[p] +#マニアA +「一緒にされると非常に困るんですよ。我々は大人の女性なのにオッパイが全然ないという、なんていうか奥ゆかしさに惹かれるわけで」[p] +#マニアC +「そうそう、子供は無くて当たり前なんですから。なんにも興奮しませんよ」[p] +#若手芸人 +「はぁーー、そうなんや」[p] +「でも全然無いのが良いんやったら、男の胸見て興奮してしまったりとか無いの?」[p] +#マニアA +「無いですよ!」[p] +#マニアB +「話聞いてました?男なんてオッパイ無いのが当たり前じゃないですか。大人の女なのに無いというレア感がですね・・・」[p] +#梅田 +「あーわかったわかった。じゃあ例えばこのアイドルちゃんとかは?だいぶ無いけど、これはどんな感じ?」[p] +#アイドル +「わたしはありますって!」[p] +#マニアA +「いや、全然ですよ。ボクに言わせればアイドルさんは巨乳ですよ」[p] +#マニアB +「巨乳だね。うん」[p] +#アイドル +「やったーー!」[p] +#梅田 +「いや、巨乳ではないやん!貧乳やん!」[p] +#アイドル +「ちょっと梅田さんヒドーーイ!」[p] +#梅田 +「いや全然無いやん!こんなレベルじゃないんや無乳っていうのは?」[p] +#マニアC +「基本的にAカップあれば巨乳ですよ」[p] +#梅田 +「マジか!」[p] +#マニアA +「ブラジャーが必要な時点で無乳ではないですね」[p] +#アイドル +「えーーーーw」[p] +#梅田 +「じゃあこいつなんかもう論外や?」[p] +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro120-3.jpg" ] +[tb_start_text mode=1 ] +# +ムギュッ[p] +#亜紀子 +「アッ・・・!?」[p] +#マニアB +「いや・・・まぁ、そうですね。対象外ですね」[p] +#梅田 +「もう気持ち悪いんや、こんなん?」[p] +# +モミモミモミ[p] +#亜紀子 +「アッ・・・ンッ♥」[p] +#マニアA +「いや・・・まぁ、気持ち悪いとまでは・・・」[p] +#梅田 +「こっちの方がええと思うけどなぁ、揉み応えもあるし」[p] +# +モミモミモミ[p] +#亜紀子 +「ンッ・・・ハァッ♥」[p] +#若手芸人 +「ちょっと梅田さん!揉みすぎですってww」[p] +#梅田 +「なんでや、スキンシップやん。なぁ?」[p] +#亜紀子 +「アッ・・・は、はい。愛情のあるスキンシップですから・・・嬉しいです・・・アンッ♥」[p] +#アイドル +「千山さんちょっとエローーーいw」[p] +#亜紀子 +「す、すみません・・・アハハハ」[p] +# + + +[_tb_end_text] + +[stopbgm time="1000" ] +[mask time="1000" effect="fadeIn" color="0x000000" ] +[mask_off time="1000" effect="fadeOut" ] +[playbgm volume="30" time="1000" loop="true" storage="オフィスの日常.ogg" ] +[tb_start_text mode=1 ] +# +その後も梅田は番組を進行しながらも亜紀子の乳を揉み続けた[p] +#梅田 +「なるほどねぇ、無乳の女性はやっぱりかなりコンプレックスを持ってるんやねぇ」[p] +# +モミモミモミ[p] +#亜紀子 +「ンッ・・・アフゥッ・・・ハンッ♥」[p] +#マニアC +「そこが良いんですよね。なんか愛おしいっていうか、俺が評価してあげるよっていうか・・・」[p] +#梅田 +「あーそういうこともあるんや」[p] +# +モミモミモミ[p] +#亜紀子 +「アフッ・・・ン・・・ハァッ♥」[p] +#梅田 +「なるほどねぇ・・・」[p] +# +モミモミモミ[p] +#亜紀子 +「ンッ・・・アンッ♥」[p] +#梅田 +「ほら、千山ちゃん、進行進行」[p] +#亜紀子 +「えっ・・・あっ、すいません!えーっと・・・ここでVTRをご覧くださいっ」[p] +#梅田 +「ぼーっとしてたらあかんやんかw」[p] +# +モミモミモミ[p] +#亜紀子 +「アンッ・・・す、すいませんでした・・・ンンッ♥」[p] +# +VTRが流れている間も梅田の手は亜紀子の胸を執拗に揉みつづけた[p] +#亜紀子 +「ンフゥ・・・アッ・・・ンンッ♥[p] +# +強弱をつけた梅田の老練な手技に亜紀子の吐息はどんどん荒くなっていった[p] +そしてついに恐れていたことが起こってしまった[p] +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro120-4.jpg" ] +[tb_cg id="120" ] +[tb_start_text mode=1 ] +# +モミモミモミ[p] +#亜紀子 +「アゥンッ・・・アフゥッ・・・ヤァ・・・ッ♥」[p] +# +ジワ・・・[p] +#亜紀子 +「アッ・・・!?ア・・・イヤ・・・ッ♥」[p] +#梅田 +(お、出てきた出てきた。母乳出るってホンマやったんやな!)[p] +#亜紀子 +「んんっ・・・ハァンッ♥」[p] +(う、梅田さん・・・ぼ、母乳が・・・バレちゃいます・・・っ)[p] +#梅田 +(大丈夫やて、バレへんバレへん)[p] +# +モミモミモミ[p] +ジュワァァァ・・・[p] +#亜紀子 +「ハァッ・・・アヒッ♥」[p] +#梅田 +(それよりそろそろV終るで。進行しいやちゃんと)[p] +#亜紀子 +(は、はい・・・っ!・・・アンッ♥)[p] +# +VTRが終り、番組も締めの段階に入る[p] +#亜紀子 +「はい・・・以上VTRでした。えー・・・今日は「無乳」というテーマで色々掘り下げてきましたけど・・・無乳の良さが解りましたか?」[p] +#梅田 +「どうでした?若手芸人」[p] +#若手芸人 +「いやーだいぶ見方は変わりましたねー。色々コンプレックスもありながら頑張ってはるところとか、かわいいなぁと思いましたし」[p] +「なんかちょっと目覚めそうな感じはありますね」[p] +#梅田 +「アイドルちゃんはどうでした?」[p] +#アイドル +「わたしも全然胸に自信なかったんですけど~、実は自分が巨乳だったと知れてよかったです~」[p] +#梅田 +「巨乳ではないけどな?」[p] +#アイドル +「えーーーwでも、どんな胸でも好きになってくれる人はいるから、わたしも頑張ろうと思いましたw」[p] +#梅田 +「カカカカ」[p] +#亜紀子 +「えー、梅田さんはどうでしたか?」[p] +#梅田 +「いやー、俺はやっぱりでかい方がいいわ。こんくらい」[p] +# +モミモミモミ[p] +#亜紀子 +「アッ・・・アンッ♥」[p] +#アイドル +「あれ~~?千山さんなんか胸のところ濡れてません?」[p] +#若手芸人 +「ほんまや、めっちゃ濡れてる!」[p] +#ディレクター +(ん・・・?なんだあれ・・・?)[p] +(カメラ!寄って!)[p] +#カメラマン +(了解!)[p] +#亜紀子 +「エッ・・・あ、こ、これは・・・汗ですっ!」[p] +「梅田さんにたくさんスキンシップしていただいて、あ、汗が出ちゃいました!」[p] +#梅田 +「ほんまや!揉んでて全然気つかへんかったわ!」[p] +「めっちゃ濡れてるやん。ほんまに汗か?まさか乳出とるんやないやろなww」[p] +#亜紀子 +「そっ、そんなわけないじゃないですか・・・っ!う、梅田さんやめてくださいよ、アハハハ」[p] +#梅田 +「そうか子供もおらんのにオッパイ出るわけないもんな、ゴメンゴメンw」[p] +#亜紀子 +「えー、と、というわけで今回は無乳について学びました。えー・・・っと・・・そ、それではまた来週。さようなら!」[p] +#梅田 +「また来週!」[p] +# +・・・・・・[p] +・・・[p] + +[_tb_end_text] + +[stopbgm time="1000" ] +[mask time="1000" effect="fadeIn" color="0x000000" ] +[bg time="1000" method="crossfade" storage="hiro202.jpg" ] +[chara_show name="美里" time="1000" wait="false" storage="chara/1/hiro258-1.png" width="510" height="1275" left="173" top="36" reflect="false" ] +[chara_show name="勝野" time="1000" wait="false" storage="chara/5/hiro256-3.png" width="513" height="1231" left="680" top="-20" reflect="false" ] +[mask_off time="1000" effect="fadeOut" ] +[playbgm volume="100" time="1000" loop="true" storage="枯れ葉が集う路地裏通り_2.ogg" ] +[tb_start_text mode=1 ] +#勝野 +「ククク、なかなかナイスな土下座だったぜ」[p] +#亜紀子 +「くぅ・・・っ」[p] +#勝野 +「カットせずにそのままきっちり放送してやるから楽しみにしておくんだな」[p] +#亜紀子 +「あぁ・・・そんな・・・」[p] +#勝野 +「それで、この後2本撮りの2本目だが・・・解かってるだろうな?」[p] +#亜紀子 +「う・・・ほ、本当にやるんですか・・・?」[p] +「もし、バレたら・・・」[p] +#勝野 +「やるんだよ。なんだ、なにか文句でもあるのか?」[p] +#亜紀子 +「い・・・いえっ!や、やります・・・」[p] + +#勝野 +「なに、お前さえ上手くやればバレることはないし、もしなにかあっても梅田さんがなんとかしてくれるさ」[p] +「・・・よし、そろそろ時間だな。早く着替えてスタジオに来いよ」[p] +#亜紀子 +「はい・・・」[p] +[_tb_end_text] + +[chara_hide_all time="1000" wait="true" ] +[tb_start_text mode=1 ] +# +・・・・・・[p] +・・・[p] +[_tb_end_text] + +[stopbgm time="1000" ] +[mask time="1000" effect="fadeIn" color="0x000000" ] +[bg time="1000" method="crossfade" storage="hiro118-3.jpg" ] +[mask_off time="1000" effect="fadeOut" ] +[tb_start_text mode=1 ] +#ディレクター +「それでは本番5秒前!4・・・3・・・」[p] +# +・・・・・・[p] + +[_tb_end_text] + +[playbgm volume="100" time="1000" loop="true" storage="オフィスの日常.ogg" ] +[tb_start_text mode=1 ] +#梅田 +「ウメちゃんのディープな話~~~~!!」[p] +「・・・っさ、始まりました。今週のゲストはこいつらでーす」[p] +#中堅芸人 +「ちょっと!ちゃんと紹介してくださいよw」[p] +#グラドル +「どうも~~おねがいしま~~す」[p] +「あ、今度DVD出るんで買ってくださ~い」[p] +#梅田 +「こらっ!勝手に宣伝すんな!しばくぞ!」[p] +#グラドル +「キャー、怖いーーw」[p] +#中堅芸人 +「ていうか梅田さん、今日は一人ですか?」[p] +#梅田 +「え、なにが?いつも一人やけど?」[p] +#中堅芸人 +「いや、いつもアシスタントの人いてますやん」[p] +#梅田 +「あれ?そやったっけ?」[p] +「まぁまぁ今日は千山ちゃんはね、ちょっと他の番組の方にね」[p] +#中堅芸人 +「あ、そうなんですか」[p] +#梅田 +「なんで今日は一人で仕切らせてもらいます」[p] +#中堅芸人 +「大丈夫ですか?ちゃんと出来ます?」[p] +#梅田 +「出来るっちゅうねん!何年やってると思ってるねん!」[p] +「えー・・・最初は・・・なんでしたっけ?」[p] +#中堅芸人 +「できてませんやん!」[p] +#梅田 +「冗談やがな冗談」[p] +「えー、今日のテーマですね。今日のテーマは『インテリ美女』!」[p] +「頭の良い女性にしか興奮できないインテリ美女マニアの方々と、その良さを語っていきたいと思います」[p] +「・・・ということですけど、どうですかインテリ美女」[p] +#中堅芸人 +「良いですねー。僕も好きなんですよ、賢い女の人」[p] +「こんなに賢いのに自分の前では・・・みたいなギャップも良いですよね」[p] +#梅田 +「でもお前の嫁はんパッパラパーやんか」[p] +#中堅芸人 +「誰がパッパラパーやねん!」[p] +「誰が元ヤンでいまだに九九間違えるパッパラパーの嫁やねん!」[p] +#梅田 +「そこまで言うてへんがなw」[p] +#中堅芸人 +「ええかげんにしいやほんま」[p] +#梅田 +「あなたはどうなんですか、頭の方は?」[p] +#グラドル +「わたし、こう見えて国立大学出てるんですよ」[p] +#梅田 +「へーそうなん?・・・見えんなーー」[p] +#グラドル +「ちょっとーwまぁよく言われますけどw」[p] +#梅田 +「じゃあまあ早速マニアの方々に登場してもらいますか。どうぞー!」[p] + + + +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro121-1.jpg" ] +[tb_start_text mode=1 ] +# +いつものように番組はマニアの人たちとのトークの形で始まった[p] +トークに慣れていないマニアたちから話を上手く引き出すのは普段ならアシスタントの役割だが、今回は梅田が番組を上手く進行させていた[p] +本来なら自分がやらなければいけない仕事を梅田がベテランの技量でこなしている様子を、亜紀子はすぐ近くで聞いていた[p] +梅田のペニスをしゃぶりながら―――[p] + +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro121-2.jpg" ] +[tb_start_text mode=1 ] +#梅田 +「インテリ美女ってのは雰囲気だけでいいの?メガネかけてるとか。それともホンマに頭が良くないとアカンの?」[p] +#マニアA +「それはもちろんそうですね。頭がいいってことに興奮するわけですから」[p] +#亜紀子 +「チュプ・・・チュパ・・・」[p] +#梅田 +「ほんなら頭めっちゃええけど金髪でピアスしてウェーーーイ!みたいな女は?それでもええの?」[p] +#マニアA +「うーーん・・・それはちょっと・・・」[p] +#中堅芸人 +「やっぱ雰囲気やないですか?インテリっぽいのが好きなんちゃうの?」[p] +#マニアA +「いや・・・両方大事なんですよねぇ・・・」[p] +#亜紀子 +「レロレロレロ・・・っ」[p] +#マニアB +「ていうか本当に頭良い人は、それなりの雰囲気になるんですよ、おのずと」[p] +#梅田 +「でもこいつなんか見てみ?ちゃんとした大学出てこんなことなってるんやで?」[p] +#グラドル +「こんなことってなんですかwわたしはちゃんとインテリ美女ですよね?」[p] +#亜紀子 +「ジュプ・・・チュバッ・・・」[p] +#マニアB +「いやグラドルさんは国立大を出てるだけで・・・まぁ普通の人ですよ」[p] +#マニアC +「ぼくらの言うインテリってのはもっと高いレベルの話でして・・・」[p] +#グラドル +「ひどーーーーーいw」[p] +#梅田 +「あ、こんなもんインテリでも何でもないんや?」[p] +#亜紀子 +「チュプ・・・レロンレロン・・・」[p] +#マニアA +「まぁ美女の方は合格点として、インテリのほうは物足りないというか・・・」[p] +#グラドル +「くやしーーーー!」[p] +#中堅芸人 +「いや、何様やねんw」[p] +#梅田 +「確かになwキミら自身は学歴はどうなんよ?」[p] +#亜紀子 +「チュプ・・・レロレロッ」[p] +#マニアA +「わたしは一応K大のほうを・・・」[p] +#マニアB +「高卒です」[p] +#マニアC +「同じく」[p] +#梅田 +「なんや、高卒やんけお前ら!」[p] +#亜紀子 +「チュプ・・・クチュッ・・・」[p] +#マニアC +「だからこそなんですよ!高卒のボクが高学歴の才女を・・・に興奮するんですよ!」[p] +#梅田 +「あーなるほど、そういうことね。なんかわかるかもしれんわ」[p] +「ほな頭が良ければ良いほど興奮するんや?T大とか」[p] +#亜紀子 +「チュブ・・・チュプッ・・・」[p] +#マニアB +「いいですねT大。興奮しますねぇ」[p] +#マニアC +「T大っていう響きにもう興奮しますからね、グフフ」[p] +#梅田 +「あいつ確かT大ちゃうの、千山ちゃん」[p] +#亜紀子 +「・・・!・・・チュプ・・・チュパッ」[p] +#マニアA +「そう!わたし大ファンなんですよ千山アナウンサー!」[p] +「あれぞインテリ美女ですよ。美しい顔から知性がにじみ出てるし、スタイルも抜群なのがまた・・・」[p] +#亜紀子 +「ジュプッ・・・ズチュッ・・・」[p] +#マニアB +「ボクも大好きです千山アナ。インテリ美女マニアにはどストライクですよ」[p] +「今日は会えると思って楽しみにして来たのに残念です・・・」[p] +#亜紀子 +「チュブ・・・ジュプッ・・・」[p] +#梅田 +「そうなんやー、今日はたまたまね。申し訳ない。運がなかったねw」[p] +#グラドル +「まぁ代わりにわたしが居るじゃないですか、ね?」[p] +#マニアA +「はぁー」[p] +#グラドル +「ちょっとーーーーw」[p] +#亜紀子 +「ジュプッ・・・チュブッ・・・」[p] +#梅田 +「さて、いつもならこの辺で理想の女性の人に来てもらって、色んなシチュエーションを実際にやってもらうんですが・・・」[p] +「今回はナーシ」[p] +#マニアC +「えーーー!?」[p] +#マニアB +「そんなーー!」[p] +#亜紀子 +「ジュプッ・・・ジュポッ・・・」[p] +#梅田 +「ちょっと今回は用意するのが難しくてね。ほら『巨乳』とかやったらオッパイ大きい女優さんとか呼んだらええわけやけど」[p] +「インテリ美女ってなかなかそういうわけにはね」[p] +#中堅芸人 +「そうですよね、ぱっと見てわかるもんでもないですしね」[p] +#梅田 +「というわけであらかじめ理想のシーンなんかを撮ってきてもらってるんでしょ?そのⅤいきましょう」[p] +「どうぞっ」[p] +# +モニターにVTRが流れ、それを見ながらコメントをはさむ形で番組は進んでいった[p] +その間も亜紀子は進行台の下で梅田のペニスに奉仕し続けていた[p] +このVTR中にイかせろと命令されていたので、ペニスを絶頂に導こうと勝野に仕込まれた技で唇と舌を動かしていく[p] + + + +[_tb_end_text] + +[tb_start_text mode=1 ] +#亜紀子 +「チュブッ・・・ジュパッ・・・!」[p] +#梅田 +「おい、しっかりしゃぶらんかい」[p] +#中堅芸人 +「しゃぶらんかい?」[p] +#亜紀子 +「・・・!?」[p] +#梅田 +「『しゃべらんかい』って言ったんや。えらい棒読みやから」[p] +#中堅芸人 +「ああ、「しゃべらんかい」ね。しょうがないですよ素人さんなんやから」[p] +#亜紀子 +「ジュプッ・・・ジュポッ・・・」[p] +#梅田 +「ちんたらしとんなぁ。ペースを上げろペースを!」[p] +#中堅芸人 +「いや、録画ですから。いても無理ですよw」[p] +#梅田 +「いや、なんかダラダラやってるからさ」[p] +#亜紀子 +「ジュポッ・・・ジュポッ・・・ジュポッ!」[p] +#梅田 +「ええぞぉ・・・その調子や・・・」[p] +#グラドル +「いい感じですねー。マニアBさんデレデレしちゃって」[p] +#マニアB +「アハハハ」[p] +#亜紀子 +「ジュプッジュプッジュプッ!」[p] +#梅田 +「おぉ・・・いくぞー!いくぞぉー!」[p] +#中堅芸人 +「いやそんな興奮するシーンですか?w」[p] +#亜紀子 +「ジュプッ!ジュプッ!ジュプッ!」[p] +#梅田 +「・・・う・・・っ」[p] +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro121-3.jpg" ] +[tb_cg id="121" ] +[tb_start_text mode=1 ] +# +ドピュッ![p] +#亜紀子 +「ンッ・・・ンムッ!?」[p] +#梅田 +「飲めよ・・・!」[p] +#中堅芸人 +「のめよ?」[p] +#亜紀子 +「ンッ・・・ゴクッゴクッ♥」[p] +#梅田 +「いや・・・受け入れろよ!ってことやんか・・・フゥ」[p] +#中堅芸人 +「いや、受け入れますよ理想のシチュエーションなんやからw」[p] +「ちゃんと見ましょうよVTR」[p] +#梅田 +「いや、すまんすまん・・・ふぅー」[p] +#亜紀子 +「ゴクッ・・・チュゥッ♥」[p] +#梅田 +「いやぁーたまらんねー」[p] +#グラドル +「ドキドキしちゃいます~~」[p] +#亜紀子 +「ハァ・・・ハァ・・・」[p] +# +・・・・・・[p] +・・・[p] + +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro121-1.jpg" ] +[tb_start_text mode=1 ] +#梅田 +「さあVTR見ていただきましたけど、どうでしたか?」[p] +#中堅芸人 +「いやぁーインテリ美女いいですねぇー。なんかハマっちゃったかも」[p] +#梅田 +「そんなん言うたらパッパラパーの嫁が怒るんちゃうか?」[p] +#中堅芸人 +「誰がパッパラパーの嫁や!」[p] +「誰が高校のとき教科書を古本屋に売ろうとしたパッパラパーの嫁や!」[p] +#梅田 +「だからそこまで言うてへんて」[p] +「あなたはどうでしたか?」[p] +#グラドル +「いや、いいですけど、あんな女性現実にいないでしょー」[p] +#マニアA +「まぁあくまで理想ですからね。夢です」[p] +#グラドル +「夢見すぎー」[p] +#梅田 +「キミ、千山があんな風にしてきたらどうすんの」[p] +#マニアA +「そりゃぁもう・・・最高ですね。最高すぎます」[p] +#梅田 +「そやろねぇ。今日おったらやってもらえたのに残念やねぇ~」[p] +#亜紀子 +「わたしのこと呼びましたか?」[p] + +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro120-1.jpg" ] +[tb_start_text mode=1 ] +#中堅芸人 +「うわっ!?」[p] +#グラドル +「えっ!?えーーーっ!?」[p] +#マニアA +「えっ!?えっ!?・・・うわっ!?」[p] +#亜紀子 +「ど、どうも、インテリ美女の千山亜紀子です」[p] +#梅田 +「自分で言うなw」[p] +#中堅芸人 +「えっ、どうなってんの?え?どこにいたん?」[p] +#ゲラドル +「びっくりしたー!」[p] +#亜紀子 +「えー、驚かせてすいません。実は最初からずっとこの中に隠れてスタンバイしてたんですよ」[p] +#中堅芸人 +「えっ、ずっといたん?その中に!?」[p] +#梅田 +「そう、実はずっといたんですよ」[p] +「Aさんが千山ちゃんの大ファンやって事前に聞いてたんで、サプライズですよサプライズ」[p] +#グラドル +「でもそこだいぶ狭かったんじゃないですか?」[p] +#亜紀子 +「え、ええ、狭かったんで大変でした・・・アハハ」[p] +#中堅芸人 +「ずーっと声も出せないしねー」[p] +#亜紀子 +「はい、辛かったです」[p] +#梅田 +「声出さへんように、俺が【ピーーー】くわえさせてたからな」[p] +#亜紀子 +「っ!?ちょ、ちょっと、梅田さん、へ、変な事言わないでくださいよ・・・っ!アハハハ」[p] +#グラドル +「もー梅田さんたらーーw」[p] +#中堅芸人 +「・・・ん?・・・あれ?」[p] +(そういえばなんかVTR見ながら「しゃぶれ」とか・・・「飲め」とか・・・えっ?)[p] +「えっ・・・ウソ・・・もしかして・・・えっ!?」[p] +#梅田 +「なにをブツブツ言うとんねん」[p] +#中堅芸人 +「えっ・・・あっ、いや、なんでもないですっ・・・アハハハ」[p] +(ほ、ほんまにしゃぶらせてたんやこの人・・・!なんてことするんや、こわ~~~!)[p] +#梅田 +「Aさんどうですか、実物に会えて」[p] +#マニアA +「えーーー・・・いやぁ・・・びっくりしすぎてなにがなんだか・・・・」[p] +#梅田 +「ほら、もっと近くに行ったれよ」[p] +#亜紀子 +「あ、はいっ」[p] + +[_tb_end_text] + +[stopbgm time="1000" ] +[bg time="1000" method="crossfade" storage="hiro118-0.jpg" ] +[playbgm volume="100" time="1000" loop="true" storage="bluenoise.ogg" ] +[tb_start_text mode=1 ] +# +その後、マニアたちの理想のシチュエーションを寸劇で再現したりして番組は無事終了した[p] +亜紀子が本番中にフェラチオをしていたことは、勝野以外のスタッフは誰も気付くことはなかった[p] +梅田と付き合いの長い中堅芸人だけが察したようだが、梅田の怖さを知っている彼は誰にも話すことはなかった[p] +番組は数週間後放送され、好評だった[p] +・・・・・・[p] +・・・[p] +[_tb_end_text] + +[stopbgm time="1000" ] +[tb_replay id="reps14" ] +[jump storage="scene12.ks" target="" ] diff --git a/data/scenario/scene12.ks b/data/scenario/scene12.ks new file mode 100644 index 0000000..e2a6a83 --- /dev/null +++ b/data/scenario/scene12.ks @@ -0,0 +1,841 @@ +[_tb_system_call storage=system/_scene12.ks] + +[mask time="1000" effect="fadeIn" color="0x000000" ] +[bg time="1000" method="crossfade" storage="hiro201.jpg" ] +[chara_show name="美里" time="1000" wait="false" storage="chara/1/hiro258-1.png" width="508" height="1270" left="151" top="21" reflect="false" ] +[mask_off time="1000" effect="fadeOut" ] +[playbgm volume="100" time="1000" loop="true" storage="neonpurple.ogg" ] +[tb_start_text mode=1 ] +#亜紀子 +(えーっと・・・原稿はこれで大丈夫ね)[p] +(本番までは・・・まだ少し時間があるわね)[p] +#先輩アナウンサー +「よぉ千山」[p] +#亜紀子 +「あ・・・おはようございます」[p] +#先輩アナウンサー +「今日もエロい格好してるな、ニヤニヤ」[p] +#亜紀子 +「ど、どうも・・・」[p] +#先輩アナウンサー +「今日は何色のパンツ穿いてきたんだ?ん?」[p] +#亜紀子 +「な・・・せ、セクハラですよ・・・!」[p] +#先輩アナウンサー +「おいおい、何怒ってるんだよ。番組であんなに色々エロいことやってるくせに」[p] +#亜紀子 +「あ、あれは仕事で仕方なくやってるだけです!」[p] +#先輩アナウンサー +「そうなのか?お前が露出狂で好きでやってるんじゃないの?」[p] +#亜紀子 +「違います!お、怒りますよ!」[p] +#先輩アナウンサー +「わかったわかった、そう怒るなよ」[p] +「おっと、仕事仕事・・・」[p] +#亜紀子 +「・・・・・・」[p] +(みんなの私に対する態度がどんどん変わってきてる・・・)[p] +(前はきついと思われてちょっと敬遠されてる感じだったけど・・・今は逆に軽く見られるようになってきてるわ)[p] +(まぁ、あんな下品な番組にばっかり出てたらそうなるわよね・・・)[p] +「はぁ・・・」[p] +[_tb_end_text] + +[chara_show name="明日香" time="1000" wait="true" storage="chara/2/hiro257-2.png" width="527" height="1265" left="649" top="-12" reflect="false" ] +[tb_start_text mode=1 ] +#明日香 +「先輩・・・おはようございます」[p] +#亜紀子 +「あ・・・おはよう明日香」[p] +#明日香 +「先輩ごめんなさい・・・わたしがもっと早く・・・」[p] +#亜紀子 +「明日香が謝ることじゃないわ。私こそなんの役にも立たなくてごめんね」[p] +#明日香 +「そんなこと・・・!私なんかのために身代わりに・・・」[p] +#亜紀子 +「違うでしょ、元々明日香が私の身代わりになってくれたんじゃない」[p] +「わたしが自分でケリをつけようとしたけど、結局あいつの手の中で踊ってただけだった」[p] +#明日香 +「最初から先輩に相談してればこんなことには・・・」[p] +#亜紀子 +「仕方ないわ。私のことを思ってしてくれたことだし。悪いのはあいつなんだから」[p] +#明日香 +「・・・先輩昨晩は勝野に・・・?」[p] +#亜紀子 +「え、ええ・・・あなたは梅田のところ・・・?」[p] +#明日香 +「はい・・・」[p] +#亜紀子 +「・・・」[p] +#明日香 +「・・・」[p] +#亜紀子 +「・・・とにかく今は耐えるしかないわ。逆らってもどうしようもないし」[p] +「大人しく従順な性奴隷を演じましょう」[p] +#明日香 +「そうですね・・・」[p] +#亜紀子 +「・・・そろそろ本番だわ。行かないと・・・あっ」[p] +#明日香 +「どうしました?」[p] +#亜紀子 +「胸が・・・張ってきたわ」[p] +#明日香 +「だ、大丈夫ですか?」[p] +#亜紀子 +「最近どんどん乳の溜まるペースが上がってるのよね・・・」[p] +「この感じだと・・・本番に危ないかも」[p] +#明日香 +「わたしが・・・」[p] +#亜紀子 +「ダメよ。あいつに乳が張ったら報告するよう命令されてるし」[p] +「もし勝手に明日香に搾ってもらったことがバレたら、どんなお仕置きをされるか・・・」[p] +「もうお仕置きは・・・わかるでしょ」[p] +#明日香 +「そ、そうですね・・・」[p] +#亜紀子 +「やっぱり勝野に頼んで搾ってもらうわ。それじゃまた後でね」[p] +#明日香 +「はい」[p] +[_tb_end_text] + +[chara_hide name="明日香" time="1000" wait="false" pos_mode="false" ] +[bg time="1000" method="crossfade" storage="hiro202.jpg" ] +[tb_start_text mode=1 ] +#亜紀子 +(困ったわ・・・)[p] +(勝野にメールをしたけど、仕事中だからそのまま本番に出ろって・・・)[p] +(どんどん張りが強くなってきてるし・・・このままだと本番中に溢れちゃうかも・・・)[p] +#谷田 +「ち、千山さん」[p] +[_tb_end_text] + +[chara_show name="谷田" time="1000" wait="true" storage="chara/4/hiro259-4.png" width="428" height="1027" left="712" top="-9" reflect="false" ] +[tb_start_text mode=1 ] +#亜紀子 +「谷田君・・・」[p] +#谷田 +「ち、千山さん・・・あの・・・グフッグフフ・・・」[p] +#亜紀子 +(まずいわ・・・前回のことでなにか期待しちゃってるわ・・・。気づかないふりして逃げましょう)[p] +「あ、時間ね。すぐスタジオに行くわ」[p] + +[_tb_end_text] + +[stopbgm time="1000" ] +[jump storage="scene12.ks" target="*t2" cond="f.tp==0" ] +[chara_move name="美里" anim="true" time="300" effect="linear" wait="true" left="-308" top="21" width="508" height="1270" ] +[playbgm volume="100" time="1000" loop="true" storage="烈火翔ける.ogg" ] +[tb_start_text mode=1 ] +#谷田 +「ちょ・・・っ、ま、待てよ・・・っ!」[p] +[_tb_end_text] + +[chara_move name="美里" anim="true" time="70" effect="linear" wait="true" left="134" top="18" width="508" height="1270" ] +[tb_start_text mode=1 ] +#亜紀子 +「ちょ、ちょっと、なにするの谷田君!離してちょうだい!」[p] +#谷田 +「な、なんでボクを避けるんだよ・・・あ、あんなことした仲じゃないか・・・」[p] +#亜紀子 +「あ、あれは・・・あなたが無理やり・・・」[p] +#谷田 +「へ、変態なんだろ・・・?わ、わかってるんだぞ・・・!」[p] +#亜紀子 +「ち、違うわ!あ、あれは自分で書いたんじゃ・・・」[p] +#谷田 +「あ、あのあと逮捕されるかと思ってビクビクしてたけど・・・どこにも訴えたりしてないってことは、やっぱりSMプレイだったってことじゃないか」[p] +#亜紀子 +「そ、それは・・・」[p] +#谷田 +「む、無理やりお、犯されるのが、好きなんだろ?グフッ・・・グフフッ・・・」[p] +#亜紀子 +(まずい・・・完全に勘違いされちゃってるわ)[p] +(このままじゃまたレイプされちゃう・・・なんとかしないと)[p] +[_tb_end_text] + +[stopbgm time="1000" ] +[glink color="black" storage="scene12.ks" size="20" target="*ta" text="優しくなだめる" x="520" y="311" width="" height="" _clickable_img="" ] +[glink color="black" storage="scene12.ks" size="20" target="*tb" text="きつく拒否する" x="520" y="400" width="" height="" _clickable_img="" ] +[s ] +*ta + +[playbgm volume="100" time="1000" loop="true" storage="bluenoise.ogg" ] +[chara_mod name="美里" time="00" cross="false" storage="chara/1/hiro258-2.png" ] +[tb_start_text mode=1 ] +#亜紀子 +「落ち着いて谷田君、冷静に、ね」[p] +#谷田 +「ハァ・・・ハァ・・・」[p] +#亜紀子 +「もうすぐニュースの生本番だから、行かないと大変なことになっちゃうわ」[p] +#谷田 +「あ・・・そ、そうか」[p] +#亜紀子 +「だからほら、一緒にスタジオに行きましょう」[p] +#谷田 +「あ・・・はい」[p] +[_tb_end_text] + +[chara_mod name="谷田" time="0" cross="false" storage="chara/4/hiro259-2.png" ] +[tb_start_text mode=1 ] +#亜紀子 +(なんとか誤魔化せたかしら・・・?)[p] +#谷田 +「あ、あの・・・」[p] +#亜紀子 +「な、なに?」[p] +#谷田 +「ま・・・また今度・・・あ、ああいうことを・・・」[p] +#亜紀子 +「え・・・えっと・・・まぁもしかしたら・・・ね」[p] +#谷田 +「は、はい!」[p] +#亜紀子 +(あぁ・・・へんな期待を持たせちゃったわ・・・)[p] +# +・・・・・・[p] +・・・[p] +[_tb_end_text] + +[chara_hide_all time="1000" wait="true" ] +[stopbgm time="1000" ] +[jump storage="scene12.ks" target="*tend" ] +*tb + +[playbgm volume="100" time="1000" loop="true" storage="music17.ogg" ] +[chara_mod name="美里" time="200" cross="false" storage="chara/1/hiro258-4.png" ] +[tb_start_text mode=1 ] +#亜紀子 +「いい加減にして!」[p] + +[_tb_end_text] + +[chara_mod name="谷田" time="600" cross="false" storage="chara/4/hiro259-3.png" ] +[tb_start_text mode=1 ] +#谷田 +「ひゃっ!?」[p] +#亜紀子 +「わたしが誰にも言わなかったからって勘違いしないで!レイプはレイプなのよ!」[p] +#谷田 +「で、で、でも・・・ぼ、ボクは・・・」[p] +#亜紀子 +「あなたは身動きの出来ない、しゃべれない状態の女性を強姦したのよ!れっきとした犯罪よ!」[p] +#谷田 +「あ・・・そ、それは・・・」[p] +#亜紀子 +「次に同じようなことをしたら黙ってませんからね!」[p] +#谷田 +「は、はい・・・それは・・・」[p] +#亜紀子 +「ADと局アナでは立場が違うんだから、もうあまり気安く話しかけないで」[p] +#谷田 +「え・・・そ、そんな・・・」[p] +#亜紀子 +(ちょっと言い過ぎたかしら・・・?でも仕方ないわよね)[p] +「じゃあわたしはスタジオに行くから」[p] + + +[_tb_end_text] + +[chara_hide name="美里" time="1000" wait="true" pos_mode="true" ] +[tb_start_text mode=1 ] +#谷田 +「あ・・・ち、千山さん・・・!」[p] +「ああ・・・」[p] +「くそ・・・なんだよ・・・えらそうに・・・」[p] +「変態女のくせに・・・くそ・・・覚えてろよ・・・!」[p] +# +・・・・・・[p] +・・・[p] +[_tb_end_text] + +[chara_hide_all time="1000" wait="true" ] +[tb_eval exp="f.tp=2" name="tp" cmd="=" op="t" val="2" val_2="undefined" ] +[stopbgm time="1000" ] +[jump storage="scene12.ks" target="*tend" ] +*t2 + +[chara_hide name="美里" time="1000" wait="true" pos_mode="true" ] +[chara_mod name="谷田" time="60" cross="false" storage="chara/4/hiro259-1.png" ] +[tb_start_text mode=1 ] +#谷田 +「あっ・・・千山さん・・・!」[p] +「・・・前回のはたまたまだったのかな・・・」[p] +「・・・もう一回千山さんとあんなことをしたいなぁ・・・ハァハァ」[p] +# +・・・・・・[p] +・・・[p] +[_tb_end_text] + +[chara_hide_all time="1000" wait="true" ] +*tend + +[jump storage="q1.ks" target="*q1-3" ] +*qb + +[jump storage="end2.ks" target="" cond="f.tp==2" ] +*rep21 + +[tb_replay_start ] +[mask time="1000" effect="fadeIn" color="0x000000" ] +[chara_hide_all time="1000" wait="true" ] +[bg time="1000" method="crossfade" storage="hiro204.jpg" ] +[tb_show_message_window ] +[chara_show name="美里" time="1000" wait="true" storage="chara/1/hiro260-5.png" width="586" height="1465" left="630" top="11" reflect="false" ] +[chara_show name="勝野" time="1000" wait="true" storage="chara/5/hiro256-3.png" width="619" height="1486" left="-18" top="-54" reflect="false" ] +[mask_off time="1000" effect="fadeOut" ] +[playbgm volume="100" time="1000" loop="true" storage="bluenoise.ogg" ] +[tb_start_text mode=1 ] +#亜紀子 +「本日もドスケベな亜紀子をおチンポでみっちりと教育してくださいませ。よろしくお願いします」[p] +#勝野 +「ククク、お前もすっかり従順な性奴隷になったな」[p] +「もう俺のチンポなしでは生きていけないか?」[p] +#亜紀子 +「は、はい。勝野様のおチンポ無しではもう生きていけません」[p] +#勝野 +「俺のことを愛してるか?」[p] +#亜紀子 +「は・・・はい、あ、愛してます・・・っ」[p] +#勝野 +「ククク、ウソつけ。お仕置きが怖いから逆らわずに従順にしておこうってだけだろ」[p] +#亜紀子 +「そ、そんなことは・・・」[p] +#勝野 +「まだ俺のことが憎くてしょうがないんだろう?わかってるぞ」[p] +「チンポに病み付きになってるのは半分本当だろうがな、クククク」[p] +#亜紀子 +「・・・・・・」[p] +#勝野 +「ということで、今日はちょっと試験をしようと思ってな」[p] +#亜紀子 +「試験・・・?」[p] +#勝野 +「そうだ。楽しい夜になるぞ今夜は・・・クヒヒヒ」[p] +「・・・お、来たな」[p] + +[_tb_end_text] + +[chara_hide name="勝野" time="1000" wait="true" pos_mode="false" ] +[chara_show name="明日香" time="1000" wait="true" storage="chara/2/hiro257-2.png" width="586" height="1406" left="32" top="-11" reflect="false" ] +[tb_start_text mode=1 ] +#明日香 +「あ・・・お、遅くなりました」[p] +#亜紀子 +「明日香・・・」[p] +#勝野 +「おう、2人一緒に呼ぶのは久しぶりだったな」[p] +「今日はお前ら2人を試験する」[p] +#明日香 +「し、試験・・・ですか?」[p] +#亜紀子 +「それはどんな・・・」[p] +#勝野 +「お前らのどっちが優秀な性奴隷かを決めるんだ」[p] +「とにかく俺に気に入られたほうが勝ちだ。単純なゲームだろう」[p] +#亜紀子 +「は、はい・・・」[p] +(なんて悪趣味なのかしら・・・)[p] +#勝野 +「あんまりやる気が無さそうだな?」[p] +#亜紀子 +「い、いえっ、そんなことはありません・・・」[p] +#勝野 +「ふん、確かにただ勝負しても面白くないわな。これじゃテレビマン失格だ」[p] +「というわけで負けたほうには罰ゲームを与える」[p] +#明日香 +「ば、罰ゲーム・・・?」[p] +#亜紀子 +「・・・・・・」[p] +(罰ゲーム・・・どうせ酷いことをされるんでしょうけど、そんなことで頑張ると思ったら大間違いよ)[p] +(明日香を酷い目に合わせるわけにはいかないわ。ここは適当に私が負けて・・・)[p] +#勝野 +「負けたほうは解雇だ。もう性奴隷として使わない」[p] +#亜紀子 +「・・・・・・えっ!?」[p] +#明日香 +「え・・・?」[p] +#勝野 +「勝負に負けたほうはもう用済みだ。解放してやる」[p] +[_tb_end_text] + +[chara_mod name="美里" time="300" cross="false" storage="chara/1/hiro261-3bk.png" ] +[tb_start_text mode=1 ] +#亜紀子 +「えっ・・・負けたほうは解放・・・?」[p] +「ほ、本当に・・・?」[p] +#勝野 +「あぁ、本当だ」[p] +「まぁ動画は念のため残しておくがな。もう俺が呼び出すことは無い」[p] +#明日香 +「か、解放・・・」[p] +#勝野 +「まぁ俺もさすがに2人も性奴隷を相手にするのがしんどくなってきてな」[p] +「残った一人をじっくりと俺好みの性奴隷に育てて末永くかわいがってやろうかと思ってな」[p] +#亜紀子 +「しょ、勝負に負けたほう・・・つまり勝野様に気に入られなかったほうが解放されるんですよね・・・?」[p] +#勝野「そうだ。気に入った方を残すんだ。当たり前だろ」 +#亜紀子 +「負けたほうが解放・・・」[p] +(つまり勝負に勝てば・・・明日香を自由にしてあげられるってこと・・・!)[p] +(わたしはもうどうなってもいいとあきらめてたけど・・・私のせいで巻き込まれた明日香だけが気がかりだった・・・)[p] +(それが、明日香を解放してあげられる・・・!)[p] +(この勝負・・・絶対に勝たないといけないわ!)[p] +#明日香 +「・・・・・・」[p] +(勝負に勝てば先輩を自由にして上げられる・・・)[p] +(先輩はキャスターとして羽ばたいて欲しい・・・こんなことで道を閉ざされていい人じゃない)[p] +(わたしも先輩に憧れてこの世界に入ったけど・・・もう元には・・・)[p] +(でも先輩は強いから・・・先輩なら立ち直れる。きっとまた輝いていた先輩に戻れるはず・・・!)[p] +(この勝負に勝って、わたしが先輩を助けるんだ・・・!)[p] + +[_tb_end_text] + +[chara_mod name="美里" time="200" cross="false" storage="chara/1/hiro260-6.png" ] +[tb_start_text mode=1 ] +#勝野 +「これからもずっと俺に奴隷としてかわいがって欲しければ頑張ってアピールしろよ」[p] +「もう奴隷は嫌で、自分だけでも逃げ出したいと思うなら手を抜けばいいがな、ククククッ」[p] +#亜紀子 +「が、頑張りますっ!」[p] +#明日香 +「え、先輩・・・あ、わ、私も頑張ります・・・!」[p] +#勝野 +「ククク、それじゃまずはアピールタイムといこうか」[p] +[_tb_end_text] + +[chara_hide_all time="1000" wait="true" ] +[bg time="1000" method="crossfade" storage="hiro144.jpg" ] +[tb_start_text mode=1 ] +#勝野 +「明日香、お前は俺の奴隷を続けたいか?」[p] +#明日香 +「はいっ!奴隷でいたいです!これからもずっと勝野様の奴隷でいさせてください!お願いします!」[p] +#亜紀子 +(あ、明日香・・・)[p] +(あなたも私の為に自分を犠牲にしようとしてくれているのね・・・)[p] +(でも自由になるべきなのはあなたよ・・・絶対に負けられないわ!)[p] +#勝野 +「亜紀子、お前はどうだ?俺の奴隷でいたいか?」[p] +#亜紀子 +「はいっ!亜紀子は勝野様のおチンポで教育していただいて、身も心も完全な奴隷になりました!」[p] +「亜紀子はもう勝野様のおチンポ無しでは生きていけません!どうかこれからもドスケベな亜紀子を可愛がってくださいませ!お願いしますっ!」[p] +#明日香 +「せ、先輩・・・」[p] +#勝野 +「ウヒャヒャヒャ!よくそんなセリフ言えたな!」[p] +「あの反抗的だったお前がそこまでプライドを捨てるとはな。明日香を助けようとして必死じゃないか、え?」[p] +#亜紀子 +「い、いえっ、そんなことはありません!」[p] +「これまでは愚かにも偉大な勝野様に反抗的な態度をとって申し訳ありませんでしたっ!」[p] +「勝野様にご指導いただいて自分がいかに愚かなメスだったのかを学ばせていただきました・・・っ」[p] +「もう二度と逆らいません。どうぞ亜紀子をこれからもお傍に置いて下さいませっ!」[p] +#勝野 +「ウハハハッ、偉大な勝野様か。そこまでいくとイヤミだぜ」[p] +「・・・まぁいい、そのアピールは評価してやろう」[p] +「よし、それじゃ今度はチンポをおねだりしてみろ」[p] +「どっちが俺が喜ぶおねだりをできるかな?」[p] +#明日香 +「お、おチンポをくださいっ!勝野様のおチンポが欲しくてしょうがないんですっ!」[p] +「勝野様の立派なおチンポで明日香をいっぱい可愛がってくださいっ!」[p] +#亜紀子 +「ドスケベな亜紀子に勝野様のおチンポをお恵みくださいませぇっ♥」[p] +「亜紀子は毎晩バイブで自分を慰めていた変態ですっ」[p] +「勝野様のおチンポに屈服してわたしは本当のメスの悦びを知りましたっ」[p] +「今日も亜紀子のいやらしいオ○ンコとアナルに勝野様のおチンポでみっちりとお仕置きをしてくださいませぇっ♥」[p] +#明日香 +「せ、先輩・・・っ」[p] +#勝野 +「ムハハハッ!おねだりは亜紀子の方が一枚も二枚も上手だな」[p] +「演技に気合が入りすぎて明日香が引いちまってるじゃねえか、ヒャハハハ!」[p] +#亜紀子 +「ほ、本心です。勝野様のおチンポが欲しくてしょうがないんですぅ♥」[p] +#勝野 +「ククク・・・まぁいいだろう。次は実践に入るぞ」[p] + +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro145-1.jpg" ] +[tb_start_text mode=1 ] +#勝野 +「ほれ、足だ。好きにしていいぞ」[p] +#亜紀子 +「ハイッ!失礼しますっ!・・・アムッ!」[p] +「ムチュッ・・・チュバッ・・・レロレロッ!」[p] +#勝野 +「ククク、迷わずしゃぶりつきやがった」[p] +「今日は風呂も入ってないし汚いままなんだがな。そのくっさい足にしゃぶりつくとはやるじゃないか」[p] +#明日香 +「ハッ・・・ペロッ・・・ペロッ!」[p] +#亜紀子 +「ンチュッ!チュバッ!ゴクンッ♥」[p] +「チュブッ!レロレロレロッ・・・ゴクッ♥」[p] +#勝野 +「足の汚れを舌で擦り取って臭いエキスを飲み込んでやがるww」[p] +「どうだ、一日働いた俺の蒸れ蒸れの足の味は?」[p] +#亜紀子 +「ンチュ・・・チュポンッ♥」[p] +「はいっ、苦しょっぱくて・・・臭くてとっても美味しいですっ♥」[p] +「ハムッ・・・チュバッ・・・レロレロレロン・・・ゴクッ♥」[p] +#明日香 +「ん・・・ペロペロペロっ」[p] +「ペロッ・・・ペロッ・・・うっ」[p] +#明日香 +「どうした明日香、そんなに俺の足の裏は臭いか?」[p] +#明日香 +「い、いえっ・・・お、美味しいですっ・・・ペロペロッ」[p] +#亜紀子 +「チュバッ!チュゥーー・・・ゴクッ♥」[p] +「チュブッ・・・レロレロレロッ・・・ゴクッ♥」[p] +#勝野 +「ククク、一本一本丁寧にしゃぶるじゃねえか。まだ左足もあるからゆっくり味わえよ」[p] +#亜紀子 +「チュポッ・・・は、はいっありがとうございますっ!・・・ハムッ♥」[p] +#明日香 +「ペロッペロッ・・・うっ」[p] +(く、臭い・・・っ!でもこのままじゃ負けちゃう・・・!)[p] +「ペロペロペロッ!」[p] +[_tb_end_text] + +[mask time="1000" effect="fadeIn" color="0x000000" ] +[mask_off time="1000" effect="fadeOut" ] +[tb_start_text mode=1 ] +#亜紀子 +「チュプッ・・・レロレロレロッ・・・ゴクンッ♥」[p] +「チュバッ・・・チュバッ・・・チュポッ♥・・・ハァッ・・・ハァッ」[p] +#勝野 +「終ったか?」[p] +#亜紀子 +「は、はいっ、全て綺麗にさせていただきましたっ」[p] +#勝野 +「ごくろうさん。結局ほとんど亜紀子がしゃぶり尽くしてしまったな」[p] +#亜紀子 +「滅相もございませんっ。勝野様の足をしゃぶらせていただいてありがとうございましたっ!」[p] +#明日香 +「あぁ・・・先輩・・・」[p] +#勝野 +「今のところ亜紀子が一歩リードだな。明日香はもっと頑張らないと奴隷解雇だぞ?」[p] +#明日香 +「あぁっ・・・が、頑張りますっ!」[p] +#亜紀子 +「・・・・・・」[p] +(いい感じだわ。・・・この調子で頑張りましょう)[p] +#勝野 +「よし、次はお待ちかねのチンポだ」[p] + +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro145-2.jpg" ] +[tb_start_text mode=1 ] +#勝野 +「どうだ、しゃぶりたいか?」[p] +#明日香 +「はいっしゃぶりたいです!しゃぶらせてくださいっ!」[p] +#亜紀子 +「あぁ勝野様のおチンポっ!亜紀子めにしゃぶらせてくださいませぇっ♥」[p] +#勝野 +「ダメだ。どっちかが咥えたら不公平だからな。舐めろ」[p] +#明日香 +「は、はいっ!・・・ぺろぺろっ」[p] +#亜紀子 +「はいっ失礼しますっ!ペロッペロッペロッ!」[p] +#勝野 +「さあどっちの舌技が上かな?ククク」[p] +#亜紀子 +「ンッ・・・レロレロレロッ・・・チュムッ♥」[p] +(裏スジをこするように・・・)[p] +#明日香 +「ペロッ・・・チュッ・・・レロレロンッ」[p] +#亜紀子 +「レロッレロッ・・・チュッ♥」[p] +(明日香・・・あなたを助けたいのよ。お願いだから手を抜いて・・・!)[p] +#明日香 +「チュッ・・・ペロッ・・・レロレロレロッ」[p] +(先輩・・・こんな勝野に媚びへつらう先輩は見たくないです・・・っ)[p] +#勝野 +「ほぉ、フェラは毎日しゃぶらせてる亜紀子の圧勝かと思ったが、明日香もなかなか頑張るじゃないか」[p] +#明日香 +「チュッ・・・ペロッ・・・レロレロッ!」[p] +#亜紀子 +「ンッ・・・レロレロレロッ」[p] +(明日香・・・尿道から出るカウパーを全部舐めとる気ね・・・わたしも頑張らないと・・・!)[p] +#明日香 +「レロッ・・・チュプッ・・・」[p] +(あっ・・・先輩の舌が・・・当たっちゃう・・・)[p] +#亜紀子 +「ンチュッ・・・レロッ・・・レロレロン♥」[p] +#明日香 +「あぁ・・・レロッ・・・チュッ♥」[p] +#勝野 +「おいおい、レズショーを見たいんじゃないぞ。同じとこばっか舐めてないでもっと色々舐めろ」[p] +#亜紀子 +「はいっ・・・ンッ・・・ハムッ」[p] +#勝野 +「おっ、玉袋にいったか。いいぞ」[p] +「今日も暑かったからな。たっぷりと汗をかいたからしっかりと綺麗にしてくれよ」[p] +#亜紀子 +「ンムッ・・・チュバッ・・・レロレロッ♥」[p] +(うっ・・・く、臭い・・・汗が苦い・・・っ)[p] +#明日香 +「レロッレロッ・・・チュパッ」[p] +#亜紀子 +「ハムッ・・・モゴモゴ・・・ゴクッ♥」[p] +「チュプッ・・・レロレロレロッ・・・♥」[p] +#勝野 +「美味そうに蒸れ蒸れ金玉しゃぶりやがって・・・参考までに夏の汗クサ金玉袋はどんな味か教えてくれよ」[p] +#亜紀子 +「チュポッ・・・は、はいっ、足の10倍臭くて・・・すごく苦くて美味しいですっ・・・ハムッ♥」[p] +「チュプッ・・・レロレロレロッ・・・ゴクッ♥」[p] +#明日香 +「くっ・・・レロレロレロッ!」[p] +#勝野 +「ククク・・・一時間くらい舐めさせてもいいが、とりあえずそのへんでいいだろう」[p] +「ちょっとその前に小便をしてなかったから催してきちまったぜ」[p] + +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro145-3.jpg" ] +[tb_start_text mode=1 ] +#勝野 +「さて、トイレに行って小便をするか・・・な」[p] +#明日香 +「・・・・・・」[p] +#亜紀子 +(ハッ・・・!)[p] +「あっ、か、勝野様、トイレまで行く必要はありません。お小水でしたら私の口にどうぞっ!」[p] +#明日香 +「・・・えっ!」[p] +#勝野 +「おいおい、トイレはすぐそこだぞ。それに口に小便なんかしたらこぼれちまうだろう」[p] +#亜紀子 +「いえっ、こぼさずに全部飲ませていただきますっ!どうぞ亜紀子の口を便器としてお使いくださいませっ♥」[p] +#明日香 +「せ、先輩・・・」[p] +#勝野 +「ククク、そんなに俺の小便が飲みたいのか?昼から小便してないし、汗一杯かいたから濃い~~のが出るぞ?」[p] +#亜紀子 +「はいっ、勝野様の濃いおしっこを飲ませてくださいませっ♥」[p] +#勝野 +「ククク、そこまで言われたら仕方がないな。小便を飲ませてやるよ」[p] +#亜紀子 +「あ、ありがとうございますっ!」[p] +#勝野 +「よし、口を開けろ便器女」[p] +#亜紀子 +「は、はいっ」[p] +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro145-4.jpg" ] +[tb_cg id="144" ] +[tb_start_text mode=1 ] +#勝野 +「勃ってるからなかなか出ないな・・・」[p] +「よし・・・出るぞ・・・」[p] +# +ジョボボボボボボ・・・[p] +#亜紀子 +「ゴボッ・・・ガボッ・・・ゴクッゴクッ♥」[p] +「ゴボボボッ・・・ゴクッゴクッゴクッ♥」[p] +# +ジョボボボボ・・・[p] +#亜紀子 +「ゴボボボ・・・ゴクッゴクゴクゴクッ♥」[p] +#明日香 +「あ・・・わ、わたしにも・・・」[p] +#勝野 +「もう遅い。お前は大事な先輩が小便飲んでるところをよーく見ておけ」[p] +# +ジョボボボボ・・・[p] +#亜紀子 +「ングッ・・・ゴクッゴクッゴクッ♥」[p] +「ゴボッ・・・ガボッ・・・ゴクゴクゴクゴクッ♥」[p] +#勝野 +「おい、しっかり飲まないと溢れるぞ。こぼしたらお前の負けにするぞ」[p] +# +ジョボボボボ・・・[p] +#亜紀子 +「ゴボッ・・・ゴクゴクゴクッ・・・ゴクゴクッ♥」[p] +「ガボボッ・・・ガブガブッ・・・ゴクゴクゴクッ♥」[p] +# +ジョボボボ・・・チョロッ[p] +#亜紀子 +「ガブッ・・・ゴクッ・・・ゴクゴクッ♥[p] +「ゴクッ・・・ハァッ・・・ゲホッ・・・ゲホッ」[p] +#勝野 +「ふう、すっきりしたぜ。人間便器も良いもんだな。ククク」[p] +#亜紀子 +「ガフッ・・・ハァハァッ・・・ゴホッ」[p] +#勝野 +「どうした、苦しかったか?やっぱり嫌々やってたんじゃないのか?」[p] +#亜紀子 +「い、いえっ・・・お、おいしい小便を飲ませていただいてありがとうございました・・・っ」[p] +#勝野 +「クハハハッ、殺したいほど憎い男に便器として使われる気分はどうだ?」[p] +#亜紀子 +「い、いえっ、尊敬する勝野様に便器として使っていただいて亜紀子は幸せですっ♥」[p] +#勝野 +「ヒャハハハ、どうだ、明日香。これがプライドを完全に捨てた先輩の姿だぞ」[p] +#明日香 +「せ、先輩・・・」[p] +#亜紀子 +(明日香、そんな目で見ないで・・・あなたのためなのよ・・・)[p] +#勝野 +「ククク、なかなか笑わせてもらったぜ」[p] +「だが、とにかくここまでは亜紀子が一歩リードなのは間違いないな」[p] +#明日香 +「そ、そんな・・・」[p] +#勝野 +「だが次の勝負はどうかな?ククク」[p] +[_tb_end_text] + +[tb_hide_message_window ] +[stopbgm time="1000" ] +[mask time="1000" effect="fadeIn" color="0x000000" ] +[bg time="1000" method="crossfade" storage="hiro107-1.jpg" ] +[tb_show_message_window ] +[mask_off time="1000" effect="fadeOut" ] +[playbgm volume="100" time="1000" loop="true" storage="music16.ogg" ] +[tb_start_text mode=1 ] +#勝野 +「どれ・・・こんなもんかな」[p] +「ククク、なかなかいい眺めだぜ。わが局の人気アナウンサー二人のマ○コとアナルが丸見えだぜ」[p] +「どうだ縛られた気分は?」[p] +#亜紀子 +「はいっ、縛っていただいて興奮しています」[p] +#明日香 +「も、もっといじめてくださいっ」[p] +#勝野 +「ふふん、媚びの姿勢を崩さないな」[p] +「だが、これを見てもまだその余裕を見せられるかな?」[p] +#明日香 +「そ、それは・・・!」[p] +#亜紀子 +「か、浣腸・・・ヒッ!」[p] +#勝野 +「おっと、どうした亜紀子?浣腸は嫌いか?」[p] +#亜紀子 +「い、いえ・・・そんなことは・・・」[p] +#勝野 +「クククク、一度こいつで地獄を見てるからな。恐怖で顔が引きつってるぞ」[p] +#亜紀子 +「・・・・・・っ」[p] +#勝野 +「さぁ浣腸が欲しいのはどっちだ?おねだりしてみろ」[p] +#明日香 +「わ、わたしに下さいっ!浣腸してくださいっ!」[p] +#亜紀子 +「わ、わたしに浣腸を下さいませっ・・・勝野様っ」[p] +#明日香 +「わ、わたしのアナルに浣腸をくださいっ・・・お願いします勝野様っ♥」[p] +#勝野 +「ククク、よーしいいだろう。明日香に浣腸をくれてやるぞ」[p] +#亜紀子 +「あっ・・・」[p] +#明日香 +「ありがとうございますっ!」[p] +#勝野 +「そーれ・・・いくぞ」[p] + +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro107-3.jpg" ] +[tb_start_text mode=1 ] +# +ズプッ[p] +#明日香 +「ンッ・・・!」[p] +#勝野 +「ほぉれ、入れていくぞ・・・」[p] +# +ズチュゥ~~~~ッ[p] +#明日香 +「ンヒッ・・・ア・・・クッ・・・」[p] +#亜紀子 +「あ、明日香・・・」[p] +#勝野 +「ククク、もう少しだ・・・」[p] +# +プチュ~~~ッ[p] +#明日香 +「う・・・く・・・ンハァッ♥」[p] +#勝野 +「よーし入ったぞ」[p] +「いいって言うまで出すなよ」[p] +#明日香 +「は、はい・・・っ」[p] + +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro107-1.jpg" ] +[tb_start_text mode=1 ] +#勝野 +「さて、浣腸はまだあるけど、どうするかなぁ?」[p] +#亜紀子 +「わ、わたしにも下さい勝野様っ!お浣腸が欲しいですっ!」[p] +#勝野 +「くくく、無理しやがって。・・・まぁいいだろう、お前にもくれてやる」[p] +#亜紀子 +「あ、ありがとうございますっ」[p] +#勝野 +「ほれっ」[p] +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro107-2.jpg" ] +[tb_start_text mode=1 ] +# +ズプッ![p] +#亜紀子 +「アヒッ・・・!」[p] +#勝野 +「おーし、入れていくぞ」[p] +# +プチュ~~~~ッ[p] +#亜紀子 +「アグッ・・・ヒッ・・・クゥッ・・・!」[p] +#勝野 +「ククク、どうした、そんなに浣腸が気持ちいいか?」[p] +#亜紀子 +「グッ・・・は、ハヒッ・・・き、ぎもちいいです・・・ンヒィッ!」[p] +#勝野 +「ブハハハッ!そうかそうか気持ちいいか。そーれ、しっかり味わって飲めよっ」[p] +# +ブチュ~~~~ッ[p] +#亜紀子 +「ヒギィ~~~ッ・・・グッ・・・フッ・・・ンハァッ!」[p] +#勝野 +「よし、全部入ったな」[p] + + +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro107-1.jpg" ] +[tb_start_text mode=1 ] +#勝野 +「ククク、どうだ苦しいか?」[p] +#明日香 +「い、いえ・・・大丈夫です・・・っ」[p] +#亜紀子 +「ハァッ・・・だ、大丈夫・・・ですっ・・・クッ・・・」[p] +#勝野 +「ククク、亜紀子の方はだいぶ苦しそうじゃないか」[p] +「・・・ところで浣腸はもう一本分あるんだがな」[p] +「浣腸のおかわりが欲しいのはどっちかな?」[p] +#亜紀子 +「お、おかわり・・・」[p] +#明日香 +「わ、わたしにください・・・っ。浣腸もう一本・・・くださいっ」[p] +#亜紀子 +「明日香・・・」[p] +(ど、どうしよう・・・)[p] +(正直一本でも既に苦しいし・・・もう一本浣腸なんて怖すぎるけど・・・)[p] +(でもこのままじゃ明日香が勝負に勝っちゃう・・・そうなったら明日香はずっと奴隷のまま・・・。それは絶対にダメよ!)[p] +(・・・でも浣腸は怖い・・・一体どうすれば・・・!?)[p] +[_tb_end_text] + +[tb_hide_message_window ] +[stopbgm time="1000" ] +[tb_replay id="reps21" ] +[glink color="black" storage="scene13.ks" size="20" text="全力で浣腸をおねだりする" x="486" y="352" width="" height="" _clickable_img="" ] +[glink color="black" storage="scene14.ks" size="20" text="やっぱり浣腸は怖い" x="509" y="456" width="" height="" _clickable_img="" ] +[s ] diff --git a/data/scenario/scene13.ks b/data/scenario/scene13.ks new file mode 100644 index 0000000..7399e67 --- /dev/null +++ b/data/scenario/scene13.ks @@ -0,0 +1,651 @@ +[_tb_system_call storage=system/_scene13.ks] + +*rep22 + +[tb_replay_start ] +[stopbgm time="1000" ] +[chara_hide_all time="1000" wait="true" ] +[bg time="1000" method="crossfade" storage="hiro107-1.jpg" ] +[tb_show_message_window ] +[playbgm volume="100" time="1000" loop="true" storage="music16.ogg" ] +[tb_start_text mode=1 ] +#亜紀子 +(浣腸は怖いけど・・・やっぱり明日香を見捨てるわけにはいかない・・・っ!)[p] +「勝野様っ、亜紀子にお浣腸をもう一本くださいっ♥」[p] +#勝野 +「ククク、浣腸嫌いなんじゃなかったのか?無理するなよ?」[p] +#亜紀子 +「はいっ、浣腸は嫌いです・・・でも、亜紀子は酷いことをされればされるほど興奮するド変態なんですぅっ♥」[p] +「ドスケベマゾ豚の亜紀子のケツ穴にたっぷり浣腸をぶち込んで、もっと苦しませていじめてくださいませぇっ♥」[p] +「そして亜紀子のケツ穴からくっさいウンチがブリブリ出るところを見て笑ってくださいましぃーっ♥」[p] +#明日香 +「せ、先輩・・・」[p] +#勝野 +「ウヒャヒャヒャ!よくそこまで思い切れるな!明日香も引いてるじゃねえかww」[p] +「そこまでの台詞は100%の演技じゃ出てこないぜ。半分本音も入ってるんだろうこのド変態め!」[p] +#亜紀子 +「は、はい、本心ですっ。亜紀子は正真正銘ドスケベのド変態なんですっ♥」[p] +#勝野 +「よーし、そこまで言うならお前に2本目の浣腸をくれてやろう」[p] +「おらよっ」[p] +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro107-2.jpg" ] +[tb_start_text mode=1 ] +# +ズプッ![p] +#亜紀子 +「ンヒッ・・・!」[p] +#勝野 +「ほれっ2本目だ、よく飲めよ!」[p] +# +ブチュチュ~~~ッ![p] +#亜紀子 +「ヒグッ!・・・ンハァッ・・・フッ・・・クッ・・・!」[p] +#明日香 +「あぁ・・・先輩・・・っ!」[p] +#勝野 +「おら、力を抜け。入らないだろ」[p] +#亜紀子 +「は・・・はひっ・・・フゥッ・・・フゥッ・・・」[p] +#勝野 +「オラッ、よっ!」[p] +# +ブチュブチュブチュ~~~~ッ![p] +#亜紀子 +「ハグッ・・・ウヒッ・・・ハウッ!」[p] +#勝野 +「よし、なんとか全部入ったな。まだ出すなよ」[p] +#亜紀子 +「は・・・ヒッ・・・フゥッ・・・ンハァッ」[p] +# +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro107-1.jpg" ] +[tb_start_text mode=1 ] +#勝野 +「さてと、今日のゲームもそろそろ終盤だ」[p] +「ここで最終アピールタイムだ。ウンコを我慢しながら俺の奴隷でいたいという熱意をアピールしろ」[p] +#明日香 +「あ、明日香は勝野様のおチンポ無しでは生きていけませんっ!奴隷でいさせてくださいっ!お願いしますっ!」[p] +#亜紀子 +「亜紀子は・・・勝野様のおチンポで・・・クヒッ・・・か、管理していただかないと生きてゆけない・・・ハァッ・・・ド変態な家畜ですっ♥」[p] +「お、愚かでドスケベな亜紀子を・・・ウグッ・・・こ、これからも勝野様のおチンポでご指導してくださいませぇっ♥」[p] +#勝野 +「うーむ、どっちも悪くないな」[p] +「ここまでの競争ではどちらも甲乙つけがたいから、最終ゲームで勝敗を決めるとしよう」[p] +「これに勝ったほうを奴隷として飼い続けてやる。負けたほうはお払い箱だ」[p] +#明日香 +「さ、最終ゲーム・・・」[p] +#亜紀子 +(そ、そんな・・・あんなに頑張ったのに・・・最後のゲームで決まってしまうなんて・・・ゲームって一体どんな・・・)[p] +#勝野 +「最終ゲームは『ドキドキ♥排便我慢対決』~~~、パチパチパチ!」[p] +#亜紀子 +「は、排便我慢・・・えっ、ま、まさか・・・!」[p] +#勝野 +「ルールは簡単。ウンコを先に漏らしたほうが負けだ」[p] +#亜紀子 +「そ、そんな・・・っ!」[p] +#勝野 +「お前らがお互いを助けるために必死に頑張って演技してたのはなかなか面白い見物だったぜ」[p] +「最後は単純明快な忍耐力勝負だ。かわいい後輩、愛する先輩を助けたければせいぜい気合を入れて肛門を締めるんだな、クヒヒヒ」[p] +#亜紀子 +「そ、そんな・・・ぐ・・・わ、わたしだけ2本も浣腸をされてるのに・・・っ」[p] +#勝野 +「おいおい、それはお前が自分でおねだりしたんだろうが」[p] +「苦しかったら明日香を見捨ててさっさとウンコを漏らしちまいな、クックックック」[p] +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro107-4.jpg" ] +[tb_start_text mode=1 ] +#亜紀子 +「グ・・・ハァッ・・・あ、明日香・・・お願いだから・・・ウンチして・・・」[p] +#明日香 +「先輩こそ・・・無理しないでください・・・っ」[p] +#亜紀子 +「あなたは・・・わたしに巻き込まれただけなんだから・・・ンクッ」[p] +「私のせいで・・・ンッ・・・あなたが人生を・・・台無しにしたら・・・フゥッ・・・わ、私は・・・っ」[p] +#明日香 +「わ、わたしはもう良いんです・・・っ・・・どうせ元々大した人生じゃ・・・」[p] +「先輩は・・・自由になれば夢に手が届くんです・・・言ってましたよね・・・一流のキャスターになるって・・・!」[p] +#亜紀子 +「あ、明日香・・・」[p] +#勝野 +「いやぁ、美しいねぇ。お互いを思いあう心・・・!そしてその強い愛でウンコを我慢する姿!素晴らしいぞ、クヒヒヒ」[p] +「どっちも応援したくなるね。頑張って肛門を締めろ!ウヒャヒャヒャ!」[p] + + + +[_tb_end_text] + +[mask time="1000" effect="fadeIn" color="0x000000" ] +[bg time="1000" method="crossfade" storage="hiro107-5.jpg" ] +[mask_off time="1000" effect="fadeOut" ] +[tb_start_text mode=1 ] +#亜紀子 +「・・・ッグ・・・クヒッ・・・ハァッ・・・ハァッ」[p] +#明日香 +「ハァッ・・・グ・・・フゥッ・・・ハウッ」[p] +#勝野 +「・・・15分経過か。亜紀子なかなか頑張るじゃねえか。2倍の浣腸液が入ってるのに」[p] +「でも、そろそろヤバいんじゃないか?肛門がヒクヒクしてるぞ」[p] +#亜紀子 +「ハッ・・・ハッ・・・ハッ・・・あ、明日香・・・お願いだから・・・ウンチして・・・っ」[p] +#明日香 +「ハァッ・・・せ、先輩こそ・・・」[p] +#亜紀子 +「わ、わたしは・・・グヒッ・・・もう・・・いいの・・・本当に・・・ンフゥッ・・・いいの・・・」[p] +#明日香 +「せ、先輩・・・ダメです・・・っ」[p] +#亜紀子 +「わ、わたしは本当に・・・もう・・・調教されて・・・感じる・・・ングッ・・・マゾの変態になっちゃったから・・・っ」[p] +「もう・・・このまま・・・アゥッ・・・ど、奴隷のままで・・・良いのよ・・・っ」[p] +#明日香 +「わ、わたしも・・・本当に・・・おチンポが大好きになっちゃったので」[p] +「ど、奴隷のままで居たいんです・・・っ」[p] +#亜紀子 +「う、嘘ついてもダメよ・・・明日香・・・ングッ・・・あなたは・・・幸せになるべき・・・よっ」[p] +#明日香 +「先輩こそ・・・私なんか見捨てて・・・自由に・・・っ」[p] +#勝野 +「そうそう、明日香のことは見捨ててもう楽になっちまえよ」[p] +「後輩思いのフリして本当は自由になりたいって思ってるんだろう?」[p] +#亜紀子 +「だ・・・誰が・・・フグッ・・・見捨てるもの・・・ですか・・・っ」[p] +#明日香 +「もう良いんです・・・先輩・・・っ!」[p] +#亜紀子 +「あ、明日香・・・ぜ、絶対に・・・あなたを・・・グギ・・・じ、自由に・・・っ」[p] +#勝野 +「プヒヒ、カッコイイこと言ってるけどもう限界だろ」[p] +「お前は結局負け犬なんだからなヒャハハ」[p] +#亜紀子 +「ヒグッ・・・!ンハァッ・・・あ、明日香・・・あなたは・・・絶対に・・・っ」[p] +#明日香 +「先輩、その気持ちだけで十分です・・・っ」[p] +#亜紀子 +「グヒィーーーッ・・・アッ・・・アッ・・・っ!!」[p] +#勝野 +「お、限界か?」[p] +#亜紀子 +「アアッ・・・フギッ・・・グ・・・ガッ・・・ダ、ダメェーーーーーッ!!」[p] +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro107-9.jpg" ] +[tb_start_text mode=1 ] +# +ブビュビュビュビュビューーーーッ!![p] +#亜紀子 +「アァーーーーッ!!イヤァーーーーーッ!!」[p] +# +ブピュピュピュピュピューーーーッ![p] +#亜紀子 +「アァァァアアアアッ・・・!」[p] +#勝野 +「グハハハハハッ!残念!亜紀子、お前の負けだ!!」[p] +「クセエーーーーッ!ギャハハハハハ!」[p] +#亜紀子 +「アゥゥ・・・クッ・・・ヒッ」[p] +# +ブビッ・・・ブビビビッ・・・[p] +#明日香 +「や、やった・・・っ・・・ハゥッ!」[p] +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro107-10.jpg" ] +[tb_start_text mode=1 ] +# +ブチャチャチャチャーーーッ![p] +#明日香 +「ヒィッ・・・アァァァーーーッ!」[p] +#勝野 +「おっ、明日香もか。結構ギリギリで我慢してたんだな」[p] +#亜紀子 +「あ、明日香・・・」[p] +# +ブピュピュピュピューーーッ!![p] +#明日香 +「ハゥッ・・・アァッ・・・」[p] +#勝野 +「もうちょっと頑張れば明日香を自由にしてやれたのにな。自分の肛門のゆるさを恨むんだな、ヒャハハハ」[p] +#亜紀子 +「く・・・ウゥ・・・っ」[p] +#勝野 +「どうした、敗者の弁は無いのか?ん?」[p] +#亜紀子 +「ンヒッ・・・アァ・・・っ!」[p] + +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro107-11.jpg" ] +[tb_start_text mode=1 ] +# +ムリムリムリムリッ[p] +#亜紀子 +「あ・・・明日香・・・ご、ごめんなさい・・・っ」[p] +#勝野 +「ギャハハハハハ!こ、こいつ、極太ウンコひねり出しながら謝ってやがるwww」[p] +#明日香 +「せ、先輩・・・い、いいんですっ」[p] +#亜紀子 +「わ、わたしのせいで・・・わたしが・・・弱いせいで・・・ンヒッ」[p] +# +ムリムリムリッ・・・![p] +#勝野 +「ヒーッヒッヒーーッ!ぶ、ぶっとい一本ぐそぶら下げながら・・・泣いてやがるっwww」[p] +#亜紀子 +「あぁ・・・グヒッ・・・グスッ」[p] +# +ムリムリムリ・・・ボトッ[p] +#明日香 +「先輩・・・もう・・・いいんです・・・」[p] +#勝野 +「ププッ、あれだけ「明日香は絶対助ける!」とか言っておきながら肛門の一つも締めておくことができないなんて、お前ってやつは本当に口だけの負け犬女だよ」[p] +「本当は奴隷を辞めたくてわざと負けたんじゃねえのか?」[p] +#亜紀子 +「ウグッ・・・グヒッ・・・」[p] +#勝野 +「まぁとにかくこれでお前は俺の奴隷を解雇だ。お前にチンポをくれてやることはもうない」[p] +「明日香は俺が今後もたっぷりとかわいがってやるから安心しろ、クククク」[p] +#亜紀子 +「あ、明日香・・・ごめんなさい・・・っ」[p] +# +・・・・・・[p] +・・・[p] +[_tb_end_text] + +[stopbgm time="1000" ] +[tb_hide_message_window ] +[tb_replay id="reps22" ] +[mask time="1000" effect="fadeIn" color="0x000000" ] +[bg time="1000" method="crossfade" storage="hiro254-1.jpg" ] +[mask_off time="1000" effect="fadeOut" ] +[playbgm volume="100" time="00" loop="false" storage="music13.ogg" ] +[tb_show_message_window ] +[tb_start_text mode=1 ] +#亜紀子 +「こんばんは、ニュースプライムZ、キャスターの千山亜紀子です」[p] + +[_tb_end_text] + +[playbgm volume="100" time="1000" loop="true" storage="Green&Dance_2.ogg" ] +[tb_start_text mode=1 ] +#亜紀子 +「最初のニュースです。小笠原諸島の硫黄島近海の海底火山の活動によってできた新しい島で、今日昼ごろからさらに噴火活動が活発化ています」[p] +「今年3月に新しくできたこの島は直径1km程度で、波の侵食によってすぐに消えてしまうと思われていましたが、今回の噴火でさらに拡大し直径5kmほどに成長したことが確認されました」[p] +「専門家の話では今後も拡大は続くと予想され―――」[p] +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro101-8.jpg" ] +[tb_start_text mode=1 ] +#ノブオ +「おっと、もう6時か。ニュースプライムZを観ないと」[p] +「今日は乳山ちゃんどんなパンツ穿いてるかな・・・って、えっ!?」[p] +「ズ、ズボン穿いてる!?」[p] +「おい、お色気路線はどうなったんだよ!?」[p] +「やりすぎて抗議でも来たのか・・・?それにしてもズボンって・・・」[p] +「乳山のパンツだけが楽しみで観てるのに・・・がっかりだよ」[p] +「・・・アニメでも観よっと」[p] +・・・・・・[p] +・・・[p] +#キミヒコ +「あ、亜紀子・・・!?」[p] +「これは一体・・・どういうことだ・・・?」[p] +「この変化は一体なにを示唆しているのか・・・どういうメッセージなのか・・・」[p] +「わからない・・・俺はもうキミがわからないよ・・・亜紀子・・・」[p] +・・・・・・[p] +・・・[p] +#子供 +「あれ、ママ、今日はアナウンサーの人パンツ見えてないよ」[p] +#ママ +「あら、本当だわ。珍しいわね」[p] +「あんなイヤらしい格好じゃなくてホっとするわ。やっぱりこの人はこっちの方がいいわ」[p] +「やっぱり苦情の電話とかが殺到したんじゃないのかしら、ねえあなた」[p] +#パパ +「・・・え、ああ・・・そうかもしれないね」[p] +#ママ +「なによ、あなたガッカリしてるんじゃ無いでしょうね?」[p] +「どうせ、いつものイヤらしい格好が見たかったんでしょう!」[p] +#パパ +「い、いや違うよ。こ、こっちの方がいいよ・・・うん」[p] +・・・・・・[p] +・・・[p] + +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro254-1.jpg" ] +[tb_start_text mode=1 ] +#亜紀子 +「NNA新日空が来期からキャビンアテンダントの制服をミニスカートに統一しハイヒールの着用も義務化することを発表しました」[p] +「2019年に女性差別の観点からヒールの着用義務を廃止していた同社ですが、「女性らしさをアピールするため」とわずか2年で元に戻すことになりました」[p] +「新しい制服は膝上20cmとかなり大胆なデザインとなりますが、女性社員からは「かわいい」「早く着たい」という声が多く、反対意見は上がっていないということです」[p] +「セクシャルな制服を採用した背景には格安航空会社の登場により顧客確保の競争が激しくなったことがあると考えられており、キャビンアテンダントの美脚で男性乗客を呼び込もうという狙いがあるようです」[p] +「新制服は来年4月から一斉導入されるということです」[p] +「それではお天気です―――」[p] +# +・・・・・・[p] +・・・[p] +[_tb_end_text] + +[stopbgm time="1000" ] +[mask time="1000" effect="fadeIn" color="0x000000" ] +[bg time="1000" method="crossfade" storage="hiro999.jpg" ] +[mask_off time="1000" effect="fadeOut" ] +[playbgm volume="100" time="1000" loop="true" storage="bluenoise.ogg" ] +[tb_start_text mode=1 ] +# +お色気路線を突き進んでいた千山亜紀子が突如パンツスタイルに戻ったことは、世間で大きな話題となり色々な憶測が飛び交った[p] +中でも、あまりの過激さに視聴者から苦情が来て自粛したという説が最も有力で、やがてそれが真実であったかのように結論として落ち着き、亜紀子に関する話題も時とともに口の端に上らなくなっていった[p] +そして数ヶ月が過ぎた・・・[p] +[_tb_end_text] + +[stopbgm time="1000" ] +[bg time="1000" method="crossfade" storage="hiro201.jpg" ] +[chara_show name="美里" time="1000" wait="true" storage="chara/1/hiro253-1.png" width="530" height="1272" left="109" top="19" reflect="false" ] +[playbgm volume="100" time="1000" loop="true" storage="neonpurple.ogg" ] +[tb_start_text mode=1 ] +#亜紀子 +「原稿の準備は・・・これでよしと」[p] +「インタビュー用の資料は・・・と」[p] +「・・・・・・」[p] +#明日香 +「先輩」[p] +[_tb_end_text] + +[chara_show name="明日香" time="1000" wait="true" storage="chara/2/hiro257-3.png" width="509" height="1221" left="563" top="3" reflect="false" ] +[tb_start_text mode=1 ] +#亜紀子 +「明日香・・・」[p] +#明日香 +「先輩、最近だいぶ忙しそうですけど、身体大丈夫ですか?」[p] +#亜紀子 +「ええ・・・大丈夫よ」[p] +#明日香 +「先輩は頑張りすぎることがあるから。無理しないでくださいね」[p] +#亜紀子 +「明日香・・・私の心配なんかしないで・・・」[p] +「わたしのせいで・・・あなたの方がずっと辛いはずなのに・・・」[p] +#明日香 +「私のことは気にしないでください先輩。私は全然辛くないですから」[p] +「わたし・・・Mの才能があったみたいで。勝野様に毎日かわいがってもらって・・・幸せなんです」[p] +#亜紀子 +「明日香・・・」[p] +#明日香 +「本当なんです。それにエッチな仕事で人気も出てきて・・・最近色んな番組にも出させてもらえるようになって・・・今すごく充実してるんです」[p] +「だから私のことは全然気に病む必要はないんですよ」[p] +#亜紀子 +「・・・・・・」[p] +#明日香 +「あ、もうそろそろ行かなきゃ。またバラエティの収録があるんですよ」[p] +「それじゃ先輩、お互い頑張りましょう」[p] + +[_tb_end_text] + +[chara_hide name="明日香" time="1000" wait="true" pos_mode="false" ] +[tb_start_text mode=1 ] +#亜紀子 +(明日香・・・)[p] +(本当に幸せそうにしてたわね・・・)[p] +(・・・バカッ!そんなわけないでしょ!私に心配を掛けまいと演技してたに決まってるじゃない!)[p] +# +明日香は知らないが、何度か勝野から亜紀子の携帯に明日香が調教されている動画が送られてきている[p] +動画の中で明日香はムチで叩かれたり肛門を責められたりと虐められ泣き叫んでいた[p] +#亜紀子 +(あんな辛い目に遭っているのに、わたしに気を遣わせまいと・・・)[p] +(・・・でも本当にそうかしら?)[p] +(辛そうに見えるだけで、あれも本当は悦びの叫びだったのかも・・・)[p] +(勝野の調教・・・)[p] +# +亜紀子は奴隷を解雇になってから一度もセックスをしていない[p] +勝野に解放の条件として他の男とのセックスを禁じられているのだ[p] +使い慣れたバイブを引っ張り出してきて以前のように毎晩オナニーをしている[p] +しかし数ヶ月の調教によって開発された身体はバイブでは満足できずに欲求不満を抱え込んでいた[p] +#亜紀子 +(本物のおチンポ・・・バイブとは違う本物の・・・)[p] +(・・・って私何を考えているの!?)[p] +(またあの屈辱の日々に戻りたいっていうの?冗談じゃないわ!)[p] +(あの憎い勝野に・・・足を舐めさせられ肛門を舐めさせられ、小便を飲まされ、浣腸をされ・・・)[p] +(ペニスをしゃぶらされ・・・ザーメンを飲まされ・・・犯されて・・・みっちりと中出し調教・・・あぁ♥)[p] +(・・・土下座して懇願すれば、また奴隷として飼ってくれるかしら・・・)[p] +(・・・あぁ、そんなことできるわけがないわ!あの男にもう一度奴隷にして欲しいって頼むなんて!)[p] +(そんなことしたらもう終りだわ!プライドも人生も全て捨て去ることになる・・・!)[p] +(・・・あぁ・・・)[p] +# +・・・・・・[p] +・・・[p] +[_tb_end_text] + +[stopbgm time="1000" ] +[mask time="1000" effect="fadeIn" color="0x000000" ] +[chara_hide_all time="1000" wait="true" ] +[bg time="1000" method="crossfade" storage="hiro254-0.jpg" ] +[mask_off time="1000" effect="fadeOut" ] +[playbgm volume="100" time="1000" loop="true" storage="neonpurple.ogg" ] +[tb_start_text mode=1 ] +# +数週間後―――[p] +[_tb_end_text] + +[chara_show name="美里" time="1000" wait="true" storage="chara/1/hiro258-2.png" width="604" height="1510" left="290" top="0" reflect="false" ] +[tb_start_text mode=1 ] +#亜紀子 +「おはようございます」[p] +#ディレクター +「おはようございます・・・って、えっ!?」[p] +「そ、その服装・・・」[p] +#亜紀子 +「え、ええ。久しぶりに攻めてみようかなって・・・」[p] +#ディレクター +「いや、良いですよ!やっぱり、パンツよりそっちの方が似合ってますよ!」[p] +#亜紀子 +「そ、そうかしら?ありがとう」[p] +#カメラマン +「あっ、千山さん今日はまたセクシーですね!」[p] +#メイクさん +「やっぱり似合います~~」[p] +#亜紀子 +「あ、ありがとう」[p] +(あぁ・・・やっちゃったわ・・・)[p] +(どうしても我慢できなくて・・・せめて服装だけでもと思って着てみたけど・・・)[p] +(この懐かしい感じ・・・ねっとりとからみつくような視線・・・メスを見る目・・・はぁ♥)[p] +(ぞくぞくするような・・・身体の芯が火照ってくるようだわ・・・♥)[p] +[_tb_end_text] + +[stopbgm time="1000" ] +[mask time="1000" effect="fadeIn" color="0x000000" ] +[chara_hide_all time="1000" wait="true" ] +[bg time="1000" method="crossfade" storage="hiro254-11.jpg" ] +[mask_off time="1000" effect="fadeOut" ] +[playbgm volume="100" time="1000" loop="false" storage="music13.ogg" ] +[tb_start_text mode=1 ] +#亜紀子 +「こんばんは、ニュースプライムZ、キャスターの千山亜紀子です」[p] +[_tb_end_text] + +[playbgm volume="100" time="1000" loop="true" storage="Green&Dance_2.ogg" ] +[tb_start_text mode=1 ] +#亜紀子 +「本年度の秋の叙勲が発表され、各分野で顕著な功績をあげた功労者など約4000人が授与することになりました」[p] +「旭日章には元経団連会長の山山田太郎太氏をはじめ1012人、瑞宝章には元T大学長の眼鏡沢髭吉氏など3976人が受勲されました」[p] +「また文化勲章には脚本家の走田朱蛾子氏、作曲家の―――」[p] + +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro101-9.jpg" ] +[tb_start_text mode=1 ] +#ノブオ +「さてと、昨日録画した深夜アニメでも観るかな・・・ポチっと」[p] +「・・・ん?」[p] +「おおおおっ!?」[p] +「千山亜紀子がまたミニスカ穿いてるじゃん!」[p] +「もうすっかりお色気路線は辞めたと思ってチェックしなくなってたけど・・・また復活したのか!?」[p] +「視聴者からの苦情でパンチラを自粛したって聞いたけど・・・もう大丈夫なのか?」[p] +「いやぁー、それにしてもやっぱり他局の女子アナとはレベルが違うなぁ」[p] +「千山亜紀子が一番エロイわ・・・」[p] +・・・・・・[p] +・・・[p] +#キミヒコ +「・・・!?」[p] +「あ、亜紀子・・・!?」[p] +「これは幻なのか・・・それとも・・・」[p] +「これは神託なのか・・・?いや・・・しかし・・・まだその時では・・・」[p] +・・・・・・[p] +・・・[p] +#ママ +「まぁ!まただわ!またこの女こんな破廉恥な格好で・・・!」[p] +「世間に叩かれて辞めたと思ったのに・・・まだ懲りてないのかしら?」[p] +#子供 +「パンツ!パンツ!」[p] +#ママ +「こらっ、いけませんあんなの見ちゃ」[p] +「全く子供に悪影響だわ・・・テレビ局も何を考えてるのかしら。ねえ、あなた」[p] +#パパ +「・・・・・・」[p] +#ママ +「ねえ、あなたったら聞いてるの!?」[p] +「もう、またあんなパンツに見とれて!いやらしいわ!」[p] +#子供 +「パパエッチ!エッチ!」[p] +#パパ +「あ、いや・・・違うよ。ニュースの内容をだね・・・」[p] +・・・・・・[p] +・・・[p] + +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro254-11.jpg" ] +[tb_start_text mode=1 ] +#亜紀子 +「日本野球機構は28日、エキスパンションで新たに4球団を増やす16球団構想を正式に進めていくことを発表しました」[p] +(あぁ・・・見られてるんだわ・・・下着も、くっきり浮いた乳首も・・・日本中の人に・・・)[p] +「NPBの球川コミッショナーは会見で「2030年を目標に新たな4球団を新設する方向で動き出す。新球団の候補地については現在8つの都市、地域が立候補しておりこれから検討して絞り込んでいく」と語りました」[p] +(今までは強制だったけど・・・今は自分でやってる・・・!自分で首輪まで嵌めて・・・変態だわ・・・)[p] +「候補地については発表がありませんでしたが、新潟、静岡、那覇、京都などが挙がっていると見られています」[p] +(あぁ・・・もっと見て・・・♥)[p] +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro254-4.jpg" ] +[tb_start_text mode=1 ] +#亜紀子 +「実現すればプロ野球が活性化することが期待できますが、一方では将来的に少子化や娯楽の多様化による野球離れで収益が十分に確保できるのかなど課題も多そうです」[p] +(あぁ・・・見られてる・・・薄い布をはさんでわたしのいやらしいアソコ・・・)[p] +「さて紅葉の季節ですが、今年は温暖化の影響で山々の色づきも例年より遅れているようです」[p] +(誰にも命令されてないのに・・・自分で脚を開いてるのよ・・・これじゃ本当に露出狂だわ・・・)[p] +「日光のいろは坂ではようやく半分ほどが色づき始めています。見ごろは例年より2週間ほど遅く11月の後半にずれ込むのではないかということです」[p] +(カメラマンさん撮って・・・わたしのスケベな姿・・・変態なわたしを・・・!)[p] +「それではお天気に参りましょう。佐藤さんお願いします」[p] +[_tb_end_text] + +[stopbgm time="1000" ] +[mask time="1000" effect="fadeIn" color="0x000000" ] +[bg time="1000" method="crossfade" storage="hiro202.jpg" ] +[chara_show name="美里" time="1000" wait="true" storage="chara/1/hiro258-1.png" width="517" height="1293" left="123" top="32" reflect="false" ] +[mask_off time="1000" effect="fadeOut" ] +[playbgm volume="100" time="1000" loop="true" storage="bluenoise.ogg" ] +[tb_start_text mode=1 ] +#亜紀子 +(はぁ・・・わたし何をやってるんだろう)[p] +(せっかく明日香が自分を犠牲にして私を自由にしてくれたっていうのに・・・)[p] +(あぁもう自分がわからないわ・・・私、奴隷に戻りたがってるの・・・?)[p] +(・・・いや、そんなことはないわ!ただ・・・ちょっと刺激が欲しいだけ)[p] +(ちょっとした遊び・・・勝野の奴隷になんて絶対に―――)[p] +#勝野 +「よぉ亜紀子」[p] +[_tb_end_text] + +[stopbgm time="1000" ] +[chara_show name="勝野" time="1000" wait="true" storage="chara/5/hiro256-1.png" width="559" height="1342" left="647" top="-31" reflect="false" ] +[playbgm volume="100" time="1000" loop="true" storage="枯れ葉が集う路地裏通り_2.ogg" ] +[tb_start_text mode=1 ] +#亜紀子 +「か、勝野・・・!」[p] +#勝野 +「ククク、懐かしい格好してるじゃねえか」[p] +「どういう風の吹き回しだ?自分でその服を着てくるなんて」[p] +#亜紀子 +「こ、これは・・・な、なんでもないわ」[p] +#勝野 +「なんでもないってどういうことだよw」[p] +「理由もなく着てきたのか?まさか朝急いでて間違えたとか言い出すんじゃないだろうな?」[p] +#亜紀子 +「く・・・ちょ、ちょっとした・・・き、気分転換よ」[p] +#勝野 +「ククク、別に咎めてるわけじゃないんだぜ。着たきゃ何時でも着ればいいさ」[p] +「露出の刺激が忘れられないんだろう?お前はマゾの変態だからな」[p] +#亜紀子 +「ち、違う・・・わたしは・・・っ!」[p] +#勝野 +「違うってどういうことだよ。自分で証明してるじゃねえか。今さら否定するなよw」[p] +「お前は見られて興奮する変態なんだよ」[p] +#亜紀子 +「く・・・」[p] +#勝野 +「まぁ露出くらいなら好きにしたら良いけどな」[p] +「それじゃ俺は行くぜ、忙しいんでな」[p] +#亜紀子 +「えっ・・・ちょ、ちょっと待っ・・・」[p] +#勝野 +「なんだ、なにか用か?」[p] +#亜紀子 +「えっ・・・えーっと・・・あ、明日香はどうしてるの?」[p] +#勝野 +「明日香?ちゃんと毎晩かわいがってやってるぜ。時々動画を送ってやってるだろ」[p] +#亜紀子 +「あ、あんな酷いことを毎晩続けてるの?」[p] +「もう・・・明日香も解放してあげて・・・!」[p] +#勝野 +「解放・・・?明日香はそんなこと望んでないぜ。明日香がお前に助けを求めたか?」[p] +#亜紀子 +「そ、それは・・・心配要らないって言ってくれるけど・・・」[p] +「わたしに気を遣わせまいと元気なふりをしてるだけに決まってるわ!」[p] +「奴隷にされて・・・あんなことをされて幸せなはずがないわ・・・!」[p] +#勝野 +「本当にそう思うか?」[p] +「自分のことを思い出してみろよ。奴隷生活はただただ苦痛だったか?快感は全く無かったか?」[p] +#亜紀子 +「・・・っ」[p] +#勝野 +「お前だって毎晩俺のチンポでよがり狂ってたじゃねえか」[p] +「明日香はもう完全に俺のチンポに堕ちて、身も心も俺のモノになっちまったんだよ」[p] + +[_tb_end_text] + +[chara_mod name="美里" time="200" cross="false" storage="chara/1/hiro258-4.png" ] +[tb_start_text mode=1 ] +#亜紀子 +「そんなのウソよ!・・・!あ、あなたの独りよがりよ・・・!」[p] +「女がチンポに堕ちるだなんて・・・妄想よ・・・!」[p] +#勝野 +「ふっ、そう思いたければ思っていればいいさ」[p] +「仮に明日香が苦しんでて自由になりたがってるとして、お前にはどうすることもできないんだからな」[p] +「それともまたお前が身代わりに奴隷に戻るとでも言うのか?」[p] +[_tb_end_text] + +[chara_mod name="美里" time="200" cross="false" storage="chara/1/hiro258-1.png" ] +[tb_start_text mode=1 ] +#亜紀子 +「えっ、わ、わたしが奴隷に戻れば明日香は解放してくれるの・・・!?」[p] +#勝野 +「ダメだ」[p] +#亜紀子 +「な、なんで・・・」[p] +#勝野 +「だが、明日香は奴隷のままでお前が奴隷に戻りたいって言うなら考えてやってもいいけどな」[p] +#亜紀子 +「は・・・はぁっ!?」[p] +「な、なんでわたしがタダで奴隷に戻らないといけないのよ・・・!」[p] +「なんのメリットも無いじゃない・・・っ。そ、そんなこと言うわけないでしょ!」[p] +#勝野 +「そうかな?本当はおまえ自身、どうしたいか自分で解ってるんじゃないのか?」[p] +「このまま自分に嘘をつき続ける人生を送る気か?正直になれよ」[p] +#亜紀子 +「自分自身がどうしたいと思っているか・・・正直に・・・」[p] +(わたしは・・・どうしたいと思ってるの・・・?)[p] +[_tb_end_text] + +[stopbgm time="1000" ] +[tb_hide_message_window ] +[glink color="black" storage="end3.ks" size="20" text="奴隷に戻りたい" x="537" y="364" width="" height="" _clickable_img="" ] +[glink color="black" storage="end4.ks" size="20" text="戻りたくない" x="549" y="456" width="" height="" _clickable_img="" ] +[s ] diff --git a/data/scenario/scene14.ks b/data/scenario/scene14.ks new file mode 100644 index 0000000..665e99e --- /dev/null +++ b/data/scenario/scene14.ks @@ -0,0 +1,1179 @@ +[_tb_system_call storage=system/_scene14.ks] + +*rep23 + +[tb_replay_start ] +[stopbgm time="1000" ] +[chara_hide_all time="1000" wait="true" ] +[tb_show_message_window ] +[playbgm volume="100" time="1000" loop="true" storage="music16.ogg" ] +[bg time="1000" method="crossfade" storage="hiro107-4.jpg" ] +[tb_start_text mode=1 ] +#亜紀子 +「う・・・っ」[p] +(やっぱり浣腸は怖い・・・ごめんなさい・・・明日香・・・っ)[p] +#明日香 +「わたしにくださいっ!浣腸大好きなんですぅっ♥」[p] +(先輩・・・先輩の気持ちは十分伝わりました。ここはわたしに譲ってください・・・っ)[p] +#勝野 +「くくく、亜紀子はもうお腹いっぱいか?」[p] +#亜紀子 +「あ・・・そ、その・・・」[p] +#勝野 +「よぉし、それじゃちゃんとおねだりできた明日香にもう一本浣腸のおかわりだ」[p] +#明日香 +「あ、ありがとうございますっ!」[p] +#勝野 +「じゃあ入れるぞ、力を抜けよ」[p] +# +ズプッ[p] + +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro107-3.jpg" ] +[tb_start_text mode=1 ] +#明日香 +「ンンッ・・・ヒッ」[p] +# +ブチュブチュブチュ~~ッ[p] +#明日香 +「ンヒィーーーッ・・・クハァッ・・・ンフッ」[p] +#亜紀子 +「あ、明日香・・・っ」[p] +#勝野 +「おぉー入る入る」[p] +# +ブチュチュチュ~~~ッ[p] +#明日香 +「ンクッ・・・ハァッ・・・ンヒッ!」[p] +#亜紀子 +「明日香・・・あぁ・・・」[p] +#勝野 +「・・・よし、全部入ったぜ」[p] +「これで明日香には2本、亜紀子には1本分の浣腸が入ったわけだ」[p] +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro107-1.jpg" ] +[tb_start_text mode=1 ] +#勝野 +「さてと、今日のゲームもそろそろ終盤だ」[p] +「ここで最終アピールタイムだ。ウンコを我慢しながら俺の奴隷でいたいという熱意をアピールしろ」[p] +#明日香 +「あ、明日香は・・・勝野様のおチンポ無しでは・・・生きていけませんっ!ど、奴隷でいさせてくださいっ・・・ハゥッ・・・お、お願いします・・・っ!」[p] +#亜紀子 +「亜紀子は・・・勝野様のおチンポで管理していただかないと生きてゆけない・・・ド変態な家畜ですっ♥」[p] +「お、愚かでドスケベな亜紀子を・・・これからも勝野様のおチンポでご指導してくださいませぇっ♥」[p] +#勝野 +「うーむ、どっちも悪くないな」[p] +「ここまでの競争ではどちらも甲乙つけがたいから、最終ゲームで勝敗を決めるとしよう」[p] +「これに勝ったほうを奴隷として飼い続けてやる。負けたほうはお払い箱だ」[p] +#亜紀子 +「さ、最終ゲーム・・・」[p] +#明日香 +「このゲームで決まる・・・」[p] +#勝野 +「最終ゲームは『ドキドキ♥排便我慢対決』~~~、パチパチパチ!」[p] +#亜紀子 +「は、排便我慢・・・えっ、そ、それって・・・」[p] +#勝野 +「ルールは簡単。ウンコを先に漏らしたほうが負けだ」[p] +#明日香 +「そ、そんな・・・っ!」[p] +#勝野 +「お前らがお互いを助けるために必死に頑張って演技してたのはなかなか面白い見物だったぜ」[p] +「最後は単純明快な忍耐力勝負だ。かわいい後輩、愛する先輩を助けたければせいぜい気合を入れて肛門を締めるんだな、クヒヒヒ」[p] +#明日香 +「そ、そんな・・・ぐ・・・わ、わたしだけ2本も浣腸をされてるのに・・・っ」[p] +#勝野 +「おいおい、それはお前が自分でおねだりしたんだろうが」[p] +「苦しかったら亜紀子を見捨ててさっさとウンコを漏らしちまいな、クックックック」[p] +[_tb_end_text] + +[mask time="1000" effect="fadeIn" color="0x000000" ] +[bg time="1000" method="crossfade" storage="hiro107-4.jpg" ] +[mask_off time="1000" effect="fadeOut" ] +[tb_start_text mode=1 ] +#亜紀子 +「・・・ッ・・・ハァッ・・・ハァッ」[p] +#明日香 +「ハァッ・・・グ・・・フゥッ・・・ハウッ」[p] +#勝野 +「・・・15分経過か。なかなか頑張るじゃねえか明日香。2倍の浣腸液が入ってるのに」[p] +「大切な先輩を助け出すために必死で肛門を締めてるんだな、クヒヒヒ」[p] +「でも、そろそろヤバいんじゃないか?肛門がヒクヒクしてるぞ」[p] +#明日香 +「ハッ・・・ハッ・・・ハッ・・・せ、先輩・・・お願いだから・・・ウンチしてください・・・っ」[p] +#亜紀子 +「ハァッ・・・あ、明日香こそ・・・我慢しないで」[p] +#明日香 +「わ、わたしは・・・アヒッ・・・もう・・・いいんです・・・本当に・・・ンフゥッ」[p] +#亜紀子 +「ダメよ・・・あなたはわたしに巻き込まれただけなんだから・・・自由になって」[p] +#明日香 +「せ、先輩は・・・こんな・・・とこにっ・・・いちゃいけません・・・っ」[p] +「わ、わたしは・・・もう普通には・・・アグッ・・・戻れない体に・・・なっちゃったから・・・っ」[p] +#亜紀子 +「明日香・・・?」[p] +#明日香 +「ほ、本当なんです・・・っ」[p] +「勝野様に・・・いっぱい犯されて・・・本当におチンポ無しでは生きていけない体に・・・されちゃったんです・・・っ」[p] +「も・・・もう戻れないんですっ・・・おねだりも・・・本当に・・・演技じゃないんです・・・っ」[p] +#亜紀子 +「あ、明日香・・・あなた・・・」[p] +#明日香 +「だから・・・なにも気にしないで・・・じ、自由になってください・・・っ」[p] +#勝野 +「ククク、明日香はこう言ってるぜ?お前だけ自由になったらどうだ亜紀子」[p] +#亜紀子 +「そ、そんなのウソよ・・・わたしを助けようと嘘をついてるんでしょ・・・明日香、騙されないわよ」[p] +#明日香 +「ち、違います・・・っ・・・本当です先輩・・・っ」[p] +#亜紀子 +「仮に本当だとしても・・・あなたはまだ戻れるわ・・・」[p] +「あなたが真面目に努力していたのを知ってるわ・・・こんなところで人生を台無しにしてはいけない・・・ハァッ・・・正しい人生に戻るのよ・・・っ」[p] +#明日香 +「せ、先輩・・・っ」[p] +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro107-5.jpg" ] +[tb_start_text mode=1 ] +#明日香 +「ハァッ・・・ウゥアッ・・・せ、先輩ぃ・・・っ」[p] +#亜紀子 +「あ・・・ンクッ・・・あ、明日香・・・もう我慢しないで・・・っ」[p] +#明日香 +「い、イヤですっ・・・絶対・・・せ、先輩を・・・グッ・・・助ける・・・ンハァッ」[p] +#亜紀子 +「む、無理よ・・・あなたは・・・ンッ・・・2倍・・・浣腸されてるんだから・・・ハァッ」[p] +「わたしはまだまだ・・・余裕があるわ・・・っ・・・あきらめなさい」[p] +#明日香 +「ハッ・・・グ・・・ヒィィィィ・・・ッ・・・アァッ」[p] +「アァッ・・・ダメ・・・ッ・・・ググゥゥ・・・ッ」[p] +#亜紀子 +「お、お願い・・・ハァッ・・・もう・・・我慢しないで・・・明日香・・・っ」[p] +#明日香 +「アッ・・・先輩ッ・・・アァァァァッ・・・ダメェッ!」[p] +「イヤアァァァァァッ!」[p] +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro107-6.jpg" ] +[tb_start_text mode=1 ] +# +ブビビビビッ![p] +#明日香 +「イヤァァァッ!」[p] +#勝野 +「おっ、出た!」[p] +#亜紀子 +「ハァッ・・・や、やった・・・っ」[p] +「アフゥッ・・・・アァッ」[p] +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro107-7.jpg" ] +[tb_start_text mode=1 ] +# +ブビュビュビュピュッ![p] +#勝野 +「おわっ、こっちもか!」[p] +#亜紀子 +「ンハァッ・・・アヒッ!」[p] +# +ブビビビビッ![p] +#勝野 +「余裕そうに見せておいてお前のほうも限界だったんだな」[p] +「浣腸2倍のハンデがありながら結構好勝負だったジャねえか、ウヒャヒャヒャヒャ!」[p] +#明日香 +「あぁ・・・そんな・・・」[p] +#亜紀子 +「わ、わたしの・・・勝ちですよね・・・?」[p] +# +ブピュッ・・・ブビッ[p] +#勝野 +「ギャハハハハ!ウンコしながらしゃべるなよwそうだよ、お前の勝ちだよ」[p] +#亜紀子 +「こ、これで明日香は自由に・・・」[p] +#勝野 +「ああ、約束どおり明日香は奴隷を解雇だ」[p] +「これからはお前だけを集中して調教してやるぜ、クククク」[p] +#明日香 +「あぁ・・・そんな・・・先輩・・・」[p] +#亜紀子 +「よ、よかった・・・ンハァッ」[p] +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro107-8.jpg" ] +[tb_cg id="107" ] +[tb_start_text mode=1 ] +# +・・・ムリムリッ[p] +#亜紀子 +「ンフッ・・・ハァッ」[p] +#勝野 +「ん?・・・おいおいおいw」[p] +# +ムリムリムリッ[p] +#亜紀子 +「ンハァッ・・・ンッ」[p] +#勝野 +「ギャハハハハ!ぶっとい一本糞が出てきやがった!」[p] +「そうか、だから浣腸が倍でも良い勝負だったんだな!中にこんなでっかい糞が溜まってたらそりゃきついわwギャハハハハ!」[p] +#亜紀子 +「ンッ・・・アァッ」[p] +# +ムリムリムリッ[p] +#勝野 +「ウヒャヒャ、まだ出てくるのかよ!こりゃビクトリーランならぬビクトリーウンコだなww」[p] +「俺の奴隷でいれるのがそんなに嬉しいか!?」[p] +#亜紀子 +「は、はいっ・・・嬉しいです・・・っ」[p] +# +ムリムリムリッ[p] +#勝野 +「どうだ明日香、先輩がこんなぶっといウンコを我慢してお前を助けてくれたんだぞw」[p] +#明日香 +「せ、先輩・・・」[p] +#亜紀子 +「明日香・・・あなたは正しい道を生きて・・・ンッ」[p] +# +ムリムリムリッ[p] +#勝野 +「ギャハハハハ!ウンコしながら・・・ぶっとい一本グソしながら後輩に・・・ウヒヒヒヒッ!」[p] +#亜紀子 +「わたしのことは・・・心配しないで・・・」[p] +# +ムリムリムリ・・・ボトッ[p] +#勝野 +「ギャハハハハハ!腹いてえ・・・!」[p] +#明日香 +「先輩・・・あぁ・・・」[p] +# +・・・・・・[p] +・・・[p] + + +[_tb_end_text] + +[stopbgm time="1000" ] +[tb_hide_message_window ] +[tb_replay id="reps23" ] +*rep26 + +[tb_replay_start ] +[mask time="1000" effect="fadeIn" color="0x000000" ] +[bg time="1000" method="crossfade" storage="hiro999.jpg" ] +[tb_show_message_window ] +[mask_off time="1000" effect="fadeOut" ] +[tb_start_text mode=1 ] +# +数週間後―――[p] +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro118-0.jpg" ] +[playbgm volume="100" time="1000" loop="true" storage="オフィスの日常.ogg" ] +[tb_start_text mode=1 ] +#梅田 +「ウメちゃんのディープな話~~~!!」[p] +「・・・っさ、始まりました。今週のゲストはこの方々です~」[p] +#若手芸人 +「よろしくおねがいします!」[p] +#ユウチューバー +「よろしくおねがいします~!」[p] +#梅田 +「キミは初めましてやけどどういう人なの?」[p] +#ユウチューバー +「yuutuberで~~す!本物の梅田さんだ~~!イエーーーイ!」[p] +#梅田 +「あ、はい」[p] +#亜紀子 +「ユウチューバーさんは今若者に大人気のyuutuberで、主にコスプレ動画などを上げていらっしゃって登録者数は現在120万人もいるんですよ」[p] +#梅田 +「ああそうなん。120万って多いん?」[p] +#若手芸人 +「むちゃくちゃ多いですよ。僕もやってるんですけどチャンネルの登録者数9万人ですからね」[p] +#ユウチューバー +「勝った~~!イエ~~~イ!」[p] +#梅田 +「へーー。まぁこんな番組に出て減らないといいですけどねファンが」[p] +#ユウチューバー +「キャハハハハ!ウケル!」[p] +[_tb_end_text] + +[tb_image_show time="1000" storage="default/hiro101-a.jpg" width="725" height="408" x="552" y="388" _clickable_img="" name="img_36" ] +[tb_start_text mode=1 ] +#ノブオ +「始まった始まった「ディープな話」」[p] +「前から面白かったけどアシスタントが千山亜紀子になってからどんどん過激になってきてるんだよな」[p] +「今週もなんかエロいハプニング起きないかな」[p] +[_tb_end_text] + +[tb_image_hide time="1000" ] +[bg time="1000" method="crossfade" storage="hiro120-1.jpg" ] +[tb_start_text mode=1 ] +#亜紀子 +「さぁそれでは今日のテーマなんですが、今回深く掘り下げていくディープなテーマは「鼻フック」です」[p] +#梅田 +「鼻フック!出ましたね、またSM系」[p] +#亜紀子 +「梅田さんはお好きですか鼻フック」[p] +#梅田 +「俺の場合はやられる側やからね。罰ゲームで何回やらされたか」[p] +「めちゃめちゃ痛いんやからあれ」[p] +#若手芸人 +「痛いですよね~。芸人はだいたい一回はやりますからね」[p] +#梅田 +「鼻取れそうになるからね」[p] +#ユウチューバー +「おもしろーーい!」[p] +#亜紀子 +「女性にやらせたことは無いですか?」[p] +#梅田 +「いやぁ・・・無いなぁ。その発想が無いもんな」[p] +#若手芸人 +「まぁ普通はやらないですよね」[p] +#亜紀子 +「SMの中でもややマニアックな部類に入るといえるかもしれません「鼻フック」ですが、今日はその鼻フックを愛するマニアの方々に来ていただいております」[p] +「さっそく登場していただきましょう。どうぞー!」[p] +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro118-0.jpg" ] +[tb_start_text mode=1 ] +#亜紀子 +「マニアAさんBさんCさんです!」[p] +#マニアたち +「よろしくお願いします」[p] +#若手芸人 +「結構普通の方々ですね」[p] +#梅田 +「だいたいそうやねん。SMとかのマニアってみんな普通っぽいのよ」[p] +#ユウチューバー +「普通のおじさんって感じー」[p] +#亜紀子 +「鼻フックの良さというのはどういうところにあるんでしょうか?」[p] +#マニアA +「色々ありますけどやっぱり「屈辱」っていうところがポイントじゃないですかね」[p] +「豚鼻にさせられるのって痛みもありますけどなにより屈辱的じゃないですか」[p] +「不細工な顔にさせられている、そしてその不細工な顔を見られて笑われている。そこに女性が屈辱を感じるから興奮するんですね」[p] +#梅田 +「たしかに屈辱的やわな。俺らは笑いを取るためにやってるけど」[p] +#マニアB +「それとやっぱり美人の顔を崩すっていうのがゾクゾクするんですよね」[p] +「綺麗なものを汚すのって興奮するじゃないですか」[p] +#若手芸人 +「あーわからなくはないです」[p] +#マニアB +「美人でいつもは澄ましてる人が豚鼻にされて不細工な顔を晒してるっていう背徳感ですね」[p] +#梅田 +「やっぱり鼻フックは美人でないとアカンの?」[p] +#マニアB +「そうですね、やっぱり美人が良いですよね」[p] +#マニアC +「ですね。上品な顔が一番鼻フックして興奮します」[p] +#梅田 +「千山とかどう?鼻フックしたい顔?」[p] +#マニアC +「無茶苦茶良いです!美人だし知的で上品だしぜひやりたいですね!」[p] +#マニアA +「うんうん、最高だよねぇ」[p] +#亜紀子 +「あ、ありがとうございます」[p] +#ユウチューバー +「アタシは?アタシは?」[p] +#マニアC +「まぁ、はい」[p] +#マニアB +「まぁまぁですかね」[p] +#ユウチューバー +「なんか人気ないんですけど!ウケル!」[p] +#梅田 +「やっぱまだ若いからね。上品な大人の女性が良いのよ、な?」[p] +#マニアA +「さすが梅田さん、わかってらっしゃいます」[p] +#若手芸人 +「Sの代表みたいな人ですからね梅田さんは」[p] +#梅田 +「誰がSの代表やねん」[p] +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro120-1.jpg" ] +[tb_start_text mode=1 ] +#亜紀子 +「鼻フックをするときに注意点とかはありますか?」[p] +#マニアA +「力の加減ですかねやっぱり。鼻ってけっこう強いのでかなり強く引っ張っても切れはしないんですが、中には鼻血が出やすい人とかも居ますから」[p] +#マニアB +「興奮するとつい力が入っちゃったりするんですよね。それで女の子に嫌がられたりして」[p] +#梅田 +「え、キミらはSMのお店とかに行ってやるわけ?そういうお店とかで鼻フックなんかさせてくれるん?」[p] +#マニアB +「させてはくれますよ。オプションでお金は取られますけど」[p] +「でも強くすると嫌がられるので本当に軽くしかできないですね。形だけ鼻フックをしてるっていう状態で」[p] +#マニアA +「本当は上唇がめくれ上がるくらい引っ張りたいんですけどなかなかさせてくれる娘はいませんよ」[p] +#マニアC +「だから僕はもうDVD観て満足してます」[p] +「プライドの高い美人に鼻フックで屈辱を味わわせるなんて現実ではできないですからね」[p] +#若手芸人 +「鼻フック物のAVなんてあるんですか?」[p] +#マニアC +「ありますよ、それなりには。結構いるんですよ同士は」[p] +#ユウチューバー +「一回観てみた~い」[p] + +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro118-0.jpg" ] +[tb_start_text mode=1 ] +#亜紀子 +「さて、いよいよ実践に移るところなんですが・・・」[p] +「実は今回残念ながら鼻フックのモデルになってくれる女優さんが用意できなかったんですよね」[p] +#マニアたち +「え~~~」[p] +#梅田 +「おいおいおい、一番大事なとこやろがい」[p] +「視聴者もここを楽しみに観てくれてるのに」[p] +#亜紀子 +「はい・・・視聴者の皆さまにもマニアのお三方にも申し訳ないんですが、今回は資料映像だけということに・・・」[p] +[_tb_end_text] + +[tb_image_show time="1000" storage="default/hiro101-a.jpg" width="720" height="405" x="556" y="389" _clickable_img="" name="img_47" ] +[tb_start_text mode=1 ] +#ノブオ +「え、セクシー女優出てこないのかよ」[p] +「ここだけのために見てるようなものなのに。ふざけんなよ・・・ん?」[p] +#ナレーション +「このあと千山アナがまさかの事態に・・・!?」[p] +#ノブオ +「おっ!?まさか千山アナが鼻フックされる展開か!?」[p] +「それは見たいな!」[p] +[_tb_end_text] + +[tb_image_hide time="1000" ] +[tb_start_text mode=1 ] +# +放送時には視聴者を引き止めるために編集で亜紀子がモデル役になることを予想させるナレーションが入っているが、収録の段階では出演者たちはそのことを知らない[p] +しかし亜紀子と梅田とプロデューサーである勝野はこの後の展開を知っている[p] +#梅田 +「ほなお前がやれや」[p] +#亜紀子 +「えっ、わたしですか!?」[p] +#梅田 +「せっかく来てくれてるんやし、かわいそうやんか」[p] +「さっきお前の鼻フックめっちゃ見たいって言ってくれてたしさ」[p] +#亜紀子 +「いや、でも・・・わたしはちょっと・・・」[p] +#若手芸人 +「いや、アナウンサーさんに鼻フックはちょっときついでしょ~」[p] +#ユウチューバー +「キャハハハ、見た~~い!」[p] +#梅田 +「見たいよな?お前らも見たいやろ?」[p] +#マニアA +「え、まぁ・・・そりゃ見たいですけど・・・」[p] +#マニアC +「めっちゃ見たいっす」[p] +#梅田 +「ほら、こない言うてるやんけ」[p] +#亜紀子 +「え、でも・・・わたしはちょっと・・・すいません」[p] + +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro120-3.jpg" ] +[tb_start_text mode=1 ] +#梅田 +「やれって」[p] +# +ムギュッ![p] +#亜紀子 +「アッ・・・!」[p] +#若手芸人 +「ちょ、ちょっと梅田さん・・・!?」[p] +#ユウチューバー +「えーーーー!おっぱい揉んでるーー!」[p] +#マニアたち +「うわっ・・・」[p] +#梅田 +「お前これからは身体を張ってがんばるって言うたんと違うんかいな、え?」[p] +# +モミモミモミッ[p] +#亜紀子 +「アンッ・・・は、はいっ・・・言いましたっ」[p] +#梅田 +「ほんなら鼻フックくらいよろこんでやらんかい」[p] +# +ムギュムギュッ[p] +#亜紀子 +「アンッ・・・は、はいっ・・・わ、わかりました・・・っ」[p] +「や、やらせていただきます・・・っ」[p] +#梅田 +「最初から進んでやらんかい、ドアホ」[p] +#亜紀子 +「はいっ・・・申し訳ありませんでした・・・っ」[p] +# +もちろん亜紀子が鼻フックのモデルになることは最初から決まっている[p] +最初からすんなりOKしたら盛り上がらないので、少し抵抗するように指示されているのだ[p] + + +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro118-0.jpg" ] +[tb_start_text mode=1 ] +#亜紀子 +「と・・・いうわけでですね・・・今回はわたくし千山亜紀子が鼻フックのモデルをやらせていただきます」[p] +「えーと・・・あ、それではちょっと裏で準備をしてきますので・・・少々お待ちください」[p] +#梅田 +「はよせえよ」[p] +#亜紀子 +「はいっ」[p] +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro118-3.jpg" ] +[tb_start_text mode=1 ] +#梅田 +「すいませんね、段取りが悪くて」[p] +#マニアA +「いえ、全然大丈夫です・・・アハハハ」[p] +(梅田さんって本当に怖いんだなぁ・・・)[p] +#マニアB +(なんかすごいものを見ちゃったきがする・・・)[p] +#マニアC +(でも、千山アナの鼻フックが見れるのはうれしいなぁ・・・)[p] +#若手芸人 +(え、これって台本になかったよな・・・?梅田さんのアドリブ・・・?こ、こわっ!)[p] +#ユウチューバー +「千山さんの鼻フック楽しみ~~~!」[p] +#梅田 +「今日は皆さんが普段使ってる鼻フックを持ってきてもらってるんですよね?」[p] +#マニアA +「あ、はい」[p] +# +ADが車付きのテーブルに載せた鼻フックを運んでくる[p] +#梅田 +「ほぉー、これですか。色々ありますねー」[p] +#ユウチューバー +「すごーい」[p] +#梅田 +「これとか・・・え、どうなってんのこれ」[p] +#マニアC +「あ、それは3方向鼻フックですね。上だけじゃなくて横にも拡げる用の」[p] +#梅田 +「え、あ、こういうこと?こうやって横にも引っ張るんや」[p] +「これ着けても大丈夫?ちょっとお前着けてみいや」[p] +#若手芸人 +「僕ですか、えー、これですか・・・うわー・・・どうやって着けるんですかこれ」[p] +#マニアC +「やりましょうか」[p] +「これをこうして・・・こういう感じで」[p] +#若手芸人 +「あ・・・痛っ!アイタタタタタタ!」[p] +「ちょ、鼻取れる!」[p] +#梅田 +「カッカッカッカ!おーおー、ええやんか」[p] +#ユウチューバー +「キャハハハハ!おもしろーーい!」[p] +#若手芸人 +「イタイイタイイタイ!」[p] +#梅田 +「ぶっさいくやなぁ~~wどうや、屈辱感じてる?」[p] +#若手芸人 +「いや不細工とかもうどうでもいいです。ただただ痛いっす!横がなんかちぎれそう!」[p] +「もう外していいっすか」[p] +#梅田 +「あー、ごくろうさん」[p] +#若手芸人 +「・・・あー痛かったぁー。血出てないっすか?」[p] +#梅田 +「出てへん出てへん。大げさやな」[p] +「・・・なるほどね、色々あるんですね」[p] +「今回はこの中からどれかを千山に着けてもらうわけやね」[p] +#若手芸人 +「・・・?え、千山アナは今鼻フックを着けてるんじゃないんですか?」[p] +#梅田 +「違う違う。準備や準備」[p] +#若手芸人 +「鼻フックの準備って?なんかあるんですか?」[p] +#梅田 +「それは出てきてからのお楽しみや」[p] +「・・・遅いな。おーいまだかー!?」[p] +#亜紀子 +「あ・・・お、終りました~!」[p] +「あの・・・若手芸人さんちょっと来てもらっていいですか?」[p] +#若手芸人 +「え、僕ですか?」[p] +#梅田 +「おい、行ったれ。手伝ったれ」[p] +#若手芸人 +「え、あ、はい・・・なんだろ?」[p] + + +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro999.jpg" ] +[tb_start_text mode=1 ] +#若手芸人 +「・・・えっ!?うわっ!?」[p] +「えーっ、すごっ・・・ええっ・・・!?」[p] +#亜紀子 +「あ・・・すいません・・・これを持ってもらっていいですか?」[p] +#若手芸人 +「え・・・これを・・・え・・・」[p] +#亜紀子 +「それで、あの・・・引っ張って行って下さい・・・」[p] +#若手芸人 +「え、引っ張る・・・って、あ、そういうこと・・・?」[p] +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro118-3.jpg" ] +[tb_start_text mode=1 ] +#ユウチューバー +「え、なになに?なんかすごい驚いてる~」[p] +#梅田 +「おい、はよ出てこいや!」[p] +#若手芸人 +「は、はい!それじゃ・・・」[p] +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro118-6.jpg" ] +[tb_start_text mode=1 ] +#マニアたち +「うぉぉぉぉぉ!?」[p] +#ユウチューバー +「キャーーーーッ!?」[p] +#梅田 +「おー、いいねぇ」[p] +[_tb_end_text] + +[tb_image_show time="1000" storage="default/hiro101-b.jpg" width="603" height="339" x="692" y="-5" _clickable_img="" name="img_63" ] +[tb_start_text mode=1 ] +#ノブオ +「おぉっ!?」[p] +「これって豚の格好か!?ほとんど裸じゃん!」[p] +「乳首とかこれシール貼ってるだけ・・・?うあぁ・・・エロッ!」[p] +「しかもあの知的な千山アナが首輪を着けられて四つん這いで・・・」[p] +「なんかすごい興奮する!」[p] +[_tb_end_text] + +[tb_image_hide time="1000" ] +[tb_start_text mode=1 ] +#亜紀子 +「ど、どうもお待たせしました・・・」[p] +#梅田 +「どうですかCさん、千山のこの格好は?」[p] +#マニアC +「あ、いや・・・さ、最高ですっ!」[p] +#梅田 +「実はこれはCさんのリクエストで「知的で上品な女を豚の格好をさせて首輪を着けて鼻フックさせたい」ということだったので、それを千山にやってもらいました」[p] +#マニアC +「か、完璧です・・・!」[p] +#若手芸人 +「あ、そういうことだったんですね・・・」[p] +#ユウチューバー +「豚コスプレかわい~~!」[p] +#梅田 +「どう千山、豚のコスプレさせられて」[p] +#亜紀子 +「は、はい・・・く、屈辱です・・・」[p] +#梅田 +「女子アナやのにこんなヨゴレ芸人みたいな仕事させられてなぁ」[p] +「ほとんど裸で首輪まで着けられて。悔しい?」[p] +#亜紀子 +「はい・・・悔しいです・・・」[p] +#梅田 +「でも自分でこれからは身体張ってやっていきますって言ったんやから、頑張らんとなぁ」[p] +#亜紀子 +「は、はい・・・頑張ります・・・っ」[p] +#梅田 +「いやぁいいよいいよ。・・・これ尻尾はどうなってんの?」[p] +#亜紀子 +「あ・・・はい、これは・・・お尻の穴に・・・」[p] +#梅田 +「あ、これケツの穴に挿さってるんや。なるほど!」[p] +#マニアたち +「え・・・ええっ!?」[p] +#ユウチューバー +「えーーっ!アナルバイブ!?」[p] +#梅田 +「こら!はっきり言うな!」[p] +「これはこういうモノなんでしょ?」[p] +#亜紀子 +「は、はい、れっきとしたコスプレ衣装で・・・お尻の穴に挿入して着けるタイプの尻尾なんですよ」[p] +#梅田 +「なるほどね。というわけで、それじゃCさん、鼻フックを着けてあげてください」[p] +#マニアC +「え、あ、いいんですか・・・?」[p] +#梅田 +「そりゃそうですよ。それがメインですから。思いっきり着けちゃってください」[p] +#マニアC +「は、はいっ・・・それじゃ失礼して・・・」[p] +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro118-7.jpg" ] +[tb_start_text mode=1 ] +#亜紀子 +「アッ・・・ウッ」[p] +#マニアC +「こ、こんな感じですかね・・・」[p] +#梅田 +「もっといけるやろ。もっと思いっきりガーーーッと引っ張ったれ」[p] +#マニアC +「え・・・い、いいんですか?」[p] +#梅田 +「ええからええから。それがやりたいんでしょ?やりたいようにやっちゃってください」[p] +#マニアC +「そ、それじゃ・・・」[p] +#亜紀子 +「ヒッ・・・い、痛っ・・・痛い痛い!」[p] +#マニアC +「あっ、す、すいません」[p] +#梅田 +「ええからええから。こいつの言うことは無視してええから思いっきりいけ」[p] +#マニアC +「え・・・で、でも・・・」[p] +#梅田 +「ほら貸してみ。・・・もっとこう!思いっきり!」[p] +#亜紀子 +「アヒーーーーッ!痛ーーーーいっ!痛いっ!やめてくださいーーーーっ!」[p] +#梅田 +「やかましい!」[p] +# +バシィッ![p] +梅田が亜紀子の尻を引っ叩く音がスタジオに響き渡る[p] +#亜紀子 +「ンヒッ!」[p] +#若手芸人 +「ちょ・・・梅田さんまずいですって!」[p] +#梅田 +「お前は黙っとけ!」[p] +#若手芸人 +「は、はいっ」[p] +#梅田 +「ほら、だいぶ不細工な面になったやろ。このくらい引っ張らんと」[p] + +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro149-5.jpg" ] +[tb_start_text mode=1 ] +#亜紀子 +「ハグゥ・・・ンヒッ・・・鼻が・・・痛い・・・っ」[p] +「は、外してください・・・っ」[p] +#梅田 +「豚が人間の言葉しゃべるな!」[p] +# +バシッ![p] +#亜紀子 +「アゥッ!」[p] +#梅田 +「しゃべるときは語尾に「ブヒ」って着けろ!」[p] +# +バシッ![p] +#亜紀子 +「な・・・なんでわたしが・・・そこまでしないといけないんですかっ!」[p] +#梅田 +「口答えする気か?もっと強くしてほしいんか?おいっ」[p] +# +グイッ[p] +#亜紀子 +「アギィィーーーーッ!アイタタタタ!!ご、ごめんなさいっ!ごめんなさいブヒっ!」[p] +#マニアたち +「うわぁ・・・」[p] +#梅田 +「自分の立場がわかったか?」[p] +#亜紀子 +「は、はいブヒッ!も、もう逆らいませんブヒッ!」[p] +#梅田 +「痛そうな顔すんな。俺が酷いことしてるみたいに思われるやろ」[p] +#亜紀子 +「す、すいませんブヒッ!」[p] +#梅田 +「笑顔笑顔!」[p] +#亜紀子 +「は、はいブヒッ!」[p] +[_tb_end_text] + +[tb_image_show time="1000" storage="default/hiro101-b.jpg" width="558" height="314" x="729" y="483" _clickable_img="" name="img_71" ] +[tb_start_text mode=1 ] +#ノブオ +「おぉーーすげぇ・・・!」[p] +「あの千山アナの鼻フック顔・・・すげえエロいな!」[p] +「いつも知的な千山アナの顔が豚みたいにされて・・・」[p] +「鼻フックなんて興味なかったけど・・・なんか目覚めそうだわ」[p] +[_tb_end_text] + +[tb_image_hide time="1000" ] +[bg time="1000" method="crossfade" storage="hiro118-8.jpg" ] +[tb_start_text mode=1 ] +#梅田 +「よーし、それじゃちゃんと進行の方もやれよ」[p] +#亜紀子 +「は、はひ・・・ど、どうでふかマニアの皆様・・・ブヒッ・・・わたしの顔は不細工になってますか・・・ブヒッ」[p] +#マニアA +「え・・・あ、はい、だいぶ・・・なってます」[p] +#マニアB +「良い感じの不細工だと思います」[p] +#マニアC +「いや・・・元がすごく上品な美人なので・・・さ、最高です」[p] +#亜紀子 +「あ・・・ありがとうございまふブヒッ」[p] +#梅田 +「ユウチューバーちゃん、どうこの不細工な顔見て」[p] +#ユウチューバー +「おもしろ~~~い!すごい美人なのにすっごい不細工~~~!」[p] +#若手芸人 +(すごいなこの娘・・・この状況でようそんな無邪気に笑えるなぁ)[p] +#亜紀子 +「み、皆様は・・・こうやって女性に鼻フックをした後・・・どうしたいですかブヒッ・・・?」[p] +#マニアA +「え・・・それは・・・まぁ・・・」[p] +#マニアB +「それはやっぱり・・・」[p] +#梅田 +「まぁそりゃもう興奮してるわけやから。もうヤりたいわな」[p] +#マニアC +「そ、そうですね」[p] +#梅田 +「でもさすがにそれは今日は出来ないですから」[p] +「その後にあるでしょ、やりたいこと。ことが終って・・・」[p] +#マニアA +「え、あ・・・」[p] +#梅田 +「この顔にぶっかけたくないですか?」[p] +#マニアC +「あ、はい!かけたいです!」[p] +#マニアB +「それは最高に興奮しますね」[p] +#ユウチューバー +「ガンシャですよねガンシャ」[p] +#梅田 +「はっきり言うなて」[p] +「今日はそのぶっかけをやっていただきましょう!」[p] +#マニアたち +「えーーーーっ!?」[p] + + +[_tb_end_text] + +[tb_image_show time="1000" storage="default/hiro101-b.jpg" width="544" height="306" x="727" y="487" _clickable_img="" name="img_76" ] +[tb_start_text mode=1 ] +#ノブオ +「えっぶっかける!?」[p] +「どういうことだ・・・?まさか本当にぶっかけるんじゃ・・・」[p] +[_tb_end_text] + +[tb_image_hide time="1000" ] +[tb_start_text mode=1 ] +#梅田 +「といっても本当にぶっかけるのはさすがにテレビ的に無理なんで、今日はそのマネだけしてみましょうということで」[p] +「こちらに白くてドロっとした液体の入った水鉄砲がありますんで、それで千山の鼻フック顔に思いっきりぶっかけていただこうというわけです」[p] +#マニアA +「あ、なるほど」[p] +#若手芸人 +「そういうことね。よかった~、本当にかけるのかと思いましたよ」[p] +「この番組だったらやりかねないからなぁ~」[p] +#梅田 +「アホ、そこまではなんぼなんでもやらんわ」[p] +「それじゃ皆さん前の方に出ていただいて・・・」[p] + +[_tb_end_text] + +[stopbgm time="1000" ] +[bg time="1000" method="crossfade" storage="hiro118-7.jpg" ] +[playbgm volume="100" time="1000" loop="true" storage="music16.ogg" ] +[tb_start_text mode=1 ] +#ディレクター +「一旦カメラ止めまーす」[p] +「それじゃマニアの皆さんはこちらに来ていただいて、カメラはこっちね」[p] +#梅田 +「おい、ディレクターちょっとええか」[p] +#ディレクター +「はい、なんですか梅田さん」[p] +#梅田 +「これさ、ほんまにぶっかけることにせえへん?」[p] +#ディレクター +「えっ、どういうことですか・・・?」[p] +#梅田 +「だから千山の顔のアップにしてさ、画面の外からほんまのザーメンぶっかけるねん」[p] +「ほんでオンエアでは偽物の液体をかけたってことにすれば、これおもろいやん。いけるやろ」[p] +#ディレクター +「ええっ!?そ、それはちょっと・・・」[p] +#勝野 +「いや、それいいですね!さすが梅田さんナイスアイデアです、それでいきましょう!」[p] +#ディレクター +「えっ、ほ、本当にやるんですか?」[p] +#勝野 +「その方がリアリティがあるだろ。画面にさえ映らなきゃ何とでもなるんだから」[p] +#ディレクター +「え、でも千山さんは・・・」[p] +#勝野 +「お前は大丈夫だよな?」[p] +#亜紀子 +「は、はい・・・大丈夫です」[p] +#若手芸人 +「え、マジでやるんですか・・・?」[p] +#ユウチューバー +「えー、すごーーーい!テレビやばっ!」[p] +#マニアたち +「え・・・俺たちが本当に・・・?」[p] +#梅田 +「皆さんもせっかくやねんから千山の顔にザーメンぶっかけてみたいでしょ?」[p] +#マニアA +「え・・・まぁ・・・それは・・・」[p] +#マニアC +「かけたいですけど・・・」[p] +#勝野 +「やっぱり下ネタ番組とはいえリアリティは必要ですからね。遠慮なくやっちゃってください」[p] +「ほら、お前からもお願いしろ」[p] +#亜紀子 +「は、はい。皆様・・・どうか遠慮なく私の顔に、ざ、ザーメンをぶっかけてください」[p] +#マニアB +「は、はぁ・・・ゴクリ」[p] +#マニアA +「そ、そういうなら・・・ハァハァ」[p] +#マニアC +「なんか・・・興奮してきた・・・っ」[p] +#若手芸人 +(ほ、ほんとにやるのかよ・・・なんて番組だ・・・)[p] +(千山アナって人気あるはずなのに・・・こういう扱いなの?)[p] +#ディレクター +「そ、それじゃ・・・それでいきますけど・・・。知りませんよ?」[p] +#勝野 +「責任は俺が取るから。心配するな」[p] +#ディレクター +「わ、わかりました・・・それじゃマニアの方はこちらの方に立っていただいて・・・」[p] +# +・・・・・・[p] +・・・[p] +[_tb_end_text] + +[stopbgm time="1000" ] +[bg time="1000" method="crossfade" storage="hiro149-5.jpg" ] +[playbgm volume="100" time="1000" loop="true" storage="オフィスの日常.ogg" ] +[tb_start_text mode=1 ] +#梅田 +「さぁそれではマニアの皆さんに白いドロッとした液体をかけていただくわけですが」[p] +「千山、今の気分は?」[p] +#亜紀子 +「はひ・・・は、恥ずかしいでふ・・・」[p] +#梅田 +「ブヒは!」[p] +#亜紀子 +「あ、すいませんっ!ブヒッ!恥ずかしいブヒッ!」[p] + +[_tb_end_text] + +[tb_image_show time="1000" storage="default/hiro101-c.jpg" width="546" height="307" x="730" y="496" _clickable_img="" name="img_88" ] +[tb_start_text mode=1 ] +#ノブオ +「なんだ、偽物の液体を水鉄砲でかけるだけか・・・まぁそりゃそうだよな本物のザーメンかけるわけないか」[p] +「でも偽物の液体とはいえ、なんか興奮するなぁ」[p] +「シコシコシコシコ・・・」[p] + + +[_tb_end_text] + +[tb_image_hide time="1000" ] +[bg time="1000" method="crossfade" storage="hiro149-1.jpg" ] +[tb_start_text mode=1 ] +#マニアA +「はぁ~すごい・・・シコシコシコ」[p] +#マニアB +「千山アナの鼻フック顔・・・興奮する・・・シコシコシコッ」[p] +#マニアC +「ほとんど裸じゃん・・・千山アナってここまでするんだ・・・シコシコシコ」[p] +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro118-9.jpg" ] +[tb_start_text mode=1 ] +#梅田 +「さぁいつでも自分のタイミングでぶっかけてくださいよ」[p] +「鼻フックの顔にぶっかけるときは、どこを狙うんですか?やっぱり鼻ですか?」[p] +#マニアC +「そうですね、やっぱり大きく広がった鼻の穴ですかね」[p] +#マニアA +「僕もそこまで鼻にはこだわらないですかね。不細工な顔にぶっかけてやるということ自体が興奮するんで」[p] +#梅田 +「ほら、千山もなんかしゃべって盛り上げんと。ホンマのザーメンかけられると思ってなんかしゃべれ」[p] +#亜紀子 +「は、はひっ・・・や、やめてください・・・っブヒッ」[p] +#梅田 +「ちゃうやろ!もっと笑顔で「たっぷりかけてください」みたいなこと言わんかい!」[p] +#亜紀子 +「は、はい、すいませんブヒッ!」[p] +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro149-2.jpg" ] +[tb_start_text mode=1 ] +#亜紀子 +「み、皆様・・・亜紀子の不細工な顔に・・・いっぱいザーメンかけてください・・・っ♥」[p] +#ユウチューバー +「キャハハハハ!メス豚だぁ~~~!」[p] +#マニアA +「ハァッ・・・ハァッ・・・え、エロっ」[p] +#マニアB +「やばい・・・すげえ興奮する・・・シコシコシコ」[p] +#梅田 +「さあいつでもいいですよー、好きなタイミングでかけてくださいねー」[p] +「ほら、千山ももっとお願いしないと」[p] +#亜紀子 +「ハヒッ・・・このメス豚に・・・皆様の濃いザーメンをお恵みくださいませ・・・ブヒッ」[p] +#マニアA +「ふぉぉ・・・!シコシコシコシコッ」[p] +#マニアC +「うぉ・・・たまらん・・・っ、シコシコシコシコ」[p] +#ユウチューバー +「キャハハハハ!千山さんもっともっと!」[p] +#亜紀子 +「は、はひっ・・・あ、亜紀子はザーメン大好きな変態メス豚ですっ・・・いっぱいかけてくださいブヒッ♥」[p] +#マニアB +「ハァハァハァ・・・シコシコシコッ」[p] +#梅田 +「お前も、ほらケツ叩いたれ」[p] +#若手芸人 +「は、はいっ」[p] +(こうなりゃやけくそだ!)[p] +「おい、もっとブヒブヒ鳴け!」[p] +# +バシッ![p] +#亜紀子 +「ハヒッ!・・・ブヒッ!フゴッ・・・ブヒィーッ♥」[p] +#マニアB +「う・・・で、出る・・・っ」[p] +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro149-3.jpg" ] +[tb_start_text mode=1 ] +# +ドピュッ![p] +#梅田 +「おお!今、右の鼻の穴に見事命中しました!」[p] +#マニアB +「う・・・っ」[p] +# +ピュピュッ・・・![p] +#亜紀子 +「あ・・・フゴッ・・・」[p] +#梅田 +「いいですねー。いい感じでかかってますよー」[p] +「ほら、かけてもらったらお礼言わんかい!」[p] +#亜紀子 +「は、はひっ!ざ、ザーメンをかけてくださってありがとうございますっ・・・ブヒッ♥」[p] +#梅田 +「さあさあ他の方もどんどんかけちゃってくださいねー!」[p] +#ユウチューバー +「キャハハハ!ほら千山さんもっとお願いして~!」[p] +# +バシッ!バシィッ![p] +#亜紀子 +「アヒッ!は、はひっ、もっとザーメンかけてくださひぃっ!ブヒッ!ブヒィッ!」[p] +#梅田 +「お、ええぞユウチューバー!カッカッカッ!」[p] +#マニアC +「うぉぉ・・・やばっ・・・出るっ!」[p] +#マニアA +「ぼ、僕も・・・出るっ」[p] +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro149-4.jpg" ] +[tb_start_text mode=1 ] +# +ドピュッ![p] +ドピュピュッ![p] +#亜紀子 +「ぅ・・・ヒッ」[p] +#梅田 +「おぉ、いったぁ!鼻の穴と、口にもいったよぉーw」[p] +#マニアA +「うっ・・・ハァッ」[p] +#マニアC +「うぉぉ・・・っ!」[p] +# +ピュピュピュッ![p] +ビュルビュルッ![p] +#梅田 +「あぁ!ザーメンが口の中にいっぱい!」[p] +「出たねぇ~~これは結構な量が出ましたよぉ~~!カッカッカッ!」[p] +#ユウチューバー +「ザーメンまみれだぁ~~!くさそーー!」[p] +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro149-6.jpg" ] +[tb_cg id="149" ] +[tb_image_show time="1000" storage="default/hiro101-c.jpg" width="505" height="284" x="799" y="511" _clickable_img="" name="img_103" ] +[tb_start_text mode=1 ] +#梅田 +「ピーーーーが口の中にいっぱい!」[p] +#ユウチューバー +「ピーーーーまみれだぁ~!くさそーー!」[p] +#ノブオ +「おぉ・・・すげえ!」[p] +「なんかめっちゃリアルだなぁ。本当にぶっかけられてるみたいだ!」[p] +「偽物のザーメンとは解ってるけど・・・なんかマジで興奮するわ」[p] +「そのへんのAVより全然エロいよ」[p] +シコシコシコシコ[p] +[_tb_end_text] + +[tb_image_hide time="1000" ] +[bg time="1000" method="crossfade" storage="hiro118-10.jpg" ] +[tb_cg id="118" ] +[tb_start_text mode=1 ] +#亜紀子 +「ンぁ・・・うっ」[p] +#梅田 +「おい、吐き出すなよ!じっくりと味わって飲みこめ」[p] +「大丈夫や、ちゃんと飲んでも身体に害のない液体やから」[p] +#ユウチューバー +「キャハハハ!たしかに!」[p] +#亜紀子 +「は、はひっ・・・ン・・・ゴクッ♥」[p] +#マニアA +「の・・・飲んだ・・・」[p] +#マニアC +「あの千山アナが・・・俺の・・・を・・・」[p] +#若手芸人 +(うわ・・・すごいなこの人・・・)[p] +#梅田 +「ほら、お礼は」[p] +#亜紀子 +「は・・・はひ、ざ、ザーメンをたくさんかけていただいて・・・ありがとうございまふ・・・ブヒッ」[p] +[_tb_end_text] + +[stopbgm time="1000" ] +[tb_replay id="reps26" ] +[mask time="1000" effect="fadeIn" color="0x000000" ] +[bg time="1000" method="crossfade" storage="hiro999.jpg" ] +[mask_off time="1000" effect="fadeOut" ] +[tb_start_text mode=1 ] +# +数日後―――[p] +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro201.jpg" ] +[chara_show name="美里" time="1000" wait="true" storage="chara/1/hiro258-1.png" width="569" height="1423" left="100" top="15" reflect="false" ] +[playbgm volume="100" time="1000" loop="true" storage="neonpurple.ogg" ] +[tb_start_text mode=1 ] +#亜紀子 +「はぁ・・・」[p] +# +明日香との勝負に勝って以来、亜紀子は性奴隷として忙しい日々を送っていた[p] +連日勝野に呼び出されては長時間の性奉仕[p] +勝野はもはやただ犯すことには飽き、ただ戯れとしてわたしに屈辱を与えることを楽しんでいるようだ[p] +梅田に呼び出されて性処理に使われることもあった[p] +梅田は勝野よりも凶暴性が高く、夜通し亜紀子をいたぶり啼き声を楽しむのだった[p] +そして番組での露出もどんどん過激になっていた[p] +先日の「鼻フック回」も放送では編集で危ない部分はカットされていたが、現場では明らかに一線を越えてしまっていた[p] +全裸に近い格好でアナルにバイブを突っ込み、カメラの前で顔にザーメンをかけられるというのはほとんどAVの撮影と変わらない[p] +#亜紀子 +(スタッフにもなんでもやる女だと思われてるでしょうね・・・)[p] +# +あの場にいた人間には、亜紀子が梅田に逆らえない奴隷であるように映ったはずだ[p] +#亜紀子 +(勝野や梅田に抱かれるのはまだ耐えられるけど・・・カメラの前で辱められるのはもうイヤよ・・・)[p] +(このままじゃ番組で本当にセックスさせられたり・・・ウンチさせられたりするかもしれないわ)[p] +(そうなったら動画を公開されるのとたいして変わらないじゃないの・・・)[p] +(わたしはこのまま勝野のいいなりに・・・奴隷のまま生きていくの?)[p] + +[_tb_end_text] + +[stopbgm time="1000" ] +[glink color="black" storage="end6.ks" size="20" text="そんなのは嫌だ" x="476" y="415" width="" height="" _clickable_img="" ] +[glink color="black" storage="end5.ks" size="20" text="受け入れるしかない" x="463" y="512" width="" height="" _clickable_img="" ] +[s ] diff --git a/data/scenario/scene2.ks b/data/scenario/scene2.ks new file mode 100644 index 0000000..b16a9f2 --- /dev/null +++ b/data/scenario/scene2.ks @@ -0,0 +1,778 @@ +[_tb_system_call storage=system/_scene2.ks] + +*rep1 + +[tb_replay_start ] +[mask time="1000" effect="fadeIn" color="0x000000" ] +[chara_hide_all time="1000" wait="true" ] +[bg time="1000" method="crossfade" storage="hiro203.jpg" ] +[tb_show_message_window ] +[mask_off time="1000" effect="fadeOut" ] +[tb_start_text mode=1 ] +#亜紀子 +「あっ・・・ンッ」[p] +「あ、明日香、もうちょっと優しく・・・」[p] +#明日香 +「・・・これくらいですか?」[p] +#亜紀子 +「ンッ・・・はぁ・・・そ、そうね」[p] +「アンッ・・・!」[p] +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro106-1.jpg" ] +[playbgm volume="100" time="000" loop="true" storage="music16.ogg" ] +[tb_start_text mode=1 ] +#亜紀子 +「アンッ・・・!」[p] +#明日香 +「やっぱりだいぶ張ってますね」[p] +モミモミ[p] +#亜紀子 +「アッ・・・ハァッ・・・」[p] +#明日香 +「乳腺のところをよくほぐして・・・」[p] +モミュッモミュッ[p] +#亜紀子 +「アン・・・っ!」[p] +#明日香 +モミモミモミモミモミ[p] +モミモミモミモミモミモミ・・・[p] +#亜紀子 +「アンッ・・・アハンッ・・・」[p] +「も・・・もういいから・・・し、搾っちゃってくれるかしら・・・」[p] +#明日香 +「あ・・・はい」[p] +「それじゃ、いきますよ?」[p] +#亜紀子 +「ええ・・・大丈夫よ」[p] +#明日香 +ムギュッ[p] + +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro106-2.jpg" ] +[tb_cg id="106" ] +[tb_start_text mode=1 ] +ピューーッ![p] +#亜紀子 +「ンンーーッ・・・!」[p] +#明日香 +「出てきましたよ先輩」[p] +「もう少し我慢してくださいね」[p] +ギュッ[p] +ピューーーーッ[p] +ギュッ[p] +ピューーーーッ[p] +#亜紀子 +「アアッ・・・!アフゥッ・・・」[p] +# +亜紀子が初めて母乳が出たのはまだ学生の頃だった[p] +ある朝目覚めるとパジャマの胸のところがじっとりと濡れていたのだ[p] +妊娠もしていないのに母乳が出るなんて恥ずかしくて誰にも相談できず、まだ量も少なかったのでブラジャーにガーゼを当てるなどして対処していた[p] +社会人になり乳の量も増えてきて流石に心配になり、勇気を出して病院で診てもらったが診断結果は「何の異常もない」ということだった[p] +経産婦が他人の赤ちゃんを見たりして母性本能が刺激されることで乳が出ることはよくあるそうだが、出産経験の無い女性ではかなり珍しいケースらしい[p] +この体質の厄介なのは、いつ出るか判らないということだ[p] +乳が溜まると乳房が張ってくるのだが、それが不意に堰を切ったように溢れ出てしまうのだ[p] +本番中に急に母乳が溢れ出して、ブラに仕込んだガーゼを通り越してブラウスに染み出してしまって冷や汗をかいたこともある[p] +自分で搾って出してしまえばいいのだが、なぜか自分でやっても全然出ないのでどうしようもない[p] +幸い誰にも気付かれずに過ごしてきたが、このままではバレるのは時間の問題だった[p] +別に悪いことをしているわけではないから堂々としていれば良いのだが、やはり母乳体質などというのを他人に知られるのは恥ずかしい[p] +ただでさえ胸が大きくてネットでは千山をもじって「乳山」などと呼ばれているのに、これで母乳が出ると知れたら世間からどんな奇異の目でみられることか・・・[p] +そんなある日、本番直前に乳が溢れてしまいあわてて処理しているところを明日香に見られてしまったのだ[p] +あわてて事情を説明すると明日香は笑わずに聞いてくれ、本気で心配してくれた[p] +それまで明日香とは挨拶くらいであまり話したことが無かったのだが、その時に初めて色々話をした[p] +実はテレビで亜紀子を見て憧れて、アナウンサーになりたいと思ってこの局を受けたのだということも、このときに初めて教えてくれた[p] +それから明日香と仲良くなったのだが、ある時試しに乳を搾ってもらったら驚くほど簡単に母乳が出たのだ[p] +コツがあるのか解からないが、明日香にやり方を教えてもらっても自分ではどうしても出ないのだから不思議だ[p] +それ以来、本番前に乳が張るときは明日香に母乳を搾ってもらうことにしている[p] + + +[_tb_end_text] + +[tb_start_text mode=1 ] +#亜紀子 +「アハン・・・っ!ハァ・・・ンッ」[p] +# +ムギュッ[p] +ピューーーーッ[p] +ムギュッ[p] +ピューーーーッ[p] +#亜紀子 +「ンッ・・・ハァッ♥」[p] +# +亜紀子は元々、身体の感度がかなり良い[p] +これもホルモンが関係しているのだろうか、特に乳が溜まっている時の乳首は敏感になる[p] +こうやって強く刺激されると身体が反応し、どうしても声が出てしまうのだ[p] +#亜紀子 +「も、もうそのくらいでいいわ・・・アンッ♥」[p] +#明日香 +「そうですか?まだちょっと張ってますけど・・・」[p] +#亜紀子 +「も、もう大丈夫よ。今日いっぱいはもう出ないと思うから」[p] +#明日香 +「そうですか・・・わかりました」[p] +#亜紀子 +(なんでちょっと残念そうなの・・・?)[p] + + + +[_tb_end_text] + +[stopbgm time="1000" ] +[tb_replay id="reps1" ] +[bg time="1000" method="crossfade" storage="hiro203.jpg" ] +[chara_show name="美里" time="1000" wait="true" storage="chara/1/hiro253-1.png" width="411" height="986" left="224" top="27" reflect="false" ] +[chara_show name="明日香" time="1000" wait="true" storage="chara/2/hiro252-3.png" width="702" height="963" left="480" top="34" reflect="false" ] +[playbgm volume="100" time="1000" loop="true" storage="neonpurple.ogg" ] +[tb_start_text mode=1 ] +#亜紀子 +「ふう・・・ありがとう明日香。いつも助かるわ」[p] +#明日香 +「いえ、とんでもないです」[p] +「先輩のお乳を搾るのは私だけの特権ですから」[p] +#亜紀子 +「そ、そう・・・」[p] +(やっぱりちょっとレズっ気があるのかしら・・・?)[p] +# +明日香は過去にトラウマを持っており、そのせいで男嫌いになってしまっている[p] +亜紀子も男には良い思い出が無いが、性欲はノーマルだ[p] +#亜紀子 +「さてと、そろそろリハーサルが始まるから行かないと」[p] +「あなたもこの後ニュース読みがあるのよね?」[p] +#明日香 +「はい」[p] + +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro202.jpg" ] +[tb_start_text mode=1 ] +#男の声 +「おーい、明日香ちゃん」[p] +[_tb_end_text] + +[chara_hide_all time="0" wait="true" ] +[chara_show name="美里" time="0" wait="true" storage="chara/1/hiro253-1.png" width="410" height="984" left="126" top="52" reflect="false" ] +[chara_show name="明日香" time="00" wait="true" storage="chara/2/hiro252-2.png" width="709" height="973" left="305" top="45" reflect="false" ] +[chara_show name="勝野" time="1000" wait="true" storage="chara/5/hiro256-1.png" width="437" height="1049" left="788" top="-3" reflect="false" ] +[stopbgm time="1000" ] +[playbgm volume="20" time="1000" loop="true" storage="枯れ葉が集う路地裏通り_2.ogg" ] +[tb_start_text mode=1 ] +#明日香 +「あ、勝野さん・・・」[p] +#勝野 +「例の件、考えてくれた?」[p] +#明日香 +「あの件ならお断りしたはずですが・・・」[p] +#勝野 +「そう冷たいこと言わずにさ!一回だけで良いから、ね!」[p] +# +このチャラチャラしていかにも業界人という感じの男はプロデューサーの勝野康平(かつのこうへい)だ[p] +亜紀子とは同期だが歳はいくつか上だ[p] +家が裕福で、二浪して入った三流大学で2回ほど留年し、コネを使ってこのテレビ局に入社してきた[p] +しかしこの業界が合っていたのか、それともコネの力か、同期の中では一番早くプロデューサーに昇格している[p] +数字さえ獲れればなんでもいいという考え方で、深夜にかなり際どいお色気番組をいくつか担当している[p] +#亜紀子 +「明日香はキャスター志望よ。あなたの低俗な番組に出るわけないでしょ」[p] +#勝野 +「うるさいな、お前には聞いてないんだよ」[p] +「自分が誘われないからって嫉妬してるのか?」[p] +#亜紀子 +「は?」[p] +#勝野 +「悪いがズボンを穿いてるような女子アナに需要はないんだよ。超ミニを穿いてパンチラの一つもサービスしてくれるなら俺の番組に出してやってもいいけどな」[p] +#亜紀子 +「・・・まったく。あなたのような低俗な人間が居る限り、性の商品化は無くならないわね」[p] +#勝野 +「低俗で結構。おかげさまで数字も上々だぜ」[p] +#亜紀子 +「あなたの作る番組は女性の裸で安易に数字を稼いでるだけじゃない。自分の仕事が恥ずかしくならないの?」[p] +#勝野 +「全く恥ずかしくないね。俺は世の中が求めているものを作っているのさ」[p] +「それに性の商品化ってのは無理やり男女平等を押し付けられて社会進出させられた女たちへの救済でもあるわけで・・・」[p] +#亜紀子 +「ハッ。最近の男尊女卑ブームの受け売りじゃないの」[p] +#勝野 +「フン、時代の波に乗っているのさ。テレビマンは時代の流れに敏感で無いといけないからな」[p] +「お前のような自分を賢いと勘違いしてるバカ女には解からないだろうが」[p] + + + + + + + +[_tb_end_text] + +[chara_mod name="美里" time="0" cross="true" storage="chara/1/hiro253-2.png" ] +[tb_start_text mode=1 ] +#亜紀子 +「なんですって!?」[p] +#明日香 +「ちょ、ちょっと先輩、もう行きましょう」[p] +「わたしあなたの番組に出る気はありませんから。失礼します」[p] +#勝野 +「気が変わったらいつでも待ってるからね明日香ちゃん」[p] + + +[_tb_end_text] + +[chara_hide name="美里" time="400" wait="true" pos_mode="false" ] +[chara_hide name="明日香" time="400" wait="true" pos_mode="true" ] +[tb_start_text mode=1 ] +#勝野 +「ふん・・・惜しいなぁあの二人。俺が使ってやれば一気に数字の取れるスターにしてやれるのに」[p] +「千山の方はいいが明日香まで千山の影響を受けてお堅い路線に走っちゃって・・・もったいねえ」[p] +「・・・しかしあいつらこの楽屋から出てきてたよな」[p] +「こんなところで何してたんだ?」[p] +「まさかアレがバレたんじゃ・・・」[p] + +[_tb_end_text] + +[chara_hide name="勝野" time="500" wait="true" pos_mode="true" ] +[bg time="1000" method="crossfade" storage="hiro203.jpg" ] +[chara_show name="勝野" time="0" wait="true" storage="chara/5/hiro256-1.png" width="479" height="1149" left="399" top="-7" reflect="false" ] +[tb_start_text mode=1 ] +#勝野 +「・・・」[p] +「・・・よかった無事だ」[p] +「アイドルの着替えでも撮れないかと仕込んでおいた隠しカメラ・・・」[p] +「もしかしてあいつに気付かれたんじゃないかと思って焦ったぜ」[p] +「ただ仕事サボってくっちゃべってただけか」[p] +「こんなことがバレたらさすがにクビだろうからな」[p] +「しかしリスクの割りに毎回たいした収穫は無いんだよなぁ」[p] +「今度こそなにか面白いものが撮れてると良いんだが・・・」[p] +# +・・・・・・[p] + + +[_tb_end_text] + +[mask time="1000" effect="fadeIn" color="0x000000" ] +[chara_hide_all time="1000" wait="true" ] +[stopbgm time="1000" ] +[playbgm volume="100" time="1000" loop="true" storage="neonpurple.ogg" ] +[bg time="000" method="crossfade" storage="hiro201.jpg" ] +[chara_show name="美里" time="00" wait="true" storage="chara/1/hiro253-1.png" width="483" height="1159" left="116" top="80" reflect="false" ] +[mask_off time="1000" effect="fadeOut" ] +[tb_start_text mode=1 ] +# +数日後[p] +[_tb_end_text] + +[chara_show name="谷田" time="1000" wait="true" storage="chara/4/hiro259-1.png" width="384" height="921" left="714" top="65" reflect="false" ] +[tb_start_text mode=1 ] +#谷田 +「千山さん、本番20分前です。そろそろお願いします」[p] +#亜紀子 +「わかったわ。ありがとう」[p] + +[_tb_end_text] + +[chara_hide name="谷田" time="1000" wait="true" pos_mode="true" ] +[bg time="1000" method="crossfade" storage="hiro202.jpg" ] +[tb_start_text mode=1 ] +#亜紀子 +「今日の収録は気を抜けないわ・・・」[p] +「・・・あら?」[p] +[_tb_end_text] + +[chara_show name="明日香" time="1000" wait="true" left="868" top="378" width="37" height="89" reflect="false" storage="chara/2/hiro257-2.png" ] +[tb_start_text mode=1 ] +#亜紀子 +(あれは・・・明日香?)[p] +#明日香 +「・・・!」[p] + + +[_tb_end_text] + +[chara_hide name="明日香" time="1000" wait="true" pos_mode="true" ] +[tb_start_text mode=1 ] +#亜紀子 +「あれっ、明日香・・・?」[p] +(今の・・・明日香だったわよね?)[p] +(なんか際どい服を着てたような気がしたけど・・・)[p] +(・・・・・・)[p] +(まぁ、気になるけど今は本番に集中しないと)[p] +# +今収録に向かっているのは亜紀子がMCを務める30分の生討論番組『とことん生討論!』だ[p] +毎回一つのテーマについて専門家などをゲストに呼んで討論する真面目な番組だ[p] +今回のテーマは「男尊女卑」[p] +もし10年前にこのテーマを取り上げたら「女性の社会進出を阻む悪しき習慣」として、どう改善に取り組むかを議論することになったはずだ[p] +しかし今日本は男尊女卑再評価のブームが起きている真っ最中なのだ[p] +行き過ぎたフェミニズムの反動として、貞淑で奥ゆかしい日本古来の女性の美徳を取り戻そうという「大和撫子ブーム」が始まったのが数年前のことだ[p] +一時の流行に終るかと思われたこの動きは、意外にも一定の支持を得て定着した[p] +ブームを支えているのは、女は家庭を守るのが当たり前、セクハラなんて言葉も存在しなかった昭和世代の男たちだ[p] +彼らは(自分たちにとっての)古き良き時代を取り戻そうと、積極的にブームを後押しした[p] +彼らにとって都合がよかったのは、今社会的に高い地位、影響力を持っている立場の人間のほとんどがこの世代だということだった[p] +結果ただのファッションとしてスタートした大和撫子ブームは、いつしか男尊女卑ブームとなりあらゆる世代を巻き込んで論争を引き起こし始めた[p] +#亜紀子 +(社会問題として男尊女卑をテーマに取り上げるのはわかるけど、ゲストの顔ぶれがちょっと・・・)[p] +(今日の収録、荒れずには済みそうもないわね・・・)[p] + + + +[_tb_end_text] + +[mask time="1000" effect="fadeIn" color="0x000000" ] +[stopbgm time="1000" ] +[chara_hide name="美里" time="1000" wait="true" pos_mode="true" ] +[bg time="1000" method="crossfade" storage="hiro126.jpg" ] +[mask_off time="1000" effect="fadeOut" ] +[playbgm volume="40" time="1000" loop="true" storage="music15.ogg" ] +[tb_start_text mode=1 ] +#亜紀子 +「こんにちわ、とことん生討論!進行役の千山亜紀子です。よろしくお願いします」[p] +「今週のテーマは『男尊女卑』です。それではまずゲストの方々を紹介しましょう」[p] +「まずは著書『男尊女卑の勧め』がベストセラーに、30年前から男尊女卑の合理性を唱えてきた麻羅川大学教授の倉本峰吉(くらもと みねきち)さん」[p] +#倉本 +「よろしくお願いします」[p] +# +スキンヘッドの痩せた老人がしっかりと挨拶をする[p] +#亜紀子 +「続いて健全な精神を育成する教育団体『男根会』の主任で、思想家の黒原剛介(くろはら ごうすけ)さん」[p] +#黒原 +「よろしく」[p] +# +オールバックに髭、でっぷりと腹の突き出たいかにも精力の強そうな男が横柄に頷く[p] +#亜紀子 +「そしてジェンダー問題に関する著書多数、フェミニズム運動家としても長年活躍されている御楚々女子大教授の真崎リカ(まさき りか)さん」[p] +#リカ +「よろしくお願いします」[p] +# +ベリーショートに緑色の鮮やかなスーツを着た痩せぎすの中年女性が厳しい顔つきで挨拶する[p] +#亜紀子 +「最後に美人精神科医として最近はテレビにも引っ張りだこ、篠田百合絵さん」[p] +#百合絵 +「どうもよろしくお願いします」[p] +# +ロングヘアーの豊満な女医が、隙の無い化粧で整えられた美しい顔でどこか作り物っぽい笑顔を見せる[p] +#亜紀子 +(さぁ、討論を始めてもらいましょう)[p] + +[_tb_end_text] + +[glink color="black" storage="scene2.ks" size="20" target="*s1" text="番組内容を見る" x="527" y="366" width="" height="" _clickable_img="" ] +[glink color="black" storage="scene2.ks" size="20" target="*s2" text="内容を飛ばす" x="535" y="448" width="" height="" _clickable_img="" ] +[s ] +*s1 + +[tb_start_text mode=1 ] +#亜紀子 +「まず倉本さんにお伺いします。なぜ今「男尊女卑」なのでしょうか?」[p] +#倉本 +「あの~、男尊女卑といいますと女性の皆さんは「権利を剥奪される」「自由を制限される」というイメージで敬遠しがちですが、決してそういうことではないんですね」[p] +「そもそも男性と女性というのは全く違った生き物であり、それぞれに見合った役割を果たすことで社会をより潤滑に、活性化していこうということなんです」[p] +「戦後、日本には無かった男女平等という観念が欧米から流入してきて、女性がどんどん社会進出するようになって来ました」[p] +「国も女性の社会進出を後押ししてきました。先進国なら欧米に倣わないといけないという強迫観念がこの国にはありますから」[p] +#リカ +「国が女性の社会進出を積極的に進めてきたとは思えませんけど」[p] +#倉本 +「まぁともかく女性がどんどん社会に出て働き始めたのは事実です」[p] +「しかしこれがよくなかった」[p] +「女性が働き始めると女性がなかなか結婚しなくなった」[p] +「自分で稼いで食っていけるから養ってもらう必要がないし、仕事があるから毎日忙しい」[p] +「ということで晩婚化が進み結婚をしない女性も増えてきた」[p] +「そうすると出生率が下がり人口が減り、消費も落ち込み景気が悪くなる」[p] +「するとより働かないといけなくなり、ますます結婚が遅れる。お金が無いので子供を多く育てられないので少子化も進む」[p] +「それでさらに景気が悪くなる。悪循環です」[p] +「女性が社会進出して女性は幸せになりましたか?なってないんです。逆に不幸になっている」[p] +#亜紀子 +「それでは女性は働くべきではないとおっしゃるんですか?」[p] +#倉本 +「別にわたしは女性の社会進出を今さらやめろとは言いません」[p] +「女性にも能力の高い人は居ますし、女性に向いている仕事もあります。どんどん働けば良いでしょう」[p] +「問題なのは社会進出に伴う女性の精神的な変化なんです。これが毒のように社会蝕んでいるんです」[p] +#亜紀子 +「精神的変化とは、具体的にはどういった変化ですか?」[p] +#倉本 +「一番大きいのは過剰な権利の主張です」[p] +「男と対等の権利をよこせ、と主張していたのが行き過ぎてそれ以上のものを望むようになってしまったのです」[p] +「ちょっとでも自分の気に入らない干渉に対しては、やれセクハラだのナニハラだのと騒ぎ立てる」[p] +「そのくせ結婚相手には現実からかけ離れた高望みをして、選り好みをした結果婚期を逃して売れ残ってしまう」[p] +「そして結婚をしたとしてもちょっとでも理想と違えばすぐに離婚」[p] +「女性が社会進出をして自信をつけプライドが高く欲も深くなったことで、結果女性自身が不幸になってしまっているんです」[p] +「そこで今一度日本女性の慎み深さを取り戻そうというのが男尊女卑回帰の意義なんです」[p] +「謙虚で淑やかで従順な、男に対して敬意を忘れない「大和撫子」を再評価することによって社会を本来のあるべき姿に戻そうということです」[p] +「そうすることで女性自身も心の平穏、満足を得ることができるのです」[p] +#リカ +「ふざけてるんですか!?全く意味不明だわ!」[p] +「なんで長年苦労してやっと手に入れた女性の権利を自ら手放して、男の奴隷に戻らないといけないんですか!それのどこが幸せなんです!?」[p] +「だいたい私に言わせれば今だってまだまだ男尊女卑なんですよ、世の中は」[p] +「男女平等なんて聞こえの良いことを言ってますが、現実は政治家や経営者、管理職における女性の割合は欧米に比べてはるかに低いんです」[p] +「これが一向に改善しないのは、日本にはまだまだ男尊女卑の思想が根強く残っているからなんです!」[p] +「それなのに男尊女卑を復活させようなんて、狂ってますよ、こんなのは!」[p] + + +[_tb_end_text] + +[tb_start_text mode=1 ] +#黒原 +「ふん、男女平等などというものがそもそも愚かでナンセンスな思想なのだ」[p] +#リン +「男女平等のどこが愚かだって言うんですか!」[p] +「同じ人間が平等な権利を持つのは当たり前でしょう。人間の半分は女性なんですよ!」[p] +#黒原 +「いいか、男と女は別の生き物だ。性質が違うんだよ」[p] +「日本に限らず世界のあらゆる国、文明で政治を動かしてきたのは男だ。それは何故か?男の方が政治において能力が高いからだ」[p] +「女の脳は政治には向いていない」[p] +#リカ +「ちょっと待って!クレオパトラやエリザベス1世のように有名な女性の権力者もいますよ!わが国にだって卑弥呼や北条政子など・・・」[p] +#黒原 +「少数の稀有な例外はある。だがほとんどは男が世を支配してきた。これは事実だ」[p] +#亜紀子 +「それは昔は暴力が支配する時代だったから、体力に勝る男性が発言権を持っていただけでは?」[p] +#リカ +「そうよ!今は話が違うわ!」[p] +#黒原 +「ほう、ならば知力は男女で互角だと?」[p] +「ならば聞くが囲碁、将棋のプロに女性が何人いるか知っているか?」[p] +#リカ +「たくさん居るんじゃないんですか?あまり詳しくないですけど、最近話題になってる中学生棋士の坂村蓮華ちゃんとか・・・」[p] +#黒原 +「それは『女流プロ』だ。実力では男に勝てないからという理由で作られた女性限定のリーグに過ぎない」[p] +「男女問わず参加できる最高峰の『プロリーグ』に合格した女は、囲碁将棋ともに過去一人も居ない」[p] +#リカ +「そ、それは競技人口の差が・・・」[p] +#黒原 +「なぜ競技人口に差が出る?それは向いていないからだ。女の脳は論理的思考に向いていないのだ」[p] +#亜紀子 +「篠原先生は脳科学の専門家でいらっしゃいますが、このことについてどう思われますか?」[p] +#篠原 +「そうですね・・・」[p] +「男女で脳の構造に差があるのは様々な研究によって明らかになっています」[p] +「一般的に論理的思考能力や発想力は男性の方が高く、記憶力や感情に関する分野は女性が優れていると言われています」[p] +#黒原 +「そう。だから女性は政治家や管理職には向いていないのだ」[p] +#亜紀子 +「それは平均した場合の傾向であって、個人で比べれば例外も多いはずですよね?」[p] +#リカ +「そうよ!平均値でちょっとばかり差があるからって、女性が政治家や管理職になっちゃいけないってのはおかしいわ!」[p] +#黒原 +「誰もなってはいけないとは言っていない」[p] +「向いているものはなればいいし、そのあるがままの状態が今の政治家や経営者における男女の割合なのだ」[p] +「それを無理に同じ数にしようというのは間違っている」[p] +#亜紀子 +(うーん・・・女性側が押されてるわね)[p] +(このままじゃ男尊女卑を肯定する流れで終ってしまうわ・・・)[p] + +[_tb_end_text] + +[tb_start_text mode=1 ] +#倉本 +「人間がこの地球上で発展してきた近代までの数万年、ずっと人類は男尊女卑だったのです」[p] +「男が働き女がそれを助ける。それが効率の良い形態だったからです」[p] +「自然、女は男を敬い男は女を慈しむようになった。人間の自然な形なのです」[p] +「現在においても一次産業、つまり農業や漁業の家庭では男が働き女が支えるという形が当たり前のようにとられています」[p] +「しかし都市型の生活をするようになってその基本が崩れた」[p] +「これは文明の進歩に伴って男女であまり効率の差がない職種が増えてきたからですが、これはまぁ仕方のないことです」[p] +「ですが女性が社会進出すると同時に男尊女卑という調和の取れた人間の基本的スタイルも同時に崩れ始めた」[p] +#黒原 +「それを教育によって正し、本来の男女の関係を取り戻そうというのが我々の使命なのだ」[p] +#リカ +「バカじゃないの!?取り戻す必要全くないでしょ!」[p] +「人類は進化したのよ!もう男尊女卑の時代は終ったの!」[p] +#黒原 +「それは違う。文明は急激に進化したが、人間という生物種はそんな速度では進化しない」[p] +「生物の進化は何万年という時間をかけてゆっくりと行われるものだ。男尊女卑はDNAにしっかりと刻み込まれている」[p] +「それを頭で考えて否定しようとするから歪みが生じるのだ」[p] +「本能に従えば自然男尊女卑になるし、男尊女卑な社会の方が女性にとっても生きやすいのだ」[p] +#リカ +「生きやすいわけないでしょ!」[p] +「昔の女性はどうしようもないから耐えていただけ!」[p] +#黒原 +「耐えていた?それは違う。それが当たり前だから耐えているという認識などなかったのだ」[p] +「昔の日本、いや世界の何処だって望む相手と結婚できることなどほとんどなかった」[p] +「親や他者が決めた相手と自分の意思などなく結婚させられるのは普通だったし、相手がどんな男だろうと離婚など許されなかった」[p] +「では昔の女は皆不幸だったのか?決してそんなことはない」[p] +「しっかりと主人のために尽くし、家を守り子育てをし、満足して生きていた」[p] +「女は男に従い、男に尽くすことに幸せを感じるように出来ているのだ」[p] +#リカ +「そんなの男の妄想よ!頭おかしいんじゃないの!?」[p] +「女が全員ドMだとでも思ってるの!?」[p] +#黒原 +「その通りだ。女は基本的に全員マゾなのだ」[p] +#リカ +「はぁ!?」[p] +#亜紀子 +(ちょっと話が無茶苦茶になってきたわね)[p] +(ここは篠原先生に論理的に反論してもらいましょう)[p] +「篠原先生、黒原さんはこうおっしゃってますが、どう思われますか?」[p] +#篠原 +「そうですね・・・」[p] +「黒原先生のおっしゃるとおり、女性のおよそ95%はマゾ気質があるという調査結果が出ています」[p] +「自分がSであると思っている女性においても、そう思い込んでいるだけで本質的にはマゾであるケースがほとんどです」[p] +#亜紀子 +(!?)[p] +(篠原先生・・・?)[p] +#篠原 +「これは厳しい環境では望む相手と出会える確率は低く、望まない相手との無理やりな性交でも快感を覚えて受け入れるように進化してきたからだと考えられています」[p] +「例えば動物には子殺しという行動があり、これは限られた出会いの中でメスに自分の子供を産ませるために、現在養育中の他のオスとの間の子供を殺して強制的に発情状態にするための行動ですが」[p] +「この場合でもメスは自分の子供を殺したオスを抵抗せずに受け入れます。それはそのほうが合理的だからです」[p] +「このようにメスには耐え忍び、それを快感に変換する能力が備わっているのです」[p] +「そういう意味では男尊女卑というのは非常に合理的な社会スタイルだと言えます」[p] +#リカ +「ちょっ・・・あなた!?」[p] +#亜紀子 +(やられた・・・!)[p] +(篠原先生をすっかり女性側の陣営だと思い込んでたけど・・・そうじゃなかった!)[p] +(最初からこの討論は3対1の戦いだったんだわ!)[p] +「あ、ここで一旦CMに入ります」[p] + + + +[_tb_end_text] + +[stopbgm time="1000" ] +[bg time="1000" method="crossfade" storage="hiro999.jpg" ] +[tb_start_text mode=1 ] +#亜紀子 +「どういうことですか一体?」[p] +#ディレクター +「知らないよ。こっちも驚いてるんだ」[p] +# +出演者の4人はリハーサルをしていないし台本ももちろん無い[p] +しかし企画段階では間違いなく篠原先生は男尊女卑否定派としてキャスティングされていたはずだ[p] +それが男尊女卑肯定派に回るとは全く想定していなかった[p] +#亜紀子 +(ディレクターも知らないってことは・・・もっと上が仕組んだこと?)[p] +# +篠田先生はこれまでテレビやSNSでも男尊女卑ブームとは距離を置き、冷静な発言をしていた[p] +それが急に考えを変えて男尊女卑肯定派に回るとは考えにくい[p] +#亜紀子 +(お金・・・?それともなにか弱みでも握られているとか・・・)[p] +(とにかく後半は篠原先生を頼ることはできないということね)[p] +(かといって真崎先生は感情に流されて冷静な発言が出来ていないし・・・)[p] +# +亜紀子は普段この番組ではあまり自分の意見を挟まずに司会に徹するようにしている[p] +キャスターとは本来、対話をスムーズに進行させるのが役目であって自己主張をするべきではないとされている[p] +しかし大物司会者の中には堂々と自分の意見を放り込む人も居るし、そうでなくても質問などで自分の考えを示唆し話を誘導することは出来る[p] +#亜紀子 +(・・・このままでは男尊女卑をアピールする番組になってしまうわ)[p] +(私の番組でそんなことは絶対にさせない・・・!)[p] +・・・・・・[p] +#ディレクター +「CM明けまーす!」[p] + + +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro126.jpg" ] +[playbgm volume="55" time="1000" loop="true" storage="music15.ogg" ] +[tb_start_text mode=1 ] +#倉本 +「まずフェミニズムという欧米から持ち込まれた概念を排除しないといけません」[p] +#黒原 +「あれが女を増長させるきっかけになった」[p] +「男が甘やかしたのもいけなかった。女というのは男がきっちり手綱を握っておかないといけない生き物なのだ」[p] +#篠原 +「そうですね。女性は甘やかすとすぐに増長してしまう性質があります。ですから男性による躾(しつけ)を必要としているのです」[p] +#リカ +「躾って、女は動物じゃないんですよ!」[p] +# +CMが明けて男尊女卑肯定派はますます勢いを増していった[p] +唯一の女性側である真崎先生は、ヒステリックに声を荒げるばかりでまともに反論できないでいる[p] +#黒原 +「我らが男根会には多くの女性が入会しているが、教育を受け皆立派な淑女になり幸せを掴んでいる」[p] +「だが本来は義務教育で子供のうちから「女は男に従うもの」という常識を身につけさせるべきなのだ」[p] +「そもそも男女に同じ教育を受けさせるということが間違っているのだ」[p] +「我々男根会が経営する学校法人礼愛学園では男子と女子をきっちりとクラス分けして教育している」[p] +「女子には「淑女」という科目があり、そこで礼儀作法を徹底的に教え込んでいる」[p] +「女子は校内で男子に会ったときは年齢にかかわらず敬語を使い、きっちりと挨拶しなければならない」[p] +「校内の掃除は全て女子が行い、給食の配膳も女子が行う」[p] +「女子には新体操やチアリーディングなどの例外を除き運動系の部活動はなく、全ての女子は男子の部活動のサポートを義務付けられている」[p] +「このように日頃から男子に敬意を持って奉仕することを覚えさせるのだ」[p] +「礼儀正しく立派な淑女に育つと保護者の方々にも満足いただいている」[p] +#亜紀子 +(とうとう自分たちが経営する学校のPRを始めたわね)[p] +(もう余り時間もないし・・・私がなんとかしないと!)[p] +#黒原 +「日本人を本来の自然で健全な姿に戻すには、なにより教育が大事なのだ」[p] + + +[_tb_end_text] + +*s3 + +[tb_start_text mode=1 ] +#亜紀子 +「先ほどから黒原さんは男尊女卑こそが人間のあるがままの自然な形だとおっしゃってますが」[p] +#黒原 +「うむ?」[p] +#亜紀子 +「文明の発展した先進国ほど男女平等が推し進められています」[p] +「これは文明が進み豊かになればなるほど男女平等になるのが自然なことだからではないんですか?」[p] +#黒原 +「それは・・・先ほども言ったように社会構造の急激な変化に人間の進化がついていけないのだ」[p] +「今は過渡期であり、どの国も男女平等が害をもたらすということにまだ気付いていないのだ」[p] +「さらに時代が進めばどの国も男尊女卑に回帰していくであろう。なぜなら男尊女卑は人間の本質だからだ」[p] +#亜紀子 +「それでは身分制度についてはどうお考えですか?」[p] +#黒原 +「なに?」[p] +#亜紀子 +「かつては世界中で身分制度があり、人間は生まれたときから階級で分けられ差別されてきました。それが当たり前でした」[p] +「ということは身分制度も人間本来の形ですか?平等は不自然だと?」[p] +#黒原 +「む・・・それとこれとは違う!」[p] +#亜紀子 +「なにが違うのでしょう?それでは人種差別はどうですか?」[p] +「人種によって能力に差があるとすれば、能力の高い人種が能力で劣る人種を支配し、奴隷として従えることも人間本来の自然な形ですか?」[p] +「黒原さんの理論だとそういうことになりますが・・・」[p] +#黒原 +「私はそんなことは言っていない!人種差別と男尊女卑は全く違う!」[p] +「奴隷は強制されたものだ。わたしは女性に自発的な意識改革を求めているだけで・・・」[p] +#亜紀子 +「でも先ほどは義務教育で男女を分けて教育すべきとおっしゃってましたよね?」[p] +「女子には男子に従うように教育すべきだと。義務教育でそれを行うのは強制以外のなにものでもないのでは?」[p] +#黒原 +「む、それは・・・」[p] +#亜紀子 +「今も世界で黒人差別は根強く残っています」[p] +「白人と黒人は別々に教育すべき、黒人には白人を敬い白人に従うように教育すべき、黒原さんはそうおっしゃるわけですね?」[p] +「あなたのいっていることはそういうことですが」[p] +#黒原 +「わたしは人種差別の話などしておらん!勝手に話を摩り替えるな!」[p] +「だいたいなんだね貴様は!進行役じゃないのか!?」[p] +「貴様はお飾りとしてそこに座っておけばよいのだ!女子アナ風情がでしゃばるな!」[p] +#亜紀子 +「・・・これは失礼しました」[p] +#黒原 +「全く非常識な女だ。女のくせにズボンなどを穿いている時点推して量るべしだがな」[p] +#亜紀子 +「服装がお気に召しませんでしたか?」[p] +#黒原 +「気に入らん!だいたい女子アナなどというモノは容姿で選ばれておるのだろう」[p] +「ならば脚の一つも見せて視聴者の目を楽しませるのも仕事の一つであろうが」[p] +「男に媚びないというアピールなのだろうが、貴様のような女が一番世の中に悪影響を及ぼすのだ」[p] +#亜紀子 +「ズボンを穿くことがどのように世の中に悪影響を及ぼすのか、ご教授願えますか?」[p] +#黒原 +「教えてやる。よく聞け」[p] +「いいか、女は男に媚びるべきなのだ」[p] +「昔から女は男の気を引くために着飾ったり、化粧をしたり、ブリっ子を演じたりしてきただろう」[p] +「『選ぶ性』であるオスの関心を得るためのメスの当然の行動なのだ」[p] +「だがいつからか勘違いしてプライドだけ高くなった女たちが、男に媚びる女を批判し始めた」[p] +「女は自立すべきで男に媚びるべきではない、と。女に真の自立などありえないというのに」[p] +#亜紀子 +「・・・・・・」[p] +#黒原 +「ふん、理解できんか。女子アナに知性を求めるのが酷というものか」[p] +#亜紀子 +「なるほどご高説ありがとうございました」[p] +「・・・ところで今黒原さんはオスを『選ぶ性』とおっしゃいましたが」[p] +#黒原 +「・・・?」[p] +#亜紀子 +「一般的に生物学においては『選ぶ性』とはメスのほうを指して使う言葉です」[p] +「多くの生物でオスはオス同士で争ったり、ダンスや鳴き声でアピールしたり、エサを運んだり立派な巣を作ったりしてメスにアピールするものです」[p] +「そうやって必死に気を引いてメスに選ばれようとするのです。そしてメスは競争に勝った優秀なオスを選ぶわけです」[p] +「そうですよね篠原先生?」[p] +#篠原 +「え?え・・・ええ、そうです」[p] +#黒原 +「む・・・っ」[p] +#亜紀子 +「そんな常識もご存じないとは驚きです」[p] +「それと先ほど「推して量るべし」とおっしゃってましたが、正しくは「推して知るべし」ですね」[p] +#黒原 +「く・・・っ」[p] +「あ、揚げ足を取るな!」[p] +#亜紀子 +「これは失礼」[p] +「しかし優秀なはずの男性の中で黒原先生自身はあまり優秀ではないご様子で」[p] +「メスに選んでもらえるようにもっと努力なされてはいかがでしょうか」[p] +#黒原 +「き、貴様・・・!」[p] +#亜紀子 +「もっとも私がメスでしたら黒原さんのようなオスを選ぶことは金輪際あり得ませんけどね」[p] +#リカ +「そうよ!出直してきなさい!」[p] +#亜紀子 +「さて時間が来てしまいましたので今週はここまでとさせていただきます。まとめをする時間も無くて申し訳ありません」[p] +「それではまた来週」[p] +#黒原 +「おい、待て!ふざけるなっ・・・!おい・・・!」[p] + + + +[_tb_end_text] + +[stopbgm time="1000" ] +[mask time="1000" effect="fadeIn" color="0x000000" ] +[bg time="1000" method="crossfade" storage="hiro202.jpg" ] +[chara_show name="美里" time="1000" wait="true" storage="chara/1/hiro253-1.png" width="500" height="1200" left="156" top="24" reflect="false" ] +[chara_show name="黒原" time="1000" wait="true" storage="chara/6/hiro264-1.png" width="503" height="861" left="673" top="21" reflect="false" ] +[mask_off time="1000" effect="fadeOut" ] +[playbgm volume="100" time="1000" loop="true" storage="music17.ogg" ] +[tb_start_text mode=1 ] +#ディレクター +「おつかれさまでーす!」[p] +#黒原 +「おい貴様、待て!待たんか!」[p] +#ディレクター +「まぁまぁまぁ黒原先生、落ち着いてください」[p] +#亜紀子 +「どうもお疲れ様でした。なにかご用でも?」[p] +#黒原 +「貴様よくもこのわしに恥をかかせてくれたな!」[p] +#ディレクター +「まぁまぁまぁまぁ」[p] +#亜紀子 +「あら、あのような妄言を垂れ流しておきながら恥という概念はお持ちなんですか?」[p] +#黒原 +「貴様・・・!」[p] +#ディレクター +「まぁまぁまぁまぁ」[p] +#亜紀子 +「それでは次の仕事がありますので失礼します」[p] +「もう会うこともないかと思いますが。では」[p] +[_tb_end_text] + +[chara_hide name="美里" time="1000" wait="true" pos_mode="true" ] +[tb_start_text mode=1 ] +#黒原 +「貴様・・・後悔させてやるぞ!」[p] +#ディレクター +「まぁまぁまぁまぁ」[p] +#黒原 +「このわしに・・・男根会に逆らうとどうなるか思い知らせてやるからな!」[p] +#ディレクター +「まぁまぁまぁまぁ」[p] +[_tb_end_text] + +[stopbgm time="1000" ] +[mask time="1000" effect="fadeIn" color="0x000000" ] +[chara_hide_all time="000" wait="true" ] +[bg time="00" method="crossfade" storage="hiro202.jpg" ] +[chara_show name="美里" time="400" wait="true" storage="chara/1/hiro253-1.png" width="494" height="1185" left="353" top="39" reflect="false" ] +[mask_off time="1000" effect="fadeOut" ] +[playbgm volume="100" time="1000" loop="true" storage="neonpurple.ogg" ] +[tb_start_text mode=1 ] +#亜紀子 +(ふう・・・結構派手にやっちゃったわね)[p] +(また局長に小言を食らうことになりそうだわ)[p] +(それにしてもあんなカルト団体の怪しい連中が堂々とテレビに出るなんて世も末ね)[p] +(男根会・・・か)[p] +(たしか会員は数十万人いるんだっけ?女性も多数いると宣伝してるけど・・・怪しいもんだわ)[p] +(・・・今度男根会の会員にインタビューしてみるのも良いかもね)[p] +・・・・・・[p] +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro201.jpg" ] +[tb_start_text mode=1 ] +#亜紀子 +「さてと・・・次の仕事は・・・」[p] +[_tb_end_text] + +[jump storage="scene3.ks" target="" ] +*s2 + +[tb_start_text mode=1 ] +# +番組は男尊女卑肯定派が持論を展開し、有利に討論を進めていった[p] +味方と思われていた篠田百合子のまさかの裏切りもあり、男尊女卑否定派は反論もできず終始劣勢であった[p] +それまで司会進行に徹していた亜紀子だったが、このままではいけないと男尊女卑肯定派の黒原に反撃に出るのだった[p] +[_tb_end_text] + +[jump storage="scene2.ks" target="*s3" ] diff --git a/data/scenario/scene3.ks b/data/scenario/scene3.ks new file mode 100644 index 0000000..b2325f9 --- /dev/null +++ b/data/scenario/scene3.ks @@ -0,0 +1,207 @@ +[_tb_system_call storage=system/_scene3.ks] + +[tb_start_text mode=1 ] +#亜紀子 +「あ、そう言えば明日香がニュースを読んでる時間ね」[p] +「明日香といえば、さっきなんか様子がおかしかったけど大丈夫かしら?」[p] +# +[_tb_end_text] + +[mask time="1000" effect="fadeIn" color="0x000000" ] +[stopbgm time="1000" ] +[playbgm volume="20" time="1000" loop="true" storage="Green&Dance_2.ogg" ] +[chara_hide name="美里" time="1000" wait="true" pos_mode="true" ] +[bg time="1000" method="crossfade" storage="hiro254-2.jpg" ] +[mask_off time="1000" effect="fadeOut" ] +[tb_start_text mode=1 ] +#明日香 +「―――パンダのヒンヒンが無事双子の赤ちゃんを出産しました」[p] +「アクションワールドでパンダの赤ちゃんが誕生するのは2018年以来で15匹目となります」[p] +「赤ちゃんの性別はまだわかっていません」[p] +「同園の若山園長は「無事出産が終ってほっとしています。成長を温かく見守って欲しいです」と語っています」[p] +「無事に成長して公開されるのが楽しみですね。続いては株価です―――」[p] + +[_tb_end_text] + +[chara_show name="美里" time="1000" wait="true" storage="chara/1/hiro253-5.png" width="755" height="1812" left="633" top="185" reflect="false" ] +[tb_start_text mode=1 ] +#亜紀子 +「こ、これは・・・!?」[p] +「明日香・・・なんて服装で・・・」[p] +(下着が見えてる・・・しかもノーブラ・・・?)[p] + + +[_tb_end_text] + +[stopbgm time="1000" ] +[bg time="1000" method="crossfade" storage="hiro201.jpg" ] +[chara_move name="美里" anim="false" time="0" effect="linear" wait="true" left="120" top="87" width="509" height="1226" ] +[chara_show name="局長" time="1000" wait="true" storage="chara/3/hiro262-1.png" width="491" height="1178" left="662" top="15" reflect="false" ] +[chara_mod name="美里" time="100" cross="false" storage="chara/1/hiro253-2.png" ] +[playbgm volume="30" time="1000" loop="true" storage="bluenoise.ogg" ] +[tb_start_text mode=1 ] +#亜紀子 +「局長!あれは一体どういうことですか!?」[p] +#局長 +「な、なんだ、どうかしたのかね?」[p] +#亜紀子 +「あの明日香の服装です!なんで明日香があんな格好をさせられてるんですか!?」[p] +#局長 +「ああ・・・あれのことかね」[p] +「いや、私も知らんよ。さっき観るまで知らなかったんだから」[p] +#亜紀子 +「局長が強要したんじゃ・・・」[p] +#局長 +「ち、違う!私はなにもしとらんよ!」[p] +「いや、確かに日頃から短いスカートを穿くように勧めてはいたが、あそこまでしろとは言っていない」[p] +「そもそも君らは私が言っても全然聞かなかったじゃないか」[p] +#亜紀子 +「・・・・・・」[p] +(それもそうよね・・・)[p] +(明日香が局長に言われたくらいであんな格好をするはずがないし)[p] +(まして自分から進んであんな服を着るなんてありえないわ)[p] +(じゃあ何故・・・?)[p] +#局長 +「まぁいいじゃないか。多少やりすぎの感はあるが、他局だってあれに近いことはやってるわけだし」[p] +「彼女もようやくやる気を見せたということだろう。君も見習ったらどうかね」[p] +「すでにSNSでは反響が出ているようだぞ。これは数字が期待できそうだ・・・」[p] +#亜紀子 +「・・・」[p] + + + + +[_tb_end_text] + +[chara_hide_all time="1000" wait="true" ] +[stopbgm time="1000" ] +[bg time="1000" method="crossfade" storage="hiro254-2.jpg" ] +[playbgm volume="20" time="1000" loop="true" storage="Green&Dance_2.ogg" ] +[tb_start_text mode=1 ] +#明日香 +「この週末は旅行日和となりそうですが昼夜の寒暖の差が大きくなりそうですので服装にはお気をつけください」[p] +「以上ニュースをお伝えしました」[p] +・・・・・・[p] + +[_tb_end_text] + +[stopbgm time="1000" ] +[mask time="1000" effect="fadeIn" color="0x000000" ] +[bg time="1000" method="crossfade" storage="hiro202.jpg" ] +[chara_show name="美里" time="1000" wait="true" storage="chara/1/hiro253-1.png" width="406" height="974" left="171" top="69" reflect="false" ] +[mask_off time="1000" effect="fadeOut" ] +[playbgm volume="100" time="1000" loop="true" storage="neonpurple.ogg" ] +[chara_show name="明日香" time="1000" wait="true" left="572" top="66" width="387" height="928" reflect="false" storage="chara/2/hiro257-2.png" ] +[tb_start_text mode=1 ] +#亜紀子 +「明日香!」[p] +#明日香 +「あ・・・先輩・・・!」[p] +#亜紀子 +「明日香、どうしたのその格好?」[p] +#明日香 +「これは・・・その・・・」[p] +#亜紀子 +「誰かに圧力をかけられたの?そうなんでしょ?」[p] +#明日香 +「そ、それは・・・」[p] +#亜紀子 +「局長?それとももっと上の誰かに何か言われたの?」[p] +#明日香 +「・・・・・・」[p] +#亜紀子 +「ねえ、私に話して。力になるから」[p] +#勝野 +「明日香は自分の意思でその服を着てきたんだよ」[p] + + + +[_tb_end_text] + +[chara_mod name="美里" time="600" cross="true" storage="chara/1/hiro253-5.png" ] +[stopbgm time="1000" ] +[chara_show name="勝野" time="1000" wait="true" storage="chara/5/hiro256-1.png" width="412" height="988" left="855" top="19" reflect="false" ] +[playbgm volume="20" time="1000" loop="true" storage="枯れ葉が集う路地裏通り_2.ogg" ] +[tb_start_text mode=1 ] +#亜紀子 +「勝野・・・!?」[p] +#勝野 +「仲が良いからって考え方も同じとは限らないんだよ」[p] +「売れるにはこういうことも必要だって、気づいて一念発起したのさ。なぁ明日香?」[p] +#明日香 +「は、はい・・・そうなんです。こういう衣装も・・・有りかなって・・・」[p] +#亜紀子 +「・・・!?」[p] +「で、でもあなたは・・・!」[p] +#勝野 +「おいおい、自分の考えを押し付けるのはよくないぜ。誰もがお前みたいな女闘士じゃないんだ」[p] +「自分が硬派気取るのは勝手にすればいいが、明日香を巻き込むのはやめてやれよ」[p] +#亜紀子 +「く・・・!」[p] +「明日香、そうなの?あなたが自分の意思で・・・?」[p] +#明日香 +「・・・はい」[p] +#亜紀子 +「・・・!」[p] +#勝野 +「ほらな。それじゃこれから打ち合わせがあるから明日香はもらっていくぜ」[p] +#亜紀子 +「打ち合わせ・・・?なんの打ち合わせよ?」[p] +#明日香 +「俺の番組に決まってるだろ。週間ピンクSHOWのお色気天気予報のコーナーに明日香が出ることが決まったんだ」[p] +#亜紀子 +「お、お色気天気予報!?」[p] +「それってセクシー女優とかがいやらしい格好で天気キャスターをするやつじゃ・・・」[p] +「明日香、あなた・・・」[p] +#明日香 +「・・・・・・」[p] +#勝野 +「そういうことなんで、じゃあな千山。行くぞ明日香」[p] +#亜紀子 +「ちょ、ちょっと・・・!」[p] + + + + +[_tb_end_text] + +[chara_hide name="勝野" time="600" wait="true" pos_mode="false" ] +[chara_hide name="明日香" time="1000" wait="true" pos_mode="true" ] +[tb_start_text mode=1 ] +#亜紀子 +(明日香・・・)[p] +(一体どうして・・・?)[p] +# +[_tb_end_text] + +[chara_hide_all time="1000" wait="true" ] +[stopbgm time="1000" ] +[bg time="1000" method="crossfade" storage="hiro999.jpg" ] +[playbgm volume="100" time="1000" loop="true" storage="music16.ogg" ] +[tb_start_text mode=1 ] +# +亜紀子と明日香にはある共通点があった[p] +それは二人とも女としての初体験をレイプによって奪われているということだ[p] +明日香の相手は学生時代の担任教師だった[p] +明日香の初めてを無残に奪ったその中年教師は、その後も卒業まで明日香を犯し続けた[p] +亜紀子も詳しくは聞いていないが、逆らえない明日香を毎日のように変態的なプレイで嬲り尽くしたらしい[p] +そのころの悪夢に今でも悩まされていると言っていた[p] +明日香はそのトラウマで男嫌いになり、いまだに男と付き合ったことがない[p] +明日香がその話をしてくれた後、亜紀子も自分の過去を打ち明けた[p] +あれ以来、亜紀子と明日香の間には確かな友情が生まれた。少なくとも亜紀子はそう感じていた[p] +#亜紀子 +(その明日香が・・・やっぱりおかしいわ。絶対におかしい)[p] +(あんなに嫌がってた勝野との仕事を急に引き受けるなんて変だし)[p] +(・・・・・・)[p] +(・・・もしかして勝野が明日香になにかしたんじゃ・・・?)[p] +(・・・ちょっと調べてみる必要があるわね)[p] +# +・・・・・・[p] + + + + +[_tb_end_text] + +[stopbgm time="1000" ] +[jump storage="scene4.ks" target="" ] diff --git a/data/scenario/scene4.ks b/data/scenario/scene4.ks new file mode 100644 index 0000000..2108cfa --- /dev/null +++ b/data/scenario/scene4.ks @@ -0,0 +1,406 @@ +[_tb_system_call storage=system/_scene4.ks] + +*rep2 + +[tb_replay_start ] +[mask time="1000" effect="fadeIn" color="0x000000" ] +[bg time="0" method="crossfade" storage="hiro101-2.jpg" ] +[tb_show_message_window ] +[mask_off time="1000" effect="fadeOut" ] +[tb_start_text mode=1 ] +# +数日後[p] +#独身男性(以下左上) +「はーぁ、なんか面白い番組やってないかな・・・ポチポチ」[p] +#テレビ +「はいレナちゃん罰ゲーム~~!スイッチオン!」[p] +「いやぁ~~ん!ダメェ~~~!」[p] +#左上 +「お、週間ピンクSHOWだ」[p] +「相変わらずくだらないことやってんなー」[p] +「こういう深夜のお色気番組って一時期絶滅したかと思ってたけど、最近また増えてきたよな」[p] +「需要あるんだろうな。ついつい見ちゃうもん」[p] +「別に大してエロくないはずなんだけど、なぜかテレビだとAVよりもエロく感じちゃうのはなんでかな?」[p] +#テレビ +「さあ続いてはお色気天気予報のコーナーです」[p] +「今週はすごいですよ。なんと現役の局アナがコスプレに挑戦してくれました!」[p] +「しかもピチピチの人気若手女子アナです!これは必見ですよ~~!」[p] +「岡明日香ちゃんです!どうぞ!」[p] +#左上 +「え、岡明日香って清純派の若手女子アナじゃん」[p] +「ホントかよ!」[p] +# + + + + + +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro116-1.jpg" ] +[playbgm volume="10" time="1000" loop="true" storage="Green&Dance_2.ogg" ] +[tb_start_text mode=1 ] +#明日香 +「こ、こんばんは。Zテレビアナウンサー3年目の岡明日香です。よろしくお願いします・・・」[p] +「それでは全国の明日のお天気です」[p] +「明日は熱帯低気圧の影響で西日本から東海にかけて次第に雲が多くなるところが多くなり、雨が降るところがありそうです。洗濯物を干す際は天気の変化にお気をつけください」[p] +「台風10号の影響で南西諸島では雨風が強まる恐れがあります」[p] +「また午後になりますと晴れている地域でも内陸部を中心に急激な天気の崩れが起こりやすくなりますので注意が必要です」[p] + +[_tb_end_text] + +[tb_image_show time="1000" storage="default/hiro101-a.jpg" width="633" height="356" x="645" y="-1" _clickable_img="" name="img_10" ] +[tb_start_text mode=1 ] +#左上 +「おおっ、本当に岡明日香だ!」[p] +「しかもかなり攻めたコスプレだぞ。下乳見えてるじゃん!」[p] +「この娘って絶対こんなことやらなそうな感じだったけど、意外だなぁ」[p] +「セクシー女優とかじゃなくて本物のアナウンサーがこういうことやると、めっちゃエロく感じるなぁ・・・おっ?」[p] +# +[_tb_end_text] + +[tb_image_hide time="1000" ] +[tb_start_text mode=1 ] +#明日香 +「それでは各地のお天気です。まず北海道は午前中は晴れ、午後から太平洋側で少しにわか雨が降るところがありそうです」[p] +# +プシャーーーッ![p] +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro116-2.jpg" ] +[tb_start_text mode=1 ] +# +明日香が雨の予報を口にした瞬間、画面の外から明日香の胸部に水鉄砲のようなもので水が吹きかけられた[p] +コスプレのセーラー服が濡れて、肌色が透けて見える[p] +#明日香 +「・・・っ!つ、続いては東北です」[p] +# +明日香は一瞬戸惑いの表情を見せたが、すぐに何事もなかったかのように笑顔に戻り予報を続けた[p] +#明日香 +「東北地方はおおむね晴れるでしょう。ただし内陸部では局地的ににわか雨が降るところがあるでしょう。ご注意ください」[p] +# +プシャーーーッ![p] +#明日香 +「続いて中部地方にまいりましょう。中部地方では―――」[p] + +[_tb_end_text] + +[tb_image_show time="1000" storage="default/hiro101-a.jpg" width="635" height="357" x="643" y="-3" _clickable_img="" name="img_16" ] +[tb_start_text mode=1 ] +#左上 +「おおっ、服が透けてきたぞ!」[p] +「なるほど、雨予報をするたびに水がかけられて服が透けていくっていうシステムね!」[p] +「これは面白いな。よし、もっと水をかけろ!全国雨降れ!」[p] + +[_tb_end_text] + +[tb_image_hide time="1000" ] +[tb_start_text mode=1 ] +#明日香 +「九州ではおおむね晴れそうですが、沖縄では台風の影響で午後から夜にかけて強い雨が降りそうです」[p] +# +プシャーーッ!プシャーーッ![p] +#明日香 +「・・・!」[p] + +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro116-3.jpg" ] +[tb_start_text mode=1 ] +#明日香 +「波も高くなることが予想されますので沿岸部の方は十分に警戒してください」[p] + +[_tb_end_text] + +[tb_image_show time="1000" storage="default/hiro101-b.jpg" width="581" height="327" x="698" y="0" _clickable_img="" name="img_22" ] +[tb_start_text mode=1 ] +#左上 +「おおおーーっ!スケスケだ!」[p] +「これ、ニップレスもしてない・・・!?」[p] +「服が白でしかも薄いから、透けて乳首が完全に見えちゃってるぞ!」[p] +「おいおい大丈夫なのかこれ!局アナだろ!?」[p] +「まさかここまでやるとは思わなかったぜ。体張ってるなぁ・・・」[p] + +[_tb_end_text] + +[tb_image_hide time="1000" ] +[tb_start_text mode=1 ] +# +明日香自身も自分が恥ずかしい格好になってしまっていることに気付いているはずだが、透けた胸を隠そうともせずぎこちない笑顔を浮かべたまま天気予報を読み続ける[p] +#明日香 +「最後に関東地方です・・・。関東も午前中は晴れますが、午後からは南のほうを中心に雨模様になるところが多くなる見込みです」[p] +# +プシャーーーッ![p] +#明日香 +「最高気温は東京が28℃。他のところでも例年より少し高めになりそうです」[p] +「関東南部では出かけるときに晴れていても帰宅時間には雨が降るところもあるので傘の用意をしておいたほうが安全そうです」[p] +「以上全国のお天気でした」[p] +「・・・あ・・・」[p] +「・・・あ、あ~した天気にな~~れっ!」[p] +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro116-4.jpg" ] +[tb_cg id="116" ] +[tb_image_show time="1000" storage="default/hiro101-b.jpg" width="597" height="336" x="681" y="0" _clickable_img="" name="img_28" ] +[tb_start_text mode=1 ] +#左上 +「おおおっ!?」[p] +「も、モロパンだーっ!」[p] +「すげえーー!」[p] + + +[_tb_end_text] + +[tb_image_hide time="1000" ] +[tb_start_text mode=1 ] +# +「清純派女子アナ路線変更!?」「注目度ナンバー1若手女子アナ大胆露出!」[p] +明日香のお色気番組での思い切った露出は大きな話題を呼んだ[p] +乳首が透けているところや、パンチラのシーンの動画はネットに上げられ世界中で再生された[p] +これまでお堅い路線でそういうことをしそうにない明日香が大胆すぎるお色気に走ったことが、一層世の男たちを興奮させた[p] +しかし一方では局アナとしてのモラルを問う声や、売名行為だなどという批判も少なくなかった[p] + +[_tb_end_text] + +[stopbgm time="1000" ] +[tb_replay id="reps2" ] +[mask time="1000" effect="fadeIn" color="0x000000" ] +[bg time="00" method="crossfade" storage="hiro254-1.jpg" ] +[mask_off time="2000" effect="fadeOut" ] +[playbgm volume="40" time="1000" loop="true" storage="music15.ogg" ] +[tb_start_text mode=1 ] +#亜紀子 +「続いてのニュースです」[p] +「K国籍のキム・キムキム容疑者が昨日、およそ12kgのキムチを販売目的で密輸した容疑で逮捕されました」[p] +「警視庁によりますとキム容疑者はキムチを覚せい剤の袋に隠して密輸しようとしたところを、成田空港の税関職員に発見されたということです」[p] +「キム容疑者は取調べに対して黙秘しているということで・・・ンッ!?」[p] +(急に・・・母乳が・・・っ)[p] +(アッ・・・出てる・・・んっ!で、でも読み続けないと・・・!)[p] +「失礼しました。キム容疑者は容疑を否認しており・・・んっ、警察は協力者がいないか調査していく方針・・・ですっ」[p] +「そ、それではお天気です。佐藤さんお願いしま・・・すっ」[p] + + +[_tb_end_text] + +[stopbgm time="1000" ] +[bg time="1000" method="crossfade" storage="hiro254-0.jpg" ] +[playbgm volume="100" time="1000" loop="true" storage="neonpurple.ogg" ] +[chara_show name="美里" time="1000" wait="true" storage="chara/1/hiro253-1.png" width="617" height="1481" left="119" top="21" reflect="false" ] +[tb_start_text mode=1 ] +#亜紀子 +(ふう・・・危なかったわ)[p] +[_tb_end_text] + +[chara_show name="谷田" time="1000" wait="true" storage="chara/4/hiro259-2.png" width="512" height="1229" left="748" top="-9" reflect="false" ] +[tb_start_text mode=1 ] +#谷田 +「千山さん、おつかれさまです!」[p] +#亜紀子 +「ええ・・・おつかれさま」[p] +#谷田 +「あの・・・ちょっと具合悪そうでしたけど、大丈夫ですか?」[p] +#亜紀子 +「え、ええ・・・大丈夫よ。ちょっと疲れてるだけだから」[p] +#谷田 +「そうですか。身体には気をつけてください」[p] +#亜紀子 +「ありがとう」[p] + +[_tb_end_text] + +[chara_hide_all time="1000" wait="true" ] +[bg time="1000" method="crossfade" storage="hiro202.jpg" ] +[chara_show name="美里" time="1000" wait="true" storage="chara/1/hiro253-1.png" width="427" height="1025" left="266" top="39" reflect="false" ] +[tb_start_text mode=1 ] +#亜紀子 +(まさか本番中に母乳が溢れてくるなんて・・・)[p] +(もう少しでジャケット染み出しちゃうところだったわ)[p] +(最近明日香が私を避けてるから、こういう時どうしようもないのよね)[p] +(トイレでガーゼを交換して来ないと・・・)[p] +[_tb_end_text] + +[mask time="2000" effect="fadeIn" color="0x000000" ] +[mask_off time="2000" effect="fadeOut" ] +[tb_start_text mode=1 ] +#亜紀子 +「ふう・・・」[p] +(あれだけ出たら今日はもう大丈夫そうね)[p] +(それにしてもなんて不便な体質なのかしら・・・。自分ではどうしようもないし・・・)[p] +(・・・それはともかく明日香のことだわ)[p] +(相変わらず露出狂みたいな格好で本番に出てるし・・・表情もどこかおかしい。あれが自分の意思のはずがないわ)[p] +(勝野とよく会ってるみたいだし、やっぱりあいつが怪しいわ・・・)[p] +(・・・ん?)[p] + +[_tb_end_text] + +[stopbgm time="1000" ] +[playbgm volume="5" time="1000" loop="true" storage="枯れ葉が集う路地裏通り_2.ogg" ] +[chara_show name="勝野" time="1000" wait="true" storage="chara/5/hiro256-1.png" width="33" height="79" left="819" top="386" reflect="false" ] +[chara_show name="明日香" time="1000" wait="true" storage="chara/2/hiro257-2.png" width="29" height="70" left="850" top="388" reflect="false" ] +[chara_move name="美里" anim="true" time="300" effect="linear" wait="true" left="31" top="39" width="427" height="1025" ] +[tb_start_text mode=1 ] +#亜紀子 +(あれは・・・勝野と明日香だわ!)[p] +(二人してどこへ行くのかしら・・・?)[p] +(・・・よし、跡をつけてみましょう)[p] +[_tb_end_text] + +[mask time="1000" effect="fadeIn" color="0x000000" ] +[chara_hide name="明日香" time="00" wait="true" pos_mode="true" ] +[chara_hide name="勝野" time="0" wait="true" pos_mode="true" ] +[mask_off time="1000" effect="fadeOut" ] +[tb_start_text mode=1 ] +#亜紀子 +(空き部屋に入ったわ)[p] +(なんとか会話を聞けないかしら・・・)[p] + +[_tb_end_text] + +*rep3 + +[tb_replay_start ] +[tb_show_message_window ] +[chara_hide_all time="1000" wait="true" ] +[bg time="1000" method="crossfade" storage="hiro999.jpg" ] +[stopbgm time="1000" ] +[tb_start_text mode=1 ] +#勝野 +「・・・めろ・・・・・・うだ・・・」[p] +# +チュパ・・・チュパ・・・[p] +#勝野 +「・・・って・・・いに・・・いぞ・・・」[p] +# +チュプ・・・チュプ・・・[p] +#勝野 +「・・・めは・・・のに・・・じゃないか・・・ククク」[p] +#亜紀子 +(勝野がなにかしゃべってるみたいだけど・・・内容までは解からないわね・・・)[p] +(それになんか変な音・・・なにかしら?)[p] +(・・・思い切ってちょっとだけ扉を開けてみましょう)[p] + +[_tb_end_text] + +[playbgm volume="100" time="1000" loop="true" storage="music16.ogg" ] +[bg time="2000" method="crossfade" storage="hiro109-1.jpg" ] +[tb_start_text mode=1 ] +#明日香 +「ジュプッ・・・ジュプッ・・・」[p] +#勝野 +「いいぞ、もっとそのかわいい唇を使ってチンポをしごくんだ」[p] +「自分の口がマ○コになったつもりで奉仕しろよ」[p] +#明日香 +「く・・・ジュプッ・・・チュバッ・・・」[p] +#勝野 +「さすが若手ナンバーワンの有望女子アナだ。飲み込みが早いじゃないか、クククク」[p] +#明日香 +「チュプッ・・・ジュポッ・・・」[p] +#亜紀子 +(こ、これは・・・!?)[p] +(い、一体どういうこと・・・!?)[p] +(なんで明日香が勝野と・・・こんな・・・)[p] +#勝野 +「しかし予想以上の反響だったな、お前のお色気路線変更は」[p] +「そんなことしそうにない清純派のお前だったから、なおさら意外性があったんだろうな」[p] +「他のやつらにもどうやって口説き落としたのかって聞かれちまったぜ」[p] +#明日香 +「チュプッ・・・ジュプッ・・・」[p] +#勝野 +「上も局アナのこういう売り出し方には積極的だしな」[p] +「これで俺はもっともっと出世してやるぜ」[p] +#明日香 +「ジュプッ・・・チュバッ・・・」[p] +#亜紀子 +(明日香が・・・勝野のアレを・・・あんな風に・・・)[p] +#勝野 +「しかし意外性って言うなら千山を使えばもっと話題になるだろうな・・・」[p] +#明日香 +「ジュポンッ・・・先輩には手を出さないって言う約束です!」[p] +#勝野 +「わかってるって。口を離すな。チンポに集中しろ」[p] +#亜紀子 +(どういうこと・・・?)[p] +(約束・・・?)[p] +#明日香 +「チュプッ・・・ジュプッ・・・」[p] +#勝野 +「しかし傑作だよな、あの千山が母乳体質だなんて」[p] +「しかも自分では搾れないっていうんだから笑えるぜ、クヒヒヒ」[p] +#亜紀子 +(・・・!)[p] +#勝野 +「俺でよかったらいつでも搾ってやるんだかがな母乳を・・・」[p] +#明日香 +「ジュプッ・・・ジュプッ・・・!」[p] +#勝野 +「おいおいそんな怖い顔するなって。まぁお前が怖い顔してもかわいいだけだがな」[p] +「よしよし、たっぷりと出してやるからな・・・おらっ!」[p] + + + + + +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro109-2.jpg" ] +[tb_cg id="109" ] +[tb_start_text mode=1 ] +#明日香 +「ジュプッ・・・ンム・・・っ!?」[p] +# +ドピュドピュドピュッ![p] +#明日香 +「ンンンッ・・・!」[p] +#勝野 +「おおぅ・・・まだ出るぞ・・・おいっ一滴もこぼすなよ」[p] +#明日香 +「ンムッ・・・ンンッ・・・ジュルッ」[p] +#勝野 +「そうだ、よく味わって飲むんだぞ」[p] +#明日香 +「ンゥッ・・・ゴクッ・・・ゴクッ・・・!」[p] +#勝野 +「いいぞ・・・尿道に残ってるのもちゃんと吸い出すんだぞ」[p] +#明日香 +「ン・・・チュゥ・・・ジュルッ・・・」[p] +「ンクッ・・・ゴクッ」[p] +#勝野 +「ふう・・・テレビ局の中で女子アナにしゃぶらせるのは最高の気分だな」[p] +#明日香 +「ハァ・・・ウッ・・・」[p] +#勝野 +「もうちょっとお楽しみといきたいところだが、あんまり長いことさぼってるわけにもいかないからな」[p] +カチャカチャ[p] +#亜紀子 +(・・・ハッ!)[p] +(二人が出てくるわ!この場を離れないと・・・!)[p] +[_tb_end_text] + +[stopbgm time="1000" ] +[tb_replay id="reps3" ] +[mask time="1000" effect="fadeIn" color="0x000000" ] +[bg time="1000" method="crossfade" storage="hiro201.jpg" ] +[chara_show name="美里" time="1000" wait="true" storage="chara/1/hiro253-1.png" width="500" height="1200" left="184" top="43" reflect="false" ] +[mask_off time="1000" effect="fadeOut" ] +[playbgm volume="100" time="1000" loop="true" storage="neonpurple.ogg" ] +[tb_start_text mode=1 ] +#亜紀子 +(・・・はぁ)[p] +(とりあえず逃げてきちゃったけど・・・一回落ち着いて状況を整理しましょう)[p] +(まず明日香を脅迫してたのは勝野で間違い無さそうね)[p] +(どう見ても恋人同士の睦事には見えなかったもの)[p] +(どこでバレたのか判らないけど、勝野が私の母乳体質のことを知っていた・・・)[p] +(二人の会話から察するに、明日香は私の秘密を守るために勝野の言いなりになっている・・・?)[p] +(たしか明日香は「先輩には手を出さない約束」って言ってたわ・・・)[p] +(・・・そうよ!明日香は私の身代わりになって勝野にあんなことを・・・いや、口だけのはずがないわ。きっと身体も・・・)[p] +(なんてことなの・・・!)[p] +(私を直接脅さずに明日香の私を慕ってくれている心を利用するなんて・・・絶対に許せないわ!)[p] +(ごめんね明日香・・・すぐに私が助けるから・・・!)[p] + + +[_tb_end_text] + +[stopbgm time="1000" ] +[chara_hide_all time="1000" wait="true" ] +[tb_hide_message_window ] +[jump storage="scene5.ks" target="" ] diff --git a/data/scenario/scene5.ks b/data/scenario/scene5.ks new file mode 100644 index 0000000..156b004 --- /dev/null +++ b/data/scenario/scene5.ks @@ -0,0 +1,1114 @@ +[_tb_system_call storage=system/_scene5.ks] + +*rep4 + +[tb_replay_start ] +[mask time="1000" effect="fadeIn" color="0x000000" ] +[tb_show_message_window ] +[bg time="1000" method="crossfade" storage="hiro203.jpg" ] +[chara_show name="美里" time="1000" wait="true" storage="chara/1/hiro253-2.png" width="445" height="1068" left="204" top="21" reflect="false" ] +[chara_show name="勝野" time="1000" wait="true" storage="chara/5/hiro256-1.png" width="467" height="1121" left="603" top="-29" reflect="false" ] +[mask_off time="1000" effect="fadeOut" ] +[playbgm volume="100" time="1000" loop="true" storage="music17.ogg" ] +[tb_start_text mode=1 ] +#勝野 +「なんだよ話って?こんなところに呼び出して」[p] +「俺も暇じゃないんだぜ。まさか愛の告白じゃないだろうな?」[p] +#亜紀子 +「ふざけないで。誰があなたなんかに」[p] +「私も忙しいから単刀直入に言うわ。明日香から手を引きなさい」[p] +#勝野 +「なんだぁ・・・?番組に使ってることならお前にとやかく言われる筋合いはないぜ」[p] +#亜紀子 +「とぼけないで、明日香を脅迫してるでしょう!それを止めなさいって言ってるの!」[p] +#勝野 +「脅迫?何の話かなぁ。証拠でもあるのか?」[p] +#亜紀子 +「知ってるのよ。あなたが私の・・・母乳のことで明日香を脅しているのは!」[p] +#勝野 +「・・・なんだ、明日香のやつ結局お前に泣きついたのかよ」[p] +「私が先輩を守る!とか言ってたくせに、情けない女だぜ」[p] +#亜紀子 +「違うわ。明日香は何も言ってないわ。あなたたちの・・・会話をたまたま聞いたのよ」[p] +#勝野 +「なるほど・・・そういうことか。・・・で、どうする気だ?」[p] +#亜紀子 +「どうもこうも・・・もう明日香に手は出させないわ!」[p] +「あなたがやっていることはれっきとした犯罪よ。止めないなら警察に通報するわ」[p] +#勝野 +「おいおい、警察だと?母乳体質のことをバラしてもいいのか?」[p] +「全マスコミが食いつくぜ。母乳女子アナとして日本中から笑い者にされることになるぞ?」[p] +#亜紀子 +「・・・好きにすればいいわ」[p] +「これは病気・・・いや病気ですらない、ただの体質よ。なにも恥じることじゃないもの」[p] +「たしかに世間からは奇異の目で見られるでしょう。でもそんなもの耐えて見せるわ。その代わりあなたは刑務所行きよ」[p] +#勝野 +「・・・フフフ、やはりお前ならそう言うと思ったぜ」[p] +「やっぱり明日香から攻めて正解だったな」[p] +#亜紀子 +「・・・?どういう意味!?」[p] +#勝野 +「元々楽屋に仕掛けた盗撮カメラで、お前らが乳繰り合っている動画が偶然撮れたわけだが」[p] + + + + +[_tb_end_text] + +[chara_mod name="美里" time="0" cross="false" storage="chara/1/hiro253-5.png" ] +[tb_start_text mode=1 ] +#亜紀子 +「盗撮・・・!?」[p] +#勝野 +「画質は悪いし顔もよく見えない映像で脅迫のネタとしては弱かったんだよ」[p] +「だから気が強いお前に先に見せたところで無駄だろうと思ったのさ。逆に盗撮のことをバラされたらこっちがまずいからな」[p] +「それで先に明日香の方に持っていったら案の定乗ってきやがった」[p] +「「愛する千山先輩のためなら私が身代わりになります!」なんつって自分から勝手に俺の手の中に転がり込んできたんだから笑えるぜ」[p] + +[_tb_end_text] + +[chara_mod name="美里" time="600" cross="false" storage="chara/1/hiro253-4.png" ] +[tb_start_text mode=1 ] +#亜紀子 +「あ、あなたって人は・・・!」[p] +「最低の下衆ね!刑務所で自分の愚かさを悔やみなさい!」[p] +#勝野 +「ククク、愚かなのはどっちかな?」[p] +#亜紀子 +「・・・?」[p] +#勝野 +「俺がなんの手も打ってないと思ったか?良いものを見せてやるぜ、ほら」[p] +#亜紀子 +「なにを・・・動画・・・?」[p] + +[_tb_end_text] + +[chara_mod name="美里" time="0" cross="false" storage="chara/1/hiro253-5.png" ] +[tb_start_text mode=1 ] +#亜紀子 +「こっ、これは・・・!?」[p] + +[_tb_end_text] + +[chara_hide_all time="1000" wait="true" ] +[stopbgm time="1000" ] +[bg time="1000" method="crossfade" storage="hiro131.jpg" ] +[playbgm volume="50" time="1000" loop="true" storage="SO_SAD.ogg" ] +[tb_start_text mode=1 ] +#明日香 +『こんにちは。Zテレビ入社3年目の岡明日香です』[p] +『年齢は24歳、スリーサイズはバスト84、ウエスト57、ヒップ86です』[p] +『いつも応援していただいてありがとうございます』[p] +『今日は皆さまに明日香のおま○ことアナルを見ていただきたくてこの動画を撮っています』[p] +『実はわたしは他人に恥ずかしいところを見られるのが好きな露出狂の変態なんです』[p] +『どうぞ明日香の裸でたくさん・・・シ、シコシコしてくださいね』[p] +『わたしはドMの変態で、男の人に無理やり犯されるのが・・・大好きです』[p] +『街で見かけたら、遠慮なく・・・レ、レイプしてくださいねっ』[p] + +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro203.jpg" ] +[chara_show name="美里" time="1000" wait="true" storage="chara/1/hiro253-5.png" width="452" height="1085" left="206" top="72" reflect="false" ] +[chara_show name="勝野" time="1000" wait="true" storage="chara/5/hiro256-3.png" width="456" height="1094" left="643" top="7" reflect="false" ] +[tb_start_text mode=1 ] +#亜紀子 +「あ、明日香・・・!?」[p] +「こ、こんな・・・」[p] +#勝野 +「絶対服従の証として撮ってあるのさ」[p] +#亜紀子 +「なんてことを・・・!」[p] +#勝野 +「よく撮れてるだろう?セリフを大きい声ではっきりと、笑顔で言えるまで何度もリテイクしたんだぜ」[p] + +[_tb_end_text] + +[stopbgm time="1000" ] +[chara_mod name="美里" time="00" cross="false" storage="chara/1/hiro253-4.png" ] +[playbgm volume="10" time="1000" loop="true" storage="烈火翔ける.ogg" ] +[tb_start_text mode=1 ] +#亜紀子 +「それを渡しなさい!」[p] +[_tb_end_text] + +[chara_move name="美里" anim="true" time="200" effect="linear" wait="false" left="470" top="74" width="452" height="1085" ] +[chara_mod name="勝野" time="00" cross="false" storage="chara/5/hiro256-2.png" ] +[chara_move name="勝野" anim="false" time="200" effect="linear" wait="true" left="848" top="7" width="456" height="1094" ] +[tb_start_text mode=1 ] +#勝野 +「おっと!」[p] +[_tb_end_text] + +[chara_move name="美里" anim="false" time="300" effect="linear" wait="true" left="202" top="74" width="452" height="1085" ] +[chara_move name="勝野" anim="false" time="300" effect="linear" wait="true" left="647" top="16" width="456" height="1094" ] +[chara_mod name="勝野" time="00" cross="false" storage="chara/5/hiro256-3.png" ] +[tb_start_text mode=1 ] +#勝野 +「あわてるんじゃねえよ」[p] +「お前は馬鹿か?バックアップは取ってあるに決まってるだろ」[p] +「海外のアップローダーにもう上げてあるんだよ」[p] +[_tb_end_text] + +[chara_mod name="美里" time="0" cross="false" storage="chara/1/hiro253-5.png" ] +[tb_start_text mode=1 ] +#亜紀子 +「な、なんですって!?」[p] +#勝野 +「もちろんパスワードでロックしてあるがな」[p] +「要するに、もし誰かにチクったりしたらいつでもこの動画が世界中にばら撒ける状態にしてあるのさ」[p] +「だからお前の母乳のことなんか関係なく、もう明日香は俺に逆らえないのさ」[p] + + +[_tb_end_text] + +[chara_mod name="美里" time="100" cross="false" storage="chara/1/hiro253-4.png" ] +[tb_start_text mode=1 ] +#亜紀子 +「く・・・っ!」[p] +#勝野 +「だからお前はすっこんでればいいんだよ」[p] +「安心しな、明日香は俺がセックス奴隷として責任を持って飼ってやるから」[p] +#亜紀子 +「この・・・クズ!絶対に許さないわ・・・!」[p] +#勝野 +「ほぉ~?許さないならどうする?警察に言うか?」[p] +#亜紀子 +「くっ・・・」[p] +#勝野 +「別にいいんだぜ。お前が通報すれば俺は捕まるだろうよ」[p] +「ただし自分を犠牲にして尊敬する先輩を守ったかわいい後輩の人生が終るけどな。それでもいいなら通報すればいいんじゃねえか?ヒャハハハハ!」[p] +#亜紀子 +「ぐっ・・・!最低の・・・最低のクズね・・・っ!」[p] +#勝野 +「おう、最低のクズだぜ?で?」[p] +「せいぜい頑張って俺を罵れよ。お前にできるのはそうやって吠えることくらいだもんな。クプププっ」[p] +#亜紀子 +「ぐ・・・っ・・・!」[p] +#勝野 +「まぁ明日香のことは見捨てるんだな。それが賢明だぜ」[p] +「それじゃ俺は忙しいからもう行くぜ」[p] +[_tb_end_text] + +[stopbgm time="1000" ] +[chara_move name="勝野" anim="true" time="300" effect="linear" wait="true" left="1035" top="16" width="456" height="1094" ] +[playbgm volume="30" time="1000" loop="true" storage="SO_SAD.ogg" ] +[tb_start_text mode=1 ] +#亜紀子 +「・・・ま、待って!」[p] + +[_tb_end_text] + +[chara_move name="勝野" anim="true" time="300" effect="linear" wait="true" left="678" top="16" width="456" height="1094" ] +[tb_start_text mode=1 ] +#勝野 +「なんだ、まだなにか用か?」[p] +#亜紀子 +「わ・・・わたしが、身代わりになるわ。だから明日香にはもう手を出さないで」[p] +#勝野 +「ほぉー?」[p] +「お前が明日香の代わりに俺の性奴隷になるってのか?」[p] +#亜紀子 +「せ、性奴隷っ・・・!?」[p] +#勝野 +「当たり前だろ。明日香の代わりなんだから」[p] +「お前が俺の性奴隷になるって言うなら考えてやってもいいぜ」[p] +「お前にそんな覚悟があるのか?ククク」[p] +#亜紀子 +「く・・・わたしが・・・せ、性奴隷になれば、明日香にはもう二度と手を出さないのね?」[p] +#勝野 +「ああ、約束するぜ」[p] +#亜紀子 +「・・・わ、わかったわ。わたしが・・・性奴隷になるわ」[p] +#勝野 +「おいおい、俺はどっちでもいいんだぜ。若くてピチピチの明日香の方が犯し甲斐があるからな」[p] +「性奴隷になりたいなら頼み方ってもんがあるだろう」[p] +#亜紀子 +「なっ・・・!」[p] +「性奴隷になるのに、わたしからお願いしろって言うの!?」[p] +#勝野 +「嫌ならいいんだぜ。俺はどっちでもいいんだ。好きにするがいいさ」[p] +#亜紀子 +「ぐ・・・わ、わかったわよ・・・っ」[p] +「く・・・わ、わたしを・・・せ、性奴隷にしてください。お願いします・・・っ!」[p] +#勝野 +「よーし、そこまで言うならお前を性奴隷にしてやるよ」[p] +#亜紀子 +「く・・・っ」[p] +#勝野 +「おい、何を睨み付けてるんだ?」[p] +「「性奴隷にしていただいてありがとうございます」だろ?」[p] +#亜紀子 +「く・・・せ、性奴隷にしていただいて・・・ありがとう・・・ございます・・・っ」[p] +#勝野 +「ふむ、まぁいいだろう」[p] +「それじゃとりあえず服を全部脱いで裸になれ」[p] + + + +[_tb_end_text] + +[chara_mod name="美里" time="00" cross="false" storage="chara/1/hiro253-5.png" ] +[tb_start_text mode=1 ] +#亜紀子 +「なっ・・・裸!?」[p] +#勝野 +「なにを驚いてるんだ。性奴隷がどういうものか解かって志願したんだろう」[p] +「俺が脱げと命令したら、もたもたしてないでさっさと脱ぐんだよ」[p] +[_tb_end_text] + +[chara_mod name="美里" time="0" cross="false" storage="chara/1/hiro253-2.png" ] +[tb_start_text mode=1 ] +#亜紀子 +「く・・・ぬ、脱げばいいんでしょう」[p] +[_tb_end_text] + +[stopbgm time="1000" ] +[mask time="1000" effect="fadeIn" color="0x000000" ] +[chara_hide_all time="1000" wait="true" ] +[chara_show name="美里" time="1000" wait="true" storage="chara/1/hiro261-1b.png" width="457" height="1144" left="362" top="17" reflect="false" ] +[mask_off time="1000" effect="fadeOut" ] +[playbgm volume="20" time="1000" loop="true" storage="SO_SAD.ogg" ] +[tb_start_text mode=1 ] +#亜紀子 +「ぬ・・・脱いだわ」[p] +#勝野 +「ほほぉー。これがわが局の看板ニュースキャスターの裸か」[p] +「さすが乳山って呼ばれてるだけあってすげえ乳だな。スリーサイズは?」[p] +#亜紀子 +「・・・どうでもいいでしょうそんなこと」[p] +#勝野 +「やれやれ、まだ自分の立場がわかってないようだな。お前は俺の奴隷なんだぜ」[p] +「聞かれたらシャキシャキ答えろ。スリーサイズは?」[p] +#亜紀子 +「く・・・」[p] +「104、64、95・・・くらいよ」[p] +#勝野 +「うひょーー、やっぱり100cmオーバーかよ!」[p] +「男連中でいつもお前の乳のサイズを予想しあってたが、104cmは予想以上だぜ。ヒャハハ」[p] +#亜紀子 +「く・・・っ」[p] +#勝野 +「よし、お前にプレゼントをやろう」[p] +#亜紀子 +「プレゼント・・・?」[p] +#勝野 +「・・・ほれ、これを着けろ」[p] + +[_tb_end_text] + +[chara_mod name="美里" time="0" cross="true" storage="chara/1/hiro261-3b.png" ] +[tb_start_text mode=1 ] +#亜紀子 +「こ、これは・・・首輪・・・!?」[p] +#勝野 +「奴隷にはやっぱり首輪が必要だろう。クククク」[p] + +[_tb_end_text] + +[chara_mod name="美里" time="00" cross="true" storage="chara/1/hiro261-2b.png" ] +[tb_start_text mode=1 ] +#亜紀子 +「ふ、ふざけないで!」[p] +「私は動物じゃないのよ!誰がこんなものを・・・!」[p] +#勝野 +「まだ理解してないようだな。奴隷ってのは家畜と同じなんだよ」[p] +「お前が嫌なら明日香に着けるだけだぜ。元々そのために買ったものだからな」[p] +#亜紀子 +「・・・っ」[p] +#勝野 +「明日香にそれを嵌めてみっちりと調教してやるぜ。ウヒヒヒ、明日香の泣き叫ぶ顔が目に浮かぶなぁ」[p] +#亜紀子 +「明日香にそんなことをさせるものですか!」[p] +「は・・・嵌めればいいんでしょう!」[p] + + +[_tb_end_text] + +[chara_mod name="美里" time="600" cross="true" storage="chara/1/hiro261-2bk.png" ] +[tb_start_text mode=1 ] +#亜紀子 +「・・・これでいいんでしょう」[p] +#勝野 +「くくく、よく似合ってるじゃねえか」[p] +「それはお前が俺の所有物になったという証だからな」[p] +「俺が外せと言った時と風呂に入る時以外は24時間ずっと着けておけよ」[p] + +[_tb_end_text] + +[chara_mod name="美里" time="600" cross="true" storage="chara/1/hiro261-3bk.png" ] +[tb_start_text mode=1 ] +#亜紀子 +「24時間・・・!?そ、そんなの無理に決まってるでしょう!」[p] +「他の人に変に思われるし・・・なにより本番もあるのよ!」[p] +#勝野 +「大丈夫だよ、パッと見はお洒落なチョーカーに見えるように出来てるから」[p] +「まぁ多少は怪しまれるかもしれないが、堂々としてれば問題ないさ。本番の時は番組内容によっては外してやるよ」[p] +#亜紀子 +「そ、そんな・・・」[p] +#勝野 +「それじゃ次は奴隷宣言をしてもらうぜ」[p] + +[_tb_end_text] + +[chara_mod name="美里" time="00" cross="true" storage="chara/1/hiro261-1bk.png" ] +[tb_start_text mode=1 ] +#亜紀子 +「ど、奴隷宣言・・・?」[p] +#勝野 +「自分の意思で俺の奴隷になったということを宣言するのさ」[p] +#亜紀子 +「な・・・なんて悪趣味なの・・・」[p] +#勝野 +「自分の口で奴隷宣言をさせて初めて正式に奴隷になったことになるんだよ」[p] +「くくく、プライドの高いお前の奴隷宣言をばっちりと撮ってやるからな」[p] +#亜紀子 +「ど、動画に残すの!?」[p] +#勝野 +「当たり前だろう。生本番のつもりで気合入れろよ」[p] +#亜紀子 +「く・・・っ」[p] + + +[_tb_end_text] + +[mask time="1000" effect="fadeIn" color="0x000000" ] +[chara_hide_all time="1000" wait="true" ] +[chara_show name="美里" time="1000" wait="true" storage="chara/1/hiro261-2bk.png" width="469" height="1173" left="370" top="6" reflect="false" ] +[mask_off time="1000" effect="fadeOut" ] +[tb_start_text mode=1 ] +#勝野 +「よーし、台詞は暗記したな?」[p] +#亜紀子 +「くっ・・・こんな屈辱的な台詞・・・」[p] +#勝野 +「よーし本番いくぞ!」[p] +#亜紀子 +「・・・」[p] +#勝野 +「おい、なにしてる」[p] +#亜紀子 +「・・・?」[p] +#勝野 +「奴隷宣言読むのに体隠してるやつがあるか。直立不動だ直立不動」[p] +#亜紀子 +「く・・・」[p] +[_tb_end_text] + +[chara_mod name="美里" time="600" cross="true" storage="chara/1/hiro260-4.png" ] +[tb_start_text mode=1 ] +#勝野 +「よし、じゃカメラを回すぞ」[p] +「本番5秒前、4,3・・・アクション!」[p] +#亜紀子 +「く・・・わ、わたくし千山亜紀子は自らの意思で・・・か、勝野康平様の・・・せ、性奴隷になることを・・・誓います」[p] +「か、勝野様の・・・」[p] +#勝野 +「カット!」[p] +「声が小さい。やり直し!」[p] +#亜紀子 +「くっ・・・」[p] + +[_tb_end_text] + +[chara_mod name="美里" time="600" cross="true" storage="chara/1/hiro260-3n.png" ] +[tb_start_text mode=1 ] +#亜紀子 +「わ、わたくし千山亜紀子は自らの意思で勝野康平様の・・・せ、性奴隷になることを誓います・・・っ!」[p] +「今まで・・・女のくせに勝野様に生意気な態度をとって・・・申し訳ありませんでしたっ!心から反省しております」[p] +「今後、勝野様には・・・二度と逆らいません。ご、ご命令には絶対服従いたします!」[p] +「あ、亜紀子の身体は、おっぱいも、お・・・おま○こもアナルも全て勝野様の所有物です。いつでもご自由に・・・お使いください!」[p] +「ど・・・ドスケベな亜紀子を・・・か、勝野様のお・・・お、おチンポでみっちりと教育してくださいませ・・・!」[p] +「どうぞよろしくお願いいたします・・・っ!」[p] + +[_tb_end_text] + +[chara_mod name="美里" time="60" cross="true" storage="chara/1/hiro260-4n.png" ] +[tb_start_text mode=1 ] +#勝野 +「おし、まぁいいだろう」[p] +「ばっちり動画に収めたからな。これでお前は正式に俺の性奴隷になったわけだ」[p] +「これからみっちり調教して一人前の性奴隷にしてやるからな。覚悟しろよ」[p] +#亜紀子 +「く・・・」[p] +#勝野 +「それと、これからは二人っきりの時は『勝野様』って呼ぶんだぞ、いいな」[p] +#亜紀子 +「な・・・っ」[p] +#勝野 +「返事は?」[p] + +[_tb_end_text] + +[chara_mod name="美里" time="00" cross="true" storage="chara/1/hiro260-3n.png" ] +[tb_start_text mode=1 ] +#亜紀子 +「はい・・・か、勝野様・・・っ」[p] +#勝野 +「よーし、それじゃそこに手を付いて四つん這いになれ」[p] +#亜紀子 +「う・・・は、はい・・・」[p] +[_tb_end_text] + +[chara_hide_all time="1000" wait="true" ] +[stopbgm time="1000" ] +[bg time="1000" method="crossfade" storage="hiro104-1.jpg" ] +[playbgm volume="100" time="1000" loop="true" storage="music16.ogg" ] +[tb_start_text mode=1 ] +#亜紀子 +「・・・っ」[p] +#勝野 +「ほぉー、これが千山亜紀子のマ○コか」[p] +「思ったより綺麗だな。年の割には使い込まれてないぜ」[p] +「毛もかなり薄いな。少女のマ○コといっても通用しそうだぜ、ククク」[p] +#亜紀子 +「く・・・さ、さっさと犯せばいいでしょ」[p] +#勝野 +「主人として奴隷の状態はよくチェックしておかないとな」[p] +「それとも、俺のチンポが待ちきれないか?」[p] +#亜紀子 +「だ、誰が・・・っ」[p] +#勝野 +「ふむふむ・・・今男はいるのか?」[p] +#亜紀子 +「・・・いないわ」[p] +#勝野 +「だろうな。男の影が全然見えなかったもんな。今は仕事が最優先ってか?」[p] +「最後に男がいたのは何時だ?」[p] +#亜紀子 +「・・・・・・21歳くらいよ」[p] +#勝野 +「21・・・!?それってまだ大学生じゃねえか」[p] +「そんなに前からずっと男が居ないのかよ!なんでだ?」[p] +「たしかにお前みたいな高学歴でプライドが高い女は男が出来にくいとは言うが・・・それにしてもなぁ」[p] +「まさか本当にレズなんじゃないだろうな?そういう噂もあったが」[p] +#亜紀子 +「ち、違うわ」[p] +「恋愛にそこまで興味がないだけで・・・」[p] +#勝野 +「ふーん・・・じゃあ今までセックスした男は?その大学の時のを入れて何人だ?」[p] +#亜紀子 +「それ・・・答えないといけないの?」[p] +#勝野 +「質問には即答えろ。正直にな」[p] +#亜紀子 +「・・・2人よ」[p] +#勝野 +「2人!?その歳で経験人数2人かよ!」[p] +「初体験は何時だ?」[p] +#亜紀子 +「・・・・・・・・・1□歳よ・・・」[p] +#勝野 +「1□歳か・・・まぁ普通だな。相手は誰だ?同級生か?先輩か?」[p] +「詳しく聞かせろよ」[p] +#亜紀子 +「・・・そ・・・その話はしたくないわ・・・」[p] +#勝野 +「お、なんだ?そんなに大事な思い出なのか?」[p] +「初恋の甘酸っぱい想い出を俺なんかに話したくないってか?」[p] +#亜紀子 +「そ、そんなんじゃないわ・・・。とにかく・・・その話はしたくないのよ・・・!」[p] +#勝野 +「ふん、まだ自分の立場ってのが解かってないようだな」[p] +「お前にノーという返事は無いんだよ!」[p] +# +バシッ![p] + + + +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro104-2.jpg" ] +[tb_start_text mode=1 ] +#亜紀子 +「アンッ!?」[p] +#勝野 +「命令に従わないとどうなるか身体に教えてやる」[p] +「オラッ!」[p] +# +バシィッ![p] +#亜紀子 +「キャゥッ!」[p] +#勝野 +「オラっ!オラっ!」[p] +# +バシッッ!バシィ!バシッ!![p] +#亜紀子 +「アヒッ!・・・あっ・・・や、やめ・・・!」[p] +# +バシィッ![p] +#亜紀子 +「ヒィィン!」[p] +#勝野 +「オラッ!自分の立場がわかったか!?」[p] +# +バシッ!!バシッ!![p] +#亜紀子 +「アンッ!わ、わかりました・・・っ!」[p] +「アウッッ!は、話すわ・・・話すから!」[p] +#勝野 +「フン、わかればいいんだ」[p] +「やっぱり家畜は躾が大事だからな」[p] +#亜紀子 +「ぐっっ・・・!」[p] +#勝野 +「で、初めてのセックスはどんな感じだったんだ?」[p] +#亜紀子 +「う・・・」[p] +「レ、レイプよ・・・っ!わたしの初めてはレイプよ!」[p] +#勝野 +「なにっ・・・!?」[p] +#亜紀子 +「下校中に襲われて・・・無理やり犯されたのよ・・・!これで満足?」[p] +#勝野 +「ほぉ~~、面白そうな話じゃねえか。詳しく教えろよ。アナウンサーなんだからわかりやすい正確な描写でな。ニヤニヤ」[p] +#亜紀子 +「く・・・あなたって人は本当にゲスね・・・!」[p] +#勝野 +「まだ減らず口を叩くのか?まぁいいからレイプの話をしろ」[p] +# +バシッ![p] +#亜紀子 +「アゥッ!・・・わ、わかったわ」[p] +「あれは・・・○校2年の夏だったわ・・・部活動の帰りに遅くなって夜道を歩いてたら、いきなり全身に衝撃が走って気を失ったのよ」[p] +「後から知ったけどスタンガンで気絶させられたみたいね。気がつくと目の前に・・・あの男が居た」[p] +#勝野 +「どんな男だ?」[p] +#亜紀子 +「今でもよく覚えてるわ・・・。極々普通の大人しそうな男・・・中肉中背で普通の髪型、普通の服装。これといって特徴の無い、でも目だけが血走って・・・」[p] +「・・・場所は廃工場のようなところで、縛られていて動けず、口はガムテープでふさがれていたわ」[p] +「そして、いつの間にか制服を脱がされてレオタードに着替えさせられてた」[p] +#勝野 +「レオタード?その男の趣味か?」[p] +#亜紀子 +「・・・自分のレオタードよ。新体操部だったから・・・荷物で持っていたのを出して気を失っている間に着替えさせたんでしょう」[p] +「その男は新体操選手として私を知っているようだった」[p] +#勝野 +「ほぉー新体操やってたのか。もしかして結構有名だったのか?」[p] +#亜紀子 +「そこまでは・・・全国大会で一度だけ入賞したことがあるくらい」[p] +「でもマニアックなファンは結構居て・・・その男もその中の一人だったんでしょう」[p] +#勝野 +「ほぉ、それで?どんな風に犯されたんだ?」[p] +#亜紀子 +「どうって・・・ただ・・・犯されたわ」[p] +「あの時のことは・・・よく覚えていないの」[p] +「ただ怖かったのと、無力な自分が悔しかったことしか・・・」[p] +#勝野 +「ふーん・・・そんなもんかねぇ・・・。初めては痛かったか?中出しされたのか?」[p] +#亜紀子 +「痛さは・・・よく覚えてないけど、中には・・・出された。家に帰ってから必死に洗ったことを覚えているわ」[p] +#勝野 +「なるほどねぇ・・・」[p] +「新体操の大会かなんかでお前のことを知ったどこかの男が、つのる欲望を抑えきれずに実行に移したって感じか」[p] +#亜紀子 +「・・・・・・」[p] +#勝野 +「どうせその頃からエロい身体をしてたんだろう?」[p] +「それを見せ付けるようにレオタードで踊ってたんじゃ、そういう輩が現れるのも無理はないな」[p] +「そういう運命なんだよお前は。クククク」[p] + + + + + + + + + +[_tb_end_text] + +[bg time="000" method="crossfade" storage="hiro104-3.jpg" ] +[tb_start_text mode=1 ] +#亜紀子 +「な・・・なんて人なの・・・!」[p] +「・・・あなたもあの男と同じよ!女を欲望のはけ口としか見ていない・・・ゲス男よ!」[p] +#勝野 +「ふん・・・俺はそのレイプ男とは違うぜ」[p] +「一度だけでやり捨てたりせずに、みっちりとチンポでかわいがってやるからな、ウヒヒヒヒ」[p] +#亜紀子 +「く・・・」[p] +#勝野 +「それで、その大学の時付き合ってた男ってのとは長かったのか?」[p] +#亜紀子 +「彼とは・・・3ヶ月くらいよ」[p] +#勝野 +「なに!そんなに短いのかよ」[p] +「そいつもダメ男だったのか?」[p] +#亜紀子 +「そんなことはないわ・・・!」[p] +「彼は・・・良い人だったわ。優しかったし・・・」[p] +「別れたのは・・・私のほうに問題があったからで・・・」[p] +#勝野 +「問題・・・?もしかして母乳のことか?」[p] +#亜紀子 +「そうよ・・・母乳のことを打ち明けることが出来なくて・・・別れたのよ」[p] +#勝野 +「てことは・・・そいつとはセックスは?」[p] +#亜紀子 +「・・・1回だけ」[p] +#勝野 +「なんてこった!てことは・・・」[p] +「まだセックスを2回しかしてないってことかよ!?」[p] +「こんないやらしい身体しておいて、なんてもったいねぇ・・・」[p] +#亜紀子 +「く・・・セックスなんて・・・絶対必要なものではないわ」[p] +#勝野 +「かぁーーなんてこった。このドスケベボディでまだ性の喜びも知らないなんて」[p] +「よしよし、俺様がセックスの素晴らしさを教えてやるからな」[p] +「みっちりと仕込んで、俺のチンポ無しでは生きられないようにしてやるぞ。ウヒヒヒヒ」[p] +#亜紀子 +「く・・・犯したければいくらでも犯すがいいわ」[p] +「でもいくら身体を犯そうとも心まで屈服することは絶対にしないわ・・・!」[p] +#勝野 +「ウヒャヒャヒャ!いいねぇそのセリフ!」[p] +「肛門まで丸見えの格好でよくそんな態度が取れるな!おい!」[p] +[_tb_end_text] + +[bg time="300" method="crossfade" storage="hiro104-4.jpg" ] +[tb_start_text mode=1 ] +#亜紀子 +「アヒィッッ!?」[p] +#勝野 +「いずれはこっちの方もかわいがってやるからな」[p] +# +ズポズポ[p] +#亜紀子 +「ンンッ・・・!ア・・・アンッ」[p] +「や、やめ・・・アアッ!」[p] +#勝野 +「ん・・・?お前なんか感じてないか?」[p] +#亜紀子 +「ンハァ・・・だ、誰が・・・ンンッ!」[p] +「か、感じてなんか・・・」[p] +#勝野 +「オラッ」[p] +# +ズポズポズポッ[p] +#亜紀子 +「アッ・・・ヤンッ・・・アハァッ♥」[p] +「あ・・・クっ・・・アンッ♥」[p] +#勝野 +「完全にアナルで感じてるじゃねえか!」[p] +「お前、さては・・・自分でいじってやがるな?」[p] +#亜紀子 +「そっ・・・そんなこと・・・ンッ・・・してない・・・っつ」[p] +#勝野 +「うそつけ!この感度は未経験ではありえないだろう!」[p] +「おらっ正直に答えろ!」[p] +# +ズポズポズポズポっ![p] +#亜紀子 +「アアァンッ!!・・・ヤァッ・・・ハァンッ♥」[p] +「わ、わかったから・・・!アヒィッ!こ、答えるから・・・!」[p] +#勝野 +「アナルオナニーしてるんだな!?」[p] +#亜紀子 +「し、してます・・・っ!アンッ♥・・・あ、アナルオナニー・・・してます・・・っ!」[p] +#勝野 +「ヒャハハハハ!こりゃ傑作だ!」[p] +「あのインテリぶってお高くとまってた千山亜紀子がアナルオナニーにはまってたとはな!」[p] +「なるほど・・・レイプの経験や母乳の問題で男となかなか付き合えないから、有り余った性欲を毎晩オナニーで解消してたって訳だククク」[p] +#亜紀子 +「アンッ・・・ま、毎晩なんて・・・してな・・・ンッ♥」[p] +#勝野 +「ウソつけ!この感度はちょっとやそっとのオナニー狂いじゃないだろう!」[p] +「毎晩このドスケベな身体を慰めてるんだろう!正直に答えろ!」[p] +# +ズポズポズポッグリグリグリッ[p] + + + +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro104-5.jpg" ] +[tb_start_text mode=1 ] +#亜紀子 +「アヒッッ・・・!言う・・・言いますから・・・ッ!」[p] +「ま、毎晩・・・アンッ♥お、オナニー・・・してます・・・アハンッ♥」[p] +#勝野 +「道具とかも使ってるのか?おいっ!」[p] +# +ズプププププ[p] +#亜紀子 +「アゥゥ・・・お、奥まで入れないでぇ・・・ンッ!」[p] +「も、持ってるわ・・・っ!」[p] +#勝野 +「どんなのを持ってるんだ?詳しく答えろ!」[p] +#亜紀子 +「あ・・・ンッ・・・ふ、普通のバイブと・・・ろ、ローターと・・・アンッ!」[p] +「ふ・・・二股の・・・バイブッ・・・アヒッ♥」[p] +#勝野 +「ケッ、済ました顔して毎晩バイブ使ってオナニー三昧だったとはな」[p] +「このドスケベ女が!」[p] +# +ズポズポズポッ![p] +#亜紀子 +「アヒィッ♥わ、わたしは・・・ドスケベなんかじゃ・・・ないっ・・・アンッ!」[p] +#勝野 +「おい、この期に及んでまだしらを切るつもりか?」[p] +「お前はドスケベなんだよ!」[p] +「「私はドスケベです」って言え!」[p] +# +ズポッ!ズポッ!ズポッ![p] +#亜紀子 +「アッ・・・ンンーーッ!」[p] + + + +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro104-6.jpg" ] +[tb_cg id="104" ] +[tb_start_text mode=1 ] +#亜紀子 +「ダ、ダメェェーーーーっ♥」[p] +「わ、わたしは・・・ドスケベ女・・・ですーーっ!」[p] +# +ジョボボボボボボボボ[p] +#勝野 +「おわっ!?」[p] +#亜紀子 +「ダメェェーーっ!見ないでぇーーーっ♥」[p] +# +ジョボボボボボボ[p] +#勝野 +「こいつ小便漏らしやがった!」[p] +「なんてスケベな女だ・・・!」[p] +#亜紀子 +「アゥゥ・・・ンハァッ・・・♥」[p] +#勝野 +「まさかキャリアウーマンの見本みたいなお前が、こんなにドスケベだったとはなぁ」[p] +「プライドで身を固めて気を張って仕事しながら、熟れた身体はチンポに飢えていたってことか」[p] +#亜紀子 +「はぁ・・・はぁ・・・」[p] +#勝野 +「よしよし、これからは俺がたっぷりとチンポで慰めてやるからな」[p] +#亜紀子 +「あっ・・・いやぁっ!」[p] + +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro113-1.jpg" ] +[tb_start_text mode=1 ] +#勝野 +「ククク、良い格好だな」[p] +「よし、さっき教えたセリフを言え。感情を込めて言うんだぞ」[p] +#亜紀子 +「く・・・」[p] +「ど・・・ドスケベな亜紀子を・・・勝野様のお、おチンポで・・・かわいがってくださいませ・・・」[p] +#勝野 +「ダメだダメだ。感情がこもってない」[p] +「もっと気持ちを込めて言わないとチンポを入れてやらないぞ」[p] +#亜紀子 +「くっ・・・!あなたなんかに抱いて欲しいわけがないでしょう・・・!」[p] +「犯したいならさっさと犯せばいいわ!」[p] +#勝野 +「ククク、アナルをほじくられただけで小便漏らすドスケベのくせに、強がるんじゃないよ」[p] +「チンポに飢えて毎日オナニーしてたんだろう?」[p] +#亜紀子 +「た、たとえどんなに男に飢えていたとしても、あなたになんか死んでも媚びたりはしないわ・・・!」[p] +#勝野 +「ふん、ドスケベのくせにやせ我慢しやがって」[p] +「それなら素直にチンポをおねだりしたくなるようにしてやるぜ」[p] +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro113-3.jpg" ] +[tb_start_text mode=1 ] +#亜紀子 +「アッ!?」[p] +#勝野 +レロレロレロっ[p] +#亜紀子 +「やっ・・・ダメ・・・ッ!・・・アンッ♥」[p] +#勝野 +レロッレロンッチュバッ[p] +#亜紀子 +「ヤッ・・・ンンッ・・・!アッ・・・ハァンッ♥」[p] +#勝野 +「くくく、ちょっと舐めただけで感じまくってるじゃねぇか」[p] +ヌロンヌロンピチュッ[p] +#亜紀子 +「だ、誰が・・・感じて・・・ンンッ!」[p] +(ダメ・・・声が・・・出ちゃう・・・っ♥)[p] +「く・・・ンンッ・・・アハァンッ♥」[p] +#勝野 +「口で否定しても、ヌルヌルのジュースがどんどん溢れてるんだよ。ホレッ」[p] +レロンレロン・・・ヌリュン・・・チュバッ[p] +#亜紀子 +「アヒッ・・・!?そ、そこは・・・アンンッ!」[p] +#勝野 +「やっぱりオナニー狂いなだけあってクリが弱いみたいだな、ヒヒヒ」[p] +レロレロレロチュパッチュパッツチューッ[p] +#亜紀子 +「ダメェッ・・・!アッ・・・アヒッ♥」[p] +「アッ・・・ンンンッ・・・!」[p] +#勝野 +「おっと、イかせてもらえると思うなよ」[p] +「チンポを上手におねだりできるまではお預けだっ」[p] +#亜紀子 +「う・・・アハァッ」[p] +「そ、そんな・・・アンッ♥」[p] +#勝野 +「いつまで意地張れるかな・・・ククク」[p] +レロレロレロ・・・[p] + +[_tb_end_text] + +[mask time="1000" effect="fadeIn" color="0x000000" ] +[bg time="1000" method="crossfade" storage="hiro113-2.jpg" ] +[mask_off time="1000" effect="fadeOut" ] +[tb_start_text mode=1 ] +#亜紀子 +「はぁ・・・んっ・・・ハァッ♥」[p] +#勝野 +「くくく、どうだ今ならもっと感情を込めておねだりができるんじゃないか、ん?」[p] +#亜紀子 +「ハァッ・・・く・・・・っ」[p] +#勝野 +「ほれっ、さっきのセリフをもう一回言ってみろ」[p] +#亜紀子 +「く・・・ど、ドスケベな亜紀子の身体を・・・勝野様のおチンポで・・・みっちりとかわいがってくださいっ・・・♥」[p] +#勝野 +「ヒヒヒッ、感情込めて言えるじゃねえか」[p] +「「みっちりと」なんてセリフ台本にはなかったはずだが、そんなにチンポが欲しくなったか?ヒャハハ!」[p] +#亜紀子 +「・・・っ!」[p] +#勝野 +「ほれ、もう一回大きい声で言え!」[p] +#亜紀子 +「う・・・ドスケベな亜紀子の身体を、勝野様のおチンポで・・・みっちりとかわいがってくださいっ!」[p] +#勝野 +「よーし、良い子だ。お望みどおりみっちりとかわいがってやるよ!」[p] + +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro113-4.jpg" ] +[tb_start_text mode=1 ] +# +ズププププ・・・ッ[p] +#亜紀子 +「アヒィッ!」[p] +#勝野 +「クハハハ!ついにあの千山亜紀子を犯してやったぜ!」[p] +「お・・・これはすげえ!マ○コがチンポに吸い付いてきやがる・・・!」[p] +#亜紀子 +「アフゥ・・・ッ・・・アンッ♥」[p] +# +ズポッ・・・ヌポッ・・・[p] +#勝野 +「どうだ、久しぶりのチンポは?バイブとは違うだろう!」[p] +# +ズチュッ・・・ヌチュッ・・・[p] +#亜紀子 +「アンッ・・・!ンッ・・・ハァンッ♥」[p] +#勝野 +「オラッ、夢にまで見た男のチンポだぞっ!感想を言ってみろ!」[p] +# +ズポッ・・・ズリュッ・・・[p] +#亜紀子 +「ク・・・ッ・・・き、気持ちよくなんか・・・ンンッ!」[p] +#勝野 +「こいつ、マ○コをキュウキュウ締め付けながら、まだ強がる気かよ」[p] +「くくく、いつまで我慢できるかな?オラッ!」[p] + +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro113-5+.jpg" ] +[tb_cg id="113" ] +[tb_start_text mode=1 ] +# +パンッパンッパンッパンッパンッ![p] +#亜紀子 +「アヒィッ!?」[p] +(ダメェーーッ!・・・バ、バイブと全然・・・違う・・・っ♥)[p] +「アンッ♥アンンッ♥ンンッーー!」[p] +#勝野 +「オラッ!オラッ!オラッ!オラァッ!」[p] +# +パンッ!パンッ!パンッ!パンッ![p] +#亜紀子 +「アンッ♥アンッ♥アンッ♥アァァーーンッ!」[p] +(こ・・・このままじゃ・・・チンポに・・・屈しちゃう・・・っ!)[p] +#勝野 +「オラッ、これでも感じないか?オイッ!」[p] +# +パンッパンッパンッ![p] +#亜紀子 +「アンッ♥アヒィーーッ!」[p] +(だ、ダメ・・・もう・・・イク・・・っ・・・イッちゃう・・・っ!)[p] +「アアッ・・・ンンッーーーーっ♥」[p] +#勝野 +「おっと、簡単にはイかせないぜ」[p] +# +ズプッ・・・ヌプーー・・・[p] +#亜紀子 +「ン・・・っ!?ハァ・・・ヤァッ・・・♥」[p] +「だ・・・誰が・・・イくものですか・・・っ」[p] +(あ、危なかった・・・イくところ・・・だった・・・)[p] +#勝野 +「と見せかけて!」[p] +# +ズンッ![p] +#亜紀子 +「アヒィッ!?」[p] +#勝野 +「オラッ、イっちまいな!」[p] +# +パンッ!パンッ!パンッ!パンッ![p] +#亜紀子 +「アッ・・・ダメェッ・・・!アヒィッ♥」[p] +「アッ・・・アァーーーーーーーーッ♥♥」[p] +#勝野 +「ククク、イったな!」[p] +「スケベな声で鳴きやがって」[p] +#亜紀子 +「アハァ・・・ンッ♥」[p] +「ハァッ・・・ハァッ・・・」[p] +#勝野 +「オラッ、休んでんじゃねぇぞ!」[p] +# +パンッパンッパンッ![p] +#亜紀子 +「アッ・・・!ダメェ・・・今は・・・っ!」[p] +「アンッ♥アンッ♥アヒィーーーッ♥」[p] +#勝野 +「オラッ、どうだ?気持ち良いか?正直に言ってみろっ!」[p] +# +ズンッズンッズンッ![p] +#亜紀子 +「アンンッ♥アンッ♥アァッ♥」[p] +「く・・・ンンーーーーッ!」[p] +#勝野 +「オラッ、言え!気持ち良いって言え!」[p] +# +パンッパンッパンッ![p] +#亜紀子 +「アァッ・・・アヒィーーー♥」[p] +「ンンッ・・・き、気持ち・・・イイーッ♥」[p] +(あぁ・・・言っちゃった・・・♥)[p] +#勝野 +「おらっ、チンポ気持ち良いですって言えっ」[p] +# +パンッパンッパンッ![p] +#亜紀子 +「ち、チンポ・・・気持ちイイ・・・ですぅーッ♥」[p] +「アヒィーーーーッ♥」[p] +#勝野 +「よーしっ・・・俺も出すぞ・・・っ」[p] +# +パンッパンッパンッパンッ![p] +#亜紀子 +「ダ、ダメェーーッ!な・・・中は・・・ッ!」[p] +「アンッ♥中は・・・ンッ・・・やめてぇーーっ!」[p] +#勝野 +「中に出して欲しくなかったら顔にかけて欲しいっておねだりしてみろっ!」[p] +# +パンッパンッパンッ![p] +#亜紀子 +「アンンッ♥か・・・顔にかけて・・・っ♥」[p] +#勝野 +「そんな頼み方じゃダメだ・・・!」[p] +「もっとちゃんとおねだりしないと中に出しちまうぞ?」[p] +# +パンッパンッパンッ![p] +#亜紀子 +「アンッ♥そ・・・そんな・・・ぁ♥」[p] +「ハァンッ♥・・・か、勝野様の・・・せ、精液を・・・ンッ♥・・・顔にたっぷりと・・・かけてください・・・っ!」[p] +#勝野 +「ふん・・・まぁいいだろう」[p] +「顔にかけてやる・・・!・・・ンッ!」[p] +#亜紀子 +「アヒィーーーーッ♥」[p] + + + +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro112-1.jpg" ] +[tb_start_text mode=1 ] +#勝野 +「オラァッ・・・!」[p] +# +ドピュピュピュッ!![p] +#亜紀子 +「アァンッ♥」[p] +# +ビュルビュル・・・ッ![p] +ビチャビチャッ![p] +#亜紀子 +「アァ・・・ッ!?あ・・・熱い・・・っ♥」[p] +「ンンッ・・・ハァ・・・ッ♥」[p] +# +ピュッ・・・ピュッ・・・[p] +#勝野 +「ふぅ・・・」[p] +「たんまり出たな。生意気なニュースキャスターの顔にぶちまけるのは最高だぜ」[p] +#亜紀子 +「うぅ・・・んっ」[p] +#勝野 +「どうだ、ゲス男のチンポにさんざんイかされた気分は?」[p] +#亜紀子 +「く・・・っ」[p] +#勝野 +「どんなに強がろうとチンポを突っ込まれりゃただのメスになるってことを自覚しただろう」[p] +#亜紀子 +「・・・っ・・・勘違いしないで」[p] +「セックスは・・・ただのセックスよ。心までは屈してないわ・・・っ」[p] +#勝野 +「ククク、ザーメンまみれの顔でカッコイイこと言うじゃねえか」[p] +「チンポ気持ちいいですっ、って言ってたくせに」[p] +#亜紀子 +「あ・・・あなたが言わせただけよ・・・っ」[p] +#勝野 +「ふん、まぁいい。それでこそ調教のし甲斐があるってもんだぜ」[p] +「せいぜい頑張って俺を楽しませてくれよ」[p] +「それじゃ、今度はこう言ってもらおうか「ドスケベな亜紀子をかわいがってくださってありがとうございました。おチンポをお口で綺麗にさせていただきます」ってな」[p] +「感情を込めてだぞ。わかってるな」[p] +#亜紀子 +「く・・・っ。言えばいいんでしょう・・・」[p] +「ド・・・ドスケベな亜紀子をかわいがってくださって・・・ありがとうございます・・・っ。おチンポをお口で綺麗に・・・させていただきます・・・っ」[p] +#勝野 +「まぁいいだろう。ホレッ気合入れて掃除しろよ」[p] +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro112-2.jpg" ] +[tb_cg id="112" ] +[tb_start_text mode=1 ] +#亜紀子 +「ンムッ・・・チュプッ・・・♥」[p] +「チュぅ・・・チュぅ・・・レロッ」[p] +#勝野 +「尿道に残ったやつもちゃんと一滴残らず吸い出して美味しくいただくんだぞ」[p] +#亜紀子 +「ンッ・・・チューーッ・・・ゴクッ♥」[p] +「チュバッ・・・チュプッ・・・レロッレロッ♥」[p] +「ンムッ・・・ゴクッ♥」[p] +「ンハァ・・・ハァ・・・っ」[p] +#勝野 +「よし・・・いいだろう」[p] +「今度から犯してもらったら言わなくてもやるんだぞ」[p] +#亜紀子 +「く・・・は、はい」[p] +#勝野 +「さてと・・・もう一回やりたいところだが、さすがにもう戻らないとな」[p] +「まぁこれからは何時でもやれるんだから、焦る必要はないか、ククク」[p] +#亜紀子 +「・・・・・・」[p] +#勝野 +「それと、明日からは明日香の代わりに俺の番組にも出てもらうからな」[p] +#亜紀子 +「え・・・っ!?」[p] +#勝野 +「当たり前だろう。明日香には手を出さないんだから、今度からはお前を使って手柄を立てさせてもらうぜ」[p] +「エロい格好とかもしてもらうから覚悟しておけよ」[p] +#亜紀子 +「く・・・そ、そんな・・・」[p] +#勝野 +「ククク、明日からが楽しみだぜ。ハハハハハ!」[p] + + +[_tb_end_text] + +[stopbgm time="1000" ] +[tb_replay id="reps4" ] +[jump storage="scene6.ks" target="" ] diff --git a/data/scenario/scene6.ks b/data/scenario/scene6.ks new file mode 100644 index 0000000..46124dd --- /dev/null +++ b/data/scenario/scene6.ks @@ -0,0 +1,630 @@ +[_tb_system_call storage=system/_scene6.ks] + +[mask time="1000" effect="fadeIn" color="0x000000" ] +[bg time="1000" method="crossfade" storage="hiro254-0.jpg" ] +[mask_off time="1000" effect="fadeOut" ] +[playbgm volume="100" time="1000" loop="true" storage="neonpurple.ogg" ] +[tb_start_text mode=1 ] +# +次の日―――[p] +[_tb_end_text] + +[chara_show name="谷田" time="1000" wait="true" storage="chara/4/hiro259-1.png" width="424" height="1018" left="226" top="-3" reflect="false" ] +[tb_start_text mode=1 ] +#谷田 +「これをここにセットして・・・と」[p] +「ふう・・・あとはあれを・・・」[p] +#ディレクター +「おい谷田!あれはどうなってる!」[p] +#谷田 +「はいっ、あれは大丈夫です!」[p] +「これをこうして準備して・・・っと、こんなもんで大丈夫かな」[p] +「ADの仕事も大変だよ・・・。おっと、そろそろ千山さんが入る時間だ」[p] +「千山さんに会えるのだけがこの仕事の至福の瞬間だからな・・・お、来たっ」[p] +「千山さん、おはようごz・・・えっ!!?」[p] + +[_tb_end_text] + +[stopbgm time="1000" ] +[chara_show name="美里" time="1000" wait="true" storage="chara/1/hiro258-1.png" width="483" height="1208" left="647" top="10" reflect="false" ] +[chara_mod name="谷田" time="600" cross="false" storage="chara/4/hiro259-3.png" ] +[playbgm volume="100" time="1000" loop="true" storage="bluenoise.ogg" ] +[tb_start_text mode=1 ] +#谷田 +「ち・・・千山さん・・・!?」[p] +「あ・・・お、おはようございます・・・っ!」[p] + +[_tb_end_text] + +[chara_mod name="美里" time="60" cross="false" storage="chara/1/hiro258-2.png" ] +[tb_start_text mode=1 ] +#亜紀子 +「お、おはよう」[p] +#谷田 +「ち、千山さん・・・そ、その格好・・・」[p] +#亜紀子 +「へ、変かしら?」[p] +#谷田 +「えっ!?い、いやっ・・・そんなことないです!す、素敵です!」[p] +#亜紀子 +「そ、そう・・・ありがとう」[p] +#谷田 +「で、でも、急にどうしたんですか・・・?な、なんかいつもと違うというか・・・」[p] +#亜紀子 +「え、ええ・・・気分転換で、たまにはこういうのもいいかなって」[p] +[_tb_end_text] + +[chara_mod name="谷田" time="0" cross="false" storage="chara/4/hiro259-2.png" ] +[tb_start_text mode=1 ] +#谷田 +「に、似合ってます!すごく、せ、セクシーで・・・!」[p] +#亜紀子 +「あ、ありがとう」[p] +(あぁ・・・谷田君がいやらしい目で見てる・・・)[p] +(そりゃそうよね・・・こんな破廉恥な格好・・・)[p] +# +勝野の奴隷になった時点で、明日香同様際どい服を強要されるのはわかっていた[p] +しかし今朝勝野に渡された衣装は予想以上に卑猥なモノだった[p] +お尻をギリギリ隠すだけの超ミニスカートは、少しでも気を抜くとパンティが見えてしまうほどだ[p] +胸元が大きく開いたノースリーブのジャケットはサイズが小さく、パツンパツンでボタンがはじけ飛びそうだ[p] +しかも下にブラウスどころかブラジャーすら着用することを許されず、肌に密着して乳首が浮き上がってしまっている[p] +派手なショッキングピンクのピンヒールに、耳元にはハート型の扇情的なイヤリング[p] +化粧も派手にするように指示されたので、まるで商売女にしか見えない[p] +そして何より赤い首輪が奴隷になったことを意識させられて屈辱的だ[p] +#ディレクター +「あ、千山さん、おはよ・・・えっ!?」[p] +「そ、その格好・・・!?」[p] +#亜紀子 +「ええ・・・これは―――」[p] +#ディレクター +「いやぁ、すごくイイですよ!」[p] +(エロッ!ついに千山アナも路線変更か!?こりゃM層の数字がすごいことになるぞ!)[p] +(よし、ここは気が変わらないようにおだてておこう!)[p] +「大人の色気が出てて、セクシーの中に知的さも感じられるし最高ですよ!」[p] +#亜紀子 +「ちょっと派手過ぎないかしら・・・?」[p] +#ディレクター +「いや、全然大丈夫ですよ。このくらいならアナウンサーとして常識の範囲内ですって」[p] +#亜紀子 +「そ、そうかしら・・・」[p] +(どこが常識の範囲内なのよ・・・)[p] +#カメラマン +「おおっ!すごい!」[p] +(なんてエロい服だよ!千山ってこんな趣味があったのか!?ヤりてぇーー!)[p] +#メイクさん +「わぁ!すごくカッコイイです!」[p] +(なにあの格好!?商売女みたいな格好して・・・頭おかしいんじゃないの?)[p] +#亜紀子 +「あ、ありがとう・・・」[p] +(ああ・・・みんなの見る目がいつもと違うわ・・・。口では褒めてくれてるけど心の中では絶対変態だと思われてる・・・)[p] +(これからこの格好でカメラの前に出なきゃいけないなんて・・・)[p] +(ああ・・・頭がクラクラしてきたわ・・・)[p] +(でも明日香も私を守るために同じことをしてくれたんだから・・・。私も耐えて見せるわ・・・!)[p] + + +[_tb_end_text] + +[chara_hide_all time="1000" wait="true" ] +[stopbgm time="1000" ] +[bg time="1000" method="crossfade" storage="hiro999.jpg" ] +[tb_start_text mode=1 ] +#ディレクター +「本番始まりまーす!」[p] +「5・・・4・・・」[p] +・・・・・・[p] +[_tb_end_text] + +[mask time="1000" effect="fadeIn" color="0x000000" ] +[bg time="1000" method="crossfade" storage="hiro254-11.jpg" ] +[mask_off time="1000" effect="fadeOut" ] +[playbgm volume="100" time="1000" loop="false" storage="music13.ogg" ] +[tb_start_text mode=1 ] +#亜紀子 +「こんばんわ、ニュースプライムZの時間です。キャスターの・・・千山亜紀子です」[p] +[_tb_end_text] + +[stopbgm time="1000" ] +[playbgm volume="20" time="1000" loop="true" storage="Green&Dance_2.ogg" ] +[tb_start_text mode=1 ] +#亜紀子 +「まずは、嬉しいニュースです。オリンピックがまた日本で開催されることが決定しました」[p] +「2080年の夏季オリンピック開催招致を目指しアメリカのヒューストン、タイのバンコクと争っていた米子市でしたが、今日の決選投票で勝利し正式に開催が決定しました」[p] +「投票はIOCに参加している205の国と地域で行われましたが―――」[p] +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro101-3.jpg" ] +[tb_start_text mode=1 ] +#左上(以下ノブオ) +「うわっ!?」[p] +#ノブオ +「千山アナがすごい服装してる!?」[p] +「すごい超ミニスカートでピンクのパンツが丸見えじゃん!」[p] +「胸もあんなに開いて巨乳がこぼれそうだし・・・もしかしてノーブラ!?」[p] +「あのお堅いイメージの千山アナが急にどうしたんだ?イメチェンか!?」[p] +・・・[p] +#左下(熱狂的千山亜紀子ファン) +「おおお・・・・・・・・!?」[p] +「・・・・・・!」[p] +「お、俺の亜紀子が・・・なんて格好を・・・!」[p] +「どうしたんだ亜紀子・・・パパパパパンティが・・・ピピピピンク・・・」[p] +「理想の具現化・・・これは俺の力・・・?いや・・・しかし・・・」[p] +「俺だけの・・・俺だけの・・・ハァハァハァハァ」[p] +・・・[p] +#右上(子供) +「ねーママあのアナウンサー、パンツ見えてるよ」[p] +#右上(ママ) +「まぁ!なんていやらしい格好なの!?」[p] +「わたし千山アナ好きだったのに・・・どうしちゃったのかしら」[p] +#右上(パパ) +「・・・」[p] +#ママ +「最近のアイドル女子アナと違って、媚びてないところが好きだったのに」[p] +「あんなやらしい格好するなんて、がっかりだわ・・・ねえあなた」[p] +#パパ +「・・・え、ああ、まぁ今日はたまたまじゃないか?」[p] +#ママ +「そうかしら・・・?でもあの服は酷いわ。あんな短いスカート・・・」[p] +#子供 +「ねえ、ああいうのロシュツキョウって言うんでしょ。知ってるよ」[p] +#ママ +「まぁ、この子ったらどこでそんな言葉を・・・」[p] +「もう、あんまり見ちゃいけません。ねぇあなたチャンネルを変えましょうよ」[p] +#パパ +「ん、まぁいいじゃないか。そんなに気にしなくても・・・」[p] +#ママ +「まぁ、あなたもああいうのが好きなの!?いやらしい!」[p] +#パパ +「ち、違う違う!ぼくはニュースを観たいだけで・・・」[p] +・・・・・・[p] +・・・[p] + + + + + + + +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro254-11.jpg" ] +[tb_start_text mode=1 ] +#亜紀子 +「メジャーリーグ、メンデルスの大蟹庶平選手がアメリカンリーグ最速となる20号ホームランを放ちました」[p] +「ナストロズをホームに迎えてのナイトゲーム。18-0でむかえた5回の第3打席でした」[p] +「アウトコースの変化球を巧く流し打った打球はライナーで一直線。そのままレフトポール際に飛び込むソロホームランとなりました」[p] +「この一発で再びホームラン単独トップに躍り出た大蟹選手。メンデルスのマドンヌ監督は「彼の能力には新たに驚かされることばかりだ」と賞賛しました」[p] +「なお試合はメンデルスが25-1と大敗しました」[p] +「以上スポーツでした。次はお天気です。佐藤さんよろしくお願いします」[p] +・・・・・・[p] +・・・[p] +[_tb_end_text] + +[stopbgm time="1000" ] +[mask time="1000" effect="fadeIn" color="0x000000" ] +[bg time="1000" method="crossfade" storage="hiro254-0.jpg" ] +[chara_show name="美里" time="1000" wait="true" storage="chara/1/hiro258-1.png" width="584" height="1460" left="130" top="21" reflect="false" ] +[mask_off time="1000" effect="fadeOut" ] +[playbgm volume="100" time="1000" loop="true" storage="neonpurple.ogg" ] +[tb_start_text mode=1 ] +#亜紀子 +(ふぅ・・・なんとか無事終れたわ・・・)[p] +(この姿が全国の人に見られてると思うと全然集中できなかったけど・・・なんとかミス無くこなせてよかったわ)[p] + +[_tb_end_text] + +[chara_show name="谷田" time="1000" wait="true" storage="chara/4/hiro259-2.png" width="500" height="1200" left="707" top="-37" reflect="false" ] +[chara_mod name="美里" time="0" cross="false" storage="chara/1/hiro258-2.png" ] +[tb_start_text mode=1 ] +#谷田 +「千山さん、おつかれさまです!」[p] +#亜紀子 +「あ、おつかれさま谷田君・・・」[p] +#谷田 +「今日は本当に最高でした!」[p] +#亜紀子 +「あ、ありがとう・・・」[p] +(本番中ずっとパンツを覗き込んでたでしょう。見えてたのよ・・・)[p] +#谷田 +「あの・・・ズボンスタイルもいいですけど、今日みたいな服もいいと思います!」[p] +#亜紀子 +「そ、そうね・・・」[p] +(やめて・・・そんな目で見ないで・・・。メスを見る目で・・・)[p] +#局長 +「千山くん!」[p] +[_tb_end_text] + +[chara_hide name="谷田" time="100" wait="true" pos_mode="false" ] +[chara_show name="局長" time="1000" wait="true" storage="chara/3/hiro262-2.png" width="602" height="1445" left="575" top="-84" reflect="false" ] +[tb_start_text mode=1 ] +#亜紀子 +「きょ、局長・・・」[p] +#局長 +「本番の様子をアナウンス室のモニターで見てたんだが・・・どうしたのかねその格好は!?」[p] +#亜紀子 +「こ、これは・・・」[p] +(まずいわね・・・さすがに怒られるかしら・・・)[p] +(でもずっとミニスカートを穿けって言ってきたのは局長なんだし、ここは強気に行きましょう)[p] +「局長に言われたとおりミニスカートにしてきたんですが、お気に召しませんか?」[p] +#局長 +「い、いや確かにミニスカートを穿いて来いとは言ったが、さすがにこれは・・・」[p] +「局のほうにも「アナウンサーの服装が破廉恥すぎる」と抗議の電話がたくさん来ておるんだ」[p] +#亜紀子 +「えっ・・・」[p] +#局長 +「だいたい急にどうしたのかね、あれだけミニスカートを穿くことを拒んでいたというのに・・・」[p] +「この急な心変わりはいったい何なんだね?」[p] +#亜紀子 +「そ、それは・・・」[p] +(まずいわ・・・勝野のことを知られるわけにはいかない。なんとか誤魔化さないと・・・)[p] +「あ、あの・・・色々考えてやっぱり局長のお言葉は正しかったと反省しまして・・・。局のためなら私も恥ずかしがってないで勇気を出してみようと・・・」[p] +#局長 +「なんと・・・!本当かね!?」[p] + + +[_tb_end_text] + +[chara_mod name="局長" time="300" cross="false" storage="chara/3/hiro262-3.png" ] +[tb_start_text mode=1 ] +#局長 +「そうかそうか!千山くんもやっと解かってくれたか!」[p] +「いやぁ私が君にくどくどと小言を言っていたのも局の為、ひいては君の為だったんだよ」[p] +「私はてっきり君に煙たがられていると思っていたが、いやぁ誠意というのは伝わるものなんだな。ワハハハ」[p] +#亜紀子 +「は、はぁ・・・」[p] +(なんて単純な人なの・・・でも、なんとか誤魔化せてよかったわ)[p] +#局長 +「よし、君がそういう気持ちなら私も後押ししよう!」[p] +「苦情のことは任せなさい!上からは色々言われるだろうが、私が説得してみせるから!」[p] +#亜紀子 +「えっ・・・あ、あの・・・」[p] +#局長 +「君は気にせずにこれからもその格好を続けたまえ!」[p] +#亜紀子 +(しまった・・・!)[p] +(苦情が来てるなら勝野もこの服装を止めさせたかもしれないのに・・・。自分で自分の首を絞めてしまったわ・・・!)[p] +#局長 +「うむうむ、いやしかしよく似合っているよ。思っていた通り抜群のスタイルだねぇ」[p] +「最近の若い子は痩せすぎて色気のないのが多いが、これくらいムチっとしてるほうが私は好きだよ、うん」[p] +「その首輪のようなもの、私は若い女性のファッションはよくわからんが、それもよく似あっとるよ」[p] +#亜紀子 +「は、はぁ・・・どうも・・・」[p] +(完全にセクハラじゃないの・・・このスケベ親父・・・)[p] +#局長 +「どうかね、もしこの後空いとるなら食事でも行かんかね?」[p] +「二人で仕事のことについて話合うというのは・・・」[p] +#亜紀子 +「すいません、この後も仕事が残ってるので・・・」[p] +「それでは、失礼します・・・っ」[p] + +[_tb_end_text] + +[chara_hide_all time="1000" wait="true" ] +[bg time="1000" method="crossfade" storage="hiro202.jpg" ] +[chara_show name="美里" time="1000" wait="true" storage="chara/1/hiro258-1.png" width="380" height="951" left="451" top="50" reflect="false" ] +[tb_start_text mode=1 ] +#亜紀子 +「はぁ・・・あのエロ親父・・・」[p] +「まさか誘ってくるなんて・・・抱けるとでも思ったのかしら」[p] +「・・・でもこの格好じゃそう思われても仕方ないわよね、はぁ」[p] +#明日香 +「先輩!」[p] +[_tb_end_text] + +[chara_show name="明日香" time="1000" wait="true" storage="chara/2/hiro252-2.png" width="694" height="951" left="665" top="52" reflect="false" ] +[tb_start_text mode=1 ] +#亜紀子 +「明日香・・・!」[p] +#明日香 +「先輩・・・わたし・・・っ!」[p] +#亜紀子 +「いいのよ明日香、何も言わないで」[p] +#明日香 +「で、でも・・・」[p] +#亜紀子 +「私を守ろうとしてくれてありがとう。でも、自分のことは自分でなんとかするわ」[p] +#明日香 +「でも、先輩がこんなことしちゃいけないんです・・・!先輩があんな男に・・・」[p] +#亜紀子 +「あなたこそあんな男に汚されちゃいけない人間よ。わたしなら大丈夫。あんなゲス男に負けたりはしないわ」[p] +#勝野 +「誰がゲス男だって?」[p] +[_tb_end_text] + +[stopbgm time="1000" fadeout="true" ] +[chara_show name="勝野" time="1000" wait="true" storage="chara/5/hiro256-1.png" width="422" height="1012" left="3" top="3" reflect="false" ] +[playbgm volume="20" time="1000" loop="true" storage="枯れ葉が集う路地裏通り_2.ogg" ] +[tb_start_text mode=1 ] +#亜紀子 +「勝野・・・!」[p] +#勝野 +「『勝野様』だろ。自分の立場を忘れたか?」[p] +#亜紀子 +「・・・それは2人きりの時だけでしょ」[p] +#勝野 +「ふん、まぁいい。仕事の話だ、行くぞ」[p] +#亜紀子 +「・・・わかったわ」[p] +#明日香 +「あ・・・勝野さん・・・わたしやっぱり!」[p] +#勝野 +「なんだ、やっぱり俺のチンポが忘れられないってか?」[p] +#亜紀子 +「ダメよ。明日香には二度と手を出さない、そういう約束でしょ」[p] +#勝野 +「そういうことだ。残念だがチンポが欲しければ他の男を当たってくれ」[p] +「それじゃぁな」[p] +#亜紀子 +「・・・」[p] + +[_tb_end_text] + +[chara_hide name="勝野" time="500" wait="true" pos_mode="false" ] +[chara_hide name="美里" time="500" wait="true" pos_mode="false" ] +[tb_start_text mode=1 ] +#明日香 +「先輩・・・」[p] +# +・・・[p] +[_tb_end_text] + +*rep5 + +[tb_replay_start ] +[stopbgm time="1000" ] +[mask time="1000" effect="fadeIn" color="0x000000" ] +[chara_hide_all time="1000" wait="true" ] +[bg time="1000" method="crossfade" storage="hiro115.jpg" ] +[tb_show_message_window ] +[mask_off time="1000" effect="fadeOut" ] +[playbgm volume="100" time="1000" loop="true" storage="music16.ogg" ] +[tb_start_text mode=1 ] +# +グポッ・・・ンプッ・・・[p] +#勝野 +「ただ咥えてるだけじゃなくて、舌も使うんだよ」[p] +#亜紀子 +「ンムッ・・・チュプ・・・」[p] +#勝野 +「よしよし、まぁ初めてにしちゃ筋は悪くないぜ」[p] +「フェラチオくらいまともに出来ないと一人前の性奴隷とはいえないからな。これからは毎日特訓させてやるぞ」[p] +#亜紀子 +「チュブッ・・・ジュポッ・・・」[p] +#勝野 +「しかしついさっきまでニュース読んでた口でチンポを咥えてると思うと興奮するな」[p] +「ちょっと今の状況をロケだと思ってリポートしてみろ」[p] +#亜紀子 +「チュポッ・・・ン・・・リ、リポートって・・・」[p] +#勝野 +「新人の頃はよくやったろ。食レポみたいにやってみろ。挨拶からな」[p] +#亜紀子 +「く・・・」[p] +「こ、こんにちは、千山亜紀子です・・・。わたしは今、勝野様の・・・お、おチンポをしゃぶらせて・・・いただいております」[p] +#勝野 +「しゃぶって感想とか言うんだ」[p] +#亜紀子 +「ん・・・チュプッ・・・チュポッ」[p] +「か、固く膨張していて・・・熱く・・・脈を打っています・・・ジュプッ」[p] +「せ、先端からぬるっとした液体がにじみ出てきて・・・す、少ししょっぱいです・・・チュプッ」[p] +#勝野 +「よし、次は玉を舐めてリポートしろ」[p] +#亜紀子 +「チュポッ・・・は、はい・・・」[p] + + + +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro115-1.jpg" ] +[tb_start_text mode=1 ] +#亜紀子 +「そ、それでは・・・こ、睾丸を舐めさせていただきます・・・」[p] +「レロ・・・っ」[p] +「え・・・えっと・・・ふ、袋は意外とスベスベしていて・・・熱くはないです」[p] +「ペロペロッ・・・ちょっとしょっぱいような苦いような・・・味がします」[p] +#勝野 +「おっ・・・いいぞ。もっと中の玉を転がすように舌を動かすんだ。優しくだぞ」[p] +#亜紀子 +「んっ・・・レロレロレロ・・・」[p] +「し、舌を動かすと・・・中に睾丸があるのが・・・よくわかります。完全な球形ではなく楕円のようで・・・レロレロッ」[p] +(これが勝野の睾丸・・・精巣があって精子が作られるのよね・・・)[p] +#勝野 +「単調に舐めてるだけじゃなくて、色々工夫しろ」[p] +「フェラチオってのは奉仕の精神が大事なんだ。どうしたら気持ち良いか自分で考えるんだよ」[p] +#亜紀子 +「くっ・・・は、はい」[p] +(なんで私があんたを気持ちよくするために努力しないといけないのよ・・・!)[p] +「チュパッ・・・ペロペロペロ・・・チューチュー♥」[p] +(ここって男の弱点なのよね・・・噛んでやったらどんな顔をするかしら・・・)[p] +「ペロッペロッ・・・チュプッ・・・レロレロレロッ♥」[p] +(でもそんなことしても怒らせるだけ・・・大人しくコイツに奉仕するしかないんだわ・・・悔しい・・・)[p] + +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro115-1+.jpg" ] +[tb_start_text mode=1 ] +#亜紀子 +「ハムッ・・・チューーチューー♥」[p] +#勝野 +「おおっ!?オホホォ~~」[p] +「玉を口に吸い込むとは・・・なかなか上級なテクニック使うじゃねえか」[p] +「そっちの商売でやっていける素質があるぜ・・・んむっ」[p] +#亜紀子 +「ンムッ・・・チュプッ・・・ネロネロネロ♥」[p] +(これがイイのかしら・・・?じゃ今度は逆の玉も・・・)[p] +「ハムッ・・・チュパッ・・・チュボッ♥」[p] +#勝野 +「おほぉ~~・・・たまらんな。ウヒヒヒ」[p] +#亜紀子 +「アムッ・・・ンチュッ・・・レロレロ・・・♥」[p] +(く・・・気持ち良さそうに・・・)[p] +「レロンッレロンッ・・・チュプッ♥」[p] +(私の顔を見て・・・優越感に浸ってるのね・・・屈辱だわ・・・)[p] +「チューーッ・・・チュポンッ♥」[p] +#勝野 +「よし、次は竿を舐めろ」[p] + + + + +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro115-2.jpg" ] +[tb_start_text mode=1 ] +#亜紀子 +「はい・・・ペロペロペロ」[p] +#勝野 +「全体を丁寧に舌で洗う感じでやるんだぞ。レポートも忘れるな」[p] +#亜紀子 +「ん・・・ペロッペロッ・・・ピチャピチャ・・・」[p] +「い、陰茎を・・・舌で舐めております・・・ペロペロペロッ」[p] +「血管が・・・浮き出ていて、デコボコしています・・・レロンレロン」[p] +#勝野 +「よし、だんだん先端に行くんだ。ゆっくり丁寧にだぞ」[p] +#亜紀子 +「はい・・・れろれろ・・・ピチュ・・・」[p] +「先端の・・・ふくらみのところに来ました・・・レロレロレロ」[p] +(たしか・・・この境目のところが気持ちイイんだっけ・・・?)[p] +「レロレロレロッ・・・サスサスサス・・・」[p] +#勝野 +「おおっ・・・いいぞ・・・っ」[p] +「裏スジを攻めるとは・・・さすがスケベ女、初めてのくせに心得てやがる、ククク」[p] +#亜紀子 +「レロレロッ・・・ピチュッ♥」[p] +(誰がスケベ女よ・・・!)[p] +「ペロペロペロ・・・チュプ・・・ペロッ♥」[p] +#勝野 +「よし・・・先っぽの尿道を舐めろ」[p] +#亜紀子 +「んっ・・・ペロペロペロッ」[p] +「さ、先っぽから出ているぬるぬるの液体を舐め取っております・・・ペロペロッ♥」[p] +「なんか・・・変な味・・・ゴクンッ♥」[p] +#勝野 +「カウパー腺液、通称「我慢汁」って言うんだ。覚えとけ」[p] +#亜紀子 +「ペロペロペロ・・・ンムッ♥」[p] +(これがカウパー・・・どんどん出てくるわ)[p] +「ペロペロ・・・チュパッ♥」[p] +#勝野 +「よし、そろそろまた咥えろ」[p] +#亜紀子 +「はい・・・ンプッ」[p] +「ジュプッ・・・ジュプッ・・・」[p] +#勝野 +「口をすぼめて・・・唇全体でしごくようにしゃぶるんだ」[p] +#亜紀子 +「ジュプッ・・・ジュプッ・・・ジュプッ」[p] +#勝野 +「同時に舌も使えよ。吸うのも忘れるな」[p] +「全部を同時にやるんだ。全身全霊でチンポに奉仕しろ」[p] +#亜紀子 +「ンプッ・・・チュパッ・・・レロレロッ♥」[p] +(偉そうに・・・何様のつもりよ・・・!)[p] +「ジュプッ・・・レロレロッ・・・チュルチュルチュルッ♥」[p] +#勝野 +「よしっ、ペースを上げていけっ」[p] +#亜紀子 +「ジュプッ!ジュプッ!チュパッ!チュパッ!」[p] +「ジュポッ!ジュプッ!チュブッ!ズチューーッ♥」[p] +#勝野 +「いいぞ・・・そろそろ出るぞ・・・っ」[p] +#亜紀子 +「ジュプッ!ジュプッ!チュプッ!」[p] +(えっ・・・で、出るの・・・!?)[p] +「ジュプッ!チュバッ!チュププッ♥」[p] +#勝野 +「・・・んっ!」[p] + +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro115-3.jpg" ] +[tb_start_text mode=1 ] +#勝野 +「出る・・・っ」[p] +#亜紀子 +「チュバッ!チュバッ・・・ンムッ!?」[p] +# +ドピュドピュドピュッ![p] +#亜紀子 +「ンムーーーッ・・・チューーッ♥」[p] +(で、出てる・・・っ!)[p] +「ンンッ・・・チューッ・・・ゴクッ♥」[p] +# +ドピュドピュピュッ![p] +#勝野 +「おおお・・・ぅ」[p] +#亜紀子 +「ンムーーッ・・・ゴクッゴクッ♥」[p] +(まだ出てる・・・っ・・・の、喉の奥に・・・っ!)[p] +「ズズズッ・・・ゴクンゴクンッ♥」[p] +(飲んじゃった・・・勝野の精液を・・・♥)[p] +#勝野 +「ふぅ・・・出たぜ」[p] +#亜紀子 +「ンンッ・・・ズズッ」[p] +#勝野 +「おっと、まだ咥えとけ」[p] +#亜紀子 +「ンンッ・・・!?」[p] +#勝野 +「まだ尿道の奥に残ってるんだよ。ちゃんと残らず吸い出すんだ」[p] +#亜紀子 +「ンンーッ・・・ンチュッ」[p] +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro115-3+.jpg" ] +[tb_cg id="115" ] +[tb_start_text mode=1 ] +#亜紀子 +「チューーー・・・ンムッ♥」[p] +(ま、まだ出るの・・・?)[p] +「チューーッ・・・♥」[p] +#勝野 +「そうだ・・・最後の一滴まで吸い出して飲み干すのがフェラチオの礼儀だからな」[p] +#亜紀子 +「ンンッ・・・ンフーーッ」[p] +(な、なにが礼儀よ・・・っ)[p] +「ンチューーーーッ・・・ゴクッ♥」[p] +#勝野 +「よし・・・そのくらいでいいだろう」[p] +#亜紀子 +「ンチュ・・・チュポンッ」[p] +「んっ・・・はぁっ・・・はぁっ・・・」[p] +#勝野 +「ザーメンを飲んだ後はどうするんだ?教えたよな?」[p] +#亜紀子 +「はぁっ・・・はぁっ・・・んっ」[p] +「う・・・お、美味しいザーメンを飲ませていただいて・・・ありがとうございました・・・っ」[p] +#勝野 +「よーし、初めてのフェラにしてはなかなかだったぞ」[p] +「これからは毎日飲ませてやるからな。ククク」[p] +#亜紀子 +「く・・・っ」[p] + + +[_tb_end_text] + +[stopbgm time="1000" ] +[tb_replay id="reps5" ] +[mask time="1000" effect="fadeIn" color="0x000000" ] +[bg time="00" method="crossfade" storage="hiro203.jpg" ] +[chara_show name="美里" time="1000" wait="true" storage="chara/1/hiro258-4.png" width="598" height="1495" left="120" top="18" reflect="false" ] +[chara_show name="勝野" time="1000" wait="true" storage="chara/5/hiro256-3.png" width="617" height="1481" left="635" top="-52" reflect="false" ] +[mask_off time="1000" effect="fadeOut" ] +[playbgm volume="20" time="1000" loop="true" storage="枯れ葉が集う路地裏通り_2.ogg" ] +[tb_start_text mode=1 ] +#勝野 +「そういえば、一応打ち合わせということだったのに仕事の話を忘れてたな」[p] +#亜紀子 +「・・・」[p] +#勝野 +「今後は俺の今担当してる番組には一通り出てもらうぞ。全てお前の嫌いな「女の裸で数字を稼ぐ低俗な番組」だがな、くくく」[p] +「まず手始めに明日香と同じく、週間ピンクSHOWのお色気天気予報のコーナーでデビューだ。いいな」[p] +#亜紀子 +「・・・はい」[p] +#勝野 +「とっておきのセクシー衣装を用意してやるからな。期待しておけ」[p] +「世間がどんな反応をするか、今から楽しみだぜ・・・クククク」[p] +[_tb_end_text] + +[stopbgm time="1000" ] +[jump storage="scene7.ks" target="" ] diff --git a/data/scenario/scene7.ks b/data/scenario/scene7.ks new file mode 100644 index 0000000..262cbcc --- /dev/null +++ b/data/scenario/scene7.ks @@ -0,0 +1,1103 @@ +[_tb_system_call storage=system/_scene7.ks] + +*rep6 + +[tb_replay_start ] +[mask time="1000" effect="fadeIn" color="0x000000" ] +[chara_hide_all time="1000" wait="true" ] +[bg time="1000" method="crossfade" storage="hiro999.jpg" ] +[tb_show_message_window ] +[tb_image_show time="1000" storage="default/hiro101-a.jpg" width="603" height="339" x="5" y="-2" _clickable_img="" name="img_6" ] +[mask_off time="1000" effect="fadeOut" ] +[tb_start_text mode=1 ] +# +数日後―――[p] +・・・[p] +#ノブオ +「・・・今週のピンクSHOWもエロいなぁ」[p] +「最近どんどん過激になってきてるよなこの番組。最近はテレビ界全体でコンプライアンスがゆるくなってきてる気がする」[p] +「いち視聴者としてはありがたいことだけどな」[p] +#テレビ +「さぁ島本さん、あと30秒を切りましたよ!頑張ってください!」[p] +「うぉぉぉぉぉ!」[p] +「いやぁ~~~ん♥」[p] +#ノブオ +「この視聴者がエッチなゲームに挑戦するコーナー良いよなー」[p] +「俺も応募してみようかなぁ・・・」[p] +#テレビ +「あーーー残念!全部脱がすことが出来ませんでしたーー!失格です!」[p] +「くそーーーー!あと1枚だったのに!」[p] +「お疲れ様でした。脱がせた服は記念品として持って帰ってくださいね」[p] +「さぁそれでは次のコーナーに参りましょう。お色気天気予報~~~!」[p] +「今週は現役女子アナ第二弾!なんとあの現役バリバリのニュースキャスターが登場です!」[p] +「いやぁ~~まさかこの人が出てくれるとは思いませんでした!それではどうぞ!」[p] +#ノブオ +「現役バリバリのニュースキャスター?誰だ・・・?」[p] +[_tb_end_text] + +[tb_image_hide time="1000" ] +[bg time="1000" method="crossfade" storage="hiro114-1.jpg" ] +[playbgm volume="20" time="1000" loop="true" storage="Green&Dance_2.ogg" ] +[tb_start_text mode=1 ] +#亜紀子 +「こ、こんばんは・・・アナウンサーの千山亜紀子です・・・。よろしくお願いします」[p] +「きょ、今日はジメジメした毎日が続いてお疲れの皆様を応援するために、チアガールになってお天気を読ませていただきます・・・」[p] +「まずは北海道です。北海道南部はおおむね晴れですがこの時期としては異例の温かさになるでしょう。札幌では昼ごろに30度を超える予報が出ています」[p] +「北部は例年通りの気温となりそうです。ほ、北海道ガ・ン・バ・レ!」[p] +# +亜紀子がガンバレの掛け声とともに脚を大きく振り上げると、純白のパンティが丸見えになった[p] +アンスコを穿くことを許されなかったので、私服の生パンティがバッチリとカメラに収められた[p] +生放送ではないが、数日後には全国の男たち――エロ目的で番組を見ているスケベな男たちの目にこの痴態が晒されることになると思うと、運動のためだけではない火照りが亜紀子の身体を襲う[p] + + +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro101-4.jpg" ] +[tb_start_text mode=1 ] +#ノブオ +「うおおっ!?千山亜紀子だ・・・!」[p] +「パンツ丸見えじゃん!!」[p] +「なんでキャスターの千山がこんなエロ番組に・・・?」[p] +「たしかに最近急にミニスカ穿いたりして、路線変更か?って言われてたけど・・・」[p] +「まさかこんな深夜バラエティに出るとはなぁ・・・しかもチアコスって」[p] +「女子アナのアイドル化に反対してたんじゃなかったのかよ」[p] +「しかし・・・エロいなぁ・・・ハァハァ」[p] +・・・[p] +#熱狂的亜紀子ファン(以下キミヒコ) +「亜紀子!?」[p] +#キミヒコ +「なんという・・・白のパンツ・・・噂は本当だったのか・・・いやしかし・・・」[p] +「おっぱいが・・・俺に出来ることは・・・ブツブツブツ」[p] +・・・[p] + +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro114-1.jpg" ] +[tb_start_text mode=1 ] +#亜紀子 +「東海地方は一日中降ったり止んだりの落ち着かない天気となりそうです」[p] +「山間部では一時的に雷を伴った強い雨が降る恐れがあります。ご注意ください」[p] +「東海地方ガ・ン・バ・レ!」[p] +# +一つの地方の予報を終えるごとにチアリーディングのダンスを踊る[p] +新体操で鍛えたしなやかな身体の柔らかさで、パンツをはっきりと見えるように足を高々と上げる[p] +手を抜いたらお仕置きだと勝野に警告されているから全力で踊るしかない[p] +#亜紀子 +「中国地方ガ・ン・バ・レ!」[p] + +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro101-4.jpg" ] +[tb_start_text mode=1 ] +#ノブオ +「頑張るなぁ千山アナ・・・!」[p] +「ダンスも上手いしおっぱいがブルンブルン揺れてるよ」[p] +「それにあのパンツ・・・アンスコに見えないけど、まさか生パンじゃないよな・・・?」[p] +「とにかくエロいぜ・・・ハァハァ」[p] +・・・[p] +#キミヒコ +「ハァ・・・ハァ・・・」[p] +「俺の・・・俺だけの亜紀子・・・ハァハァ」[p] +・・・[p] +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro114-1.jpg" ] +[tb_start_text mode=1 ] +#亜紀子 +「九州沖縄地方ガ・ン・バ・レ!」[p] +「そ、それでは最後に関東地方の予報にまいりましょう・・・!」[p] +# +バッ![p] +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro114-2.jpg" ] +[tb_cg id="114" ] +[tb_start_text mode=1 ] +#亜紀子 +「か、関東北部は昼ごろから雲が増え始め・・・午後は雨になるところが多いでしょう」[p] +「群馬県は曇りのち雨です。群馬県ガ・ン・バ・レ・・・っ!」[p] + +[_tb_end_text] + +[tb_image_show time="1000" storage="default/hiro101-c.jpg" width="574" height="323" x="703" y="-2" _clickable_img="" name="img_24" ] +[tb_start_text mode=1 ] +#ノブオ +「うおおおおお!!」[p] +「上着を脱ぎ捨てた!?おっぱいが丸出しだ!」[p] +「お天気マークのニップレスが貼ってある!すげえ!なんてエロいんだよ!」[p] +「おおおお!踊ったらめちゃめちゃ揺れてる!!おっぱいが暴れまくってるよ!」[p] +「これはすげええ!シコシコシコシコ」[p] +[_tb_end_text] + +[tb_image_hide time="1000" ] +[tb_start_text mode=1 ] +#亜紀子 +「千葉県ガ・ン・バ・レっ!」[p] +# +激しくダンスをするたびに大きすぎる乳房がビタンビタンと肉のぶつかる音を立てて暴れる[p] +#亜紀子 +(ああ・・・見られてる・・・)[p] +# +ちょっと前までキャスターとして順調な道を歩んでいた亜紀子の無様な姿を、スタッフたちが興奮した顔で見ている[p] +そしてカメラの向こうには何万人もの男の目があるのだ[p] +それを意識すると亜紀子の体中を痺れるような感覚が駆け巡る[p] +#亜紀子 +「埼玉県は一日中・・・雨が降り続くでしょう。埼玉県ガ・ン・バ・レ・・・っ!」[p] +[_tb_end_text] + +[tb_image_show time="1000" storage="default/hiro101-c.jpg" width="565" height="318" x="715" y="-4" _clickable_img="" name="img_28" ] +[tb_start_text mode=1 ] +#ノブオ +「ハァハァ・・・シコシコシコ・・・ん!?」[p] +「な、なんかパンティに・・・シミができてないか!?」[p] +「絶対濡れてるよ・・・!うぉぉぉぉシコシコシコシコ!」[p] +# + + +[_tb_end_text] + +[tb_image_hide time="1000" ] +[tb_start_text mode=1 ] +#亜紀子 +「ハァ・・・東京は・・・日中はずっと雨が続きそうですが・・・夕方から夜にかけて雨も弱まり晴れるところも・・・あるでしょう・・・ンッ♥」[p] +「と、東京都・・・ガ・ン・バ・レェ・・・っ♥」[p] +(はぁ・・・お、終った・・・)[p] +「それでは皆さん・・・また来週・・・!」[p] +# +・・・・・・[p] +・・・[p] +[_tb_end_text] + +[stopbgm time="1000" ] +[tb_replay id="reps6" ] +[mask time="1000" effect="fadeIn" color="0x000000" ] +[bg time="1000" method="crossfade" storage="hiro999.jpg" ] +[mask_off time="1000" effect="fadeOut" ] +[tb_start_text mode=1 ] +# +キャスター千山亜紀子のお下劣番組出演のニュースが与えた衝撃は、明日香の時の比ではなかった[p] +ワイドショーでも取り上げられ、それまでどちらかというと地味だった亜紀子は一躍話題の人となった[p] +すでに流行りかけていた女子アナのセクシー路線化は、これを機にさらに加速し始め、各局の女子アナは競って肌を露出し始めた[p] +折りしも近年厳しくなる一方だった放送業界のコンプライアンスが見直され、規制が緩やかになったことでテレビはお色気全盛期に入っていた[p] +そしてその流れに敢然と抵抗していた亜紀子は、いつの間にか自分がその先頭を走っている事実に気付き愕然とするのだった[p] + +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro201.jpg" ] +[playbgm volume="100" time="1000" loop="true" storage="neonpurple.ogg" ] +[chara_show name="美里" time="1000" wait="true" storage="chara/1/hiro258-1.png" width="571" height="1428" left="122" top="-2" reflect="false" ] +[tb_start_text mode=1 ] +#亜紀子 +(はぁ・・・なんでこんなことに・・・)[p] +(こんな注目の浴び方したいわけじゃないのに・・・)[p] +(ネットでは売れるために必死な女みたいに叩かれてるし、週刊誌はあることないこと書き立てるし・・・)[p] +(実家のお母さんが心配して電話してきたのには参ったわ。心配ないってなんとか説得したけど・・・)[p] +(このままじゃダメだわ・・・なんとかして勝野の支配から脱出しないと)[p] +#局長 +「千山くん」[p] + + +[_tb_end_text] + +[chara_show name="局長" time="1000" wait="true" storage="chara/3/hiro262-3.png" width="587" height="1408" left="628" top="-77" reflect="false" ] +[chara_mod name="美里" time="0" cross="false" storage="chara/1/hiro258-2.png" ] +[tb_start_text mode=1 ] +#亜紀子 +「あ、局長・・・」[p] +(まただわ・・・)[p] +#局長 +「いやぁ好評だよ君の路線変更」[p] +「出る番組出る番組数字が良くて、スポンサー様からもお褒めの言葉をいただいたよ。ハハハ」[p] +#亜紀子 +「そ、そうですか・・・」[p] +#局長 +「それでスポンサーの方から今度一緒に会食でもとお誘いがあるがどうかね?」[p] +#亜紀子 +「いえ、私はそういう場はちょっと・・・」[p] +#局長 +「そうかね、うん、いやまぁ嫌なら無理強いはしないよ。私のほうから断っておこう」[p] +#亜紀子 +「どうも・・・」[p] +#局長 +「・・・ところで、あのことは考えてくれたかね?」[p] +#亜紀子 +「あのことなら・・・お断りしたはずですが」[p] +#局長 +「なに、そう深く考えることはないんだよ。君を束縛するつもりはないんだからね」[p] +#亜紀子 +「あの・・・そういうことではなくて・・・」[p] +# +局長の誘いをなんとか誤魔化して逃れていたのだが、局長はあきらめるどころかこともあろうに愛人になることを提案してきた[p] +それに関してはもちろん曖昧に答えずはっきりと断っているのだが、一向に手を引く気配がない[p] +これだけ断られても食い下がるのもすごいが、なによりはっきりと愛人にならないかと言ってくる面の皮の厚さに驚かされる[p] +#局長 +「まぁまぁ聞きたまえ。君が一大決心をしてそういう格好をしているのも要は出世したいからだろう?」[p] +「メインキャスターに並々ならぬ意欲を持ってるのは知っているんだよ」[p] +#亜紀子 +「そ、それは・・・」[p] +(勝野のことを知られるわけにはいかないから、売れたいからやっていると思われても否定できないのよね・・・)[p] +#局長 +「わたしなら必ず力になれるんだよ?」[p] +「・・・ここだけの話だが、井原君、彼女も私が後押ししてメインキャスターにしたんだよ」[p] +「彼女の場合、彼女の方から提案してきたんだけどね、フフフフ」[p] +#亜紀子 +「井原先輩が・・・」[p] +# +井原久美子はZ局の看板ニュース番組「ニュースアナライズ」のメインキャスターだ[p] +年齢は40を少しすぎたくらいで、知的美人でいまだにすごく人気がある[p] +もちろん実力も申し分なく、亜紀子も素人時代からテレビで見てきた大先輩として尊敬していた[p] +#亜紀子 +(井原先輩が局長と肉体関係があったなんて・・・)[p] +#局長 +「大人の関係というやつだよ。双方にとって利益のあることなのだから」[p] +「この世界じゃよくある話だよ。誰にもばれる心配はないし、なっ」[p] +#亜紀子 +「いえ・・・わたしは・・・」[p] +#局長 +「もしかして恋人に気兼ねしとるのかね?全然気にすることはないよ」[p] +「あくまで仕事の範疇だからね。身体だけだよ」[p] +#亜紀子 +「いえ、すいませんけど・・・」[p] +#局長 +「月に1~2回でいいんだよ。ちょこっと楽しむだけだ」[p] +「君もキライじゃないんだろう?ウフフフフ」[p] + +[_tb_end_text] + +[chara_mod name="美里" time="600" cross="false" storage="chara/1/hiro258-3.png" ] +[chara_mod name="局長" time="600" cross="false" storage="chara/3/hiro262-2.png" ] +[tb_start_text mode=1 ] +#亜紀子 +「いい加減にしてください!」[p] +#局長 +「な・・・!?」[p] +#亜紀子 +「わたしは身体を使って出世する気なんか全くありません!」[p] +#局長 +「ちょっ・・・声が・・・抑えて!」[p] +#亜紀子 +「・・・こういう格好をしてるからって勘違いしないでください」[p] +「わたしは誰とでも簡単に寝るような軽い女じゃありません」[p] +#局長 +「そ、そんなことは・・・」[p] +#亜紀子 +「これまで立場を利用して女を抱いてきたんでしょうけど、自分がどんなに醜い人間かってことを自覚してはいかがですか」[p] +「局長に抱かれるなんて私は死んでもお断りです」[p] +#局長 +「なっ・・・君ぃ・・・!」[p] +#亜紀子 +「このことは誰にも言いませんが、もしまた誘ってきたら全部ばらしますからね」[p] +「それでは失礼します」[p] + +[_tb_end_text] + +[chara_hide name="美里" time="1000" wait="true" pos_mode="true" ] +[chara_mod name="局長" time="00" cross="false" storage="chara/3/hiro262-1.png" ] +[tb_start_text mode=1 ] +#局長 +「ちょ・・・待ちたまえ・・・!」[p] +「・・・・・・」[p] +「クソッ!なんて生意気な・・・!」[p] +「あの様子なら簡単に抱けると思ったが・・・くそっ!あきらめるしかないのか・・・」[p] +「・・・しかしあの身体は惜しい・・・むむむ」[p] +・・・・・・[p] +[_tb_end_text] + +[chara_hide_all time="1000" wait="true" ] +[bg time="1000" method="crossfade" storage="hiro202.jpg" ] +[chara_show name="美里" time="1000" wait="true" storage="chara/1/hiro258-1.png" width="490" height="1225" left="477" top="22" reflect="false" ] +[tb_start_text mode=1 ] +#亜紀子 +(はぁ・・・ちょっと強く言いすぎたかしら)[p] +(カッとなるとつい強く言い過ぎちゃうのがわたしの悪いくせだわ)[p] +(でもあれくらい言わないと局長には通じないんだから仕方ないわよね)[p] +(・・・さて、そろそろ夕方のニュースの準備をしないと)[p] +(またこの服でカメラの前に出るのは憂鬱だけど、やることはしっかりやらないと)[p] +(原稿はもう下読みしたし・・・あっ・・・)[p] +(・・・乳房が・・・結構張ってる・・・。この感じだと、本番中に危ないかも・・・)[p] +(もし本番中に漏れてきたら・・・ノーブラだからすぐにバレちゃう・・・!)[p] +(明日香に搾ってもらわないと・・・明日香はどこかしら?)[p] +[_tb_end_text] + +[chara_move name="美里" anim="true" time="300" effect="linear" wait="true" left="132" top="22" width="490" height="1225" ] +[tb_start_text mode=1 ] +#勝野 +「おい」[p] +[_tb_end_text] + +[stopbgm time="1000" ] +[chara_show name="勝野" time="1000" wait="true" storage="chara/5/hiro256-1.png" width="512" height="1229" left="682" top="-20" reflect="false" ] +[playbgm volume="20" time="1000" loop="true" storage="枯れ葉が集う路地裏通り_2.ogg" ] +[tb_start_text mode=1 ] +#亜紀子 +「あ、勝野・・・」[p] +#勝野 +「勝野様だろう。今は周りに誰も居ないぞ」[p] +#亜紀子 +「・・・」[p] +#勝野 +「反抗的な目をするじゃねえか。昨夜も俺のチンポでヒィヒィよがってたくせに」[p] +#亜紀子 +「・・・っ」[p] +#勝野 +「思い出したらムラムラしてきたぜ。ちょっとそこの部屋で昼の分のザーメンを飲ませてやろう」[p] +#亜紀子 +「い、今は無理よ。ニュースの本番まであんまり時間がないし・・・」[p] +#勝野 +「18時からだろう?まだ十分時間はあるだろ」[p] +#亜紀子 +「ちょっと今は、準備しないといけないから・・・」[p] +#勝野 +「準備?なんの準備だよ。新人じゃあるまいしニュース読むのに準備なんか要らないだろ」[p] +#亜紀子 +「それは・・・ンッ」[p] +#勝野 +「ん・・・?」[p] +「そうか、そういうことか!母乳が出そうなんだろう!」[p] +#亜紀子 +「くっ・・・そ、そうよ・・・」[p] +#勝野 +「そういや、そうだったなぁ。本番前に明日香に搾ってもらってたんだっけ」[p] +「本番中に漏れる可能性があるってことか?そりゃ面白いことになるだろうなぁ、クククク」[p] +#亜紀子 +「わ、笑い事じゃないわ・・・!」[p] +#勝野 +「母乳キャスターとしてデビューさせるのも面白そうだが・・・色々と面倒なことにはなるだろうなぁ」[p] +「・・・仕方ねぇ。俺が搾ってやるよ」[p] +#亜紀子 +「えっ・・・!け、結構よ!」[p] +#勝野 +「くくく、遠慮するなよ。奴隷の管理は飼い主としてのマナーだからな」[p] +「まぁお前には拒否権なんかないがな。おら、来いっ」[p] +#亜紀子 +「・・・っ!」[p] +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro203.jpg" ] +[tb_start_text mode=1 ] +#勝野 +「ここなら誰も来ないだろう」[p] +「よし、お乳を搾ってやるから服を脱げ」[p] +#亜紀子 +「くっ・・・」[p] +[_tb_end_text] + +[chara_hide name="美里" time="1000" wait="true" pos_mode="false" ] +[chara_show name="美里" time="1000" wait="true" storage="chara/1/hiro261-1bk.png" width="507" height="1268" left="120" top="8" reflect="false" ] +[tb_start_text mode=1 ] +#亜紀子 +「なんで全裸にならないといけないのよ・・・!」[p] +#勝野 +「搾乳といえば乳牛だからな。ホルスタインが服を着てたらおかしいだろう」[p] +#亜紀子 +「私は乳牛なんかじゃ・・・っ!」[p] +#勝野 +「普通の人間は妊娠もしてないのに乳が出たりしないし、そもそも104cmもある時点でほぼ乳牛みたいなもんだろう。クククク」[p] + +[_tb_end_text] + +[chara_mod name="美里" time="200" cross="false" storage="chara/1/hiro261-2bk.png" ] +[tb_start_text mode=1 ] +#亜紀子 +「く・・・っ!」[p] +#勝野 +「家畜が一人前に人間様を睨みつけてるんじゃねえよ。ほれ、そこに四つん這いになれ乳牛」[p] +#亜紀子 +「わ、わかりました・・・っ」[p] +[_tb_end_text] + +*rep7 + +[tb_replay_start ] +[chara_hide_all time="1000" wait="true" ] +[stopbgm time="1000" ] +[bg time="1000" method="crossfade" storage="hiro132-1.jpg" ] +[tb_show_message_window ] +[playbgm volume="100" time="1000" loop="true" storage="music16.ogg" ] +[tb_start_text mode=1 ] +#亜紀子 +「く・・・こんな格好・・・っ」[p] +#勝野 +「家畜のお前にはぴったりだぜ。ククク」[p] +「それにしてもでかい乳だな。重みでタプンタプンしてるぜ」[p] +「これはもう立派な乳牛だ。胸を張って乳牛を名乗っていいぜ。クププププ」[p] +#亜紀子 +「だ、誰が・・・っ」[p] +「あんまり時間がないんだから、搾るなら早く搾って・・・!」[p] +#勝野 +「搾ってくださいだろ?全く、すぐに自分の立場を忘れるな」[p] +「動物ってのはやっぱり身体で覚えさせないとダメみたいだな」[p] +# +パンッ![p] +#亜紀子 +「アンッ!お、お尻を叩かないで・・・っ!」[p] +#勝野 +「『私は自分で乳を搾れない乳牛です。どうか乳を搾ってください』って言え」[p] +# +パンッ![p] +#亜紀子 +「アンッ!く・・・」[p] + +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro132-2.jpg" ] +[tb_start_text mode=1 ] +#亜紀子 +「わ・・・私は自分で乳を搾れない・・・乳牛です・・・。どうか乳を搾ってください・・・っ!」[p] +#勝野 +「『お願いしますご主人様』」[p] +# +パンッ![p] +#亜紀子 +「ヤンッ!・・・お、お願いします・・・ご主人様・・・っ」[p] +#勝野 +「よーし、それじゃ搾ってやるとするか」[p] +「どーれ・・・俺は昔乳搾り体験したことがあるんだ。たっぷりと搾ってやるぜ」[p] +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro132-3.jpg" ] +[tb_start_text mode=1 ] +#勝野 +「よっ・・・っと、こんな感じか?」[p] +# +ギュッ[p] +#亜紀子 +「アンッ・・・!」[p] +「も、もっと・・・優しく・・・んっ♥」[p] +#勝野 +「乳搾られて感じてるんじゃねぇよ」[p] +# +パンッ![p] +#亜紀子 +「ァヒンッ!」[p] +#勝野 +「んー出ないな。もっとこうか・・・?」[p] +# +ギュッ・・・ギュッ[p] +#亜紀子 +「アンンッ・・・!ンンッーー♥」[p] +#勝野 +「おかしいな・・・」[p] +# +ギューッ![p] +#亜紀子 +「アヒィーーッ♥」[p] +「そ・・・そんな風に強く搾っても・・・出ないわ・・・っ」[p] +「自分でいくら搾っても出ないんだから・・・明日香でないと無理なのっ」[p] +#勝野 +「うるせえ、俺が出してやるって言ってるだろ!」[p] +「たしか・・・こう根本をギュッとして指を順番に・・・」[p] +#亜紀子 +「アンッ!い・・・痛いだけよ・・・っ」[p] +「あなたには・・・無理よ・・・っ」[p] +#勝野 +「そんなはずは・・・オラッ!出ろッ!」[p] +# +ギューーッ![p] +#亜紀子 +「アヒィーーーッ!」[p] + +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro132-4.jpg" ] +[tb_start_text mode=1 ] +# +ピューーーーッ![p] +#勝野 +「ほれ、出た!」[p] +#亜紀子 +「アァァーーーンッ!そ、そんな・・・アンッ♥」[p] +#勝野 +「こうして・・・こうすれば・・・オラッ」[p] +# +プシャーーーーッ![p] +#亜紀子 +「アヒィーーーンッ♥」[p] +#勝野 +「ほれ見たか!俺のテクにかかれば乳搾りだってこんなもんよ!」[p] +「オラ、どんどん搾ってやるぞ!ほれっ!」[p] +# +プシャーーーーッ![p] +ビューーーーーッ![p] +#亜紀子 +「ンンーーーッ♥」[p] +「アンッ!アンッ!アンーッ♥」[p] +#勝野 +「乳搾られていい声で鳴いてんじゃねぇよ、このドスケベ乳牛が!」[p] +# +ギュッ! ピューーーッ![p] +ギュッ! ピューーーッ![p] +#亜紀子 +「アンッ!ダメェーーッ♥」[p] +「そ、そんなに強く搾ったら・・・アヒィーーーッ♥」[p] +#勝野 +「強く搾ったらどうなるってんだ?イっちゃうーってか?」[p] +「乳搾られてイっちまえ!オラッ!オラッ!」[p] +# +ギュッ! プシャーーーーッ![p] +ギューッ! ビュビューーーッ![p] +#亜紀子 +「アンンーーッ!ダメェーーーーッ♥」[p] + + +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro132-6.jpg" ] +[tb_cg id="132" ] +[tb_start_text mode=1 ] +# +ジョボボボボボボボ[p] +#亜紀子 +「イヤァァァーーーッ♥」[p] +#勝野 +「おわっ!こいつ、また小便漏らしやがった!」[p] +# +ジョボボボボボボ[p] +#亜紀子 +「イヤァァッ・・・!見ないでぇーーーっ♥」[p] +#勝野 +「イくたびに漏らしやがって・・・!どんだけだらしない身体なんだよ!」[p] +# +パンッ![p] +#亜紀子 +「アヒィーーーッ♥」[p] +#勝野 +「乳と小便を垂れ流しやがって!恥ずかしくないのかよ!」[p] +# +ギューッ! プシャーーーッ![p] +ジョボボボボ・・・[p] +#亜紀子 +「く・・・っ!ァヒィーーーン♥」[p] +#勝野 +「まったくとんでもないドスケベ牛だぜ。ヒャハハハ」[p] +「もう片方の乳も搾ってやるからもう小便漏らすなよ!」[p] +#亜紀子 +「アァァ・・・アンッ♥」[p] +# +ギュッ! ビューーーッ![p] +ギュッ! ビューーーッ![p] +・・・・・・[p] +・・・[p] +[_tb_end_text] + +[mask time="1000" effect="fadeIn" color="0x000000" ] +[bg time="1000" method="crossfade" storage="hiro132-5.jpg" ] +[mask_off time="1000" effect="fadeOut" ] +[tb_start_text mode=1 ] +#勝野 +「よし・・・このくらいでいいだろう」[p] +#亜紀子 +「あぁ・・・うぅ・・・っ」[p] +#勝野 +「これは結構な重労働だぜ。家畜の世話も楽じゃないな・・・」[p] +#亜紀子 +「・・・っ」[p] +[_tb_end_text] + +[stopbgm time="1000" ] +[tb_replay id="reps7" ] +[bg time="1000" method="crossfade" storage="hiro203.jpg" ] +[chara_show name="美里" time="1000" wait="true" storage="chara/1/hiro260-5n.png" width="568" height="1420" left="86" top="6" reflect="false" ] +[chara_show name="勝野" time="1000" wait="true" storage="chara/5/hiro256-3.png" width="583" height="1399" left="645" top="-53" reflect="false" ] +[playbgm volume="20" time="1000" loop="true" storage="枯れ葉が集う路地裏通り_2.ogg" ] +[tb_start_text mode=1 ] +#勝野 +「ったく・・・畳に小便漏らしやがって。一応拭いたけど匂いは残るだろうなぁ」[p] +#亜紀子 +「ぅ・・・っ」[p] +#勝野 +「乳搾っただけで小便漏らしてイくってどんだけスケベなんだよお前の身体はよ」[p] +#亜紀子 +「し、仕方ないじゃない・・・体質なんだから・・・」[p] +#勝野 +「とりあえず謝れ。小便漏らしてすいませんでした、って」[p] +#亜紀子 +「く・・・っ。しょ、小便を漏らして・・・すいませんでした・・・っ」[p] +#勝野 +「『私は変態ドスケベ乳牛です。これからもドスケベな私の面倒を見てくださいご主人様』って言え」[p] + +[_tb_end_text] + +[chara_mod name="美里" time="600" cross="false" storage="chara/1/hiro260-4n.png" ] +[tb_start_text mode=1 ] +#亜紀子 +「くっ・・・!」[p] +「わ・・・私は変態・・・ドスケベ乳牛です・・・っ。これからも・・・ドスケベな私の面倒を見てください・・・ご主人様・・・っ」[p] +#勝野 +「ふっ、いいだろ。俺が責任を持ってこれからも乳搾りをしてやるよ」[p] +「乳が張ったらこれからはちゃんと俺に報告するんだぞ。勝手に明日香に搾らせたりしたらお仕置きだからな」[p] +#亜紀子 +「は、はい・・・」[p] +#勝野 +「よし・・・ところでこの母乳どうするかな。100ccくらいあるぞ」[p] +「どんな味がするんだ・・・ペロッ」[p] +#亜紀子 +「ちょっ・・・やめっ・・・」[p] +#勝野 +「ふん・・・牛乳よりちょっと薄くて、ほんのり甘いな」[p] +「そうだ、紙コップにコーヒーを入れて・・・そこにこの母乳をたっぷりと混ぜて・・・」[p] +#亜紀子 +「な、何をする気・・・?」[p] +#勝野 +「この母乳入りコーヒーをだな・・・」[p] +・・・・・・[p] +・・・[p] +[_tb_end_text] + +[mask time="1000" effect="fadeIn" color="0x000000" ] +[chara_hide name="美里" time="1000" wait="true" pos_mode="false" ] +[chara_show name="美里" time="1000" wait="true" storage="chara/1/hiro258-5.png" width="556" height="1390" left="122" top="18" reflect="false" ] +[mask_off time="1000" effect="fadeOut" ] +[tb_start_text mode=1 ] +#亜紀子 +「そ、そんなの無理よ・・・!」[p] +#勝野 +「大丈夫だって、バレやしないよ」[p] +#亜紀子 +「で、でも・・・」[p] +#勝野 +「いいからやれといったらやるんだよ。お前にノーは無いと言ったろ」[p] +[_tb_end_text] + +[chara_mod name="美里" time="600" cross="false" storage="chara/1/hiro258-1.png" ] +[tb_start_text mode=1 ] +#亜紀子 +「く・・・っ」[p] +#勝野 +「よし、そろそろ時間だろ。仕事して来い」[p] +「一緒に出るのを誰かに見られたら面倒だから、俺はちょっと遅れて出るぜ」[p] +#亜紀子 +「・・・・・・」[p] + +[_tb_end_text] + +[chara_hide name="勝野" time="500" wait="true" pos_mode="false" ] +[stopbgm time="1000" ] +[bg time="1000" method="crossfade" storage="hiro202.jpg" ] +[playbgm volume="30" time="1000" loop="true" storage="bluenoise.ogg" ] +[tb_start_text mode=1 ] +#亜紀子 +「どうしよう・・・」[p] +「このコーヒーを誰かに飲ませろって・・・誰に渡せば・・・」[p] +#谷田 +「あ、千山さん」[p] +[_tb_end_text] + +[chara_show name="谷田" time="1000" wait="true" storage="chara/4/hiro259-2.png" width="450" height="1080" left="709" top="2" reflect="false" ] +[tb_start_text mode=1 ] +#亜紀子 +「あ、谷田君・・・」[p] +#谷田 +「そろそろ本番ですよ。スタジオのほうに・・・」[p] +#亜紀子 +「あ、うん。すぐ行くわ」[p] +#谷田 +「それじゃお願いします」[p] + +[_tb_end_text] + +[chara_move name="谷田" anim="true" time="300" effect="linear" wait="true" left="1042" top="4" width="450" height="1080" ] +[tb_start_text mode=1 ] +#亜紀子 +「あっ・・・谷田君・・・!」[p] + +[_tb_end_text] + +[chara_move name="谷田" anim="true" time="300" effect="linear" wait="true" left="721" top="-5" width="450" height="1080" ] +[chara_mod name="美里" time="00" cross="false" storage="chara/1/hiro258-2.png" ] +[tb_start_text mode=1 ] +#谷田 +「はいっ、なんですか?」[p] +#亜紀子 +「あ、あの・・・こ、このコーヒー飲んでくれない?」[p] +#谷田 +「え、コーヒーくれるんですか?」[p] +#亜紀子 +「え、ええ・・・さっき淹れたんだけど、もう本番だし要らなくなっちゃって・・・。よかったらどうかしら・・・」[p] +#谷田 +「いいんですか?じゃあ、いただきます!」[p] +#亜紀子 +「は、はい、どうぞ」[p] +#谷田 +「ありがとうございます!いやぁ千山さんが淹れたコーヒーをもらえるなんてラッキーだなぁ」[p] +「も、もしかして飲みかけですか!?」[p] +#亜紀子 +「あ、ううん、まだ口はつけてないわ」[p] +#谷田 +「あー残念・・・なんちゃって、アハハハ」[p] +「じゃ、いただきます。ゴクゴク」[p] +#亜紀子 +(あぁ・・・飲んでる・・・私の母乳入りコーヒーを・・・)[p] +#谷田 +「あー美味しい。千山さんにもらったからか、なんかすごく美味しく感じますよ。アハハハ」[p] +#亜紀子 +「そ、そう・・・よかったわ・・・」[p] +(あぁ・・・恥ずかしい・・・)[p] +(・・・もし「わたしの母乳が入ってるわよ」って言ったらどんな顔するのかしら・・・)[p] +(変態だと思って幻滅するでしょうね・・・)[p] +#谷田 +「おっと、そろそろ急がないと」[p] +#亜紀子 +「あ、そうね。行きましょう」[p] +# + +[_tb_end_text] + +[chara_hide_all time="1000" wait="true" ] +[tb_start_text mode=1 ] +・・・・・・[p] +・・・[p] +[_tb_end_text] + +[stopbgm time="1000" ] +[jump storage="q1.ks" target="*q1-1" ] +*s7a + +[stopbgm time="1000" ] +[mask time="1000" effect="fadeIn" color="0x000000" ] +[chara_hide_all time="1000" wait="true" ] +[bg time="1000" method="crossfade" storage="hiro120-1.jpg" ] +[mask_off time="1000" effect="fadeOut" ] +[playbgm volume="20" time="1000" loop="true" storage="オフィスの日常.ogg" ] +[tb_start_text mode=1 ] +#梅田 +「さー今週も始まりました『ウメちゃんのディープな世界』!ゲストのみなさんよろしくお願いします!」[p] +#若手芸人 +「よろしくお願いします!」[p] +#バラドル +「よろしくお願いしまーす」[p] +#梅田 +「さて、今週からアシスタントが代わりました。自己紹介どうぞ!」[p] +#亜紀子 +「はい、今週からアシスタントを務めさせていただきます、千山亜紀子です。よろしくお願いします」[p] +#梅田 +「キミ前はあんまりこういう番組出てなかったけども、最近は出るようになったんやねー」[p] +#亜紀子 +「は、はい、こういったアシスタントは初めてなので、未熟なところもあるかと思いますがよろしくお願いします」[p] +#梅田 +「いやーいいですね。見てくださいよこの乳」[p] +#若手芸人 +「乳てw梅田さん!」[p] +#梅田 +「いやーすごいでこれ・・・何cmあるん?」[p] +#亜紀子 +「あの・・・それは・・・秘密です」[p] +#梅田 +「いやそんなんええねん。何cmかって聞いてんねん」[p] +#亜紀子 +「え・・・あの・・・104cmです・・・」[p] +#梅田 +「104!?ひゃひゃひゃ104!?」[p] +#バラドル +「すごーーーい!」[p] +#梅田 +「104てすごいな!ひゃーーー・・・はさんだらたまらんやろうな」[p] +#若手芸人 +「はさむてw何をはさむんですかw」[p] +#梅田 +「ハッハッハッハ!」[p] +#亜紀子 +(私がこんな番組のアシスタントなんて・・・屈辱だわ)[p] +# +『ウメちゃんのディープな話』は勝野が担当する深夜番組で、性に関するマニアックな愛好家をスタジオに呼んでそのディープな世界について紹介してもらうという、下ネタバラエティだ[p] +メインMCのウメちゃんこと梅田雅人は50代のベテラン芸人で、最近は勢いがなくなってきたとはいえまだまだこの業界で力を持っている大物だ[p] +以前は2年目の若手女子アナがアシスタントをしていたのだが、勝野の一声で今週から私がその座につくことになった[p] +#梅田 +「ごめんごめん、で、今日のテーマはなんですか」[p] +#亜紀子 +「は、はい、今日のテーマはこちらです。『巨女』!」[p] +#梅田 +「きょじょ?なにそれ?」[p] +#亜紀子 +「はい、巨女というのはその字の通り大きな女性のことで、自分よりずっと背の高い女性にしか興奮できない巨女マニアというのが存在するんですよ」[p] +#梅田 +「へぇ~~なるほど、でっかい女にこう上からぶわぁーっと無理やりやられるのが好きなんや。Mってことか」[p] +#若手芸人 +「いやでも、でっかい女性を征服したいみたいな、Sの方もあるんじゃないですか?」[p] +#梅田 +「あーなるほどなるほど、そっちもあるんか」[p] +#バラドル +「あ、もしかして私それで今回呼ばれたんですかー?」[p] +#梅田 +「そうやな、キミでかいもんな」[p] +#バラドル +「じゃあ今日はモテモテかもー」[p] +#亜紀子 +「はい、それでは早速「巨女」マニアの方々をお呼びしましょう。どうぞ!」[p] + +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro118-0.jpg" ] +[tb_start_text mode=1 ] +# +その後、「巨女」マニアの男性たち3名が紹介され、大きい女のどこに興奮するかや理想のプレイなどを熱く語って番組は進行していった[p] +そして実際に長身のセクシー女優が登場して、巨女マニアの男たちがあこがれのシチュエーションを疑似体験するところで番組は盛り上がりを迎えていた[p] +#梅田 +「Bさんはどういうプレイが理想なん?」[p] +#マニアB +「ぼ、僕はこう仰向けに寝転んだところにお尻でこう顔のところにギューッて押しつぶして欲しいですね」[p] +#梅田 +「カッカッカッカw顔の上に座って欲しいんや?」[p] +#マニアB +「は、はい!」[p] +#梅田 +「ドMやないか!」[p] +#マニアB +「アハハハハ」[p] +#梅田 +「よし、お前やったれ」[p] +#バラドル +「えーーー私ですかーー!?」[p] +#梅田 +「せっかくやからな。なぁ」[p] +#マニアB +「は、はい、お願いします!」[p] +#バラドル +「えーーホントにやるのーーー?えーーー」[p] +# +この演出は台本にはなく、梅田のアドリブであった[p] +バラドルは無茶振りに戸惑いを見せながらも、Bさんの顔の上にそーっと腰を下ろした[p] +#マニアB +「んんーーーーっ♥」[p] +#バラエティー +「ヤダーーーーーくすぐったいーーー!」[p] +#梅田 +「ギャハハハハハハ!」[p] +#マニアB +「ンムーーーーー・・・プハァ!」[p] +「さ、さ、さ、最高でした!ありがとうございます!」[p] +#バラドル +「いやーーーん、どういたしましてーw」[p] +#若手芸人 +「うわーーいいなーー。俺もやって欲しいわーーw」[p] +#梅田 +「カッカッカッカッカw」[p] +#亜紀子 +(はぁ・・・低俗な番組だわ。私が居る必要ないし)[p] +「えー・・・それでは次はCさんの理想のプレイはどういったものですか?」[p] +#マニアC +「えーわたしはこう向き合って、おっぱいを頭の上に乗せてもらいたいです」[p] +#梅田 +「ハハハハハ、おもろい」[p] +「それは俺もちょっとやって欲しいわ」[p] +#バラドル +「でも相当身長差ないと無理じゃないー?」[p] +#若手芸人 +「おっぱいもかなりの大きさ必要ですよね」[p] +#梅田 +「よし、ほんなら千山、お前やったれ」[p] +#亜紀子 +「えっ!?わ、わたしは無理です」[p] +#梅田 +「なんでや、ええやんけ。お前も結構背あるし。なんせ乳でかいがな」[p] +#亜紀子 +「む、無理ですよ。わたしの身長では足りませんし・・・」[p] +#梅田 +「台つこたらええがな。なぁCさんも千山にやってほしいやろ?」[p] +#マニアC +「はい!ぜひ・・・!」[p] +#梅田 +「ほら、やったれや」[p] +#若手芸人 +「いや梅田さん、無理でしょ。局アナさんですから・・・」[p] +#亜紀子 +「は、はい・・・ちょっとわたしは・・・すいません」[p] +#梅田 +「なんやあかんのか・・・ちっ」[p] +#亜紀子 +「す、すいません・・・」[p] +# +結局長身セクシー女優さんがCさんの頭の上に乳房を乗せてその場は終った[p] +それで台本どおりなのだが、元々そんなに胸の大きくない女優さんだったので盛り上がりに欠ける結果となってしまった[p] +そして番組は終盤に入り、巨女マニアたちの夢のシチュエーションを事前に撮影したVTRを見るコーナーへと移っていった[p] +#梅田 +「カッカッカッカッカ」[p] +#亜紀子 +(梅田さんの機嫌を損ねたかと思ったけど・・・もう怒ってはないようね)[p] +(落ち目とはいえ大物だし・・・怒らせたらなにがあるかわからないし・・・後で謝ったほうがいいのかしら)[p] +# +梅田はVTRを見ながら笑顔を見せている[p] +見ながらのリアクションもワイプで使われるので気を抜くことは出来ないのだ[p] +#亜紀子 +(なんとか無事収録は終われそうね・・・)[p] +(バラエティのアシスタントも楽な仕事じゃないわね・・・・・・えっ!?)[p] +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro120-2.jpg" ] +[tb_start_text mode=1 ] +#亜紀子 +(ちょ・・・ちょっと・・・梅田さん!?)[p] +# +突如梅田の手が伸びてきて亜紀子の尻を無遠慮にまさぐり始めた[p] +#梅田 +「カッカッカッカッカ」[p] +# +梅田は知らん顔でVTRを観ている[p] +#亜紀子 +(ちょっと・・・や、やめてください!)[p] +#梅田 +(ちゃんと前向いとかんかい。抜かれるぞ)[p] +#亜紀子 +(お尻を触るのをやめてください・・・!)[p] +#梅田 +(ええやないか尻くらい)[p] +#亜紀子 +(いいわけないでしょ・・・!セクハラですよっ!)[p] +#梅田 +(なにがセクハラや。これもアシスタントの仕事のうちやろ)[p] +(身体張って笑いとることもできひんのやったら、これくらい我慢せんかい)[p] +#亜紀子 +(そ、そんな・・・!アッ・・・スカートの中まで手を入れないでください・・・っ!)[p] +#梅田 +(おらジタバタ動くな!カメラ回ってんのやぞ!)[p] +#亜紀子 +(はっ・・・と、とにかく手を離して下さい!)[p] +(いい加減にしないと・・・告発しますよ!)[p] +#梅田 +(告発ぅ~?やれるもんならやってみい)[p] +(お前この世界におられへんようにしたるからな。わしはまだそのくらいの力はあるんやで)[p] +#亜紀子 +(なっ・・・!)[p] +#梅田 +(わしのチンポしゃぶるの断ってテレビ出られへんようになった女なんぼでもおるんやからな)[p] +#亜紀子 +(な、なんて人なの・・・!)[p] +#梅田 +(カッカッカッカ、女子アナなんか性処理のためにおるようなもんやろ。エロいケツしやがって)[p] +モミモミモミ[p] +#亜紀子 +(くっ・・・!)[p] + +[_tb_end_text] + +[stopbgm time="1000" ] +[tb_image_show time="1000" storage="default/hiro101-99.jpg" width="800" height="502" x="226" y="-5" _clickable_img="" name="img_134" ] +[playbgm volume="100" time="1000" loop="true" storage="烈火翔ける.ogg" ] +[tb_start_text mode=1 ] +#亜紀子 +「馬鹿にしないで!!」[p] +# +パンッ!![p] +#梅田 +「な・・・!?」[p] +#亜紀子 +(し、しまった・・・!つい手が出ちゃった・・・!)[p] +# +スタジオ中の視線が亜紀子に集まった[p] +ほとんどの人がVTRを見ていたので何が起こったか理解していなかった[p] +#亜紀子 +(やっちゃった・・・どうしよう)[p] + +[_tb_end_text] + +[tb_image_hide time="1000" ] +[stopbgm time="1000" ] +[bg time="000" method="crossfade" storage="hiro120-1.jpg" ] +[playbgm volume="20" time="1000" loop="true" storage="オフィスの日常.ogg" ] +[tb_start_text mode=1 ] +#梅田 +「すまんすまん、V見てる間暇やから千山ちゃんのケツ触ったら怒られてもうたわ。ガハハハハハ!」[p] +#若手芸人 +「ちょっとなにしてるんですか梅田さんww」[p] +#バラドル +「やだ~~~~梅田さんサイテ~~~!」[p] +# +一瞬凍りついたスタジオがほっとした笑いに包まれた[p] +#梅田 +「まさかビンタされる思わんかったわ。気の強い姉ちゃんやでホンマ。カッカッカッカ」[p] +#若手芸人 +「そら怒りますってw梅田さんが悪いっすわw」[p] +#バラドル +「千山ちゃん大丈夫~~~~?訴えたほうがいいんじゃない~?」[p] +#亜紀子 +「あ、いえ・・・大丈夫です。ちょっとビックリしちゃって」[p] +「お騒がせしてすいません」[p] +#若手芸人 +「千山ちゃんは悪くないよー!怒って当然ですよーw」[p] +#梅田 +「いやすまんすまん!V見よV」[p] +# +梅田がとっさの機転で笑いに変えたことで、収録はとまることなくそのまま続行された[p] +梅田はその後も何事もなかったかのように笑いをとり続け、収録は無事終了した[p] +・・・・・・[p] + + + + + +[_tb_end_text] + +[stopbgm time="1000" ] +[mask time="1000" effect="fadeIn" color="0x000000" ] +[bg time="1000" method="crossfade" storage="hiro202.jpg" ] +[chara_show name="美里" time="00" wait="true" storage="chara/1/hiro258-4.png" width="434" height="1085" left="211" top="46" reflect="false" ] +[chara_show name="勝野" time="000" wait="true" storage="chara/5/hiro256-1.png" width="445" height="1068" left="655" top="-10" reflect="false" ] +[mask_off time="1000" effect="fadeOut" ] +[playbgm volume="20" time="1000" loop="true" storage="枯れ葉が集う路地裏通り_2.ogg" ] +[tb_start_text mode=1 ] +#勝野 +「おい、やってくれたな」[p] +#亜紀子 +「し、仕方ないでしょう!あのエロおやじが悪いんだから・・・」[p] +#勝野 +「そのくらい我慢しろよ!本番中にビンタなんて・・・信じられねぇよ」[p] +「俺が強引に前のアシスタントをクビにしてお前を起用したんだぞ。梅田さんの機嫌損ねたら俺の立場がヤバいだろうが・・・!」[p] +#亜紀子 +「わたしをクビにすればいいでしょう。あいつにも芸能界から消すって脅されたわ。・・・もうどうにでもなれよ」[p] +#勝野 +「てめえ、開き直りやがって・・・!」[p] +「・・・仕方ない、今からでも梅田さんに土下座して謝りに行くぞ」[p] +#亜紀子 +「い、嫌よ・・・そんなこと絶対に!」[p] +#勝野 +「おい、お前自分の立場を忘れたのか?」[p] +「俺はいつでもお前と明日香の人生を終わらせることができるんだぞ」[p] +#亜紀子 +「く・・・っ」[p] +#梅田のマネージャー +「あのー、勝野さんすいません」[p] +#勝野 +「あっ、すいません!これから楽屋にこいつを謝らせに行こうかと思ってたところで・・・」[p] +#梅田のマネージャー +「あ、いや、なんか「勝野だけ呼んで来い」って言ってまして」[p] + +[_tb_end_text] + +[chara_mod name="勝野" time="0" cross="false" storage="chara/5/hiro256-2.png" ] +[tb_start_text mode=1 ] +#勝野 +「えっ、俺だけ・・・ですか!?」[p] +#梅田のマネージャー +「はい、すぐ呼んで来いって」[p] +#勝野 +「う・・・わ、わかりました。すぐ伺います」[p] +#梅田のマネージャー +「それじゃすぐに来てくださいね」[p] + +[_tb_end_text] + +[chara_mod name="勝野" time="0" cross="false" storage="chara/5/hiro256-1.png" ] +[tb_start_text mode=1 ] +#勝野 +「くそっ・・・!ヤバイなこれは・・・」[p] +「仕方ない。俺は行って来るから、お前は例の部屋で待ってろ」[p] +「今夜はたっぷりとお仕置きしてやるからな。覚悟しておけよ」[p] +#亜紀子 +「く・・・」[p] +[_tb_end_text] + +[chara_hide name="勝野" time="1000" wait="true" pos_mode="true" ] +[tb_start_text mode=1 ] +#亜紀子 +(ふん・・・いい気味だわ。これで勝野が業界から干されればいいのに・・・)[p] +(・・・といっても私の立場は変わらないけどね・・・)[p] +(・・・例の部屋で待ってろ・・・か。)[p] +(怒らせてしまったから、今夜はきっと一晩中ひどいことをされるんだわ・・・)[p] +(どんなことをされるのかしら・・・あぁ・・・)[p] +# +・・・・・・[p] +・・・[p] +[_tb_end_text] + +[stopbgm time="1000" ] +[jump storage="scene8.ks" target="" ] diff --git a/data/scenario/scene8.ks b/data/scenario/scene8.ks new file mode 100644 index 0000000..6575c1b --- /dev/null +++ b/data/scenario/scene8.ks @@ -0,0 +1,1081 @@ +[_tb_system_call storage=system/_scene8.ks] + +[mask time="1000" effect="fadeIn" color="0x000000" ] +[bg time="1000" method="crossfade" storage="hiro204.jpg" ] +[chara_show name="美里" time="1000" wait="true" storage="chara/1/hiro258-1.png" width="630" height="1575" left="725" top="11" reflect="false" ] +[mask_off time="1000" effect="fadeOut" ] +[playbgm volume="40" time="1000" loop="true" storage="bluenoise.ogg" ] +[tb_start_text mode=1 ] +#亜紀子 +(・・・いつ来ても趣味の悪い部屋だわ・・・)[p] +(セックスするためだけの部屋・・・。行ったことないけどラブホテルってこんな感じなのかしら・・・?)[p] +# +勝野に言われて来たのは都内のとあるマンションの一室だ[p] +といっても勝野はここで暮らしているわけではなく、女とセックスするときだけ使っている[p] +マンション全体が勝野の親戚の持ちものらしく、勝野はいつでも自由に使えるそうだ[p] +勝野はここを「やり部屋」と呼んでおり、過去には何人ものアイドルの卵や売れない女性芸能人を連れ込んで抱いてきたと自慢げに語っていた[p] +亜紀子も勝野の奴隷になって以来、週に2~3回はここに連れ込まれてセックス調教を受けている[p] +#亜紀子 +(本当に最低の男だわ・・・女を玩具かなにかとしか思っていないんだから・・・)[p] +(なんとかあいつの支配から脱出する方法を考えないと・・・)[p] +(でも既に世間に出回ったら破滅するような恥ずかしい動画を何本も撮られちゃったから・・・)[p] +(よくわからないけどデータはどうやっても侵入できないところにあるらしいし)[p] +(ハッカーを雇って・・・いや無理だわ。下手すると脅迫者がもう一人増えるだけだもの)[p] +(このままじゃ永遠にあいつの奴隷・・・そんなの絶対に嫌よ!)[p] +(・・・とにかく服を脱ぎましょう。もうすぐあいつが来るかもしれないわ)[p] +(来た時に全裸で待ってないとお仕置きされちゃうわ)[p] + + +[_tb_end_text] + +[chara_hide name="美里" time="1000" wait="true" pos_mode="true" ] +[chara_show name="美里" time="1000" wait="true" storage="chara/1/hiro261-1ak.png" width="439" height="1099" left="703" top="20" reflect="false" ] +[tb_start_text mode=1 ] +#亜紀子 +(全く・・・なんで私があいつの決めたルールを忠実に守らないといけないのよ・・・)[p] +(でも少しでも口実があればすぐにお仕置きお仕置きって酷いことをされちゃうから、従う振りをしておかないと・・・)[p] +(わざと私の怒りを煽って私が逆らうのを待ってるんだから。反抗的な態度をとれば逆にあいつを楽しませることになる)[p] +(あいつの思い通りにはさせないわ・・・・・・あっ)[p] +(あいつが来たわ・・・!)[p] + +[_tb_end_text] + +[chara_mod name="美里" time="600" cross="false" storage="chara/1/hiro260-2.png" ] +[chara_show name="勝野" time="1000" wait="true" storage="chara/5/hiro256-1.png" width="445" height="1068" left="155" top="-20" reflect="false" ] +[tb_start_text mode=1 ] +#亜紀子 +「お、おかえりなさいませご主人様・・・っ!」[p] +#勝野 +「おう」[p] +#亜紀子 +「きょ、今日もドスケベな亜紀子をたっぷりと・・・調教してくださいませ・・・っ!」[p] +#勝野 +「ククク、だいぶ奴隷らしくなってきたな」[p] +「よしよし、そんなに俺のチンポが待ちきれなかったか?」[p] +#亜紀子 +(く・・・いい気になって・・・でも、我慢よ・・・)[p] +(でも収録のことで怒ってるかと思ったけど、なんか機嫌が良さそうね?)[p] +(梅田に呼ばれて叱られたんじゃないのかしら・・・?)[p] +#勝野 +「とりあえず汗流すか。風呂の準備しろ」[p] +#亜紀子 +「は、はい・・・」[p] +[_tb_end_text] + +[tb_hide_message_window ] +*rep8 + +[tb_replay_start ] +[stopbgm time="1000" ] +[mask time="1000" effect="fadeIn" color="0x000000" ] +[chara_hide_all time="1000" wait="true" ] +[bg time="00" method="crossfade" storage="hiro141-1.jpg" ] +[tb_show_message_window ] +[mask_off time="1000" effect="fadeOut" ] +[playbgm volume="100" time="1000" loop="true" storage="music16.ogg" ] +[tb_start_text mode=1 ] +#亜紀子 +「し、失礼します・・・」[p] +# +ヌリュッ・・・ヌリュッ・・・[p] +身体にボディソープを塗りつけ、勝野の身体になすりつける[p] +これはソープランドという風俗店で行うサービスらしい[p] +奴隷には必須の技術だと、この部屋に連れ込まれた初日に教え込まれた[p] +もちろん最初は拒否したが、お仕置きをされて結局はすることになるので、逆らっても無駄だと最近は悟った[p] +#勝野 +「もっとしっかり身体を押し付けろ。舌とかも使えよ」[p] +#亜紀子 +「はい・・・ヌリュッ、ヌリュッ・・・ペロペロ」[p] +#勝野 +「だいぶ上手くなって来たじゃないか。これならいつアナウンサーをクビになってもソープ嬢で食っていけるぜ」[p] +#亜紀子 +「あ、ありがとうございます・・・ヌリュッヌリュッ」[p] +#勝野 +「・・・なんだ今日はやけに素直だな。いつもの反抗的な態度はどうした?」[p] +#亜紀子 +「・・・」[p] +# +ヌルッヌリュッ[p] +#勝野 +「やっぱり女ってのはチンポで教育するのが一番だな。あの生意気だったお前がたった数十日でこんなにも従順なメスになるんだもんな、ククク」[p] +#亜紀子 +「・・・っ」[p] +# +ヌリュッ・・・ヌリュッ[p] +#勝野 +「一人前の奴隷に教育していただいた感謝の言葉は?」[p] +#亜紀子 +(くっ・・・わたしを怒らせようと思って・・・。挑発に乗っちゃダメよ・・・っ)[p] +「・・・あ、ありがとうございます」[p] +#勝野 +「ダメだ。こういうときどういう風に言うか教えたはずだろ」[p] +#亜紀子 +「くっ・・・お、愚かでドスケベな亜紀子を・・・勝野様のお、オチンポで・・・一人前の奴隷に教育してくださって・・・本当にありがとうございます・・・っ」[p] +#勝野 +「お、なんだその目は?なにか言いたいことでもあるのか?」[p] +#亜紀子 +「い、いえ・・・っ」[p] +(我慢よ我慢・・・っ)[p] +#勝野 +「おらっ、手を休めるな」[p] +#亜紀子 +「は、はい・・・っ」[p] +# +ヌリュッヌリュッレロレロレロレロ[p] +#勝野 +「よーし、そろそろチンポを洗え」[p] +「お前を教育してくれたおチンポ様だ。感謝の念をこめて洗えよ」[p] +#亜紀子 +「くっ・・・は、はい」[p] +(く、悔しい・・・わたしがわざと従順なふりをしてるのを知ってて弄ってるんだわ・・・)[p] +# +シュッ・・・シュッ・・・コシコシコシ[p] +勝野のすでにビンビンに膨張しているイチモツをソープの付いた手で優しく洗う[p] +たぷっとした玉袋はさらに慎重に、袋のしわを伸ばして指の腹で丁寧にこする[p] +#勝野 +「念入りに洗えよ。後でお前がしゃぶることになるんだからな。ウハハハ」[p] +#亜紀子 +「・・・っ」[p] +# +サワサワサワ・・・モミュモミュモミュ・・・[p] +#勝野 +「おおぅ・・・上手くなったもんだぜ。これ以上やられると我慢汁が溢れちまう」[p] +「それじゃ次はマットプレイだ」[p] +#亜紀子 +「は、はい」[p] + +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro141-2.jpg" ] +[tb_cg id="141" ] +[tb_start_text mode=1 ] +#亜紀子 +「んっ・・・ハァッ」[p] +# +ヌリュッ・・・ヌリュッ・・・[p] +空気で膨らませたマットの上に仰向けになった勝野に覆いかぶさるように重なり、身体を前後に滑らせて全身で勝野の身体を洗う[p] +何度も犯されているとはいえ、こんなにも密着すると恥ずかしくて顔に血が上るのがわかる[p] +#亜紀子 +「ンッ・・・アフゥ・・・♥」[p] +(分厚い胸板・・・ごつごつして毛だらけで・・・男の身体だわ・・・)[p] +(熱いおチンチンが・・・当たってる・・・)[p] +# +ニュルッ・・・ニュルッ・・・[p] +#勝野 +「おほっ・・・お前の身体はボリュームがあってマットプレイには最適だな」[p] +「マジで都内のどの店でも指名ナンバーワンを狙えるぜ。ククク」[p] +#亜紀子 +「・・・っ・・・ンハァ・・・」[p] +# +ヌリュッヌリュッ[p] +#勝野 +「よし、ご褒美にキスしてやるぜ」[p] +#亜紀子 +「ンッ・・・!?ン・・・ムッ・・・♥」[p] +# +チュバッ・・・ヌチュ・・・[p] +#亜紀子 +「ンムッ・・・レロッ・・・チュバッ・・・ンハァッ♥」[p] +(ん・・・なにがご褒美よ・・・っ)[p] +#勝野 +「よし、次は裏だ」[p] +#亜紀子 +「はい・・・」[p] +# +ヌリュッ・・・ヌリュッ・・・[p] +今度はうつ伏せになった勝野の上にかぶさり、身体をこすり付ける[p] +#亜紀子 +「んっ・・・ハッ・・・ぁ」[p] +# +ヌリュッ・・・!ヌリュッ・・・![p] +結構な全身運動で、おもわず吐息が漏れる[p] +勝野は悠然と寝そべり、指一本動かさずに自分の身体が綺麗になるのを楽しんでいる[p] +#勝野 +「よし、脚を洗え。そのでかい乳でな」[p] +#亜紀子 +「はい・・・」[p] +# +ズリュッ・・・ズリュッ・・・[p] +勝野の毛だらけの脚を両の乳房で挟んでしごく[p] +#亜紀子 +「ンッ・・・ハッ・・・」[p] +# +ヌリュッ・・・ニュルンッ・・・[p] +#勝野 +「くくく、でかいチンポにパイズリしてるみたいだろう」[p] +#亜紀子 +「くっ・・・ンフゥ・・・」[p] +# +ヌリュッ・・・サスサスッ・・・[p] +#勝野 +「足はどうするかわかってるな?」[p] +#亜紀子 +「くっ・・・はい・・・っ」[p] +# +ペロ・・・ペロッ・・・[p] +勝野の足の指に舌を這わせる[p] +#亜紀子 +「レロッレロッ・・・チュバッ」[p] +(足を舐めさせられるなんて・・・最低だわ・・・)[p] +「ネロッ・・・ンチュッ・・・」[p] +#勝野 +「一日中仕事してたっぷり汗をかいたからな。しっかりとキレイにしろよ、ククク」[p] +#亜紀子 +「くっ・・・レロレロレロレロンッ・・・チュバッ」[p] +(いい気になって・・・悔しい・・・っ!)[p] +「ペロペロペロッ・・・チュプ・・・」[p] +#勝野 +「ほれ、手を抜くな。どうやるか教えただろう」[p] +#亜紀子 +「はい・・・ハムッ」[p] +(たしか指を一本ずつ口に含んで・・・)[p] +「ンムッ・・・レロレロレロ・・・ンチュッ♥」[p] +(飴玉を舐めるように・・・舌で指の間まで隈なく・・・)[p] +「レロッレロッ・・・ンムッ・・・チューッ♥」[p] +(ツバは吐き出さずに・・・飲みこめ・・・でしょっ)[p] +「ムチュッ・・・ンム・・・チュゥッ・・・ゴクッ♥」[p] +# +最初に少し洗ったとはいえ汗臭い勝野の足を丹念にしゃぶったエキスを一滴もこぼさぬよう飲み下す[p] +勝野はこっちを見ていないのでバレないように吐き出してもいいのだが、言いつけを忠実に守って塩気のある足汁を飲み込んでいった[p] +#亜紀子 +「チュバッ・・・ジュルッ・・・ゴクッ♥」[p] +「アムッ・・・チュバッ・・・レロレロレロ・・・ゴクッ♥」[p] +# +10本の足の指を時間をかけてしゃぶり終わると、最後にお湯をかけて洗い流す[p] +#亜紀子 +「お、終りました・・・ハァハァ」[p] +#勝野 +「よーし、いいだろう。それじゃそろそろベッドでかわいがってやるよ」[p] +#亜紀子 +「は、はい・・・」[p] + + + + +[_tb_end_text] + +[stopbgm time="1000" ] +[tb_hide_message_window ] +[tb_replay id="reps8" ] +*rep9 + +[tb_replay_start ] +[mask time="1000" effect="fadeIn" color="0x000000" ] +[bg time="1000" method="crossfade" storage="hiro117-1.jpg" ] +[tb_show_message_window ] +[mask_off time="1000" effect="fadeOut" ] +[playbgm volume="100" time="1000" loop="true" storage="music16.ogg" ] +[tb_start_text mode=1 ] +#勝野 +「くくく、お前はやっぱり四つん這いが一番似合ってるな」[p] +「ほれ、もっとよく見えるように尻を突き出せ」[p] +# +パン![p] +#亜紀子 +「アンッ・・・こ、こうですか」[p] +#勝野 +「ふむ、いい格好だ。マ○コも肛門も丸見えだぞ」[p] +#亜紀子 +「・・・っ」[p] +#勝野 +「おいおい、もうマ○コほかほかじゃねえか。そんなに俺のチンポが待ちきれないのか?」[p] +# +パンッ[p] +#亜紀子 +「ンッ・・・!そ、そんなこと・・・っ」[p] +#勝野 +「でも簡単にチンポをもらえると思うなよ」[p] +「俺がチンポを挿れたくなるように、上手におねだりしてみろ」[p] +#亜紀子 +「く・・・」[p] +「お・・・おチンポを・・・入れてください・・・」[p] +#勝野 +「ダメだダメだ。もっと頭を使って俺がその気になるようなセリフを考えろ」[p] +「言い方とかも工夫しろよ。感情がこもって無いと何回でもやり直させるからな」[p] +#亜紀子 +「く・・・っ」[p] +(なんでわたしがそんなこと考えないといけないのよ・・・!)[p] +(でも仕方ないわ・・・逆らうだけ時間の無駄だし・・・)[p] +[_tb_end_text] + +[stopbgm time="1000" ] +*q1 + +[bg time="00" method="crossfade" storage="hiro117-1.jpg" ] +[tb_eval exp="f.qp=0" name="qp" cmd="=" op="t" val="0" val_2="undefined" ] +[tb_start_text mode=1 ] +#亜紀子 +(えーっと・・・勝野が喜びそうなおねだりでしょ)[p] +(まず、言い方は・・・)[p] +[_tb_end_text] + +[glink color="black" storage="scene8.ks" size="20" target="*a1a" text="屈辱に耐えながら" x="512" y="337" width="" height="" _clickable_img="" ] +[glink color="black" storage="scene8.ks" size="20" target="*a1b" text="大きな声でハキハキと" x="491" y="418" width="" height="" _clickable_img="" ] +[glink color="black" storage="scene8.ks" size="20" target="*a1c" text="媚びて甘える感じ" x="512" y="497" width="" height="" _clickable_img="" ] +[s ] +*a1a + +[tb_start_text mode=1 ] +#亜紀子 +(そうね・・・)[p] +(わたしが悔しがるのが勝野は一番喜ぶわけだから、ここは今の感情のままで素直にいきましょう)[p] +[_tb_end_text] + +[tb_eval exp="f.qp+=100" name="qp" cmd="+=" op="t" val="100" val_2="undefined" ] +[jump storage="scene8.ks" target="*q2" ] +*a1b + +[tb_start_text mode=1 ] +#亜紀子 +(そうね・・・)[p] +(アナウンサーだから大きな声ではっきりと言うのがいいのかも・・・?)[p] +[_tb_end_text] + +[tb_eval exp="f.qp+=200" name="qp" cmd="+=" op="t" val="200" val_2="undefined" ] +[jump storage="scene8.ks" target="*q2" ] +*a1c + +[bg time="1000" method="crossfade" storage="hiro117-2.jpg" ] +[tb_start_text mode=1 ] +#亜紀子 +(そうね・・・)[p] +(おねだりだから、やっぱり甘える感じがいいのかしら・・・?)[p] +[_tb_end_text] + +[tb_eval exp="f.qp+=300" name="qp" cmd="+=" op="t" val="300" val_2="undefined" ] +*q2 + +[tb_start_text mode=1 ] +#亜紀子 +(次は・・・自分のことをどう表現するかね)[p] +[_tb_end_text] + +[glink color="black" storage="scene8.ks" size="20" target="*a2a" text="ドスケベな亜紀子" x="499" y="325" width="" height="" _clickable_img="" ] +[glink color="black" storage="scene8.ks" size="20" target="*a2b" text="愚かなで無能な下僕" x="489" y="413" width="" height="" _clickable_img="" ] +[glink color="black" storage="scene8.ks" size="20" target="*a2c" text="盛りのついた雌牛" x="499" y="496" width="" height="" _clickable_img="" ] +[s ] +*a2a + +[tb_start_text mode=1 ] +#亜紀子 +(そうね・・・)[p] +(勝野がいつも言わせたがる定番ね・・・これでいいはず)[p] +[_tb_end_text] + +[tb_eval exp="f.qp+=10" name="qp" cmd="+=" op="t" val="10" val_2="undefined" ] +[jump storage="scene8.ks" target="*q3" ] +*a2b + +[tb_start_text mode=1 ] +#亜紀子 +(そうね・・・)[p] +(立場を強調するなら、このくらい言った方がいいかもね・・・屈辱だけど)[p] +[_tb_end_text] + +[tb_eval exp="f.qp+=20" name="qp" cmd="+=" op="t" val="20" val_2="undefined" ] +[jump storage="scene8.ks" target="*q3" ] +*a2c + +[tb_start_text mode=1 ] +#亜紀子 +(そうね・・・)[p] +(家畜であるということを自ら認める・・・屈辱だけど効果はあるかも)[p] +[_tb_end_text] + +[tb_eval exp="f.qp+=30" name="qp" cmd="+=" op="t" val="30" val_2="undefined" ] +*q3 + +[tb_start_text mode=1 ] +#亜紀子 +(最後は・・・ペニスをどうおねだりするかね)[p] +[_tb_end_text] + +[glink color="black" storage="scene8.ks" size="20" target="*a3a" text="勝野様の逞しいおチンポでかわいがってください" x="382" y="303" width="" height="" _clickable_img="" ] +[glink color="black" storage="scene8.ks" size="20" target="*a3b" text="ご主人様のおチンポでみっちり教育してください" x="388" y="396" width="" height="" _clickable_img="" ] +[glink color="black" storage="scene8.ks" size="20" target="*a3c" text="早くおチンポをください。もう我慢できません" x="401" y="484" width="" height="" _clickable_img="" ] +[s ] +*a3a + +[tb_start_text mode=1 ] +#亜紀子 +(そうね・・・)[p] +(「俺様のチンポでかわいがってやる」とかよく言うし、そのままでいいかな)[p] +[_tb_end_text] + +[tb_eval exp="f.qp+=1" name="qp" cmd="+=" op="t" val="1" val_2="undefined" ] +[jump storage="scene8.ks" target="*end" ] +*a3b + +[tb_start_text mode=1 ] +#亜紀子 +(そうね・・・)[p] +(奴隷らしい言い方ならこんな感じかしら・・・)[p] +[_tb_end_text] + +[tb_eval exp="f.qp+=2" name="qp" cmd="+=" op="t" val="2" val_2="undefined" ] +[jump storage="scene8.ks" target="*end" ] +*a3c + +[tb_start_text mode=1 ] +#亜紀子 +(そうね・・・)[p] +(チンポをおねだりだから・・・欲しくてしょうがない感じを出すのが正解かも)[p] +[_tb_end_text] + +[tb_eval exp="f.qp+=3" name="qp" cmd="+=" op="t" val="3" val_2="undefined" ] +*end + +[jump storage="scene8.ks" target="*311" cond="f.qp==311" ] +[jump storage="scene8.ks" target="*222" cond="f.qp==222" ] +[jump storage="scene8.ks" target="*132" cond="f.qp==132" ] +[jump storage="scene8.ks" target="*213" cond="f.qp==213" ] +[tb_start_text mode=1 ] +#勝野 +「ダメだ。やり直し」[p] +#亜紀子 +「くっ・・・」[p] +[_tb_end_text] + +[jump storage="scene8.ks" target="*q1" ] +*311 + +[tb_start_text mode=1 ] +#亜紀子 +「ドスケベな亜紀子を、勝野様のたくましいおチンポでいっぱいかわいがってくださいませっ・・・♥」[p] +#勝野 +「ウハハハ、そんなに俺様のチンポが欲しいのか?」[p] +#亜紀子 +「は、はい・・・っ♥」[p] +#勝野 +「ククク、よくやるぜ。・・・まぁいい、その思い切った演技に免じて90点やろう」[p] +[_tb_end_text] + +[jump storage="scene8.ks" target="*next" ] +*222 + +[tb_start_text mode=1 ] +#亜紀子 +「愚かで無能な下僕を、ご主人様のおチンポでみっちりと教育してくださいませっ!」[p] +#勝野 +「ほぉ、これは文句のつけようがないな。性奴隷としては満点の回答だ」[p] +「しかし創意工夫に欠けるので85点ってとこだな」[p] +[_tb_end_text] + +[jump storage="scene8.ks" target="*next" ] +*132 + +[tb_start_text mode=1 ] +#亜紀子 +「くっ・・・さ、盛りのついた雌牛を・・・ご主人様の・・・お、おチンポで、みっちりと調教してくださいませ・・・っ」[p] +#勝野 +「くくく、雌牛か。自らを家畜に貶めてまでチンポをねだる気分はどうだ?」[p] +「よしよし、92点やろう」[p] +[_tb_end_text] + +[jump storage="scene8.ks" target="*next" ] +*213 + +[tb_start_text mode=1 ] +#亜紀子 +(くっ・・・こんな最低のゲス男に・・・)[p] +(体を洗わされて、足を舐めさせられて・・・おチンポのおねだりまでしなきゃいけないなんて・・・!)[p] +(屈辱だわ・・・あぁっ♥)[p] +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro117-2.jpg" ] +[tb_start_text mode=1 ] +#亜紀子 +「お、愚かでドスケベな亜紀子に・・・あぁっ♥早くっ勝野様のたくましいおチンポを・・・くださいませっ!も、もう我慢できませんーーーっ♥」[p] +#勝野 +「ムハハハハハッ!本気でチンポをおねだりしやがった!」[p] +「身も心も性奴隷になりきったようだな。100点やるぜ!」[p] +[_tb_end_text] + +*next + +[playbgm volume="100" time="1000" loop="true" storage="music16.ogg" ] +[tb_start_text mode=1 ] +#勝野 +「よし、合格だ」[p] +「お待ちかねのチンポをくれてやるぞ。オラッ!」[p] +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro117-3.jpg" ] +[tb_start_text mode=1 ] +# +ズプッ![p] +#亜紀子 +「アッ・・・んんっ!」[p] +#勝野 +「おいおい、まだ挿れただけだぞ。いい声出してるんじゃねえよ」[p] +# +ズプッズプッ[p] +#亜紀子 +「ア・・・アンッ♥」[p] +#勝野 +「やっぱりお前はバックで犯されるのが一番好きみたいだな、ククク」[p] +# +ズプッ!ヌプッ![p] +#亜紀子 +「く・・・だれが・・・アァンッ♥」[p] +(か・・・感じちゃう・・・っ)[p] +#勝野 +「最初に犯したときからどんどんスケベになりやがって」[p] +# +ズプッ!ズムッ![p] +#亜紀子 +「アンッ・・・ンンッ♥」[p] +(たしかに・・・わたし・・・どんどん感じやすくなってる・・・)[p] +#勝野 +「エリート看板キャスターさんがこんなにドスケベだったとは、視聴者が知ったら驚くぜ!」[p] +# +ズプッ!ヌチュッ![p] +#亜紀子 +「アンッ・・・ヤンッ♥」[p] +#勝野 +「足舐めさせられたり、屈辱的なセリフ言わされたりして感じてたんだろう、このマゾ雌が!」[p] +# +パンッパンッ[p] +#亜紀子 +「だ、誰が・・・っ、感じて・・・アンッ♥」[p] +(わたし・・・感じてなんか・・・)[p] +#勝野 +「女の95%はマゾ・・・お前自身が証明してるじゃねえか、オラッ!」[p] +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro117-4.jpg" ] +[tb_start_text mode=1 ] +# +パンッ!パンッ!パンッ![p] +#亜紀子 +「アヒッ・・・わ、わたしは・・・マゾなんかじゃ・・・アンッ♥」[p] +(そんな・・・はず・・・無い・・・っ!)[p] +#勝野 +「でけえ乳ブルンブルン揺らしやがって、オラッ!」[p] +# +パンッ!パンッ!パンッ![p] +#亜紀子 +「アヒィッ!・・・ンンッ・・・ヤァーーーッ♥」[p] +#勝野 +「もうイったのかよ、このドスケベが!」[p] +# +パンッ!パンッ!パンッ![p] +#亜紀子 +「アンッ!アンッ!やっ・・・ダメッ♥」[p] +(なんでこんなに・・・気持ちいいの・・・っ!)[p] +#勝野 +「おらっ、まだまだいくぞ!」[p] + +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro117-5.jpg" ] +[tb_start_text mode=1 ] +# +パンッ!パンッ!パンッ![p] +#亜紀子 +「アンッ!アンッ!アンンッ♥」[p] +(ダメェ・・・奥に当たって・・・!)[p] +#勝野 +「どうだ、バックで子宮突かれると、どうしようもなくメスの気分になるだろうフヒヒ」[p] +# +ズンッ!ズンッ!ズンッ![p] +#亜紀子 +「アヒッ!ンンッ・・・ァハンッ♥」[p] +(ダメ・・・チンポに・・・負けちゃう・・・っ)[p] +#勝野 +「おっと今日はまだ搾ってなかったな。ついでに搾ってやるか」[p] +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro117-6.jpg" ] +[tb_start_text mode=1 ] +# +ギュムッ[p] +#亜紀子 +「アヒッ!?ダ、ダメェ・・・っ・・・オッパイだめぇっ♥」[p] +#勝野 +「やっぱりパンパンに張ってるじゃねえか」[p] +「乳が張ったら報告しろって言っただろ!」[p] +# +モミュッ!モミュッ![p] +#亜紀子 +「アヒッ!・・・も、申し訳ありませ・・・ンンーッ♥」[p] +#勝野 +「手じゃ掴みきれないくらいでかいな。俺のザーメンたらふく飲んでまたでかくなったんじゃないのか?ククク」[p] +# +モギュッ!モギュッ![p] +#亜紀子 +「アッ・・・そんな強く・・・揉まないでぇ・・・アヒィッ♥」[p] +#勝野 +「おらっ、乳噴出してイっちまえ!」[p] +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro117-7.jpg" ] +[tb_start_text mode=1 ] +# +ピュッ・・・ピューーーッ![p] +#亜紀子 +「アゥーーッ・・・お、おっぱい出ちゃう・・・っ♥」[p] +#勝野 +「ワハハ、簡単に出るじゃねえか。これで自分で搾っても全然出ないってのは笑えるぜ」[p] +# +モギュッ  ピューーッ![p] +モギュッ  ピューーーーッ![p] +#亜紀子 +「アンッ・・・アンッ・・・アンーーッ♥」[p] +#勝野 +「おい乳で感じてないでマ○コに集中しろ。そろそろ中に出してやるぞ」[p] +# +パン!パン!パン!パンッ![p] +#亜紀子 +「アヒッ・・・な、中は・・・ダメェッ・・・アンンッ♥」[p] +#勝野 +「ダメとか言いながらチンポをキュンキュン締め付けやがって!」[p] +「お望みどおり俺のミルクを子宮にたっぷり飲ませてやるよ・・・!」[p] +# +パンッパンッパンッパンッ![p] +#亜紀子 +「ンンーーーーッ!・・・っ・・・ィイーーーーッ♥」[p] +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro117-8.jpg" ] +[tb_cg id="117" ] +[tb_start_text mode=1 ] +# +ドピュッ!ドピュピュッ![p] +#亜紀子 +「アァァァアッッ♥」[p] +#勝野 +「うお・・・出る・・・っ!」[p] +# +ビュルビュルビュルッ![p] +#亜紀子 +「アァーーーンッ!!お、おなかに・・・出てる・・・っ♥」[p] +#勝野 +「まだ・・・出るっ」[p] +# +ピュッ・・・ピュピュッ[p] +#亜紀子 +「あぁ・・・ァハ・・・ンッ♥」[p] +#勝野 +「ふう・・・出た出た」[p] +# +ヌポン・・・ッ[p] +#亜紀子 +「アンッ・・・ハァ・・・ハァ・・・♥」[p] +#勝野 +「逆にミルクを搾り取られちまったぜ・・・このドスケベ女め」[p] +「おい、休んでないでチンポをしゃぶって綺麗にしろ」[p] +#亜紀子 +「んっ・・・ハムッ」[p] +「チュパ・・・レロレロレロ・・・♥」[p] +「チュゥ・・・ンムッ・・・ゴクッ♥」[p] +(出したばっかりで・・・ビクンビクンしてる・・・)[p] +「チュムッ・・・レロレロレロ・・・ゴクンッ♥」[p] +#勝野 +「今夜はまだまだかわいがってやるからな、ククク」[p] +#亜紀子 +「チュプッ・・・チュポッ・・・♥」[p] +(あぁ・・・このままじゃ・・・わたしどうなっちゃうの・・・)[p] +(・・・・・・)[p] +# + +[_tb_end_text] + +[stopbgm time="1000" ] +[tb_replay id="reps9" ] +[mask time="1000" effect="fadeIn" color="0x000000" ] +[bg time="1000" method="crossfade" storage="hiro201.jpg" ] +[mask_off time="1000" effect="fadeOut" ] +[playbgm volume="70" time="1000" loop="true" storage="neonpurple.ogg" ] +[tb_start_text mode=1 ] +# +次の日――[p] +[_tb_end_text] + +[chara_show name="美里" time="1000" wait="true" storage="chara/1/hiro258-1.png" width="601" height="1503" left="81" top="12" reflect="false" ] +[tb_start_text mode=1 ] +#亜紀子 +(はぁ・・・)[p] +(昨夜は不覚だったわ・・・)[p] +(何時間もみっちりと犯されて・・・快楽に負けてしまったわ)[p] +(男嫌いだったわたしが・・・悔しいけど勝野にすっかり身体を開発されてしまって・・・)[p] +(バイブとは違う本物の・・・やっぱり女は勝てないのかしら?)[p] +(・・・でもセックスが気持ちいいのは生理的に仕方のないことよね)[p] +(だからって勝野に心を許すのとは話が別だわ)[p] +(あんな最低のゲス男、絶対に・・・)[p] +(・・・おっと、そろそろニュースの本番ね)[p] +(スタジオに移動しましょう)[p] +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro202.jpg" ] +[tb_start_text mode=1 ] +#勝野 +「おい」[p] +[_tb_end_text] + +[stopbgm time="1000" ] +[playbgm volume="60" time="1000" loop="true" storage="枯れ葉が集う路地裏通り_2.ogg" ] +[chara_show name="勝野" time="1000" wait="true" storage="chara/5/hiro256-1.png" width="597" height="1433" left="686" top="-54" reflect="false" ] +[tb_start_text mode=1 ] +#勝野 +「そろそろ本番か?」[p] +#亜紀子 +「・・・そうよ」[p] +#勝野 +「なんだよ、そっけないな。昨夜はあれだけ俺のチンポによがってたくせに」[p] +#亜紀子 +「く・・・っ」[p] +#勝野 +「なるほど、いじめて欲しくてわざと昼間は反抗的な態度を取ってるんだな。マゾだからなお前は」[p] +#亜紀子 +「そんなわけないでしょ!わ、わたしはマゾなんかじゃないわ・・・!」[p] +#勝野 +「いや、お前はマゾだよ。自分でも気付いてないかもしれないがな」[p] +#亜紀子 +「勝手に決め付けないで・・・!」[p] +#勝野 +「それじゃ試してやろうじゃないか。お前がマゾかどうか」[p] +#亜紀子 +「た、試す・・?も、もうすぐ本番なのよ」[p] +#勝野 +「その本番で・・・」[p] +[_tb_end_text] + +[mask time="1000" effect="fadeIn" color="0x000000" ] +[mask_off time="600" effect="fadeOut" ] +[chara_mod name="美里" time="600" cross="false" storage="chara/1/hiro258-5.png" ] +[tb_start_text mode=1 ] +#亜紀子 +「そ、そんなの無理よ・・・!出来るわけないわ!」[p] +#勝野 +「出来る出来ないじゃない、やるんだよ。奴隷にノーは無いってこと忘れたか?」[p] +「もしやらなかったらきつーいお仕置きだぞ。このお仕置きはマゾが喜ばないタイプのお仕置きだからな。ククク」[p] +[_tb_end_text] + +[chara_mod name="美里" time="00" cross="false" storage="chara/1/hiro258-1.png" ] +[tb_start_text mode=1 ] +#亜紀子 +「く・・・っ」[p] +#勝野 +「ほれ、そろそろ行かないと間に合わないぞ」[p] +#亜紀子 +「あっ・・・」[p] +#勝野 +「ちゃんとモニターで見てるからな」[p] +[_tb_end_text] + +[chara_hide name="勝野" time="1000" wait="true" pos_mode="true" ] +[tb_start_text mode=1 ] +#亜紀子 +「く・・・」[p] +# +・・・・・・[p] +・・・[p] +[_tb_end_text] + +[stopbgm time="1000" ] +[tb_hide_message_window ] +*rep10 + +[tb_replay_start ] +[mask time="1000" effect="fadeIn" color="0x000000" ] +[chara_hide_all time="1000" wait="true" ] +[bg time="1000" method="crossfade" storage="hiro254-11.jpg" ] +[tb_show_message_window ] +[mask_off time="1000" effect="fadeOut" ] +[playbgm volume="20" time="1000" loop="true" storage="Green&Dance_2.ogg" ] +[tb_start_text mode=1 ] +#亜紀子 +「ニュースプライムZ、キャスターの千山亜紀子です」[p] +「最初のニュースです。今日午後3時ごろ、T県N市で下校中の小学生がトラックの集団に突っ込む事故がありました」[p] +「事故が起きたのは住宅街の一角で、小学生は法廷速度の時速60kmを超えるスピードでトラックの集団に突入したということです」[p] +「この事故で小学生が軽症、トラック運転手に怪我人はありませんでした」[p] +「トラック運転手の一人は『小学生がすごいスピードでこっちに突っ込んでくるのが見えて、避けようとしたが間に合わなかった』と証言しています」[p] +「小学生は近くの病院に運ばれましたが、現在は自宅に戻っているということです」[p] +(あぁ・・・どうしよう・・・)[p] +「次のニュースです。訪日中のジョー・ダイベン米大統領の夫人シルさんが、神宮球場でプロ野球を観戦しました―――」[p] +(やるしかないけど・・・でも・・・恥ずかしくて無理よ・・・)[p] +「シル夫人は『球場の雰囲気がとてもよかった。傘を使った応援が印象的だった』と―――」[p] +(あっ・・・バストショットになったわ・・・!今なら・・・)[p] +「なお試合は9-1でホームのヤクルトが巨人を下しました―――」[p] +(・・・え、えいっ!)[p] +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro254-4.jpg" ] +[tb_start_text mode=1 ] +#カメラマン +(あっ!?脚が・・・!)[p] +#ディレクター +(おっ!?これはすごいぞ!)[p] +#谷田 +(千山さん・・・!?)[p] +#ディレクター +(おい、カメラ!引いて!)[p] +#カメラマン +(わかってます!)[p] +#亜紀子 +「オレンジ社はYphoneの新作を秋に発売することを発表しました―――」[p] +(あっ!?カメラが・・・!)[p] +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro101-5.jpg" ] +[tb_start_text mode=1 ] +#ノブオ +「千山アナ、今日のパンティはピンクか・・・おおっ!?」[p] +「脚を開いたぞ!パンティが丸見えだ!大胆すぎるぜ!うひょーー!」[p] +「これって局の命令なのかな・・・?それとも露出願望が・・・!?」[p] +「とにかくエロすぎるぞ!」[p] +・・・[p] +#キミヒコ +「なんてことだ・・・!俺の亜紀子が・・・!」[p] +「局に無理やりやらされているんだな・・・かわいそうな亜紀子・・・ハァハァ」[p] +「・・・いや、それとも俺に対するメッセージ・・・なのか!?」[p] +「だとしたら・・・いやしかし・・・ハァハァハァ」[p] +・・・[p] +#子供 +「お母さん、あの人パンツ丸見えだよ」[p] +#ママ +「まぁ!もう、なにしてるの全く!破廉恥だわ!」[p] +「ニュースをなんだと思ってるのかしら!ねえあなた、チャンネル変えましょうよ」[p] +#パパ +「うむ・・・いや、しかしニュースが途中だから・・・」[p] +#ママ +「他のチャンネルでもニュースやってるじゃない」[p] +「なのにいつもこのチャンネルばっかり・・・あなたああいういやらしい女が好きなのね!」[p] +#パパ +「な、何を言ってるんだ。ボクはただニュースをだね・・・」[p] +#子供 +「このハンバーグおいしー」[p] +・・・[p] +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro254-4.jpg" ] +[tb_start_text mode=1 ] +#亜紀子 +「双子の姉妹が同じ日に双子を産むという珍しいおめでたニュースが届きました」[p] +(あぁ・・・見られてる・・・)[p] +「アメリカのメーン州に住むエリザベス・モリスさんとキャサリン・モリスさんは一卵性の双子姉妹ですが、現地時間22日のほぼ同時刻に出産を迎えました」[p] +(でも今閉じたら・・・このまま何もないふりをして読み続けるしかないわ)[p] +「産まれてきたのはなんとどちらも双子、それも二組とも一卵性の男の子の双子でした」[p] +(あっ、谷田君・・・そんな食いつくように見ないで・・・)[p] +「実はこの姉妹の夫も一卵性の双子。2018年の同じ日に兄のロビンさんが妹のキャサリンさん、弟のブルックさんが姉のエリザベスさんと結婚しました」[p] +(テレビの前で何万人もの男の人があんな目で見てるんだわ・・・)[p] +「双子同士の夫婦が同日に双子を産むという非常に珍しいニュースにアメリカでも大きな話題になっているようです」[p] +(あぁ・・・恥ずかしすぎる・・・あぁ♥)[p] +「姉のエリザベスさんは『予定日が同じだったので同じ日に生まれるとは思っていたが、まさか両方双子とは思いませんでした。とても驚いています。4人とも元気に育って欲しい』と語っています」[p] +「次のニュースです―――」[p] +# +・・・・・・[p] +・・・[p] + +[_tb_end_text] + +[stopbgm time="1000" ] +[mask time="1000" effect="fadeIn" color="0x000000" ] +[bg time="1000" method="crossfade" storage="hiro203.jpg" ] +[chara_show name="勝野" time="000" wait="true" storage="chara/5/hiro256-3.png" width="500" height="1200" left="666" top="2" reflect="false" ] +[chara_show name="美里" time="000" wait="true" storage="chara/1/hiro258-1.png" width="496" height="1240" left="104" top="53" reflect="false" ] +[mask_off time="1000" effect="fadeOut" ] +[playbgm volume="30" time="1000" loop="true" storage="bluenoise.ogg" ] +[tb_start_text mode=1 ] +#勝野 +「ククク、どうだ?全国にパンツを見せびらかした気分は」[p] +#亜紀子 +「く・・・最悪よ・・・っ」[p] +#勝野 +「ウソつけ。興奮してたんだろうが」[p] +#亜紀子 +「こ、興奮なんて・・・してないわっ」[p] +#勝野 +「口ではなんとでも言えるからな。調べてやるから全裸になってケツを突き出せ」[p] +#亜紀子 +「・・・っ!」[p] +[_tb_end_text] + +[mask time="1000" effect="fadeIn" color="0x000000" ] +[chara_hide_all time="1000" wait="true" ] +[bg time="1000" method="crossfade" storage="hiro104-7.jpg" ] +[mask_off time="1000" effect="fadeOut" ] +[tb_start_text mode=1 ] +#勝野 +「おいっビチャビチャじゃねえか!ギャハハ!」[p] +#亜紀子 +「あぁ・・・そんな・・・!」[p] +#勝野 +「腿まで垂れてきてるじゃねえか。なにが感じてないだよ、自分でも濡れてるの判ってただろうが!」[p] +#亜紀子 +「くっ・・・なんで・・・っ」[p] +#勝野 +「なんでってお前がマゾだからだよ」[p] +「下着をカメラに晒して興奮する、マゾの変態だからだよっ!」[p] +# +パン![p] +#亜紀子 +「アンッ!」[p] +#勝野 +「ケツ叩かれるのも好きなんだろう!ホレッ!」[p] +# +パンッ!パンッ![p] +#亜紀子 +「アンッ!アヒッ♥」[p] + +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro104-5.jpg" ] +[tb_start_text mode=1 ] +#勝野 +「オラッ、マゾの変態だって認めろ!」[p] +# +パンッ!パンッ![p] +#亜紀子 +「アゥッ!イヤッ!アンンッ♥」[p] +#勝野 +「自分で認めるまでぶつぞ!それとももっと叩いてほしくて意地張ってるのか?」[p] +# +パンッ!パンッ!パンッ![p] +#亜紀子 +「アンッ・・・痛い・・・ァハンッ♥」[p] +(あぁ・・・なんでお尻叩かれてアソコがキュンてなるの・・・っ)[p] +#勝野 +「ほれっ、わたしはマゾの変態ですって言っちまえ!」[p] +# +ズポッ![p] +#亜紀子 +「アヒィッ!お、お尻に指入れないでぇ・・・っ♥!い、言います・・・っ・・・言いますから・・・っ」[p] +「わ、わたしは・・・アンッ!ま、マゾの・・・変態です・・・っ!アンッ♥」[p] +#勝野 +「オマ○コびちょびちょにしてすいませんって言え!」[p] +# +ズプッ!ズプッ![p] +#亜紀子 +「アヒッ!お、オ○コを・・・びちょびちょにして・・・ンッ、すいませんーーっ!アヒッ♥」[p] +#勝野 +「よーし、ちゃんと言えたご褒美にチンポを入れてやろう」[p] + +[_tb_end_text] + +[stopbgm time="1000" ] +[bg time="1000" method="crossfade" storage="hiro113-4.jpg" ] +[playbgm volume="100" time="1000" loop="true" storage="music16.ogg" ] +[tb_start_text mode=1 ] +# +ズプッ[p] +#亜紀子 +「アァンッ!」[p] +#勝野 +「おらっこのドスケベ女。これが欲しかったんだろうが」[p] +# +グチュッ!グチュッ![p] +#亜紀子 +「アッ・・・ンンッ・・・アンッ♥」[p] +#勝野 +「テレビ見てる男はみんなお前を頭の中で犯してるんだぜっ」[p] +# +ヌプッ!ヌプッ![p] +#亜紀子 +「アンッ・・・い、イヤァ・・・っ♥」[p] +#勝野 +「ディレクターとかカメラマンとかADもみんなお前をスケベな目で見てるんだ」[p] +パン!パン![p] +#亜紀子 +「アァッ・・・アフゥッ・・・そ、そんなァ・・・アンっ♥」[p] +#勝野 +「もう今のお前は知的なニュースキャスターじゃなく、みんなのオナペットなんだよ。どうだ、嬉しいか?」[p] +# +パンッ!パンッ![p] +#亜紀子 +「アヒッ!や・・・やりたくて・・・ンッ♥やってるわけじゃ・・・アンッ♥」[p] +#勝野 +「ウソつけ!お前はなんだ?言ってみろ!」[p] +# +パンッ!パンッ![p] +#亜紀子 +「わ・・・わたしは・・・アヒッ♥・・・ニュース・・・キャスター・・・ンッ♥」[p] +#勝野 +「違うだろ!じゃあここで止めてもいいのか?」[p] +#亜紀子 +「アッ・・・そんなァ・・・や、やめちゃ・・・っ♥」[p] +#勝野 +「じゃあ正直に言ってみろ。お前はなんだ!?」[p] +#亜紀子 +「アハァ・・・わ、わたしは・・・」[p] +(ダメ・・・言っちゃダメ・・・っ)[p] +「ま・・・ドスケベな・・・マゾの変態ですぅ・・・っ♥」[p] +(あぁ・・・言っちゃった・・・)[p] +#勝野 +「よし、それを忘れるなよ!」[p] +# +パンッ!パンッ!パンッ![p] +#亜紀子 +「アヒィーッ!アンッ♥アンッ♥アンーッ♥」[p] +#勝野 +「おらっ、中に出してやるぞ、ドスケベ女!」[p] +# +パンッ!パンッ!パンッ![p] +#亜紀子 +「アひィンッ♥な、中は・・・ダメッ・・・アンッ♥」[p] +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro113-6.jpg" ] +[tb_start_text mode=1 ] +# +ドピュドピュドピュッ![p] +#亜紀子 +「アァーーーーッ!ダメェーーーーっ♥」[p] +#勝野 +「う・・・しまる・・・っ」[p] +# +ドピュッ・・・ビュルビュルッ![p] +#亜紀子 +「アッ・・・ンンーッ♥」[p] +#勝野 +「ダメとか言いながら・・・マ○コは最後の一滴まで搾りとろうとしてるじゃねえか」[p] +「子宮が精液を飲んでるのが判るか?」[p] +#亜紀子 +「アァ・・・アフゥ・・・っ♥」[p] +(あぁ・・・奥に・・・いっぱい・・・)[p] +#勝野 +「ふう・・・出た出た」[p] +# +ヌポンッ[p] +#亜紀子 +「ハァ・・・ハァ・・・・」[p] +#勝野 +「ほれ」[p] +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro112-3.jpg" ] +[tb_start_text mode=1 ] +#亜紀子 +「ンッ・・・レロッレロッ・・・♥」[p] +#勝野 +「ククク、いちいち言わなくても掃除フェラするようになったな」[p] +「美味そうに舐めやがって」[p] +#亜紀子 +「くっ・・・レロレロ・・・チュバッ♥」[p] +#勝野 +「やっぱりニュース読み終わってすぐの女子アナに局内で中出しセックスするのは最高だな」[p] +「お前も局内の方が興奮するんじゃないのか?なにせ変態だからな」[p] +#亜紀子 +「レロッ・・・チュプッ・・・ゴクッ♥・・・そ、そんなこと・・・」[p] +#勝野 +「ほれ、休むな」[p] +#亜紀子 +「ンッ・・・レロレロ・・・チュゥ♥」[p] +#勝野 +「お前にはもっとカメラの前で身体を張ってもらうからな」[p] +「俺の持ってる深夜番組でも色々お前を使った企画を考えてるところだ」[p] +#亜紀子 +「チュバッ・・・レロレロレロッ♥」[p] +(そんな・・・)[p] +(これ以上恥ずかしいことをテレビでさせられたら・・・どうなってしまうの)[p] +#勝野 +「ククク、楽しみにしておけよ」[p] +# +・・・・・・[p] +・・・[p] +[_tb_end_text] + +[stopbgm time="1000" ] +[tb_replay id="reps10" ] +[jump storage="scene9.ks" target="" ] diff --git a/data/scenario/scene9.ks b/data/scenario/scene9.ks new file mode 100644 index 0000000..6a26c78 --- /dev/null +++ b/data/scenario/scene9.ks @@ -0,0 +1,1170 @@ +[_tb_system_call storage=system/_scene9.ks] + +[mask time="1000" effect="fadeIn" color="0x000000" ] +[bg time="1000" method="crossfade" storage="hiro201.jpg" ] +[chara_show name="美里" time="1000" wait="true" storage="chara/1/hiro258-1.png" width="537" height="1343" left="336" top="16" reflect="false" ] +[tb_show_message_window ] +[mask_off time="1000" effect="fadeOut" ] +[playbgm volume="80" time="1000" loop="true" storage="neonpurple.ogg" ] +[tb_start_text mode=1 ] +# +翌日―――[p] +#亜紀子 +(はぁ・・・)[p] +(昨日の事がやっぱりネットで話題になってるわ・・・)[p] +(『千山亜紀子ニュース本番でパンツ見せつけ開脚』『千山亜紀子露出狂か!?』etc・・・)[p] +(好きでやってるわけじゃないのに・・・世間にはそんなことわからないから仕方ないけど)[p] +(誰が露出狂よ!・・・たしかに見られて感じてたのは事実だけど・・・)[p] +(だからってこんなことで注目されて人生を無茶苦茶にしたいわけじゃないわ)[p] +(・・・問題は勝野よ。もっと露出を増やすみたいなこと言ってたし・・・なんとか止めないと)[p] +(これ以上エッチなキャラが定着したら、もう二度とキャスターには戻れないわ)[p] +(でも勝野をどうやって・・・)[p] +(・・・あ、なんかオッパイが張ってきたわ・・・)[p] +(本番にはまだ時間があるけど・・・この感じだと結構危ないかも)[p] +(・・・勝野に搾ってもらうしかないわ・・・)[p] +(仕方がない、勝野に頼みましょう)[p] +[_tb_end_text] + +[stopbgm time="1000" ] +[mask time="1000" effect="fadeIn" color="0x000000" ] +[chara_hide name="美里" time="00" wait="true" pos_mode="true" ] +[bg time="000" method="crossfade" storage="hiro202.jpg" ] +[chara_show name="美里" time="00" wait="true" storage="chara/1/hiro258-1.png" width="457" height="1143" left="234" top="39" reflect="false" ] +[chara_show name="勝野" time="00" wait="true" storage="chara/5/hiro256-1.png" width="500" height="1200" left="648" top="-18" reflect="false" ] +[mask_off time="1000" effect="fadeOut" ] +[playbgm volume="60" time="1000" loop="true" storage="枯れ葉が集う路地裏通り_2.ogg" ] +[tb_start_text mode=1 ] +#勝野 +「お前から呼び出すなんて珍しいな」[p] +「どうした、急にチンポが欲しくなったか?」[p] +#亜紀子 +「ち、違うわ。そ、その・・・」[p] +「お、オッパイが・・・」[p] +#勝野 +「あぁ・・・乳が張ってきたのか。本番まで持たないのか?」[p] +#亜紀子 +「わからないけど、ちょうど危ないかも・・・」[p] +#勝野 +「本番に溢れそうなのか。そりゃ面白そうだ、ククク」[p] +#亜紀子 +「そ、そんなの嫌よ。搾ってちょうだい・・・!」[p] +#勝野 +「ふっ、そんな頼み方じゃダメだ。学習しろよ」[p] +#亜紀子 +「く・・・ご、ご主人様、オッパイが張って・・・母乳が出そうです。どうかこのドスケベな家畜を・・・搾乳してくださいませ・・・っ」[p] +#勝野 +「ククク、上手く言えるようになったじゃねえか」[p] +「でもダメだ」[p] +#亜紀子 +「そ、そんな・・・!」[p] +#勝野 +「ククク、あわてるな。乳は搾ってやるよ。ただし俺じゃないがな」[p] +「ちょうど面白い遊びを考えていたんだ」[p] +#亜紀子 +「えっ、遊び・・・?ど、どういうこと・・・?」[p] +#勝野 +「ADの谷田いるだろ。お前にくびったけの」[p] +#亜紀子 +「谷田君・・・?彼がいったい・・・」[p] +#勝野 +「あいつにお前の乳を搾らせてやるのさ」[p] + +[_tb_end_text] + +[chara_mod name="美里" time="600" cross="false" storage="chara/1/hiro258-5.png" ] +[tb_start_text mode=1 ] +#亜紀子 +「ええっ!?そ、そんなの無理よ!」[p] +#勝野 +「これは命令だ。お前に拒否権なんかねえ」[p] +#亜紀子 +「そ、そんな・・・!」[p] +#勝野 +「あいつは前からお前に夢中だったからな。最近のお前の格好見て毎日オナニーが止まらんだろう」[p] +「かわいそうだからちょっと美味しい目を見せてやろうと思ってな」[p] +「谷田のこと嫌いか?」[p] +#亜紀子 +「き、嫌いじゃないけど・・・」[p] +#勝野 +「じゃあいいじゃねえか。なにも谷田にこれからも調教に加わってもらおうって気はねえ」[p] +「ちょっとした遊びさ」[p] +#亜紀子 +「で、でも・・・」[p] +[_tb_end_text] + +[chara_mod name="美里" time="00" cross="false" storage="chara/1/hiro258-1.png" ] +[tb_start_text mode=1 ] +#勝野 +「プランは2つ考えてきてあるんだが・・・プランA、プランBとするか」[p] +「これがどっちも捨てがたいんだよ。よし、お前が好きなほうを選んでいいぞ」[p] +#亜紀子 +「えっ・・・そんなこと言われても・・・」[p] +「内容がわからないと選びようがないわ」[p] +#勝野 +「そうだな・・・プランAはお前の演技力が必要だが、リスクは少ない」[p] +「プランBは運がよければなにも起こらないかもしれないが、リスクは高いな」[p] +「さぁどっちが良い?」[p] +#亜紀子 +「り、リスクって・・・一体なにを・・・」[p] +(どうしよう・・・どっちを選んだからいいのかしら?)[p] +[_tb_end_text] + +[stopbgm time="1000" ] +[glink color="black" storage="scene9.ks" size="20" text="プランA(演技力)" x="479" y="325" width="" height="" _clickable_img="" target="*s9a" ] +[glink color="black" storage="scene9.ks" size="20" text="プランB(運次第)" x="481" y="411" width="" height="" _clickable_img="" target="*s9b" ] +[s ] +*s9a + +[tb_start_text mode=1 ] +#亜紀子 +(リスクが少ない・・・安全ってことよね)[p] +「じゃあ・・・A・・・で」[p] +#勝野 +「Aか、よし。それじゃ作戦を教えるから覚えろよ」[p] +#亜紀子 +「・・・」[p] +[_tb_end_text] + +[mask time="1000" effect="fadeIn" color="0x000000" ] +[chara_mod name="美里" time="00" cross="true" storage="chara/1/hiro258-5.png" ] +[chara_mod name="勝野" time="00" cross="true" storage="chara/5/hiro256-3.png" ] +[mask_off time="1000" effect="fadeOut" ] +[playbgm volume="100" time="1000" loop="true" storage="枯れ葉が集う路地裏通り_2.ogg" ] +[tb_start_text mode=1 ] +#勝野 +「・・・って感じだ。わかったか?」[p] +#亜紀子 +「そ、そんなの・・・無理よ・・・」[p] +#勝野 +「拒否権は無いって言ったろ」[p] +「なに大丈夫さ。あいつはお前を崇拝してるからお前が巧くやれば普通に終るよ」[p] +#亜紀子 +「そんなこと言っても・・・」[p] +#勝野 +「部屋に隠しカメラをセットしておくからな。ちゃんと台本どおりやらないとお仕置きだぞ」[p] +「それじゃ上手くやれよ」[p] +[_tb_end_text] + +[chara_hide name="勝野" time="1000" wait="true" pos_mode="false" ] +[tb_start_text mode=1 ] +#亜紀子 +「あぁ・・・やるしかないのね・・・」[p] +# +・・・・・・[p] +・・・[p] +[_tb_end_text] + +[tb_hide_message_window ] +[stopbgm time="1000" ] +*rep11 + +[tb_replay_start ] +[mask time="1000" effect="fadeIn" color="0x000000" ] +[bg time="000" method="crossfade" storage="hiro203.jpg" ] +[tb_show_message_window ] +[chara_hide_all time="1000" wait="true" ] +[chara_show name="谷田" time="1000" wait="true" storage="chara/4/hiro259-2.png" width="391" height="939" left="707" top="14" reflect="false" ] +[chara_show name="美里" time="1000" wait="true" storage="chara/1/hiro258-2.png" width="479" height="1198" left="227" top="29" reflect="false" ] +[mask_off time="1000" effect="fadeOut" ] +[playbgm volume="100" time="1000" loop="true" storage="neonpurple.ogg" ] +[tb_start_text mode=1 ] +#谷田 +「ち、千山さん、頼みたいことってなんですか?」[p] +「千山さんのためなら、な、なんでもやりますよ・・・!」[p] +#亜紀子 +「あ・・・そ、そう・・・えーっと・・・その・・・」[p] +#谷田 +「な、なんですか?」[p] +「お、お金なら僕もってませんけど」[p] +#亜紀子 +「ち、違うわ。お金じゃなくて・・・えっと・・・」[p] +#谷田 +「そ、そうですよね。よかった」[p] +「それじゃ、なんですか?なんでも言ってください!」[p] +#亜紀子 +「そ、その・・・ぼ、母乳を・・・」[p] +#谷田 +「え?」[p] +#亜紀子 +「あの・・・母乳を搾ってほしいの」[p] +#谷田 +「えっ、ぼ、母乳・・・?えっ?」[p] +#亜紀子 +「その・・・わたし、体質で母乳が出るの」[p] +「それで、自分では上手く搾れないから、谷田くんに搾ってもらえないかって・・・」[p] +#谷田 +「ぼ、母乳を搾る・・・!?」[p] +「えっ、ど、ど、ど、どういう・・・」[p] +#亜紀子 +「あ、その・・・」[p] +#谷田 +「えっ、あ、冗談ですか!?そ、そうですよね」[p] +「母乳なんておかしいし・・・ドッキリみたいなやつですか?」[p] +#亜紀子 +「違うのっ・・・あの・・・」[p] +「ん・・・っ」[p] +#谷田 +「えっ!?ちょ、ち、千山さん・・・!?」[p] +[_tb_end_text] + +[chara_hide name="美里" time="300" wait="true" pos_mode="false" ] +[stopbgm time="1000" ] +[playbgm volume="100" time="1000" loop="true" storage="SO_SAD.ogg" ] +[chara_show name="美里" time="1000" wait="true" storage="chara/1/hiro261-4.png" width="466" height="1165" left="174" top="40" reflect="false" ] +[chara_mod name="谷田" time="00" cross="false" storage="chara/4/hiro259-3.png" ] +[tb_start_text mode=1 ] +#谷田 +「あ、あ、あ、わ・・・」[p] +「ど、ど、ど、どうしたんですか、ち、千山さん・・・っ!」[p] +「な、なんで裸に・・・!?」[p] +#亜紀子 +「ぬ、脱がないと母乳を搾れないから・・・」[p] +#谷田 +「え、ぼ、母乳って本当に・・・?」[p] +「で、でも・・・なんで全部脱ぐんですか・・・?」[p] +#亜紀子 +「母乳で汚れちゃったら困るでしょ。そ、それで一応全部脱いだのよ」[p] +#谷田 +「そ、そうなんですか?・・・す、すごい・・・千山さんの裸・・・ゴクリ」[p] +「お、おっぱい・・・すごっ・・・!」[p] +#亜紀子 +「は、恥ずかしいからあんまり見ないで・・・」[p] +#谷田 +「す、すいません・・・ハァハァ」[p] +#亜紀子 +「そ、それでね・・・あの、わ、わたしだけ裸じゃ恥ずかしいから・・・谷田君も脱いで欲しいの」[p] +#谷田 +「えっ!?ぼ、ボクもですか!?」[p] +「で、でも・・・」[p] +#亜紀子 +「お、お願い。ねっ」[p] +#谷田 +「わ、わかりました・・・っ!」[p] +[_tb_end_text] + +[chara_hide_all time="1000" wait="true" ] +[bg time="1000" method="crossfade" storage="hiro999.jpg" ] +[tb_start_text mode=1 ] +#谷田 +「ぜ、全部ですよね?」[p] +#亜紀子 +「え、ええ、全部脱いで・・・」[p] +#谷田 +「は、はいっ。・・・脱ぎました!」[p] +#亜紀子 +「あ、ありがとう」[p] +(あぁ・・・すごい・・・ビンビンに勃起してるわ・・・)[p] +#谷田 +「そ、それで・・・母乳を搾るって・・・どうすれば?」[p] +#亜紀子 +「えっと・・・搾るっていうより・・・その・・・す、吸ってほしいの」[p] +#谷田 +「えっ!?」[p] +「す、吸う!?・・・ぼ、母乳を・・・!?」[p] +#亜紀子 +「え、ええ・・・その方が出やすいから・・・」[p] +「こ、こっちへ来て。・・・ここに仰向けに・・・頭をここに・・・」[p] +#谷田 +「は、はい・・・っ!」[p] + +[_tb_end_text] + +[stopbgm time="1000" ] +[bg time="1000" method="crossfade" storage="hiro139-1.jpg" ] +[playbgm volume="100" time="1000" loop="true" storage="music16.ogg" ] +[tb_start_text mode=1 ] +#谷田 +「ハァァァ・・・!千山さんとこんな・・・ゆ、夢じゃないのか・・・ハァハァ」[p] +「ほ、本当にす、す、吸っていいんですか・・・?」[p] +#亜紀子 +「ええ・・・す、吸ってちょうだい」[p] +#谷田 +「は、はい・・・ん・・・ハムッ」[p] +#亜紀子 +「アッ・・・♥」[p] +#谷田 +「チューーーッ・・・ンムーーーッ」[p] +#亜紀子 +「ンッ・・・アンッ♥」[p] +#谷田 +「チューーーッ・・・チューーーッ・・・ンッ!?」[p] +「チューーッ!ゴクッ・・・ゴクッ」[p] +#亜紀子 +「ンンッ・・・アフッ♥」[p] +#谷田 +「チューーッ!チューーッ!・・・ゴクッ・・・プハーーッ!」[p] +「ほ、本当に母乳だ・・・千山さんの母乳・・・ムチューーーーッ!」[p] +#亜紀子 +「アンッ・・・ハァッ・・・ンンッ♥」[p] +(あぁ・・・谷田君のおチンチン・・・あんなにビクンビクンして・・・)[p] +(あれを・・・手で・・・しないといけないのよね・・・)[p] +# +スッ・・・[p] +#谷田 +「チュウウーーッ・・・!?」[p] +「プハッ・・・えっ!?ち、千山さん・・・!?」[p] +#亜紀子 +「あ・・・あの、母乳を搾ってくれてるお礼に・・・わ、わたしもミルクを搾らせて♥」[p] +# +サスッサスッサスッ[p] +#谷田 +「おぉぉぉおおお・・・っ」[p] +「そ、そんなことされたら・・・す、すぐに・・・出ちゃ・・・」[p] +#亜紀子 +「ほ、ほらオッパイをちゃんと吸って・・・」[p] +#谷田 +「ンプッ・・・ンムーーー・・・チュゥ・・・チューーッ・・・ゴクッ」[p] +「チューーーッ!ゴクッ・・・チューーーッ!ゴクッ・・・」[p] +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro139-2.jpg" ] +[tb_start_text mode=1 ] +#亜紀子 +「アンッ・・・ンッ♥」[p] +# +シュッシュッシュッ・・・[p] +#谷田 +「ンンーーーーッ!ンムーーーッ・・・チューーーッ」[p] +「ゴクッ・・・ゴクッ・・・チュバッ・・・あぁっ・・・やばいです・・・っ!」[p] +#亜紀子 +「ハァッ・・・ハァッ・・・アフッ♥」[p] +「ミ、ミルク・・・いっぱい出して・・・っ♥」[p] +# +シュッシュッシュッシュッ・・・[p] +#谷田 +「う・・・ンムッ・・・チューーーッ!ゴクッ」[p] +「チューーッ!ゴクッゴクッ!チューーーーッ」[p] +#亜紀子 +「アヒッ・・・ンッ・・・アンッ♥」[p] +# +シュッ!シュッ!シュッ![p] +#谷田 +「ンンーーーッ!ゴクッゴクッ」[p] +「ンムーーーーーッ!(出るーーーーっ!)」[p] +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro139-3.jpg" ] +[tb_cg id="139" ] +[tb_start_text mode=1 ] +# +ドピュッ!![p] +#亜紀子 +「あっ・・・♥」[p] +#谷田 +「ンンーーーーッ!」[p] +「チューーーーッ!チューーーッ!」[p] +# +ドピュピュピュッ![p] +#亜紀子 +「ンンーーッ!アッ・・・・ハンッ♥」[p] +# +ピュッ・・・ピュピュッ[p] +#谷田 +「ンムーーーッ・・・ゴクッ・・・ゴクッ・・・」[p] +「プハッ・・・ハァッ・・・ハァッ・・・」[p] +#亜紀子 +「ハァ・・・アフゥ・・・」[p] +(一回出したのに・・・まだカチカチだわ・・・)[p] +#谷田 +「ハァ・・・フゥッ・・・ち、千山さん・・・」[p] +「あ、あの・・・ボク・・・」[p] +#亜紀子 +「あっ・・・た、谷田君、ありがとう。母乳吸ってもらってだいぶ・・・楽になったわ」[p] +#谷田 +「えっ・・・あ、はい」[p] +#亜紀子 +「あ・・・ありがとうね」[p] +(どうしよう・・・もう一回しないといけないんだけど・・・)[p] +#谷田 +「いえっ、全然!ボクでよければいつでも・・・っ!」[p] +#亜紀子 +「そ、そうね・・・ええ・・・」[p] +(勝野に手の後、口でもう一回してやれって言われてるのよね・・・)[p] +#谷田 +「あ、あの・・・母乳・・・お、美味しかったです!」[p] +#亜紀子 +「えっ!?あ、ええ・・・あ、ありがとう・・・」[p] +「そ、それでね・・・谷田君」[p] +#谷田 +「はい、なんですか?」[p] +#亜紀子 +「そ、その・・・お、お礼に・・・」[p] +「ぼ、母乳を吸ってくれたお礼に・・・た、谷田君のミルクも飲んであげる♥」[p] +(わ、わたし何言ってるのかしら・・・?)[p] +#谷田 +「えっ!?なっ・・・」[p] +#亜紀子 +「ねっ、谷田君のミルク飲ませて・・・っ♥」[p] +(こうなったらヤケクソよ!)[p] +#谷田 +「えっ・・・う、うわっ!」[p] +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro140-1.jpg" ] +[tb_start_text mode=1 ] +#亜紀子 +「ん・・・ハムッ♥」[p] +#谷田 +「うわっ・・・ち、千山さん・・・っ!」[p] +#亜紀子 +「チュバ・・・チュム・・・っ♥」[p] +#谷田 +「あぁ・・・ち、千山さんの・・・舌が・・・っ!」[p] +#亜紀子 +「チュプッ・・・レロレロレロン♥」[p] +(あぁ・・・なんて恥ずかしい格好なの・・・)[p] +#谷田 +「お・・・ぅ・・・ち、千山さんの・・・アソコ・・・ハァッハァッ」[p] +#亜紀子 +「チュプッ・・・チュバッ・・・ンムッ♥」[p] +(あぁ・・・見られてる・・・わたしのアソコ・・・)[p] +#谷田 +「ハァッ・・・ハァッ・・・ペロッ・・・」[p] +#亜紀子 +「ンンッ・・・ンフゥッ♥」[p] +「チュ・・・チュポッ・・・アンッ・・・イヤァッ♥」[p] +# +ムギュッ[p] +#谷田 +「ンブッ!?ンムーーーッ!」[p] +#亜紀子 +「ハァッ・・・ハムッ・・・ンチュッ♥」[p] +(あぁ・・・恥ずかしすぎて・・・顔にアソコを押し付けちゃった・・・)[p] +# +ムギューー[p] +#谷田 +「ンムーーッ・・・プフーーーッ!」[p] +「フーッ・・・フーッ・・・レロレロレロッ」[p] +#亜紀子 +「ンンッ!?・・・チュムッ・・・レロレロッ♥」[p] +(あぁ・・・谷田君の舌が・・・っ)[p] +#谷田 +「ンフーーッ・・・レロレロレロッ・・・チュバチュバッ!」[p] +#亜紀子 +「ンンーーッ!・・・チュブッ・・・ジュプッ♥」[p] +(は、早くイかせないと・・・っ)[p] + + +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro140-2.jpg" ] +[tb_start_text mode=1 ] +#亜紀子 +「ジュプッ!ジュポッ!チュブッ♥」[p] +#谷田 +「ンフーーーッ!ンフーーーッ!」[p] +「ベロベロベロッ・・・ズチュチュチュッ!」[p] +#亜紀子 +「ンフッ!・・・ジュプッ!ジュポッ!ジュポッ!」[p] +(唇をオ○ンコのようにして・・・全体を・・・)[p] +#谷田 +「ンムーーーッ!ジュパジュパチュバッ!」[p] +#亜紀子 +「ジュプッ!チュバッ!チュポッ!」[p] +(同時に舌でも・・・敏感な部分を・・・)[p] +#谷田 +「ンンーーーッ・・・レロレロレロレロッ!」[p] +#亜紀子 +「ンンーーッ♥」[p] +(早く・・・イかさないと・・・イかされちゃう・・・っ♥)[p] +「・・・ジュプッ!ジュポッ!チュバッ!チュプッ!」[p] +#谷田 +「ンフッ!?・・・ンンーーーッ!」[p] + +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro140-3.jpg" ] +[tb_cg id="140" ] +[tb_start_text mode=1 ] +# +ドピュッ!![p] +#亜紀子 +「ングッ!?・・・ンムーーーッ・・・ゴキュッ♥」[p] +(なにこの量・・・さっきより多いんじゃ・・・)[p] +「ンチューーーッ・・・ゴキュッゴキュッ♥」[p] +#谷田 +「ンムーーー・・・プフーーーッ!」[p] +「ハァッ・・・ち、千山さんが・・・ボクのザーメンを・・・っ!」[p] +# +ビュルビュル・・・ッ![p] +#亜紀子 +「ンンッ・・・ズズズッ・・・ゴクッ♥」[p] +#谷田 +「アフゥ・・・ッ」[p] +# +ピュピュピュッ・・・[p] +#亜紀子 +「ン・・・チュゥ・・・ゴクッ♥」[p] +「ズズッ・・・チュムッ・・・ゴクンッ♥」[p] +#谷田 +「ち、チンコが・・・溶けて無くなりそう・・・」[p] +#亜紀子 +「ズズッ・・・ゴクッ♥」[p] +「チュバ・・・チュポンッ♥」[p] +「ハァ・・・ハァ・・・」[p] +(あぁ・・・いっぱい飲んじゃった・・・谷田君の精液・・・)[p] +#谷田 +「はぁ・・・はぁ・・・これは・・・夢なのか・・・?」[p] +[_tb_end_text] + +[stopbgm time="1000" ] +[mask time="1000" effect="fadeIn" color="0x000000" ] +[bg time="1000" method="crossfade" storage="hiro203.jpg" ] +[chara_show name="美里" time="000" wait="true" storage="chara/1/hiro258-2.png" width="555" height="1388" left="166" top="11" reflect="false" ] +[chara_show name="谷田" time="00" wait="true" storage="chara/4/hiro259-2.png" width="461" height="1106" left="705" top="-17" reflect="false" ] +[mask_off time="1000" effect="fadeOut" ] +[playbgm volume="100" time="1000" loop="true" storage="bluenoise.ogg" ] +[tb_start_text mode=1 ] +#谷田 +「あ、あの・・・」[p] +#亜紀子 +「え・・・」[p] +#谷田 +「あ・・・いや・・・」[p] +#亜紀子 +「・・・・・・」[p] +「あっ・・・時間が・・・。そろそろ本番に行かないと」[p] +#谷田 +「あっ・・・そ、そうですね!」[p] +「い、急がないと・・・」[p] +#亜紀子 +「あ、谷田君・・・このことは他の人には・・・」[p] +#谷田 +「あっ・・・はいっ。わ、わかってます。だ、誰にも言いません!」[p] +#亜紀子 +「ぜ、絶対・・・お願いね」[p] +#谷田 +「は、はいっ・・・」[p] +「そ、それじゃボクは先に・・・」[p] +[_tb_end_text] + +[chara_move name="谷田" anim="true" time="300" effect="linear" wait="true" left="1017" top="-17" width="461" height="1106" ] +[tb_start_text mode=1 ] +#亜紀子 +「あっ・・・谷田君!」[p] +(最後の指令をやらないと・・・)[p] +#谷田 +「えっ、なんですか?」[p] +[_tb_end_text] + +[chara_move name="谷田" anim="false" time="300" effect="linear" wait="true" left="657" top="-17" width="461" height="1106" ] +[tb_start_text mode=1 ] +#亜紀子 +「あ・・・その・・・」[p] +#谷田 +「・・・?」[p] +#亜紀子 +(えーい・・・やるしかないわ・・・!)[p] +「た、谷田君のミルク、とっても美味しかったわっ」[p] +[_tb_end_text] + +[chara_move name="美里" anim="true" time="300" effect="linear" wait="true" left="536" top="53" width="555" height="1388" ] +[tb_start_text mode=1 ] +# +チュッ♥[p] +[_tb_end_text] + +[chara_move name="美里" anim="true" time="300" effect="linear" wait="true" left="55" top="10" width="555" height="1388" ] +[chara_mod name="谷田" time="00" cross="true" storage="chara/4/hiro259-3.png" ] +[tb_start_text mode=1 ] +#谷田 +「えっ・・・!?」[p] +#亜紀子 +「じゃ、じゃあわたしは行くわね・・・!」[p] + +[_tb_end_text] + +[chara_hide name="美里" time="1000" wait="true" pos_mode="true" ] +[tb_start_text mode=1 ] +#谷田 +「あっ・・・千山さん!」[p] +「・・・・・・」[p] +「千山さん・・・」[p] +# +・・・・・・[p] +・・・[p] + +[_tb_end_text] + +[stopbgm time="1000" ] +[tb_replay id="reps11" ] +[mask time="1000" effect="fadeIn" color="0x000000" ] +[chara_hide name="谷田" time="1000" wait="false" pos_mode="false" ] +[bg time="1000" method="crossfade" storage="hiro202.jpg" ] +[chara_show name="美里" time="1000" wait="true" storage="chara/1/hiro258-1.png" width="525" height="1313" left="158" top="24" reflect="false" ] +[mask_off time="1000" effect="fadeOut" ] +[playbgm volume="100" time="1000" loop="true" storage="bluenoise.ogg" ] +[tb_start_text mode=1 ] +#亜紀子 +(あぁ・・・恥ずかしかった・・・)[p] +(谷田君とあんなことするなんて・・・夢だったらいいのに・・・)[p] +(明日から谷田君とどんな顔で会ったらいいのよ・・・)[p] + +[_tb_end_text] + +[chara_show name="勝野" time="1000" wait="true" storage="chara/5/hiro256-3.png" width="531" height="1275" left="630" top="-26" reflect="false" ] +[tb_start_text mode=1 ] +#勝野 +「どうだ、ちゃんとシナリオ通りにやったか?」[p] +#亜紀子 +「・・・ちゃんとやったわ」[p] +#勝野 +「ククク、谷田のやつどんな反応したか・・・映像をチェックするのが楽しみだぜ」[p] +#亜紀子 +「・・・・・・」[p] +#勝野 +「カメラを回収してくるか。ほれ、お前は早く行かないと本番に遅れるぞ」[p] +#亜紀子 +「え、ええ・・・」[p] +[_tb_end_text] + +[chara_hide name="美里" time="1000" wait="true" pos_mode="true" ] +[bg time="1000" method="crossfade" storage="hiro203.jpg" ] +[tb_start_text mode=1 ] +#勝野 +「さてと、隠しカメラを回収して・・・と」[p] +「・・・あれ?」[p] +[_tb_end_text] + +[chara_mod name="勝野" time="200" cross="false" storage="chara/5/hiro256-2.png" ] +[tb_start_text mode=1 ] +#勝野 +「しまった、電源が切れてるじゃねえか!」[p] +「くそっ、せっかくあいつの演技と谷田の顔を見てやりたかったのによ・・・」[p] +[_tb_end_text] + +[chara_mod name="勝野" time="200" cross="false" storage="chara/5/hiro256-1.png" ] +[tb_start_text mode=1 ] +#勝野 +「・・・まぁいい、あいつは撮られてたと信じてるし、ちゃんとやったはずだろう」[p] +「また今度他の男に抱かせるのも面白いな。金とか取ってもいいし。まだまだあいつで遊べるぜ」[p] +# +・・・・・・[p] +・・・[p] +[_tb_end_text] + +[stopbgm time="1000" ] +[jump storage="scene9.ks" target="*s9end" ] +*s9b + +[tb_eval exp="f.tp=1" name="tp" cmd="=" op="t" val="1" val_2="undefined" ] +[playbgm volume="100" time="1000" loop="true" storage="bluenoise.ogg" ] +[tb_start_text mode=1 ] +#亜紀子 +(運次第ではなにも起こらないかもしれない・・・それに賭けて見るしかないわ)[p] +「じゃあ・・・プランBで」[p] +#勝野 +「ククク、Bを選ぶか。なかなかのギャンブラーだな」[p] +「よし、それじゃついて来い」[p] +#亜紀子 +「え・・・どこへ・・・」[p] +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro203.jpg" ] +[tb_start_text mode=1 ] +#勝野 +「ここでいいだろ。よし、脱げ」[p] +#亜紀子 +「えっ・・・」[p] +#勝野 +「全裸になるんだよ。早くしろ」[p] +#亜紀子 +「く・・・はい」[p] + +[_tb_end_text] + +[chara_hide name="美里" time="1000" wait="true" pos_mode="false" ] +[chara_show name="美里" time="1000" wait="true" storage="chara/1/hiro261-1bk.png" width="501" height="1253" left="119" top="27" reflect="false" ] +[tb_start_text mode=1 ] +#亜紀子 +「ぬ、脱いだわ・・・」[p] +#勝野 +「よし、それじゃ準備をするか」[p] +#亜紀子 +「えっ・・・あっ・・・!?」[p] +[_tb_end_text] + +[tb_hide_message_window ] +[stopbgm time="1000" ] +*rep12 + +[tb_replay_start ] +[mask time="1000" effect="fadeIn" color="0x000000" ] +[chara_hide_all time="1000" wait="true" ] +[bg time="1000" method="crossfade" storage="hiro127-2.jpg" ] +[tb_show_message_window ] +[mask_off time="1000" effect="fadeOut" ] +[playbgm volume="100" time="1000" loop="true" storage="SO_SAD.ogg" ] +[tb_start_text mode=1 ] +#勝野 +「・・・よし、これで準備完了だ」[p] +「ククク、オムツがよく似合ってるぜ」[p] +#亜紀子 +「ンーーーーーッ!ンンーーーーッ!」[p] +(イヤァーッ!こんなの・・・っ!)[p] +#勝野 +「手錠は自分では指が届かなくて外せないが、他人がやれば簡単にはずせるようになってるからな」[p] +「谷田に外してもらえればそれで終わりだ。裸は見られるがな」[p] +「あとは谷田の理性が勝つか欲望が勝つかだな。クヒヒヒ」[p] +#亜紀子 +「ンンッ・・・ン・・・」(そんな・・・)[p] +#勝野 +「隠しカメラをここにセットして・・・と」[p] +「谷田を匿名メールでここに呼び出すから、そしたらゲームスタートだ」[p] +「ククク、谷田のやつどんな反応するか・・・楽しみだぜ」[p] +#亜紀子 +「ンーーーッ・・・ウゥ・・・」(あぁ・・・イヤァ・・・なんでこんなことを・・・)[p] +#勝野 +「それじゃな、幸運を祈るぜ。クックックック」[p] +#亜紀子 +「ンンーーーーッ!ンンーーーッ!」(ま、待って・・・!行かないでぇ・・・!!)[p] + + +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro127-1.jpg" ] +[tb_start_text mode=1 ] +#亜紀子 +(あぁ・・・行っちゃった・・・)[p] +(も、もうすぐここに谷田君が・・・来る・・・!)[p] +(ハァッハァッ・・・なんとか逃げられないかしら)[p] +# +ガチャガチャッ![p] +#亜紀子 +(ダメだわ・・・外れない!)[p] +(ああ、谷田君が来ちゃう・・・!)[p] +# +ドクッドクッドクッドクッ[p] +#亜紀子 +(心臓が・・・ものすごいスピードで打ってるわ)[p] +(も、もし・・・他の人が入ってきたら・・・!?)[p] +(人生が終っちゃう・・・っ!)[p] +(あぁ・・・!)[p] +[_tb_end_text] + +[bg time="0" method="crossfade" storage="hiro203.jpg" ] +[chara_show name="谷田" time="1000" wait="true" storage="chara/4/hiro259-1.png" width="484" height="1162" left="358" top="-9" reflect="false" ] +[tb_start_text mode=1 ] +# +ガチャッ[p] +#谷田 +「誰か知らないけどこんなところに何が・・・」[p] +[_tb_end_text] + +[chara_mod name="谷田" time="00" cross="true" storage="chara/4/hiro259-3.png" ] +[tb_start_text mode=1 ] +#谷田 +「エッ・・・う、ウワッ!!?」[p] +「えっ、ち、千山さん・・・!?」[p] +[_tb_end_text] + +[chara_hide_all time="1000" wait="false" ] +[bg time="1000" method="crossfade" storage="hiro127-2.jpg" ] +[tb_start_text mode=1 ] +#亜紀子 +「ンーーーーッ!!」(た、谷田君!!)[p] +#谷田 +「ち、千山さん・・・ど、どうしたんですか!?」[p] +「こんなところで何を・・・っていうか、は、裸で・・・!」[p] +#亜紀子 +「ンーーーーッ!ンンッ・・・」(み、見ないでぇーーっ!)[p] +#谷田 +「い、一体これは・・・。う、動けないんですか・・・?」[p] +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro127-1.jpg" ] +[tb_start_text mode=1 ] +#亜紀子 +「ンンーーーーッ!ンムーーーッ!」(お願い!手錠を外して!)[p] +#谷田 +「え、そ、それ・・・紙オムツ!?」[p] +「なんでそんなものを・・・」[p] +#亜紀子 +「ンンッ・・・ンムーーーッ!」(オムツはいいから・・・助けてっ!)[p] +#谷田 +「えっ・・・あっ、猿ぐつわでしゃべれないんですね・・・!」[p] +「だ、誰かにやられたんですか?・・・もしかして暴漢が・・・!?」[p] +#亜紀子 +「ンンーーーーッ!」(とにかく外してちょうだい!早く!)[p] +#谷田 +「と、とりあえず・・・口のやつを外したらいいですか・・・?」[p] +「ち、近づいてもいい・・・ですか?」[p] +#亜紀子 +「ンンーーーッ!ンンッ!」(近づいていいから!とにかく外して!)[p] +#谷田 +「ち、近づきますよ・・・」[p] +「ち、千山さんの・・・お、おっぱい・・・ゴクリ」[p] +#亜紀子 +「ンンッ・・・ウウゥ・・・」(あぁそんなに見ないで・・・)[p] +#谷田 +「・・・・・・ジィーーー」[p] +「・・・ハッ!そ、そうだ・・・く、口のやつを外しますね」[p] +「・・・あれ・・・外せないぞ・・・あれっ」[p] +#亜紀子 +「ンムーーッ・・・ンンッ!」(口のはいいから・・・手錠をお願い・・・!)[p] +#谷田 +「かっちりはまってて・・・外せない・・・!」[p] +「どうやって・・・あっ、すいませんっ!」[p] +「お、オッパイに手が・・・ハァッハァッ」[p] +#亜紀子 +「ウー・・・ンムーッ!」(そ、それはいいから・・・手錠を・・・!)[p] +#谷田 +「ハァハァ・・・ち、千山さんの・・・オッパイ・・・ゴクリ」[p] +#亜紀子 +「ンッ・・・ンンッ!?」(た、谷田君・・・!?し、しっかりして!)[p] + +[_tb_end_text] + +[bg time="10" method="crossfade" storage="hiro127-2.jpg" ] +[tb_start_text mode=1 ] +#谷田 +「ハァッハァッ・・・ち、千山さんの・・・ハァハァ」[p] +#亜紀子 +「ンンンーーーッ!ンフーーーッ!」(ちょっと谷田君!は、外してお願い!)[p] +#谷田 +「ちょ・・・ちょっとだけ・・・」[p] +# +モミッ[p] +#亜紀子 +「ンッ!?ンンーーーッ!」(アンッ!や、やめてーーっ!)[p] +#谷田 +「はわっ・・・や、柔らかい・・・っ!」[p] +「も・・・もう・・・うぉぉーっ!」[p] +#亜紀子 +「ンンーーーーーーッ!」(イヤァーーーーッ!)[p] +[_tb_end_text] + +[stopbgm time="1000" ] +[bg time="1000" method="crossfade" storage="hiro127-3.jpg" ] +[playbgm volume="100" time="1000" loop="true" storage="music16.ogg" ] +[tb_start_text mode=1 ] +#谷田 +「ムフォーーーー!ハムッ!」[p] +「ムフーーーーッ!ムフーーーッ!」[p] +#亜紀子 +「ンムーーーーーッ!?ンンーーーーーッ!」(アァーーーッ!ダメェーーーーッ!)[p] +#谷田 +「ハモーーッ!ブチュッ!チュバッ!」[p] +「モミモミモミモミ・・・チューーッ!」[p] +#亜紀子 +「ンムーーーーッ・・・!ンフーーーッ♥」(アンッ・・・吸っちゃ・・・アンンッ♥)[p] +(しょ、正気に返って・・・谷田君・・・アンッ♥)[p] +#谷田 +「フゴッ・・・チュバッ・・・チュバッ!」[p] +「チューーーッチューーーッ!」[p] +#亜紀子 +「ンッ・・・ンンーーーーーーッ!」(そ、そんなに吸ったら・・・っ!で、出ちゃ・・・うっ♥)[p] +#谷田 +「チューーッ!チューーーッ!・・・フモッ!?」[p] +「エッ・・・これ・・・ぼ、母乳!?」[p] +「な、なんで千山さんが・・・子供がいるはずないのに・・・?」[p] +#亜紀子 +「ンンッ・・・ンフゥッ・・・」(あぁ・・・母乳が出ること・・・知られちゃった・・・)[p] +#谷田 +「ち、千山さんの・・・ぼ、ぼ、母乳・・・ふぉおおおっ!」[p] +「ハムッ!チューーーッ・・・ゴクッ!チューーーーッ・・・ゴクッ」[p] +#亜紀子 +「ンンンーーーーッ!ンフーーーーーッ♥」(イヤァーーッ!の、飲まないでェーーーーッ・・・ヤンッ♥)[p] +#谷田 +「チューッ!ゴクッゴクッ!」[p] +「チューーッ!ゴクッ!チューーッ!ゴクッ!・・・ムハーーーッ!」[p] +#亜紀子 +「ンンーーーーーッ!ンフーーーーッ♥」(ダメェーーーーッ!オッパイそんなに強く吸っちゃ・・・アヒィーーーっ♥)[p] +#谷田 +「チュバッ!チュバッ!ムフーーーッ!」[p] +「ンチューーーーッ!ゴクッゴクッ!チューーーーッ!ゴクッツゴクッ!」[p] +#亜紀子 +「ンフゥッ!・・・・ンンンーーーーーーーーッ♥」(アッ・・・ダメェーーーーーッ♥)[p] +# +ジョワワワワワ・・・[p] +#谷田 +「チューーーッ!ゴクゴクッ!」[p] +「チューーーーッ!ゴクゴクッ!」[p] +#亜紀子 +「ンンッ・・・ンフゥッ♥」(あぁ・・・オムツの中で・・・おしっこ・・・出ちゃ・・・った♥)[p] +# +ジョワワワワワ・・・[p] +#谷田 +「チューーーーッ!ゴクッ!チューーーーッ!ゴクッ!」[p] +「ゴクッゴクッ!・・・プハァーーーーッ!」[p] +「ハァッ・・・ハァッ・・・ち、千山さん・・・!」[p] +#亜紀子 +「ンンッ・・・ンフーーッ・・・ンフーーーッ♥」(あんっ・・・谷田君に・・・オッパイ吸われて・・・お漏らししちゃった・・・♥)[p] + +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro127-4.jpg" ] +[tb_start_text mode=1 ] +#谷田 +「ハァッ・・・ハァッ・・・あぁ、なんてことを・・・」[p] +「千山さんのオッパイを、吸ってしまった・・・」[p] +#亜紀子 +「ンンーーーッ!」(いいから・・・手錠を外して!)[p] +#谷田 +「あぁ・・・く、クビだ・・・いや・・・逮捕・・・!?」[p] +#亜紀子 +「ンンーーーッ!ンムーーッ!」[p] +(誰にも言わないから・・・まず手錠を外してちょうだい!)[p] +#谷田 +「もう・・・取り返しがつかない・・・」[p] +「こ・・・こうなったら・・・やけくそだ!」[p] + +[_tb_end_text] + +[bg time="400" method="crossfade" storage="hiro127-5.jpg" ] +[tb_start_text mode=1 ] +#亜紀子 +「ンンーーーーーッ!?」(ダ、ダメェッ!落ち着いて谷田君!誰にも言わないから!)[p] +#谷田 +「こ、この・・・オムツ・・・ハァハァ・・・」[p] +「ぬ、脱がせてあげますね・・・っ!」[p] +#亜紀子 +「ンーーーーーッ!?ンムーーーーッ!!」[p] +(ダメェーーーーッ!そ、それだけはやめてぇーーーーっ!)[p] +#谷田 +「ち、ち、千山さんの・・・アソコ・・・ハァッ・・・ハァッ」[p] + +[_tb_end_text] + +[bg time="400" method="crossfade" storage="hiro127-6.jpg" ] +[tb_start_text mode=1 ] +#亜紀子 +「ンンーーーーーーーッ!」(イヤァアーーーーッ!)[p] +#谷田 +「えっ・・・こ、これは・・・!?」[p] + + +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro127-7.jpg" ] +[tb_cg id="127" ] +[tb_start_text mode=1 ] +#亜紀子 +「ンンーーーッ・・・ンンムーーッ!」(あぁ・・・見られちゃった・・・!)[p] +#谷田 +「こ、これは・・・!?」[p] +「私は・・・ドMの変態です・・・ご、ご自由に・・・?」[p] +#亜紀子 +「ンムーーーーッ!ンフーーーッ!」(谷田君、これは違うの・・・!)[p] +「ンンーーーーッ!ンンーーーーッ!」(自分で書いたんじゃないの!わたしは変態なんかじゃ・・・!)[p] +#谷田 +「も・・・もしかして・・・これって暴漢にやられたとかじゃなくて・・・SMプレイかなんかだったんですか?」[p] +「ち、千山さんが・・・ドM・・・?」[p] +#亜紀子 +「ンンーーーーッ!ブンブンッ」(違うわ!違う!)[p] +#谷田 +「てことは・・・嫌がる振りして、本当は喜んでたんですね・・・っ!?」[p] +#亜紀子 +「ンムーーーッ!ンンーーーッ!」(違うの!谷田君聞いて!)[p] +#谷田 +「まさか・・・千山さんがそんな変態だったなんて・・・!」[p] +「ハァッ・・・ハァッ・・・憧れの千山さんが・・・!」[p] +#亜紀子 +「ンンーーーーッ!ンフーーーーッ!」(違うの!わたしを信じて・・・っ!)[p] +#谷田 +「ハァッハァッご、ご自由に・・・ってことは・・・いいんだよな?」[p] +「グフッ・・・グフフフッ」[p] +#亜紀子 +「ンンーーーーーーッ!ンムゥーーーッ!」(イヤァーーーーっ!ヤメテェーーーーッ!)[p] +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro129-1.jpg" ] +[tb_start_text mode=1 ] +#谷田 +「ふもぉーーーっ!」[p] +#亜紀子 +「ンーーーーッ!ンンーーーーッ!」(イヤァーーーーーッ!ヤメテェーーーーッ!)[p] +#谷田 +「千山さんっ・・・千山さん・・・っ!」[p] +#亜紀子 +「ンムーーーッ!」(離してぇーーっ!)[p] +#谷田 +「ハァッ!ハァッ!・・・これが千山さんの・・・マ・・・マ○コ・・・っ!」[p] +「フッ・・・フンッ・・・あ、あれっ・・・入らないぞ・・・クソッ!」[p] +#亜紀子 +「ンンーーーーッ!ンンーーーッ!」(アァーーーッ!ヤメテェーーーーッ!)[p] +#谷田 +「こ、こうか・・・!?」[p] +# +ズプッ![p] +#亜紀子 +「ンンーーーーーッ!?」(アァーーーーッ!)[p] +#谷田 +「や、やった・・・!は、入った・・・!」[p] +「ち、ち、千山さんと・・・せ、セックス・・・っ!」[p] +#亜紀子 +「ンンーーーッ・・・・ンムーーーーッ!」(あぁぁ・・・谷田君のオチンチンが・・・!)[p] +#谷田 +「ハァッ!ハァッ!・・・す、すごい・・・これが千山さんの・・・!」[p] +「ハァッ・・・フンッ!フンッ!」[p] +# +ズムッ!ズムッ![p] +#亜紀子 +「ンムーーーーーッ!ンンッ!」(あぁ・・・う、動かないでぇ・・・アンッ!)[p] +#谷田 +「す、すごっ・・・熱くて・・・ギュッって・・・ハァッハァッ!」[p] +# +ズチュッ!ズチュッ!ズチュッ![p] +#亜紀子 +「ンンッーーンンンーーーッ♥」(アンッ!アァンーーーッ♥)[p] +#谷田 +「き、気持ちよすぎ・・・っ!ホァァァーーッ!」[p] +# +ズンッ!ズンッ!ズンッ![p] +#亜紀子 +「ンムーーーーーッ!ンンーーーッ♥」(アァーーーッ・・・奥・・・突いちゃ・・・っ!アヒィッ♥)[p] +#谷田 +「ハァッハァッ・・・ち、千山さん・・・っ・・・ハムッ!」[p] +#亜紀子 +「ンンーーーッ!?」(た、谷田君・・・!)[p] +#谷田 +「ブチュゥ!ベロベロベロッ・・・ンムーーッ!」[p] +#亜紀子 +「ンムーーーーッ!ンフゥッ♥」(唇舐めまわさないでぇ・・・ンンッ♥)[p] +#谷田 +「ハムッ・・・ベチュ・・・チュバッ!」[p] +# +ズチュッ!ズチュッ!ズチュッ![p] +#亜紀子 +「ンムーーーーッ・・・ンンンッ♥」(キスしながら・・・奥をズンズンしないでぇ・・・っ♥)[p] + + +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro129-2.jpg" ] +[tb_start_text mode=1 ] +#谷田 +「ハァッハァッ・・・千山さんっ・・・ムチューッ」[p] +# +グチュッ!グチュッ!グチュッ![p] +#亜紀子 +「ンンンーーーッ!ンムゥ・・・っ♥」(アァーーーッ・・・感じちゃう・・・ンンッ♥)[p] +#谷田 +「ハァッハァッハァッ・・・ベロベロベロンッ」[p] +# +ズチュッ!ズチュッ!ズチュッ![p] +#亜紀子 +「ンフーーーッ!ンンッ・・・ンンーッ♥」(谷田君の唾液が・・・く、臭い・・・アァッ♥)[p] +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro129-3.jpg" ] +[tb_start_text mode=1 ] +#谷田 +「ふぉぉおーーーーっ!」[p] +# +パン!パン!パン!パンッ![p] +#亜紀子 +「ンフゥーーーーッ♥」(アヒィーーーッ♥)[p] +#谷田 +「あぁっ、千山さんっ!千山さん・・・っ!」[p] +# +パン!パン!パン!パン!パン!パンッ![p] +#亜紀子 +「ンンーーーーッ!ンフゥーーーーッ♥」(は、激し・・・ッ!・・・イ、イっちゃ・・・っ♥)[p] +#谷田 +「アッ・・・アッ・・・で、出る・・・ッ!」[p] +[_tb_end_text] + +[bg time="1000" method="crossfade" storage="hiro129-4.jpg" ] +[tb_cg id="129" ] +[tb_start_text mode=1 ] +#亜紀子 +「ンンンーーーーーーーッッ♥」(イクーーーーーーーッ♥)[p] +#谷田 +「うっ・・・ハァッ!」[p] +# +ドピュピュピュッ![p] +#亜紀子 +「ン・・・・・・ッ♥ンフゥ・・・ッ♥」(な、中に・・・いっぱい出てる・・・っ♥)[p] +#谷田 +「あ・・・う・・・っ」[p] +# +ビュルビュルビュルッ![p] +#亜紀子 +「ンンッ・・・ンフッ・・・ンッ♥」(あぁ・・・まだ出てる・・・奥に出てる・・・♥)[p] +#谷田 +「ハァッ・・・ハァッツ・・・ブフゥ」[p] +# +ピュ・・・ピュッ[p] +#亜紀子 +「ンフーッ・・・ンフゥッ♥」(谷田君に・・・中出しされて・・・イかされちゃった・・・♥)[p] +# +・・・・・・[p] +・・・[p] + + + + +[_tb_end_text] + +[stopbgm time="1000" ] +[tb_replay id="reps12" ] +[mask time="1000" effect="fadeIn" color="0x000000" ] +[bg time="000" method="crossfade" storage="hiro203.jpg" ] +[chara_show name="谷田" time="1000" wait="true" storage="chara/4/hiro259-3.png" width="500" height="1200" left="340" top="-12" reflect="false" ] +[mask_off time="1000" effect="fadeOut" ] +[playbgm volume="100" time="1000" loop="true" storage="bluenoise.ogg" ] +[tb_start_text mode=1 ] +#谷田 +「は・・・ボ、ボクはなんてことを・・・」[p] +「ち、千山さんを・・・レ、レ、レイ・・・」[p] +「あわ・・・はわわわっ!」[p] +# +[_tb_end_text] + +[chara_move name="谷田" anim="true" time="300" effect="linear" wait="true" left="1146" top="-6" width="500" height="1200" ] +[chara_hide name="谷田" time="1000" wait="true" pos_mode="true" ] +[tb_start_text mode=1 ] +# +・・・・・・[p] +・・・[p] +[_tb_end_text] + +[mask time="1000" effect="fadeIn" color="0x000000" ] +[chara_show name="美里" time="00" wait="true" storage="chara/1/hiro258-1.png" width="536" height="1340" left="168" top="35" reflect="false" ] +[chara_show name="勝野" time="1000" wait="true" storage="chara/5/hiro256-3.png" width="561" height="1347" left="666" top="-37" reflect="false" ] +[mask_off time="1000" effect="fadeOut" ] +[tb_start_text mode=1 ] +#勝野 +「ククク、谷田のやつだいぶハッスルしたみたいだな」[p] +「あわてて逃げていきやがった。小心者のくせに頑張ったぜ」[p] +#亜紀子 +「く・・・うぅ・・・」[p] +#勝野 +「なに泣いてるんだよ。どうせお前だって楽しんだんだろう?」[p] +「谷田のチンポは良かったか?」[p] +#亜紀子 +「た、楽しんでなんか・・・っ!」[p] +#勝野 +「ウソつけ、楽しんだに決まってるぜ。お前はマゾの変態なんだからよ」[p] +#亜紀子 +「ち、違う・・・わたしは変態じゃ・・・」[p] +#勝野 +「まぁいい、後で動画をチェックすれば判ることだ」[p] +「おい、それよりそろそろ行かないとやばいんじゃないのか」[p] +#亜紀子 +「あっ・・・」[p] +#勝野 +「しっかり仕事して来い。淫乱キャスターさんよ、ククク」[p] +#亜紀子 +「くっ・・・」[p] +# + +[_tb_end_text] + +[chara_hide name="美里" time="1000" wait="true" pos_mode="true" ] +[tb_start_text mode=1 ] +#勝野 +「くっくっくっ、あいつもだいぶ奴隷としてこなれてきたな」[p] +「このままプライドの柱を一本一本へし折って、地の底まで落としてやるぜ」[p] +「次はどんな調教をしてやるかな・・・ククク」[p] +# +・・・・・・[p] +・・・[p] +[_tb_end_text] + +[stopbgm time="1000" ] +*s9end + +[chara_hide_all time="1000" wait="true" ] +[jump storage="scene10.ks" target="" ] diff --git a/data/scenario/sr.ks b/data/scenario/sr.ks new file mode 100644 index 0000000..a883495 --- /dev/null +++ b/data/scenario/sr.ks @@ -0,0 +1,50 @@ +[_tb_system_call storage=system/_sr.ks] + +[stopbgm time="1000" ] +[mask time="1000" effect="fadeIn" color="0x000000" ] +[chara_hide_all time="1000" wait="true" ] +[tb_hide_message_window ] +[bg time="1000" method="crossfade" storage="hiro999.jpg" ] +[mask_off time="1000" effect="fadeOut" ] +[playbgm volume="100" time="1000" loop="true" storage="music22.ogg" ] +[tb_ptext_show x="470" y="320" size="35" color="0xffffff" time="2000" face="serif,'游明朝'" text="作画  立方蟹" anim="false" edge="undefined" shadow="undefined" ] +[wait time="1200" ] +[tb_ptext_hide time="2000" ] +[tb_ptext_show x="470" y="320" size="35" color="0xffffff" time="2000" text="CG  立方蟹" anim="false" face="serif,'游明朝'" edge="undefined" shadow="undefined" ] +[wait time="1200" ] +[tb_ptext_hide time="2000" ] +[tb_ptext_show x="426" y="320" size="35" color="0xffffff" time="2000" face="serif,'游明朝'" text="シナリオ  立方蟹" anim="false" edge="undefined" shadow="undefined" ] +[wait time="1200" ] +[tb_ptext_hide time="2000" ] +[tb_ptext_show x="413" y="320" size="35" color="0xffffff" time="2000" face="serif,'游明朝'" text="スクリプト  立方蟹" anim="false" edge="undefined" shadow="undefined" ] +[wait time="1200" ] +[tb_ptext_hide time="2000" ] +[tb_ptext_show x="344" y="300" size="35" color="0xffffff" time="500" text="BGM  No.13/15/16/17/22 立方蟹" face="serif,'游明朝'" anim="false" edge="undefined" shadow="undefined" ] +[tb_ptext_show x="210" y="370" size="35" color="0xffffff" time="1500" text="BGM  BlueNoise/ネオンパープル 甘茶の音楽工房様" face="serif,'游明朝'" anim="false" edge="undefined" shadow="undefined" ] +[wait time="3000" ] +[tb_ptext_hide time="2000" ] +[tb_ptext_show x="323" y="300" size="35" color="0xffffff" time="500" text="BGM Green&Dance_2 GANO様" face="serif,'游明朝'" anim="false" edge="undefined" shadow="undefined" ] +[tb_ptext_show x="271" y="381" size="35" color="0xffffff" time="1000" text="BGM SO_SAD  稿屋 隆 様" face="serif,'游明朝'" anim="false" edge="undefined" shadow="undefined" ] +[tb_ptext_show x="360" y="460" size="35" color="0xffffff" time="1000" text="BGM 烈火翔ける  shimtone様" anim="false" face="serif,'游明朝'" edge="undefined" shadow="undefined" ] +[wait time="3000" ] +[tb_ptext_hide time="2000" ] +[tb_ptext_show x="376" y="297" size="35" color="0xffffff" time="500" text="BGM  枯葉が集う路地2 ベル様" face="serif,'游明朝'" anim="false" edge="undefined" shadow="undefined" ] +[tb_ptext_show x="340" y="380" size="35" color="0xffffff" time="1000" text="BGM  オフィスの日常 MAKOOTO様" face="serif,'游明朝'" anim="false" edge="undefined" shadow="undefined" ] +[tb_ptext_show x="293" y="460" size="30" color="0xffffff" time="1000" text="BGM Sleeping_City  REV Music Production様" anim="false" face="serif,'游明朝'" edge="undefined" shadow="undefined" ] +[wait time="3000" ] +[tb_ptext_hide time="2500" ] +[tb_ptext_show x="300" y="320" size="35" color="0xffffff" time="2000" face="serif,'游明朝'" text="使用ソフト  ティラノビルダーVer1.84c" anim="false" edge="undefined" shadow="undefined" ] +[wait time="1000" ] +[tb_ptext_hide time="2000" ] +[tb_ptext_show x="428" y="320" size="35" color="0xffffff" time="2900" text="企画・監督  立方蟹" face="serif,'游明朝'" anim="false" edge="undefined" shadow="undefined" ] +[wait time="3000" ] +[tb_ptext_hide time="2000" ] +[tb_show_message_window ] +[tb_start_text mode=1 ] +# + +[_tb_end_text] + +[stopbgm time="1000" ] +[return ] +[s ] diff --git a/data/scenario/system/_cg1.ks b/data/scenario/system/_cg1.ks new file mode 100644 index 0000000..0a93b53 --- /dev/null +++ b/data/scenario/system/_cg1.ks @@ -0,0 +1,3 @@ +[preload storage="./data/bgimage/bg_base.png" ] +[preload storage="./data/fgimage/default/cg.png" ] +[return] \ No newline at end of file diff --git a/data/scenario/system/_cg2.ks b/data/scenario/system/_cg2.ks new file mode 100644 index 0000000..0a93b53 --- /dev/null +++ b/data/scenario/system/_cg2.ks @@ -0,0 +1,3 @@ +[preload storage="./data/bgimage/bg_base.png" ] +[preload storage="./data/fgimage/default/cg.png" ] +[return] \ No newline at end of file diff --git a/data/scenario/system/_cg3.ks b/data/scenario/system/_cg3.ks new file mode 100644 index 0000000..0a93b53 --- /dev/null +++ b/data/scenario/system/_cg3.ks @@ -0,0 +1,3 @@ +[preload storage="./data/bgimage/bg_base.png" ] +[preload storage="./data/fgimage/default/cg.png" ] +[return] \ No newline at end of file diff --git a/data/scenario/system/_cg4.ks b/data/scenario/system/_cg4.ks new file mode 100644 index 0000000..0a93b53 --- /dev/null +++ b/data/scenario/system/_cg4.ks @@ -0,0 +1,3 @@ +[preload storage="./data/bgimage/bg_base.png" ] +[preload storage="./data/fgimage/default/cg.png" ] +[return] \ No newline at end of file diff --git a/data/scenario/system/_cg5.ks b/data/scenario/system/_cg5.ks new file mode 100644 index 0000000..0a93b53 --- /dev/null +++ b/data/scenario/system/_cg5.ks @@ -0,0 +1,3 @@ +[preload storage="./data/bgimage/bg_base.png" ] +[preload storage="./data/fgimage/default/cg.png" ] +[return] \ No newline at end of file diff --git a/data/scenario/system/_cg6.ks b/data/scenario/system/_cg6.ks new file mode 100644 index 0000000..0a93b53 --- /dev/null +++ b/data/scenario/system/_cg6.ks @@ -0,0 +1,3 @@ +[preload storage="./data/bgimage/bg_base.png" ] +[preload storage="./data/fgimage/default/cg.png" ] +[return] \ No newline at end of file diff --git a/data/scenario/system/_config.ks b/data/scenario/system/_config.ks new file mode 100644 index 0000000..16c1e94 --- /dev/null +++ b/data/scenario/system/_config.ks @@ -0,0 +1,2 @@ +[preload storage="./data/bgimage/bg_config.jpg" ] +[return] \ No newline at end of file diff --git a/data/scenario/system/_end1.ks b/data/scenario/system/_end1.ks new file mode 100644 index 0000000..f5740ea --- /dev/null +++ b/data/scenario/system/_end1.ks @@ -0,0 +1,23 @@ +[preload storage="./data/bgimage/hiro999.jpg" ] +[preload storage="./data/bgimage/hiro120-1.jpg" ] +[preload storage="./data/bgimage/hiro118-0.jpg" ] +[preload storage="./data/bgimage/hiro120-5.jpg" ] +[preload storage="./data/fgimage/default/hiro101-97.jpg" ] +[preload storage="./data/bgimage/hiro120-3.jpg" ] +[preload storage="./data/bgimage/hiro118-3.jpg" ] +[preload storage="./data/bgimage/hiro101-7.jpg" ] +[preload storage="./data/bgimage/hiro143-1.jpg" ] +[preload storage="./data/bgimage/hiro143-2.jpg" ] +[preload storage="./data/bgimage/hiro143-3.jpg" ] +[preload storage="./data/bgimage/hiro254-7.jpg" ] +[preload storage="./data/bgimage/hiro254-8.jpg" ] +[preload storage="./data/bgimage/hiro202.jpg" ] +[preload storage="./data/bgimage/hiro142-1.jpg" ] +[preload storage="./data/bgimage/hiro142-2.jpg" ] +[preload storage="./data/bgimage/hiro142-3.jpg" ] +[preload storage="./data/bgimage/hiro142-4.jpg" ] +[preload storage="./data/fgimage/chara/7/hiro263-1.png" ] +[preload storage="./data/fgimage/chara/7/hiro263-5.png" ] +[preload storage="./data/bgimage/hiro204.jpg" ] +[preload storage="./data/bgimage/hiro136-1.jpg" ] +[return] \ No newline at end of file diff --git a/data/scenario/system/_end2.ks b/data/scenario/system/_end2.ks new file mode 100644 index 0000000..8a70c9e --- /dev/null +++ b/data/scenario/system/_end2.ks @@ -0,0 +1,30 @@ +[preload storage="./data/bgimage/hiro999.jpg" ] +[preload storage="./data/bgimage/hiro118-0.jpg" ] +[preload storage="./data/bgimage/hiro120-1.jpg" ] +[preload storage="./data/bgimage/hiro120-5.jpg" ] +[preload storage="./data/fgimage/default/hiro101-97.jpg" ] +[preload storage="./data/bgimage/hiro118-3.jpg" ] +[preload storage="./data/bgimage/hiro118-4.jpg" ] +[preload storage="./data/bgimage/hiro118-5.jpg" ] +[preload storage="./data/bgimage/hiro203.jpg" ] +[preload storage="./data/fgimage/chara/1/hiro260-5m.png" ] +[preload storage="./data/bgimage/hiro202.jpg" ] +[preload storage="./data/fgimage/chara/1/hiro260-6m.png" ] +[preload storage="./data/fgimage/chara/3/hiro262-3.png" ] +[preload storage="./data/bgimage/hiro122-1.jpg" ] +[preload storage="./data/bgimage/hiro122-2.jpg" ] +[preload storage="./data/fgimage/chara/4/hiro259-4.png" ] +[preload storage="./data/bgimage/hiro122-3.jpg" ] +[preload storage="./data/bgimage/hiro122-4.jpg" ] +[preload storage="./data/bgimage/hiro122-5.jpg" ] +[preload storage="./data/bgimage/hiro122-6.jpg" ] +[preload storage="./data/bgimage/hiro122-7.jpg" ] +[preload storage="./data/bgimage/hiro122-8.jpg" ] +[preload storage="./data/bgimage/hiro122-9.jpg" ] +[preload storage="./data/bgimage/hiro122-10.jpg" ] +[preload storage="./data/bgimage/hiro122-11.jpg" ] +[preload storage="./data/bgimage/hiro134-1.jpg" ] +[preload storage="./data/bgimage/hiro134-2.jpg" ] +[preload storage="./data/fgimage/chara/5/hiro256-2.png" ] +[preload storage="./data/bgimage/hiro254-9.jpg" ] +[return] \ No newline at end of file diff --git a/data/scenario/system/_end3.ks b/data/scenario/system/_end3.ks new file mode 100644 index 0000000..d962d91 --- /dev/null +++ b/data/scenario/system/_end3.ks @@ -0,0 +1,14 @@ +[preload storage="./data/bgimage/hiro202.jpg" ] +[preload storage="./data/bgimage/hiro203.jpg" ] +[preload storage="./data/bgimage/hiro123-1.jpg" ] +[preload storage="./data/bgimage/hiro123-3.jpg" ] +[preload storage="./data/bgimage/hiro123-2.jpg" ] +[preload storage="./data/bgimage/hiro118-0.jpg" ] +[preload storage="./data/bgimage/hiro120-1.jpg" ] +[preload storage="./data/bgimage/hiro148-1.jpg" ] +[preload storage="./data/bgimage/hiro148-2.jpg" ] +[preload storage="./data/bgimage/hiro999.jpg" ] +[preload storage="./data/bgimage/hiro204.jpg" ] +[preload storage="./data/bgimage/hiro136-1.jpg" ] +[preload storage="./data/bgimage/hiro147.jpg" ] +[return] \ No newline at end of file diff --git a/data/scenario/system/_end4.ks b/data/scenario/system/_end4.ks new file mode 100644 index 0000000..db385e5 --- /dev/null +++ b/data/scenario/system/_end4.ks @@ -0,0 +1,18 @@ +[preload storage="./data/fgimage/chara/1/hiro258-4.png" ] +[preload storage="./data/fgimage/chara/5/hiro256-2.png" ] +[preload storage="./data/fgimage/chara/5/hiro256-1.png" ] +[preload storage="./data/bgimage/hiro201.jpg" ] +[preload storage="./data/fgimage/chara/1/hiro253-1.png" ] +[preload storage="./data/bgimage/hiro202.jpg" ] +[preload storage="./data/bgimage/hiro999.jpg" ] +[preload storage="./data/bgimage/hiro205.jpg" ] +[preload storage="./data/fgimage/chara/1/hiro258-5.png" ] +[preload storage="./data/fgimage/chara/6/hiro264-3.png" ] +[preload storage="./data/fgimage/chara/1/hiro258-3.png" ] +[preload storage="./data/fgimage/chara/1/hiro260-3.png" ] +[preload storage="./data/bgimage/hiro123-4.jpg" ] +[preload storage="./data/bgimage/hiro123-6.jpg" ] +[preload storage="./data/bgimage/hiro123-5.jpg" ] +[preload storage="./data/fgimage/default/hiro101-d.png" ] +[preload storage="./data/fgimage/default/hiro101-e.png" ] +[return] \ No newline at end of file diff --git a/data/scenario/system/_end4b.ks b/data/scenario/system/_end4b.ks new file mode 100644 index 0000000..3508d5b --- /dev/null +++ b/data/scenario/system/_end4b.ks @@ -0,0 +1,17 @@ +[preload storage="./data/bgimage/hiro124-1.jpg" ] +[preload storage="./data/bgimage/hiro123-9.jpg" ] +[preload storage="./data/bgimage/hiro123-7.jpg" ] +[preload storage="./data/bgimage/hiro125-1.jpg" ] +[preload storage="./data/bgimage/hiro125-2.jpg" ] +[preload storage="./data/bgimage/hiro125-3.jpg" ] +[preload storage="./data/bgimage/hiro999.jpg" ] +[preload storage="./data/bgimage/hiro146-1.jpg" ] +[preload storage="./data/bgimage/hiro146-2.jpg" ] +[preload storage="./data/bgimage/hiro146-3.jpg" ] +[preload storage="./data/bgimage/hiro123-8.jpg" ] +[preload storage="./data/bgimage/hiro103-1.jpg" ] +[preload storage="./data/bgimage/hiro103-2.jpg" ] +[preload storage="./data/bgimage/hiro103-3.jpg" ] +[preload storage="./data/bgimage/hiro103-4.jpg" ] +[preload storage="./data/bgimage/hiro124-2.jpg" ] +[return] \ No newline at end of file diff --git a/data/scenario/system/_end5.ks b/data/scenario/system/_end5.ks new file mode 100644 index 0000000..2f4a64f --- /dev/null +++ b/data/scenario/system/_end5.ks @@ -0,0 +1,22 @@ +[preload storage="./data/bgimage/hiro201.jpg" ] +[preload storage="./data/fgimage/chara/1/hiro258-4.png" ] +[preload storage="./data/fgimage/chara/1/hiro258-1.png" ] +[preload storage="./data/bgimage/hiro202.jpg" ] +[preload storage="./data/bgimage/hiro999.jpg" ] +[preload storage="./data/bgimage/hiro205.jpg" ] +[preload storage="./data/fgimage/chara/1/hiro258-5.png" ] +[preload storage="./data/bgimage/hiro133-1.jpg" ] +[preload storage="./data/bgimage/hiro133-2.jpg" ] +[preload storage="./data/bgimage/hiro135-1.jpg" ] +[preload storage="./data/bgimage/hiro135-2.jpg" ] +[preload storage="./data/bgimage/hiro135-3.jpg" ] +[preload storage="./data/bgimage/hiro135-4.jpg" ] +[preload storage="./data/bgimage/hiro137-1.jpg" ] +[preload storage="./data/bgimage/hiro137-2.jpg" ] +[preload storage="./data/bgimage/hiro137-3.jpg" ] +[preload storage="./data/bgimage/hiro137-4.jpg" ] +[preload storage="./data/bgimage/hiro136-2.jpg" ] +[preload storage="./data/bgimage/hiro254-0.jpg" ] +[preload storage="./data/fgimage/chara/4/hiro259-3.png" ] +[preload storage="./data/bgimage/hiro254-13.jpg" ] +[return] \ No newline at end of file diff --git a/data/scenario/system/_end6.ks b/data/scenario/system/_end6.ks new file mode 100644 index 0000000..63e3959 --- /dev/null +++ b/data/scenario/system/_end6.ks @@ -0,0 +1,15 @@ +[preload storage="./data/bgimage/hiro202.jpg" ] +[preload storage="./data/bgimage/hiro999.jpg" ] +[preload storage="./data/bgimage/hiro254-10.jpg" ] +[preload storage="./data/bgimage/hiro101-10.jpg" ] +[preload storage="./data/bgimage/hiro254-12.jpg" ] +[preload storage="./data/bgimage/hiro101-11.jpg" ] +[preload storage="./data/bgimage/hiro201.jpg" ] +[preload storage="./data/bgimage/hiro204.jpg" ] +[preload storage="./data/fgimage/chara/5/hiro256-2.png" ] +[preload storage="./data/fgimage/chara/1/hiro253-3.png" ] +[preload storage="./data/fgimage/chara/1/hiro253-1.png" ] +[preload storage="./data/fgimage/chara/2/hiro252-1.png" ] +[preload storage="./data/fgimage/chara/2/hiro252-3.png" ] +[preload storage="./data/bgimage/hiro101-12.jpg" ] +[return] \ No newline at end of file diff --git a/data/scenario/system/_end7.ks b/data/scenario/system/_end7.ks new file mode 100644 index 0000000..15d7f22 --- /dev/null +++ b/data/scenario/system/_end7.ks @@ -0,0 +1,7 @@ +[preload storage="./data/bgimage/hiro119-4.jpg" ] +[preload storage="./data/bgimage/hiro999.jpg" ] +[preload storage="./data/bgimage/hiro206.jpg" ] +[preload storage="./data/fgimage/chara/1/hiro253-5.png" ] +[preload storage="./data/fgimage/chara/5/hiro256-3.png" ] +[preload storage="./data/bgimage/hiro151.jpg" ] +[return] \ No newline at end of file diff --git a/data/scenario/system/_preview.ks b/data/scenario/system/_preview.ks new file mode 100644 index 0000000..a550204 --- /dev/null +++ b/data/scenario/system/_preview.ks @@ -0,0 +1,2 @@ +[preload storage="./data/bgimage/hiro200+.jpg" ] +[return] \ No newline at end of file diff --git a/data/scenario/system/_q1.ks b/data/scenario/system/_q1.ks new file mode 100644 index 0000000..eb44f56 --- /dev/null +++ b/data/scenario/system/_q1.ks @@ -0,0 +1,8 @@ +[preload storage="./data/bgimage/hiro254-10.jpg" ] +[preload storage="./data/bgimage/hiro254-0.jpg" ] +[preload storage="./data/fgimage/chara/1/hiro258-5.png" ] +[preload storage="./data/bgimage/hiro254-3.jpg" ] +[preload storage="./data/fgimage/chara/1/hiro258-1.png" ] +[preload storage="./data/bgimage/hiro254-6.jpg" ] +[preload storage="./data/bgimage/hiro101-6.jpg" ] +[return] \ No newline at end of file diff --git a/data/scenario/system/_q2.ks b/data/scenario/system/_q2.ks new file mode 100644 index 0000000..65bc521 --- /dev/null +++ b/data/scenario/system/_q2.ks @@ -0,0 +1,3 @@ +[preload storage="./data/bgimage/hiro254-13.jpg" ] +[preload storage="./data/bgimage/game159.jpg" ] +[return] \ No newline at end of file diff --git a/data/scenario/system/_rep1.ks b/data/scenario/system/_rep1.ks new file mode 100644 index 0000000..b54f427 --- /dev/null +++ b/data/scenario/system/_rep1.ks @@ -0,0 +1,3 @@ +[preload storage="./data/bgimage/bg_base.png" ] +[preload storage="./data/fgimage/default/kaiso.png" ] +[return] \ No newline at end of file diff --git a/data/scenario/system/_rep2.ks b/data/scenario/system/_rep2.ks new file mode 100644 index 0000000..b54f427 --- /dev/null +++ b/data/scenario/system/_rep2.ks @@ -0,0 +1,3 @@ +[preload storage="./data/bgimage/bg_base.png" ] +[preload storage="./data/fgimage/default/kaiso.png" ] +[return] \ No newline at end of file diff --git a/data/scenario/system/_rep3.ks b/data/scenario/system/_rep3.ks new file mode 100644 index 0000000..b54f427 --- /dev/null +++ b/data/scenario/system/_rep3.ks @@ -0,0 +1,3 @@ +[preload storage="./data/bgimage/bg_base.png" ] +[preload storage="./data/fgimage/default/kaiso.png" ] +[return] \ No newline at end of file diff --git a/data/scenario/system/_rep4.ks b/data/scenario/system/_rep4.ks new file mode 100644 index 0000000..b54f427 --- /dev/null +++ b/data/scenario/system/_rep4.ks @@ -0,0 +1,3 @@ +[preload storage="./data/bgimage/bg_base.png" ] +[preload storage="./data/fgimage/default/kaiso.png" ] +[return] \ No newline at end of file diff --git a/data/scenario/system/_scene1.ks b/data/scenario/system/_scene1.ks new file mode 100644 index 0000000..a34ee73 --- /dev/null +++ b/data/scenario/system/_scene1.ks @@ -0,0 +1,10 @@ +[preload storage="./data/bgimage/hiro999.jpg" ] +[preload storage="./data/bgimage/hiro254-1.jpg" ] +[preload storage="./data/bgimage/hiro101-1.jpg" ] +[preload storage="./data/bgimage/hiro254-0.jpg" ] +[preload storage="./data/bgimage/hiro202.jpg" ] +[preload storage="./data/bgimage/hiro201.jpg" ] +[preload storage="./data/fgimage/chara/1/hiro253-3.png" ] +[preload storage="./data/fgimage/chara/2/hiro252-1.png" ] +[preload storage="./data/fgimage/chara/1/hiro253-1.png" ] +[return] \ No newline at end of file diff --git a/data/scenario/system/_scene10.ks b/data/scenario/system/_scene10.ks new file mode 100644 index 0000000..c8e89f8 --- /dev/null +++ b/data/scenario/system/_scene10.ks @@ -0,0 +1,23 @@ +[preload storage="./data/bgimage/hiro201.jpg" ] +[preload storage="./data/bgimage/hiro202.jpg" ] +[preload storage="./data/fgimage/default/hiro101-98.jpg" ] +[preload storage="./data/bgimage/hiro203.jpg" ] +[preload storage="./data/fgimage/chara/5/hiro256-2.png" ] +[preload storage="./data/fgimage/chara/5/hiro256-1.png" ] +[preload storage="./data/fgimage/chara/1/hiro258-3.png" ] +[preload storage="./data/fgimage/chara/5/hiro256-3.png" ] +[preload storage="./data/fgimage/chara/1/hiro258-5.png" ] +[preload storage="./data/bgimage/hiro999.jpg" ] +[preload storage="./data/bgimage/hiro105-1.jpg" ] +[preload storage="./data/bgimage/hiro110-2.jpg" ] +[preload storage="./data/bgimage/hiro110-1.jpg" ] +[preload storage="./data/bgimage/hiro105-5.jpg" ] +[preload storage="./data/bgimage/hiro105-2.jpg" ] +[preload storage="./data/bgimage/hiro105-3.jpg" ] +[preload storage="./data/bgimage/hiro105-6.jpg" ] +[preload storage="./data/bgimage/hiro105-4.jpg" ] +[preload storage="./data/bgimage/hiro119-1.jpg" ] +[preload storage="./data/bgimage/hiro119-2.jpg" ] +[preload storage="./data/bgimage/hiro119-3.jpg" ] +[preload storage="./data/bgimage/hiro119-4.jpg" ] +[return] \ No newline at end of file diff --git a/data/scenario/system/_scene11.ks b/data/scenario/system/_scene11.ks new file mode 100644 index 0000000..550a538 --- /dev/null +++ b/data/scenario/system/_scene11.ks @@ -0,0 +1,13 @@ +[preload storage="./data/bgimage/hiro118-0.jpg" ] +[preload storage="./data/bgimage/hiro120-1.jpg" ] +[preload storage="./data/bgimage/hiro118-1.jpg" ] +[preload storage="./data/bgimage/hiro120-5.jpg" ] +[preload storage="./data/fgimage/default/hiro101-97.jpg" ] +[preload storage="./data/bgimage/hiro120-3.jpg" ] +[preload storage="./data/bgimage/hiro120-4.jpg" ] +[preload storage="./data/bgimage/hiro202.jpg" ] +[preload storage="./data/bgimage/hiro118-3.jpg" ] +[preload storage="./data/bgimage/hiro121-1.jpg" ] +[preload storage="./data/bgimage/hiro121-2.jpg" ] +[preload storage="./data/bgimage/hiro121-3.jpg" ] +[return] \ No newline at end of file diff --git a/data/scenario/system/_scene12.ks b/data/scenario/system/_scene12.ks new file mode 100644 index 0000000..21b3f3c --- /dev/null +++ b/data/scenario/system/_scene12.ks @@ -0,0 +1,19 @@ +[preload storage="./data/bgimage/hiro201.jpg" ] +[preload storage="./data/bgimage/hiro202.jpg" ] +[preload storage="./data/fgimage/chara/1/hiro258-2.png" ] +[preload storage="./data/fgimage/chara/4/hiro259-2.png" ] +[preload storage="./data/fgimage/chara/1/hiro258-4.png" ] +[preload storage="./data/fgimage/chara/4/hiro259-3.png" ] +[preload storage="./data/fgimage/chara/4/hiro259-1.png" ] +[preload storage="./data/bgimage/hiro204.jpg" ] +[preload storage="./data/fgimage/chara/1/hiro261-3bk.png" ] +[preload storage="./data/fgimage/chara/1/hiro260-6.png" ] +[preload storage="./data/bgimage/hiro144.jpg" ] +[preload storage="./data/bgimage/hiro145-1.jpg" ] +[preload storage="./data/bgimage/hiro145-2.jpg" ] +[preload storage="./data/bgimage/hiro145-3.jpg" ] +[preload storage="./data/bgimage/hiro145-4.jpg" ] +[preload storage="./data/bgimage/hiro107-1.jpg" ] +[preload storage="./data/bgimage/hiro107-3.jpg" ] +[preload storage="./data/bgimage/hiro107-2.jpg" ] +[return] \ No newline at end of file diff --git a/data/scenario/system/_scene13.ks b/data/scenario/system/_scene13.ks new file mode 100644 index 0000000..e987274 --- /dev/null +++ b/data/scenario/system/_scene13.ks @@ -0,0 +1,19 @@ +[preload storage="./data/bgimage/hiro107-1.jpg" ] +[preload storage="./data/bgimage/hiro107-2.jpg" ] +[preload storage="./data/bgimage/hiro107-4.jpg" ] +[preload storage="./data/bgimage/hiro107-5.jpg" ] +[preload storage="./data/bgimage/hiro107-9.jpg" ] +[preload storage="./data/bgimage/hiro107-10.jpg" ] +[preload storage="./data/bgimage/hiro107-11.jpg" ] +[preload storage="./data/bgimage/hiro254-1.jpg" ] +[preload storage="./data/bgimage/hiro101-8.jpg" ] +[preload storage="./data/bgimage/hiro999.jpg" ] +[preload storage="./data/bgimage/hiro201.jpg" ] +[preload storage="./data/bgimage/hiro254-0.jpg" ] +[preload storage="./data/bgimage/hiro254-11.jpg" ] +[preload storage="./data/bgimage/hiro101-9.jpg" ] +[preload storage="./data/bgimage/hiro254-4.jpg" ] +[preload storage="./data/bgimage/hiro202.jpg" ] +[preload storage="./data/fgimage/chara/1/hiro258-4.png" ] +[preload storage="./data/fgimage/chara/1/hiro258-1.png" ] +[return] \ No newline at end of file diff --git a/data/scenario/system/_scene14.ks b/data/scenario/system/_scene14.ks new file mode 100644 index 0000000..e5e3020 --- /dev/null +++ b/data/scenario/system/_scene14.ks @@ -0,0 +1,28 @@ +[preload storage="./data/bgimage/hiro107-4.jpg" ] +[preload storage="./data/bgimage/hiro107-3.jpg" ] +[preload storage="./data/bgimage/hiro107-1.jpg" ] +[preload storage="./data/bgimage/hiro107-5.jpg" ] +[preload storage="./data/bgimage/hiro107-6.jpg" ] +[preload storage="./data/bgimage/hiro107-7.jpg" ] +[preload storage="./data/bgimage/hiro107-8.jpg" ] +[preload storage="./data/bgimage/hiro999.jpg" ] +[preload storage="./data/bgimage/hiro118-0.jpg" ] +[preload storage="./data/fgimage/default/hiro101-a.jpg" ] +[preload storage="./data/bgimage/hiro120-1.jpg" ] +[preload storage="./data/bgimage/hiro120-3.jpg" ] +[preload storage="./data/bgimage/hiro118-3.jpg" ] +[preload storage="./data/bgimage/hiro118-6.jpg" ] +[preload storage="./data/fgimage/default/hiro101-b.jpg" ] +[preload storage="./data/bgimage/hiro118-7.jpg" ] +[preload storage="./data/bgimage/hiro149-5.jpg" ] +[preload storage="./data/bgimage/hiro118-8.jpg" ] +[preload storage="./data/fgimage/default/hiro101-c.jpg" ] +[preload storage="./data/bgimage/hiro149-1.jpg" ] +[preload storage="./data/bgimage/hiro118-9.jpg" ] +[preload storage="./data/bgimage/hiro149-2.jpg" ] +[preload storage="./data/bgimage/hiro149-3.jpg" ] +[preload storage="./data/bgimage/hiro149-4.jpg" ] +[preload storage="./data/bgimage/hiro149-6.jpg" ] +[preload storage="./data/bgimage/hiro118-10.jpg" ] +[preload storage="./data/bgimage/hiro201.jpg" ] +[return] \ No newline at end of file diff --git a/data/scenario/system/_scene2.ks b/data/scenario/system/_scene2.ks new file mode 100644 index 0000000..cc7741f --- /dev/null +++ b/data/scenario/system/_scene2.ks @@ -0,0 +1,9 @@ +[preload storage="./data/bgimage/hiro203.jpg" ] +[preload storage="./data/bgimage/hiro106-1.jpg" ] +[preload storage="./data/bgimage/hiro106-2.jpg" ] +[preload storage="./data/bgimage/hiro202.jpg" ] +[preload storage="./data/fgimage/chara/1/hiro253-2.png" ] +[preload storage="./data/bgimage/hiro201.jpg" ] +[preload storage="./data/bgimage/hiro126.jpg" ] +[preload storage="./data/bgimage/hiro999.jpg" ] +[return] \ No newline at end of file diff --git a/data/scenario/system/_scene3.ks b/data/scenario/system/_scene3.ks new file mode 100644 index 0000000..ad08af7 --- /dev/null +++ b/data/scenario/system/_scene3.ks @@ -0,0 +1,7 @@ +[preload storage="./data/bgimage/hiro254-2.jpg" ] +[preload storage="./data/bgimage/hiro201.jpg" ] +[preload storage="./data/fgimage/chara/1/hiro253-2.png" ] +[preload storage="./data/bgimage/hiro202.jpg" ] +[preload storage="./data/fgimage/chara/1/hiro253-5.png" ] +[preload storage="./data/bgimage/hiro999.jpg" ] +[return] \ No newline at end of file diff --git a/data/scenario/system/_scene4.ks b/data/scenario/system/_scene4.ks new file mode 100644 index 0000000..9205b86 --- /dev/null +++ b/data/scenario/system/_scene4.ks @@ -0,0 +1,15 @@ +[preload storage="./data/bgimage/hiro101-2.jpg" ] +[preload storage="./data/bgimage/hiro116-1.jpg" ] +[preload storage="./data/fgimage/default/hiro101-a.jpg" ] +[preload storage="./data/bgimage/hiro116-2.jpg" ] +[preload storage="./data/bgimage/hiro116-3.jpg" ] +[preload storage="./data/fgimage/default/hiro101-b.jpg" ] +[preload storage="./data/bgimage/hiro116-4.jpg" ] +[preload storage="./data/bgimage/hiro254-1.jpg" ] +[preload storage="./data/bgimage/hiro254-0.jpg" ] +[preload storage="./data/bgimage/hiro202.jpg" ] +[preload storage="./data/bgimage/hiro999.jpg" ] +[preload storage="./data/bgimage/hiro109-1.jpg" ] +[preload storage="./data/bgimage/hiro109-2.jpg" ] +[preload storage="./data/bgimage/hiro201.jpg" ] +[return] \ No newline at end of file diff --git a/data/scenario/system/_scene5.ks b/data/scenario/system/_scene5.ks new file mode 100644 index 0000000..8883a9a --- /dev/null +++ b/data/scenario/system/_scene5.ks @@ -0,0 +1,29 @@ +[preload storage="./data/bgimage/hiro203.jpg" ] +[preload storage="./data/fgimage/chara/1/hiro253-5.png" ] +[preload storage="./data/fgimage/chara/1/hiro253-4.png" ] +[preload storage="./data/bgimage/hiro131.jpg" ] +[preload storage="./data/fgimage/chara/5/hiro256-2.png" ] +[preload storage="./data/fgimage/chara/5/hiro256-3.png" ] +[preload storage="./data/fgimage/chara/1/hiro253-2.png" ] +[preload storage="./data/fgimage/chara/1/hiro261-3b.png" ] +[preload storage="./data/fgimage/chara/1/hiro261-2b.png" ] +[preload storage="./data/fgimage/chara/1/hiro261-2bk.png" ] +[preload storage="./data/fgimage/chara/1/hiro261-3bk.png" ] +[preload storage="./data/fgimage/chara/1/hiro261-1bk.png" ] +[preload storage="./data/fgimage/chara/1/hiro260-4.png" ] +[preload storage="./data/fgimage/chara/1/hiro260-3n.png" ] +[preload storage="./data/fgimage/chara/1/hiro260-4n.png" ] +[preload storage="./data/bgimage/hiro104-1.jpg" ] +[preload storage="./data/bgimage/hiro104-2.jpg" ] +[preload storage="./data/bgimage/hiro104-3.jpg" ] +[preload storage="./data/bgimage/hiro104-4.jpg" ] +[preload storage="./data/bgimage/hiro104-5.jpg" ] +[preload storage="./data/bgimage/hiro104-6.jpg" ] +[preload storage="./data/bgimage/hiro113-1.jpg" ] +[preload storage="./data/bgimage/hiro113-3.jpg" ] +[preload storage="./data/bgimage/hiro113-2.jpg" ] +[preload storage="./data/bgimage/hiro113-4.jpg" ] +[preload storage="./data/bgimage/hiro113-5+.jpg" ] +[preload storage="./data/bgimage/hiro112-1.jpg" ] +[preload storage="./data/bgimage/hiro112-2.jpg" ] +[return] \ No newline at end of file diff --git a/data/scenario/system/_scene6.ks b/data/scenario/system/_scene6.ks new file mode 100644 index 0000000..da7a67b --- /dev/null +++ b/data/scenario/system/_scene6.ks @@ -0,0 +1,17 @@ +[preload storage="./data/bgimage/hiro254-0.jpg" ] +[preload storage="./data/fgimage/chara/4/hiro259-3.png" ] +[preload storage="./data/fgimage/chara/1/hiro258-2.png" ] +[preload storage="./data/fgimage/chara/4/hiro259-2.png" ] +[preload storage="./data/bgimage/hiro999.jpg" ] +[preload storage="./data/bgimage/hiro254-11.jpg" ] +[preload storage="./data/bgimage/hiro101-3.jpg" ] +[preload storage="./data/fgimage/chara/3/hiro262-3.png" ] +[preload storage="./data/bgimage/hiro202.jpg" ] +[preload storage="./data/bgimage/hiro115.jpg" ] +[preload storage="./data/bgimage/hiro115-1.jpg" ] +[preload storage="./data/bgimage/hiro115-1+.jpg" ] +[preload storage="./data/bgimage/hiro115-2.jpg" ] +[preload storage="./data/bgimage/hiro115-3.jpg" ] +[preload storage="./data/bgimage/hiro115-3+.jpg" ] +[preload storage="./data/bgimage/hiro203.jpg" ] +[return] \ No newline at end of file diff --git a/data/scenario/system/_scene7.ks b/data/scenario/system/_scene7.ks new file mode 100644 index 0000000..4d4baed --- /dev/null +++ b/data/scenario/system/_scene7.ks @@ -0,0 +1,29 @@ +[preload storage="./data/bgimage/hiro999.jpg" ] +[preload storage="./data/fgimage/default/hiro101-a.jpg" ] +[preload storage="./data/bgimage/hiro114-1.jpg" ] +[preload storage="./data/bgimage/hiro101-4.jpg" ] +[preload storage="./data/bgimage/hiro114-2.jpg" ] +[preload storage="./data/fgimage/default/hiro101-c.jpg" ] +[preload storage="./data/bgimage/hiro201.jpg" ] +[preload storage="./data/fgimage/chara/1/hiro258-2.png" ] +[preload storage="./data/fgimage/chara/1/hiro258-3.png" ] +[preload storage="./data/fgimage/chara/3/hiro262-2.png" ] +[preload storage="./data/fgimage/chara/3/hiro262-1.png" ] +[preload storage="./data/bgimage/hiro202.jpg" ] +[preload storage="./data/bgimage/hiro203.jpg" ] +[preload storage="./data/fgimage/chara/1/hiro261-2bk.png" ] +[preload storage="./data/bgimage/hiro132-1.jpg" ] +[preload storage="./data/bgimage/hiro132-2.jpg" ] +[preload storage="./data/bgimage/hiro132-3.jpg" ] +[preload storage="./data/bgimage/hiro132-4.jpg" ] +[preload storage="./data/bgimage/hiro132-6.jpg" ] +[preload storage="./data/bgimage/hiro132-5.jpg" ] +[preload storage="./data/fgimage/chara/1/hiro260-4n.png" ] +[preload storage="./data/fgimage/chara/1/hiro258-1.png" ] +[preload storage="./data/bgimage/hiro120-1.jpg" ] +[preload storage="./data/bgimage/hiro118-0.jpg" ] +[preload storage="./data/bgimage/hiro120-2.jpg" ] +[preload storage="./data/fgimage/default/hiro101-99.jpg" ] +[preload storage="./data/fgimage/chara/5/hiro256-2.png" ] +[preload storage="./data/fgimage/chara/5/hiro256-1.png" ] +[return] \ No newline at end of file diff --git a/data/scenario/system/_scene8.ks b/data/scenario/system/_scene8.ks new file mode 100644 index 0000000..fd25727 --- /dev/null +++ b/data/scenario/system/_scene8.ks @@ -0,0 +1,26 @@ +[preload storage="./data/bgimage/hiro204.jpg" ] +[preload storage="./data/fgimage/chara/1/hiro260-2.png" ] +[preload storage="./data/bgimage/hiro141-1.jpg" ] +[preload storage="./data/bgimage/hiro141-2.jpg" ] +[preload storage="./data/bgimage/hiro117-1.jpg" ] +[preload storage="./data/bgimage/hiro117-2.jpg" ] +[preload storage="./data/bgimage/hiro117-3.jpg" ] +[preload storage="./data/bgimage/hiro117-4.jpg" ] +[preload storage="./data/bgimage/hiro117-5.jpg" ] +[preload storage="./data/bgimage/hiro117-6.jpg" ] +[preload storage="./data/bgimage/hiro117-7.jpg" ] +[preload storage="./data/bgimage/hiro117-8.jpg" ] +[preload storage="./data/bgimage/hiro201.jpg" ] +[preload storage="./data/bgimage/hiro202.jpg" ] +[preload storage="./data/fgimage/chara/1/hiro258-5.png" ] +[preload storage="./data/fgimage/chara/1/hiro258-1.png" ] +[preload storage="./data/bgimage/hiro254-11.jpg" ] +[preload storage="./data/bgimage/hiro254-4.jpg" ] +[preload storage="./data/bgimage/hiro101-5.jpg" ] +[preload storage="./data/bgimage/hiro203.jpg" ] +[preload storage="./data/bgimage/hiro104-7.jpg" ] +[preload storage="./data/bgimage/hiro104-5.jpg" ] +[preload storage="./data/bgimage/hiro113-4.jpg" ] +[preload storage="./data/bgimage/hiro113-6.jpg" ] +[preload storage="./data/bgimage/hiro112-3.jpg" ] +[return] \ No newline at end of file diff --git a/data/scenario/system/_scene9.ks b/data/scenario/system/_scene9.ks new file mode 100644 index 0000000..6d49304 --- /dev/null +++ b/data/scenario/system/_scene9.ks @@ -0,0 +1,28 @@ +[preload storage="./data/bgimage/hiro201.jpg" ] +[preload storage="./data/bgimage/hiro202.jpg" ] +[preload storage="./data/fgimage/chara/1/hiro258-5.png" ] +[preload storage="./data/fgimage/chara/1/hiro258-1.png" ] +[preload storage="./data/fgimage/chara/5/hiro256-3.png" ] +[preload storage="./data/bgimage/hiro203.jpg" ] +[preload storage="./data/fgimage/chara/4/hiro259-3.png" ] +[preload storage="./data/bgimage/hiro999.jpg" ] +[preload storage="./data/bgimage/hiro139-1.jpg" ] +[preload storage="./data/bgimage/hiro139-2.jpg" ] +[preload storage="./data/bgimage/hiro139-3.jpg" ] +[preload storage="./data/bgimage/hiro140-1.jpg" ] +[preload storage="./data/bgimage/hiro140-2.jpg" ] +[preload storage="./data/bgimage/hiro140-3.jpg" ] +[preload storage="./data/fgimage/chara/5/hiro256-2.png" ] +[preload storage="./data/fgimage/chara/5/hiro256-1.png" ] +[preload storage="./data/bgimage/hiro127-2.jpg" ] +[preload storage="./data/bgimage/hiro127-1.jpg" ] +[preload storage="./data/bgimage/hiro127-3.jpg" ] +[preload storage="./data/bgimage/hiro127-4.jpg" ] +[preload storage="./data/bgimage/hiro127-5.jpg" ] +[preload storage="./data/bgimage/hiro127-6.jpg" ] +[preload storage="./data/bgimage/hiro127-7.jpg" ] +[preload storage="./data/bgimage/hiro129-1.jpg" ] +[preload storage="./data/bgimage/hiro129-2.jpg" ] +[preload storage="./data/bgimage/hiro129-3.jpg" ] +[preload storage="./data/bgimage/hiro129-4.jpg" ] +[return] \ No newline at end of file diff --git a/data/scenario/system/_sr.ks b/data/scenario/system/_sr.ks new file mode 100644 index 0000000..02e268b --- /dev/null +++ b/data/scenario/system/_sr.ks @@ -0,0 +1,2 @@ +[preload storage="./data/bgimage/hiro999.jpg" ] +[return] \ No newline at end of file diff --git a/data/scenario/system/_title_screen.ks b/data/scenario/system/_title_screen.ks new file mode 100644 index 0000000..12808ff --- /dev/null +++ b/data/scenario/system/_title_screen.ks @@ -0,0 +1,2 @@ +[preload storage="./data/bgimage/hiro200+.jpg" ] +[return] \ No newline at end of file diff --git a/data/scenario/system/builder.ks b/data/scenario/system/builder.ks new file mode 100644 index 0000000..b2ea17a --- /dev/null +++ b/data/scenario/system/builder.ks @@ -0,0 +1,220 @@ +;ビルダーでシナリオごとに必ず呼び出されるシステム系のKSファイル + +;メッセージウィンドウを非表示にする +[macro name="tb_show_message_window"] + [layopt layer="message0" visible="true" ] + [layopt layer="fixlayer" visible="true" ] +[endmacro] + +;メッセージウィンドウを表示する +[macro name="tb_hide_message_window"] + [layopt layer="message0" visible="false" ] + [layopt layer="fixlayer" visible="false" ] +[endmacro] + +[macro name="_tb_system_call"] + [call storage=%storage ] +[endmacro] + +[macro name="tb_image_show"] + [image storage=%storage layer=1 page=fore visible=true y=%y x=%x width=%width height=%height time=%time ] +[endmacro] + +[macro name="tb_image_hide"] + [freeimage layer=1 page=fore time=%time] +[endmacro] + +[macro name="tb_ptext_show"] + +[if exp="mp.anim=='true'" ] + [mtext layer=2 text="%text" y=%y x=%x size=%size face=%face color=%color name=%name bold=%bold time=%time fadeout=%fadeout wait=%wait in_effect=%in_effect out_effect=%out_effect edge=%edge shadow=%shadow ] +[else] + [ptext layer=2 text="%text" y=%y x=%x size=%size face=%face color=%color name=%name bold=%bold time=%time edge=%edge shadow=%shadow ] +[endif] + +[endmacro] + +[macro name="tb_ptext_hide"] + [freeimage layer=2 time=%time ] +[endmacro] + +[macro name="tb_eval"] + [eval exp=%exp ] +[endmacro] + +[macro name="tb_keyconfig"] + +[if exp="mp.flag=='1'" ] + [start_keyconfig] +[else] + [stop_keyconfig] +[endif] + +[endmacro] + + +;生ティラノ用のマーカー +[macro name="tb_start_tyrano_code"] +[endmacro] + +[macro name="_tb_end_tyrano_code"] +[endmacro] + +[macro name="tb_start_text"] +[endmacro] + +[macro name="_tb_end_text"] +[endmacro] + + +[macro name="lr"] +[l][r] +[endmacro] + +;キャラクター揺らす +[macro name="tb_chara_shake"] + +[iscript] + +tf.swing_1 = mp.swing; +tf.swing_2 = mp.swing*2*-1; + +[endscript] + +[keyframe name="shake"] + +[if exp="mp.direction=='x'"] +[frame p=0% x="0" ] +[frame p=50% x="&tf.swing_1" ] +[frame p=100% x="0" ] +[else] +[frame p=0% y="0" ] +[frame p=50% y="&tf.swing_1" ] +[frame p=100% y="0" ] +[endif] + +[endkeyframe] + +[kanim name="%name" keyframe="shake" count=%count|5 time=%time|500] + +[endmacro] + + +;;;;;;;;; CG・回想モード ;;;;;;;;;;;;;;; + +[iscript] + + if(sf.cg_id){ + }else{ + sf.cg_id = {}; + } + + if(sf.replay_id){ + }else{ + sf.replay_id = {}; + } + +[endscript] + + + + +[macro name="tb_cg_image_button"] + + [iscript] + + tf.is_cg_open = false; + if(sf.cg_id[mp.id]){ + tf.is_cg_open = true; + } + + mp.target = "*"+mp.id; + + + [endscript] + + ;渡された値を元に、CG状態を確認していく + [if exp="tf.is_cg_open==true"] + [button name="_tb_system" graphic=&mp.graphic x=&mp.x y=&mp.y width=&mp.width height=&mp.height storage="system/master_cg.ks" target=&mp.target role="sleepgame" ] + [else] + [image storage=&mp.no_graphic x=&mp.x y=&mp.y width=&mp.width height=&mp.height layer="1" visible="true" folder="image" ] + [endif] +[endmacro] + +[macro name="tb_cg"] + + [iscript] + + sf.cg_id[mp.id] = "on"; + + [endscript] + +[endmacro] + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +[macro name="tb_replay_image_button"] + + [iscript] + + tf.is_replay_open = false; + if(sf.replay_id[mp.id]){ + tf.is_replay_open = true; + } + + [endscript] + + ;渡された値を元に、CG状態を確認していく + [if exp="tf.is_replay_open==true"] + [button name="_tb_system" graphic=&mp.graphic x=&mp.x y=&mp.y width=&mp.width height=&mp.height storage=&mp.storage target=&mp.target exp="tf._tb_is_replay=true;" role="sleepgame" ] + [else] + [image name="_tb_system" storage=&mp.no_graphic x=&mp.x y=&mp.y width=&mp.width height=&mp.height layer="1" visible="true" folder="image" ] + [endif] + +[endmacro] + +[macro name="tb_replay"] + + [iscript] + + sf.replay_id[mp.id] = "on"; + + [endscript] + + [if exp="tf._tb_is_replay==true"] + [awakegame] + [endif] + +[endmacro] + +[macro name="tb_replay_start"] + + [if exp="tf._tb_is_replay==true"] + + [cm] + [clearfix name="_tb_system"] + [freeimage layer="1"] + + [endif] + +[endmacro] + + +[macro name="tb_clear_images"] +[cm] +[clearfix name="_tb_system" ] +[freeimage layer="1"] +[endmacro] + + + + + + + + + + + diff --git a/data/scenario/system/chara_define.ks b/data/scenario/system/chara_define.ks new file mode 100644 index 0000000..2d5ff18 --- /dev/null +++ b/data/scenario/system/chara_define.ks @@ -0,0 +1,24 @@ +;=========キャラクター事前定義情報 +;美里 +[chara_new name="美里" jname="美里" storage="chara/1/hiro253-1.png" ] +;明日香 +[chara_new name="明日香" jname="明日香" storage="chara/2/hiro252-1.png" ] +;局長 +[chara_new name="局長" jname="局長" storage="chara/3/hiro262-1.png" ] +;谷田 +[chara_new name="谷田" jname="谷田" storage="chara/4/hiro259-1.png" ] +;勝野 +[chara_new name="勝野" jname="勝野" storage="chara/5/hiro256-1.png" ] +;黒原 +[chara_new name="黒原" jname="黒原" storage="chara/6/hiro264-1.png" ] +;ノブオ +[chara_new name="ノブオ" jname="ノブオ" storage="chara/7/hiro263-1.png" ] + +;=========変数宣言部分 +[iscript] +f['qpt']=0; +f['qp']=0; +f['tp']=0; +f['end']=0; +f['ask']=0; +[endscript] diff --git a/data/scenario/system/live2d.ks b/data/scenario/system/live2d.ks new file mode 100644 index 0000000..468abd6 --- /dev/null +++ b/data/scenario/system/live2d.ks @@ -0,0 +1,387 @@ +;============================================================ +; Live2D x tyranoscript対応マクロ +;============================================================ +; ライブラリ読込 +[loadjs storage = "live2d/lib/live2d.min.js"] +[loadjs storage = "live2d/framework/Live2DFramework.js"] +[loadjs storage = "live2d/framework/PlatformManager.js"] +[loadjs storage = "live2d/framework/LAppLive2DManager.js"] +[loadjs storage = "live2d/Live2Dmodel.js"] +[loadjs storage = "live2d/Live2Dtyrano.js"] + +[iscript] +;live2Dが初めての場合、初期化する +if(f.live2d_models == undefined){ + f.live2d_models = {}; +} +[endscript] + + +;------------------------------------------------------------ +; キャンバスとLive2Dモデル生成 +;------------------------------------------------------------ +[macro name = "live2d_new"] +;*パラメータ1 : name 【必須】Live2DモデルID(一意なもの) +; パラメータ2 : left Live2Dモデルの横位置(Canvasの横位置) +; パラメータ3 : top Live2Dモデルの縦位置(Canvasの縦位置) +; パラメータ4 : width Live2Dモデルの横幅(Canvasの横幅) +; パラメータ5 : height Live2Dモデルの縦幅(Canvasの縦幅) +; パラメータ6 : zindex Live2Dモデルの奥行き(Canvasの奥行き) +; パラメータ7 : opacity Live2Dモデルの透明度(0.0?1.0) +; ぱらめーた  can_visible Live2Dモデルの表示、非表示制御 +; パラメータ8 : glleft Canvas内のLive2Dモデル横位置(0.0?2.0ぐらい) +; パラメータ9 : gltop Canvas内のLive2Dモデル縦位置(0.0?2.0ぐらい) +; パラメータ10 : glscale Canvas内のLive2Dモデル拡大縮小サイズ(0.0?2.0ぐらい) +[iscript] +; optinal +if(mp.name ==null)console.error('nameは必須です'); +if(mp.left == null)mp.left = 0; +if(mp.top == null)mp.top = 0; +if(mp.width == null)mp.width = TYRANO.kag.config.scWidth; +if(mp.height == null)mp.height = TYRANO.kag.config.scWidth; +if(mp.zindex == null)mp.zindex = 12; +if(mp.opacity == null)mp.opacity = 0.0; +if(mp.can_visible == null)mp.can_visible = false; +if(mp.glleft == null)mp.glleft = 0.0; +if(mp.gltop == null)mp.gltop = 0.0; +if(mp.glscale == null)mp.glscale = 1.0; + + +; Live2DのCanvas追加する親ID +parentID = 'tyrano_base'; +; Canvasを生成し、Live2Dモデルを透明で表示[Live2Dtyrano.js] + +TG.stat.is_strong_stop = true; +var complete_event = function(){ + TG.stat.is_strong_stop = false; + TG.layer.showEventLayer(); + TG.ftag.nextOrder(); +}; + +live2d_new( + LIVE2D_MODEL[mp.name], + mp.name, + mp.left, + mp.top, + mp.width, + mp.height, + mp.zindex, + mp.opacity, + mp.can_visible, + Number(mp.glleft), + Number(mp.gltop), + Number(mp.glscale), + parentID, + complete_event); +[endscript] +[endmacro] + + +;------------------------------------------------------------ +; Live2Dキャラの表示 +;------------------------------------------------------------ +[macro name = "live2d_show"] +;*パラメータ1 : name 【必須】Live2DモデルID(一意なもの) +;*パラメータ2 : time 切り替え時間 +;*パラメータ3 : left 横位置 +;*パラメータ4 : top 縦位置 +;*パラメータ5 : scale 比率 + + +[iscript] +; optinal +if(mp.name ==null)console.error('nameは必須です'); +if(mp.time == null)mp.time = 1000; +if(mp.left == null)mp.left = 0; +if(mp.top == null)mp.top = 0; +if(mp.scale == null)mp.scale = 1; + +TG.stat.is_strong_stop = true; +var complete_event = function(){ + TG.stat.is_strong_stop = false; + TG.layer.showEventLayer(); + TG.ftag.nextOrder(); +}; + + +; Live2Dモデルの表示[Live2Dtyrano.js] +live2d_show(mp.name, mp.time,mp.left,mp.top,mp.scale,complete_event); +[endscript] +[endmacro] + + +;------------------------------------------------------------ +; Live2Dキャラの非表示 +;------------------------------------------------------------ +[macro name = "live2d_hide"] +;*パラメータ1 : name 【必須】Live2DモデルID(一意なもの) +;*パラメータ2 : time 切り替え時間 +[iscript] +; optinal +if(mp.name ==null)console.error('nameは必須です'); +if(mp.time == null)mp.time = 1000; + +TG.stat.is_strong_stop = true; +var complete_event = function(){ + TG.stat.is_strong_stop = false; + TG.layer.showEventLayer(); + TG.ftag.nextOrder(); +}; + +; Live2Dモデルの非表示[Live2Dtyrano.js] +live2d_hide(mp.name, mp.time,complete_event); +[endscript] +[endmacro] + + +;------------------------------------------------------------ +; Live2Dキャラの透明度 +;------------------------------------------------------------ +[macro name = "live2d_opacity"] +;*パラメータ1 : name 【必須】Live2DモデルID(一意なもの) +;*パラメータ2 : opacity 【必須】透明度(0.0~1.0) +;*パラメータ3 : time 切り替え時間 +[iscript] +; optinal +if(mp.name ==null)console.error('nameは必須です'); +if(mp.opacity ==null)console.error('opacityは必須です'); +if(mp.time == null)mp.time = 1000; + +; Live2Dモデルの透明度[Live2Dtyrano.js] +live2d_opacity(mp.name, mp.opacity, mp.time); +[endscript] +[endmacro] + + +;------------------------------------------------------------ +; Live2Dキャラのカラー +;------------------------------------------------------------ +[macro name = "live2d_color"] +;*パラメータ1 : name 【必須】Live2DモデルID(一意なもの) +;*パラメータ2 : red 赤(0.0~1.0) +;*パラメータ3 : green 緑(0.0~1.0) +;*パラメータ4 : blue 青(0.0~1.0) +[iscript] +; optinal +if(mp.name ==null)console.error('nameは必須です'); +if(mp.red == null)mp.red = 1.0; +if(mp.green == null)mp.green = 1.0; +if(mp.blue == null)mp.blue = 1.0; + +; Live2Dモデルのカラー[Live2Dtyrano.js] +live2d_color(mp.name, mp.red, mp.green, mp.blue); +[endscript] +[endmacro] + + +;------------------------------------------------------------ +; Live2Dキャラの退場 +;------------------------------------------------------------ +[macro name = "live2d_delete"] +;*パラメータ1 : name 【必須】Live2DモデルID(一意なもの) +[iscript] +; optinal +if(mp.name ==null)console.error('nameは必須です'); + +; Live2DのCanvas追加する親ID +parentID = 'tyrano_base'; +; Live2Dモデル表示[Live2Dtyrano.js] +live2d_delete(mp.name, parentID); +[endscript] +[endmacro] + + +;------------------------------------------------------------ +; Live2Dキャラのモーション再生 +;------------------------------------------------------------ +[macro name = "live2d_motion"] +;*パラメータ1 : name 【必須】Live2DモデルID(一意なもの) +;*パラメータ2 : filenm Live2Dモーションファイル名 +; パラメータ3 : idle アイドリング有無 +[iscript] +; optinal +if(mp.name ==null)console.error('nameは必須です'); +;モーション番号を指定しない場合、モーションストップ +if(mp.filenm == null)mp.filenm = ''; +if(mp.idle == null)mp.idle = ''; +; Live2Dモデルのモーション再生[Live2Dtyrano.js] +Live2Dcanvas[mp.name].motionChange(mp.name, mp.filenm, mp.idle); +[endscript] +[endmacro] + + +;------------------------------------------------------------ +; Live2Dキャラの表情モーション再生 +;------------------------------------------------------------ +[macro name = "live2d_expression"] +;*パラメータ1 : name 【必須】Live2DモデルID(一意なもの) +;*パラメータ2 : filenm Live2D表情モーションファイル名 +[iscript] +; optinal +if(mp.name ==null)console.error('nameは必須です'); +;表情モーション名を指定しない場合、モーションストップ +if(mp.filenm == null)mp.filenm = ''; +; Live2Dモデルのモーション再生[Live2Dtyrano.js] +Live2Dcanvas[mp.name].expressionChange(mp.name, mp.filenm); +[endscript] +[endmacro] + + +;------------------------------------------------------------ +; Live2Dキャラの移動 +;------------------------------------------------------------ +[macro name = "live2d_trans"] +;*パラメータ1 : name 【必須】Live2DモデルID(一意なもの) +;*パラメータ2 : left 【必須】X位置 +;*パラメータ3 : top 【必須】Y位置 +;*パラメータ4 : time 切り替え時間 +[iscript] +; optinal +if(mp.name ==null)console.error('nameは必須です'); +if(mp.left ==null)console.error('leftは必須です'); +if(mp.top ==null)console.error('topは必須です'); +if(mp.time == null)mp.time = 1000; +; Live2Dモデルの移動[Live2Dtyrano.js] +Live2Dcanvas[mp.name].transChange(mp.name,mp.left, mp.top, mp.time); +[endscript] +[endmacro] + + +;------------------------------------------------------------ +; Live2Dキャラの回転 +;------------------------------------------------------------ +[macro name = "live2d_rotate"] +;*パラメータ1 : name 【必須】Live2DモデルID(一意なもの) +;*パラメータ2 : rotate 【必須】回転角度 +;*パラメータ3 : time 切り替え時間 +[iscript] +; optinal +if(mp.name ==null)console.error('nameは必須です'); +if(mp.rotate ==null)console.error('rotateは必須です'); +if(mp.time == null)mp.time = 1000; +; Live2Dモデルの回転[Live2Dtyrano.js] +Live2Dcanvas[mp.name].rotateChange(mp.name,mp.rotate, mp.time); +[endscript] +[endmacro] + + +;------------------------------------------------------------ +; Live2Dキャラの拡大・縮小 +;------------------------------------------------------------ +[macro name = "live2d_scale"] +;*パラメータ1 : name 【必須】Live2DモデルID(一意なもの) +;*パラメータ2 : scaleX 【必須】Xスケール +;*パラメータ3 : scaleY 【必須】Yスケール +;*パラメータ4 : time 切り替え時間 +[iscript] +; optinal +if(mp.name ==null)console.error('nameは必須です'); +if(mp.scaleX ==null)console.error('scaleXは必須です'); +if(mp.scaleY ==null)console.error('scaleYは必須です'); +if(mp.time == null)mp.time = 1000; +; Live2Dモデルの移動[Live2Dtyrano.js] +Live2Dcanvas[mp.name].scaleChange(mp.scaleX, mp.scaleY, mp.time); +[endscript] +[endmacro] + + +;------------------------------------------------------------ +; Live2Dキャラのシェイク +;------------------------------------------------------------ +[macro name = "live2d_shake"] +;*パラメータ1 : name 【必須】Live2DモデルID(一意なもの) +[iscript] +; optinal +if(mp.name ==null)console.error('nameは必須です'); +; キャラクターを揺らす[Live2Dtyrano.js] +Live2Dcanvas[mp.name].vibration(); +[endscript] +[endmacro] + +;------------------------------------------------------------ +; Live2Dモデルの復元(セーブ対応) +;------------------------------------------------------------ +[macro name = "live2d_restore"] + +[iscript] + +var live2d_models = TG.stat.f.live2d_models; + +tf.i = 0; + +tf.models = live2d_models; +tf.array_models = []; +var index=0; +for (var name in live2d_models){ + live2d_models[name]["name"] = name; + tf.array_models[index] = live2d_models[name]; + index++; +} + +tf.cnt_model = tf.array_models.length; + +[endscript] + +*point + +[iscript] + + tf.model_name=tf.array_models[tf.i]["name"]; + tf.model_left=tf.array_models[tf.i]["can_left"]; + tf.model_top = tf.array_models[tf.i]["can_top"]; + + tf.model_glscale = tf.array_models[tf.i]["gl_scale"]; + tf.model_scale = tf.array_models[tf.i]["scale"]; + + tf.model_visible = tf.array_models[tf.i]["can_visible"]; + tf.model_width = tf.array_models[tf.i]["can_width"]; + tf.model_height = tf.array_models[tf.i]["can_height"]; + + //モーションはアイドル指定の場合のみ + if(tf.array_models[tf.i]["motion"]){ + tf.model_motion = tf.array_models[tf.i]["motion"]; + }else{ + tf.model_motion = ""; + } + + //表情指定 + if(tf.array_models[tf.i]["expression"]){ + tf.model_expression = tf.array_models[tf.i]["expression"]; + }else{ + tf.model_expression = ""; + } + + + if(tf.array_models[tf.i]["rotate"]){ + tf.model_rotate = tf.array_models[tf.i]["rotate"]; + }else{ + tf.model_rotate = 0; + } + + tf.i++; + +[endscript] + +@live2d_new name=&tf.model_name width=&tf.model_width height=&tf.model_height glscale=&tf.model_glscale + +[if exp="tf.model_rotate!=0"] +@live2d_rotate name=&tf.model_name rotate=&tf.model_rotate time="0" +[endif] + +[if exp="tf.model_visible==true"] +@live2d_show name=&tf.model_name left=&tf.model_left top=&tf.model_top scale=&tf.model_scale +[endif] + +[if exp="tf.model_motion!=''"] +@live2d_motion name=&tf.model_name filenm=&tf.model_motion idle="ON" +[endif] + +[if exp="tf.model_expression!=''"] +@live2d_expression name=&tf.model_name filenm=&tf.model_expression +[endif] + +[if exp="tf.i
"+tf.title; + +[endscript] + +[ptext * text=&tf.savetext ] + + +[endmacro] + +[macro name="setsave"] + + [iscript] + + TG.menu.doSave(mp.index); + + [endscript] + +[endmacro] + +[macro name="loading"] + + [iscript] + + TG.menu.loadGame(mp.index); + + [endscript] + +[endmacro] + + +;/////////////拡張 CGモードなどを利用するための設定 + +[iscript] + + if(sf.cg_view){ + }else{ + sf.cg_view = {}; + } + + if(sf.replay_view){ + }else{ + sf.replay_view = {}; + } + + +[endscript] + + +;CGモードのボタンを表示するためのマクロ +[macro name="cg_image_button"] + + [iscript] + + mp.graphic = mp.graphic.split(','); + mp.tmp_graphic = mp.graphic.concat(); + tf.is_cg_open = false; + if(sf.cg_view[mp.graphic[0]]){ + tf.is_cg_open = true; + } + + if(typeof mp.thumb !="undefined"){ + mp.tmp_graphic[0] = mp.thumb; + } + + + [endscript] + + ;渡された値を元に、CG状態を確認していく + [if exp="tf.is_cg_open==true"] + [button graphic=&mp.tmp_graphic[0] x=&mp.x y=&mp.y width=&mp.width height=&mp.height preexp="mp.graphic" exp="tf.selected_cg_image = preexp" storage="cg.ks" target="*clickcg" folder="bgimage" ] + [else] + [button graphic=&mp.no_graphic x=&mp.x y=&mp.y width=&mp.width height=&mp.height storage="cg.ks" target="*no_image" folder="bgimage" ] + [endif] +[endmacro] + +;CGが閲覧された場合、CGモードで表示できるようにする +[macro name="cg" ] + + [iscript] + + sf.cg_view[mp.storage] = "on"; + + [endscript] + +[endmacro] + + +;リプレイモード +;CGモードのボタンを表示するためのマクロ +[macro name="replay_image_button"] + + [iscript] + + tf.is_replay_open = false; + if(sf.replay_view[mp.name]){ + tf.is_replay_open = true; + } + + [endscript] + + ;渡された値を元に、CG状態を確認していく + [if exp="tf.is_replay_open==true"] + [button graphic=&mp.graphic x=&mp.x y=&mp.y width=&mp.width height=&mp.height preexp="sf.replay_view[mp.name]" exp="tf.selected_replay_obj = preexp" storage="replay.ks" target="*clickcg" folder="bgimage" ] + [else] + [button graphic=&mp.no_graphic x=&mp.x y=&mp.y width=&mp.width height=&mp.height storage="replay.ks" target="*no_image" folder="bgimage" ] + [endif] + +[endmacro] + +;リプレイを開放する +[macro name="setreplay" ] + + [iscript] + + sf.replay_view[mp.name] = {storage:mp.storage, target:mp.target}; + + [endscript] + +[endmacro] + +[macro name="endreplay"] + + [if exp="tf.flag_replay == true"] + + @layopt page="fore" layer="message0" visible=false + ;システムボタンを非表示にするなど + [hidemenubutton] + + @jump storage="replay.ks" + + [endif] + +[endmacro] + +[return] + + diff --git a/data/scenario/title_screen.ks b/data/scenario/title_screen.ks new file mode 100644 index 0000000..ec5493e --- /dev/null +++ b/data/scenario/title_screen.ks @@ -0,0 +1,34 @@ +[_tb_system_call storage=system/_title_screen.ks] + +[hidemenubutton] + +[tb_clear_images] + +[stopbgm time="1000" ] +[tb_keyconfig flag="0" ] +[tb_hide_message_window ] +[chara_hide_all time="1000" wait="true" ] +[bg storage="hiro200+.jpg" ] +[playbgm volume="100" time="1000" loop="true" storage="Sleeping_City.ogg" ] +*title + +[glink color="black" text="はじめから" x="75" y="370" size="20" target="*start" width="" height="" _clickable_img="" ] +[glink color="black" text="つづきから" x="75" y="470" size="20" target="*load" width="" height="" _clickable_img="" ] +[glink color="black" storage="cg1.ks" size="20" text="CGモード" x="75" y="570" width="" height="" _clickable_img="" ] +[glink color="black" storage="rep1.ks" size="20" text="回想モード" x="75" y="670" width="" height="" _clickable_img="" ] +[s ] +*start + +[showmenubutton] + +[cm ] +[tb_keyconfig flag="1" ] +[jump storage="scene1.ks" target="" ] +[s ] +*load + +[cm ] +[showload] + +[jump target="*title" storage="" ] +[s ] diff --git a/data/system/KeyConfig.js b/data/system/KeyConfig.js new file mode 100644 index 0000000..748cb2b --- /dev/null +++ b/data/system/KeyConfig.js @@ -0,0 +1,106 @@ +/* +Ver4.50以降で有効 +ティラノスクリプトの装置入出力に関する設定を行うファイルです。 + + +<設定できるアクション> + save:セーブ画面を開きます + load:ロード画面を開きます + next:次の文章に移ります。左クリックの操作 + menu:メニュー画面を表示します。 + title:タイトルへ戻ります + skip:スキップを開始します + backlog:バックログを表示します + fullscreen:フルスクリーン切り替え + qsave:クイックセーブ実行 + qload:クイックロード実行 + auto:オートモード開始 + hidemessage:メッセージ消去 + 関数を指定することもできます。 + 例えば、コンフィグ画面の表示などは、関数の中にsleepgameでコンフィグ画面のシナリオファイルを指定してください + function(){ + //config呼び出し + TYRANO.kag.ftag.startTag("sleepgame", {storage:"config.ks"}); + } + +<キーボード指定方法> + + キーコードと、そのキーが押されたときのアクションを配置します。 + キーコードの調べ方は + http://shanabrian.com/web/javascript/keycode.php + 上記サイトで実際にキーを押すことで対応する数字を取得できます。 + + ノベルゲームでよく利用すると思わえるキーコードを書いておきます。 + 32:space 13:Enter 17:Ctrl + +<マウス操作> + + right:右クリック + center:センターボタンをクリック + wheel_up:マウスホイールを上に上げたときの動作 + wheel_down:マウスホイールを下に下げたときの動作 + + +<ジェスチャー> + + スマホやタブレット限定です。フリック操作などに対応して、システムを呼び出すことができます。 + swipe_up_1 は例えば、画面の上方向にフリックした時の動作を指定できます。 + この _1 の数字は指の数をしていできます。 + + なので、1本でのスワイプと2本でのスワイプの動作を分けたい場合にはそれぞれ + swipe_up_1 とswipe_up_2 を分けて定義すれば良いということです。 + + holdは 画面を一定時間タッチし続けたときに発動します。 + +*/ + +var __tyrano_key_config = { + + //キーボード操作 + "key" : { + + "32" : "hidemessage", //Space + "13" : "next", // Enter + "91" : "skip", //Command(Mac) + "17" : "skip", //Ctrl (Windows) + "67":function(){ // c ボタン + //config呼び出し例 コメント化 + /* + if (TYRANO.kag.tmp.sleep_game != null) { + return false; + } + TYRANO.kag.ftag.startTag("sleepgame", {storage:"config.ks"}); + */ + } + + }, + + //マウス操作 + "mouse" : { + "right" : "hidemessage", //右クリックの動作 + "center": "menu", //センターボタンをクリック + "wheel_up" : "backlog", // ホイールをアップした時の動作 + "wheel_down" : "next" //ホイールをダウンした時の動作 + }, + + //ジェスチャー + "gesture" : { + "swipe_up_1" : { + "action" : "backlog" + }, + "swipe_left_1" : { + "action" : "auto" + }, + "swipe_right_1" : { + "action" : "menu" + }, + "swipe_down_1" : { + "action" : "load" + }, + + "hold" : { + "action" : "skip", + } + } + +}; \ No newline at end of file diff --git a/node_modules/adm-zip/README.md b/node_modules/adm-zip/README.md new file mode 100644 index 0000000..dd94d47 --- /dev/null +++ b/node_modules/adm-zip/README.md @@ -0,0 +1,64 @@ +# ADM-ZIP for NodeJS + +ADM-ZIP is a pure JavaScript implementation for zip data compression for [NodeJS](http://nodejs.org/). + +# Installation + +With [npm](http://npmjs.org) do: + + $ npm install adm-zip + +## What is it good for? +The library allows you to: + +* decompress zip files directly to disk or in memory buffers +* compress files and store them to disk in .zip format or in compressed buffers +* update content of/add new/delete files from an existing .zip + +# Dependencies +There are no other nodeJS libraries that ADM-ZIP is dependent of + +# Examples + +## Basic usage +```javascript + + var AdmZip = require('adm-zip'); + + // reading archives + var zip = new AdmZip("./my_file.zip"); + var zipEntries = zip.getEntries(); // an array of ZipEntry records + + zipEntries.forEach(function(zipEntry) { + console.log(zipEntry.toString()); // outputs zip entries information + if (zipEntry.entryName == "my_file.txt") { + console.log(zipEntry.data.toString('utf8')); + } + }); + // outputs the content of some_folder/my_file.txt + console.log(zip.readAsText("some_folder/my_file.txt")); + // extracts the specified file to the specified location + zip.extractEntryTo(/*entry name*/"some_folder/my_file.txt", /*target path*/"/home/me/tempfolder", /*maintainEntryPath*/false, /*overwrite*/true); + // extracts everything + zip.extractAllTo(/*target path*/"/home/me/zipcontent/", /*overwrite*/true); + + + // creating archives + var zip = new AdmZip(); + + // add file directly + zip.addFile("test.txt", new Buffer("inner content of the file"), "entry comment goes here"); + // add local file + zip.addLocalFile("/home/me/some_picture.png"); + // get everything as a buffer + var willSendthis = zip.toBuffer(); + // or write everything to disk + zip.writeZip(/*target file name*/"/home/me/files.zip"); + + + // ... more examples in the wiki +``` + +For more detailed information please check out the [wiki](https://github.com/cthackers/adm-zip/wiki). + +[![build status](https://secure.travis-ci.org/cthackers/adm-zip.png)](http://travis-ci.org/cthackers/adm-zip) diff --git a/node_modules/adm-zip/adm-zip.js b/node_modules/adm-zip/adm-zip.js new file mode 100644 index 0000000..9ba4bd0 --- /dev/null +++ b/node_modules/adm-zip/adm-zip.js @@ -0,0 +1,475 @@ +var fs = require("fs"), + pth = require("path"); + +fs.existsSync = fs.existsSync || pth.existsSync; + +var ZipEntry = require("./zipEntry"), + ZipFile = require("./zipFile"), + Utils = require("./util"); + +module.exports = function(/*String*/input) { + var _zip = undefined, + _filename = ""; + + if (input && typeof input === "string") { // load zip file + if (fs.existsSync(input)) { + _filename = input; + _zip = new ZipFile(input, Utils.Constants.FILE); + } else { + throw Utils.Errors.INVALID_FILENAME; + } + } else if(input && Buffer.isBuffer(input)) { // load buffer + _zip = new ZipFile(input, Utils.Constants.BUFFER); + } else { // create new zip file + _zip = new ZipFile(null, Utils.Constants.NONE); + } + + function getEntry(/*Object*/entry) { + if (entry && _zip) { + var item; + // If entry was given as a file name + if (typeof entry === "string") + item = _zip.getEntry(entry); + // if entry was given as a ZipEntry object + if (typeof entry === "object" && entry.entryName != undefined && entry.header != undefined) + item = _zip.getEntry(entry.entryName); + + if (item) { + return item; + } + } + return null; + } + + return { + /** + * Extracts the given entry from the archive and returns the content as a Buffer object + * @param entry ZipEntry object or String with the full path of the entry + * + * @return Buffer or Null in case of error + */ + readFile : function(/*Object*/entry) { + var item = getEntry(entry); + return item && item.getData() || null; + }, + + /** + * Asynchronous readFile + * @param entry ZipEntry object or String with the full path of the entry + * @param callback + * + * @return Buffer or Null in case of error + */ + readFileAsync : function(/*Object*/entry, /*Function*/callback) { + var item = getEntry(entry); + if (item) { + item.getDataAsync(callback); + } else { + callback(null,"getEntry failed for:" + entry) + } + }, + + /** + * Extracts the given entry from the archive and returns the content as plain text in the given encoding + * @param entry ZipEntry object or String with the full path of the entry + * @param encoding Optional. If no encoding is specified utf8 is used + * + * @return String + */ + readAsText : function(/*Object*/entry, /*String - Optional*/encoding) { + var item = getEntry(entry); + if (item) { + var data = item.getData(); + if (data && data.length) { + return data.toString(encoding || "utf8"); + } + } + return ""; + }, + + /** + * Asynchronous readAsText + * @param entry ZipEntry object or String with the full path of the entry + * @param callback + * @param encoding Optional. If no encoding is specified utf8 is used + * + * @return String + */ + readAsTextAsync : function(/*Object*/entry, /*Function*/callback, /*String - Optional*/encoding) { + var item = getEntry(entry); + if (item) { + item.getDataAsync(function(data) { + if (data && data.length) { + callback(data.toString(encoding || "utf8")); + } else { + callback(""); + } + }) + } else { + callback(""); + } + }, + + /** + * Remove the entry from the file or the entry and all it's nested directories and files if the given entry is a directory + * + * @param entry + */ + deleteFile : function(/*Object*/entry) { // @TODO: test deleteFile + var item = getEntry(entry); + if (item) { + _zip.deleteEntry(item.entryName); + } + }, + + /** + * Adds a comment to the zip. The zip must be rewritten after adding the comment. + * + * @param comment + */ + addZipComment : function(/*String*/comment) { // @TODO: test addZipComment + _zip.comment = comment; + }, + + /** + * Returns the zip comment + * + * @return String + */ + getZipComment : function() { + return _zip.comment || ''; + }, + + /** + * Adds a comment to a specified zipEntry. The zip must be rewritten after adding the comment + * The comment cannot exceed 65535 characters in length + * + * @param entry + * @param comment + */ + addZipEntryComment : function(/*Object*/entry,/*String*/comment) { + var item = getEntry(entry); + if (item) { + item.comment = comment; + } + }, + + /** + * Returns the comment of the specified entry + * + * @param entry + * @return String + */ + getZipEntryComment : function(/*Object*/entry) { + var item = getEntry(entry); + if (item) { + return item.comment || ''; + } + return '' + }, + + /** + * Updates the content of an existing entry inside the archive. The zip must be rewritten after updating the content + * + * @param entry + * @param content + */ + updateFile : function(/*Object*/entry, /*Buffer*/content) { + var item = getEntry(entry); + if (item) { + item.setData(content); + } + }, + + /** + * Adds a file from the disk to the archive + * + * @param localPath + */ + addLocalFile : function(/*String*/localPath, /*String*/zipPath, /*String*/zipName) { + if (fs.existsSync(localPath)) { + if(zipPath){ + zipPath=zipPath.split("\\").join("/"); + if(zipPath.charAt(zipPath.length - 1) != "/"){ + zipPath += "/"; + } + }else{ + zipPath=""; + } + var p = localPath.split("\\").join("/").split("/").pop(); + + if(zipName){ + this.addFile(zipPath+zipName, fs.readFileSync(localPath), "", 0) + }else{ + this.addFile(zipPath+p, fs.readFileSync(localPath), "", 0) + } + } else { + throw Utils.Errors.FILE_NOT_FOUND.replace("%s", localPath); + } + }, + + /** + * Adds a local directory and all its nested files and directories to the archive + * + * @param localPath + * @param zipPath optional path inside zip + * @param filter optional RegExp or Function if files match will + * be included. + */ + addLocalFolder : function(/*String*/localPath, /*String*/zipPath, /*RegExp|Function*/filter) { + if (filter === undefined) { + filter = function() { return true; }; + } else if (filter instanceof RegExp) { + filter = function(filter) { + return function(filename) { + return filter.test(filename); + } + }(filter); + } + + if(zipPath){ + zipPath=zipPath.split("\\").join("/"); + if(zipPath.charAt(zipPath.length - 1) != "/"){ + zipPath += "/"; + } + }else{ + zipPath=""; + } + localPath = localPath.split("\\").join("/"); //windows fix + localPath = pth.normalize(localPath); + if (localPath.charAt(localPath.length - 1) != "/") + localPath += "/"; + + if (fs.existsSync(localPath)) { + + var items = Utils.findFiles(localPath), + self = this; + + if (items.length) { + items.forEach(function(path) { + var p = path.split("\\").join("/").replace( new RegExp(localPath, 'i'), ""); //windows fix + if (filter(p)) { + if (p.charAt(p.length - 1) !== "/") { + self.addFile(zipPath+p, fs.readFileSync(path), "", 0) + } else { + self.addFile(zipPath+p, new Buffer(0), "", 0) + } + } + }); + } + } else { + throw Utils.Errors.FILE_NOT_FOUND.replace("%s", localPath); + } + }, + + /** + * Allows you to create a entry (file or directory) in the zip file. + * If you want to create a directory the entryName must end in / and a null buffer should be provided. + * Comment and attributes are optional + * + * @param entryName + * @param content + * @param comment + * @param attr + */ + addFile : function(/*String*/entryName, /*Buffer*/content, /*String*/comment, /*Number*/attr) { + var entry = new ZipEntry(); + entry.entryName = entryName; + entry.comment = comment || ""; + entry.attr = attr || 438; //0666; + if (entry.isDirectory && content.length) { + // throw Utils.Errors.DIRECTORY_CONTENT_ERROR; + } + entry.setData(content); + _zip.setEntry(entry); + }, + + /** + * Returns an array of ZipEntry objects representing the files and folders inside the archive + * + * @return Array + */ + getEntries : function() { + if (_zip) { + return _zip.entries; + } else { + return []; + } + }, + + /** + * Returns a ZipEntry object representing the file or folder specified by ``name``. + * + * @param name + * @return ZipEntry + */ + getEntry : function(/*String*/name) { + return getEntry(name); + }, + + /** + * Extracts the given entry to the given targetPath + * If the entry is a directory inside the archive, the entire directory and it's subdirectories will be extracted + * + * @param entry ZipEntry object or String with the full path of the entry + * @param targetPath Target folder where to write the file + * @param maintainEntryPath If maintainEntryPath is true and the entry is inside a folder, the entry folder + * will be created in targetPath as well. Default is TRUE + * @param overwrite If the file already exists at the target path, the file will be overwriten if this is true. + * Default is FALSE + * + * @return Boolean + */ + extractEntryTo : function(/*Object*/entry, /*String*/targetPath, /*Boolean*/maintainEntryPath, /*Boolean*/overwrite) { + overwrite = overwrite || false; + maintainEntryPath = typeof maintainEntryPath == "undefined" ? true : maintainEntryPath; + + var item = getEntry(entry); + if (!item) { + throw Utils.Errors.NO_ENTRY; + } + + var target = pth.resolve(targetPath, maintainEntryPath ? item.entryName : pth.basename(item.entryName)); + + if (item.isDirectory) { + target = pth.resolve(target, ".."); + var children = _zip.getEntryChildren(item); + children.forEach(function(child) { + if (child.isDirectory) return; + var content = child.getData(); + if (!content) { + throw Utils.Errors.CANT_EXTRACT_FILE; + } + Utils.writeFileTo(pth.resolve(targetPath, maintainEntryPath ? child.entryName : child.entryName.substr(item.entryName.length)), content, overwrite); + }); + return true; + } + + var content = item.getData(); + if (!content) throw Utils.Errors.CANT_EXTRACT_FILE; + + if (fs.existsSync(target) && !overwrite) { + throw Utils.Errors.CANT_OVERRIDE; + } + Utils.writeFileTo(target, content, overwrite); + + return true; + }, + + /** + * Extracts the entire archive to the given location + * + * @param targetPath Target location + * @param overwrite If the file already exists at the target path, the file will be overwriten if this is true. + * Default is FALSE + */ + extractAllTo : function(/*String*/targetPath, /*Boolean*/overwrite) { + overwrite = overwrite || false; + if (!_zip) { + throw Utils.Errors.NO_ZIP; + } + + _zip.entries.forEach(function(entry) { + if (entry.isDirectory) { + Utils.makeDir(pth.resolve(targetPath, entry.entryName.toString())); + return; + } + var content = entry.getData(); + if (!content) { + throw Utils.Errors.CANT_EXTRACT_FILE + "2"; + } + Utils.writeFileTo(pth.resolve(targetPath, entry.entryName.toString()), content, overwrite); + }) + }, + + /** + * Asynchronous extractAllTo + * + * @param targetPath Target location + * @param overwrite If the file already exists at the target path, the file will be overwriten if this is true. + * Default is FALSE + * @param callback + */ + extractAllToAsync : function(/*String*/targetPath, /*Boolean*/overwrite, /*Function*/callback) { + overwrite = overwrite || false; + if (!_zip) { + callback(new Error(Utils.Errors.NO_ZIP)); + return; + } + + var entries = _zip.entries; + var i = entries.length; + entries.forEach(function(entry) { + if(i <= 0) return; // Had an error already + + if (entry.isDirectory) { + Utils.makeDir(pth.resolve(targetPath, entry.entryName.toString())); + if(--i == 0) + callback(undefined); + return; + } + entry.getDataAsync(function(content) { + if(i <= 0) return; + if (!content) { + i = 0; + callback(new Error(Utils.Errors.CANT_EXTRACT_FILE + "2")); + return; + } + Utils.writeFileToAsync(pth.resolve(targetPath, entry.entryName.toString()), content, overwrite, function(succ) { + if(i <= 0) return; + + if(!succ) { + i = 0; + callback(new Error('Unable to write')); + return; + } + + if(--i == 0) + callback(undefined); + }); + + }); + }) + }, + + /** + * Writes the newly created zip file to disk at the specified location or if a zip was opened and no ``targetFileName`` is provided, it will overwrite the opened zip + * + * @param targetFileName + * @param callback + */ + writeZip : function(/*String*/targetFileName, /*Function*/callback) { + if (arguments.length == 1) { + if (typeof targetFileName == "function") { + callback = targetFileName; + targetFileName = ""; + } + } + + if (!targetFileName && _filename) { + targetFileName = _filename; + } + if (!targetFileName) return; + + var zipData = _zip.compressToBuffer(); + if (zipData) { + var ok = Utils.writeFileTo(targetFileName, zipData, true); + if (typeof callback == 'function') callback(!ok? new Error("failed"): null, ""); + } + }, + + /** + * Returns the content of the entire zip file as a Buffer object + * + * @return Buffer + */ + toBuffer : function(/*Function*/onSuccess,/*Function*/onFail,/*Function*/onItemStart,/*Function*/onItemEnd) { + this.valueOf = 2; + if (typeof onSuccess == "function") { + _zip.toAsyncBuffer(onSuccess,onFail,onItemStart,onItemEnd); + return null; + } + return _zip.compressToBuffer() + } + } +}; diff --git a/node_modules/adm-zip/headers/entryHeader.js b/node_modules/adm-zip/headers/entryHeader.js new file mode 100644 index 0000000..9a0e1bd --- /dev/null +++ b/node_modules/adm-zip/headers/entryHeader.js @@ -0,0 +1,261 @@ +var Utils = require("../util"), + Constants = Utils.Constants; + +/* The central directory file header */ +module.exports = function () { + var _verMade = 0x0A, + _version = 0x0A, + _flags = 0, + _method = 0, + _time = 0, + _crc = 0, + _compressedSize = 0, + _size = 0, + _fnameLen = 0, + _extraLen = 0, + + _comLen = 0, + _diskStart = 0, + _inattr = 0, + _attr = 0, + _offset = 0; + + var _dataHeader = {}; + + function setTime(val) { + var val = new Date(val); + _time = (val.getFullYear() - 1980 & 0x7f) << 25 // b09-16 years from 1980 + | (val.getMonth() + 1) << 21 // b05-08 month + | val.getDay() << 16 // b00-04 hour + + // 2 bytes time + | val.getHours() << 11 // b11-15 hour + | val.getMinutes() << 5 // b05-10 minute + | val.getSeconds() >> 1; // b00-04 seconds divided by 2 + } + + setTime(+new Date()); + + return { + get made () { return _verMade; }, + set made (val) { _verMade = val; }, + + get version () { return _version; }, + set version (val) { _version = val }, + + get flags () { return _flags }, + set flags (val) { _flags = val; }, + + get method () { return _method; }, + set method (val) { _method = val; }, + + get time () { return new Date( + ((_time >> 25) & 0x7f) + 1980, + ((_time >> 21) & 0x0f) - 1, + (_time >> 16) & 0x1f, + (_time >> 11) & 0x1f, + (_time >> 5) & 0x3f, + (_time & 0x1f) << 1 + ); + }, + set time (val) { + setTime(val); + }, + + get crc () { return _crc; }, + set crc (val) { _crc = val; }, + + get compressedSize () { return _compressedSize; }, + set compressedSize (val) { _compressedSize = val; }, + + get size () { return _size; }, + set size (val) { _size = val; }, + + get fileNameLength () { return _fnameLen; }, + set fileNameLength (val) { _fnameLen = val; }, + + get extraLength () { return _extraLen }, + set extraLength (val) { _extraLen = val; }, + + get commentLength () { return _comLen }, + set commentLength (val) { _comLen = val }, + + get diskNumStart () { return _diskStart }, + set diskNumStart (val) { _diskStart = val }, + + get inAttr () { return _inattr }, + set inAttr (val) { _inattr = val }, + + get attr () { return _attr }, + set attr (val) { _attr = val }, + + get offset () { return _offset }, + set offset (val) { _offset = val }, + + get encripted () { return (_flags & 1) == 1 }, + + get entryHeaderSize () { + return Constants.CENHDR + _fnameLen + _extraLen + _comLen; + }, + + get realDataOffset () { + return _offset + Constants.LOCHDR + _dataHeader.fnameLen + _dataHeader.extraLen; + }, + + get dataHeader () { + return _dataHeader; + }, + + loadDataHeaderFromBinary : function(/*Buffer*/input) { + var data = input.slice(_offset, _offset + Constants.LOCHDR); + // 30 bytes and should start with "PK\003\004" + if (data.readUInt32LE(0) != Constants.LOCSIG) { + throw Utils.Errors.INVALID_LOC; + } + _dataHeader = { + // version needed to extract + version : data.readUInt16LE(Constants.LOCVER), + // general purpose bit flag + flags : data.readUInt16LE(Constants.LOCFLG), + // compression method + method : data.readUInt16LE(Constants.LOCHOW), + // modification time (2 bytes time, 2 bytes date) + time : data.readUInt32LE(Constants.LOCTIM), + // uncompressed file crc-32 value + crc : data.readUInt32LE(Constants.LOCCRC), + // compressed size + compressedSize : data.readUInt32LE(Constants.LOCSIZ), + // uncompressed size + size : data.readUInt32LE(Constants.LOCLEN), + // filename length + fnameLen : data.readUInt16LE(Constants.LOCNAM), + // extra field length + extraLen : data.readUInt16LE(Constants.LOCEXT) + } + }, + + loadFromBinary : function(/*Buffer*/data) { + // data should be 46 bytes and start with "PK 01 02" + if (data.length != Constants.CENHDR || data.readUInt32LE(0) != Constants.CENSIG) { + throw Utils.Errors.INVALID_CEN; + } + // version made by + _verMade = data.readUInt16LE(Constants.CENVEM); + // version needed to extract + _version = data.readUInt16LE(Constants.CENVER); + // encrypt, decrypt flags + _flags = data.readUInt16LE(Constants.CENFLG); + // compression method + _method = data.readUInt16LE(Constants.CENHOW); + // modification time (2 bytes time, 2 bytes date) + _time = data.readUInt32LE(Constants.CENTIM); + // uncompressed file crc-32 value + _crc = data.readUInt32LE(Constants.CENCRC); + // compressed size + _compressedSize = data.readUInt32LE(Constants.CENSIZ); + // uncompressed size + _size = data.readUInt32LE(Constants.CENLEN); + // filename length + _fnameLen = data.readUInt16LE(Constants.CENNAM); + // extra field length + _extraLen = data.readUInt16LE(Constants.CENEXT); + // file comment length + _comLen = data.readUInt16LE(Constants.CENCOM); + // volume number start + _diskStart = data.readUInt16LE(Constants.CENDSK); + // internal file attributes + _inattr = data.readUInt16LE(Constants.CENATT); + // external file attributes + _attr = data.readUInt32LE(Constants.CENATX); + // LOC header offset + _offset = data.readUInt32LE(Constants.CENOFF); + }, + + dataHeaderToBinary : function() { + // LOC header size (30 bytes) + var data = new Buffer(Constants.LOCHDR); + // "PK\003\004" + data.writeUInt32LE(Constants.LOCSIG, 0); + // version needed to extract + data.writeUInt16LE(_version, Constants.LOCVER); + // general purpose bit flag + data.writeUInt16LE(_flags, Constants.LOCFLG); + // compression method + data.writeUInt16LE(_method, Constants.LOCHOW); + // modification time (2 bytes time, 2 bytes date) + data.writeUInt32LE(_time, Constants.LOCTIM); + // uncompressed file crc-32 value + data.writeUInt32LE(_crc, Constants.LOCCRC); + // compressed size + data.writeUInt32LE(_compressedSize, Constants.LOCSIZ); + // uncompressed size + data.writeUInt32LE(_size, Constants.LOCLEN); + // filename length + data.writeUInt16LE(_fnameLen, Constants.LOCNAM); + // extra field length + data.writeUInt16LE(_extraLen, Constants.LOCEXT); + return data; + }, + + entryHeaderToBinary : function() { + // CEN header size (46 bytes) + var data = new Buffer(Constants.CENHDR + _fnameLen + _extraLen + _comLen); + // "PK\001\002" + data.writeUInt32LE(Constants.CENSIG, 0); + // version made by + data.writeUInt16LE(_verMade, Constants.CENVEM); + // version needed to extract + data.writeUInt16LE(_version, Constants.CENVER); + // encrypt, decrypt flags + data.writeUInt16LE(_flags, Constants.CENFLG); + // compression method + data.writeUInt16LE(_method, Constants.CENHOW); + // modification time (2 bytes time, 2 bytes date) + data.writeUInt32LE(_time, Constants.CENTIM); + // uncompressed file crc-32 value + data.writeInt32LE(_crc, Constants.CENCRC, true); + // compressed size + data.writeUInt32LE(_compressedSize, Constants.CENSIZ); + // uncompressed size + data.writeUInt32LE(_size, Constants.CENLEN); + // filename length + data.writeUInt16LE(_fnameLen, Constants.CENNAM); + // extra field length + data.writeUInt16LE(_extraLen, Constants.CENEXT); + // file comment length + data.writeUInt16LE(_comLen, Constants.CENCOM); + // volume number start + data.writeUInt16LE(_diskStart, Constants.CENDSK); + // internal file attributes + data.writeUInt16LE(_inattr, Constants.CENATT); + // external file attributes + data.writeUInt32LE(_attr, Constants.CENATX); + // LOC header offset + data.writeUInt32LE(_offset, Constants.CENOFF); + // fill all with + data.fill(0x00, Constants.CENHDR); + return data; + }, + + toString : function() { + return '{\n' + + '\t"made" : ' + _verMade + ",\n" + + '\t"version" : ' + _version + ",\n" + + '\t"flags" : ' + _flags + ",\n" + + '\t"method" : ' + Utils.methodToString(_method) + ",\n" + + '\t"time" : ' + _time + ",\n" + + '\t"crc" : 0x' + _crc.toString(16).toUpperCase() + ",\n" + + '\t"compressedSize" : ' + _compressedSize + " bytes,\n" + + '\t"size" : ' + _size + " bytes,\n" + + '\t"fileNameLength" : ' + _fnameLen + ",\n" + + '\t"extraLength" : ' + _extraLen + " bytes,\n" + + '\t"commentLength" : ' + _comLen + " bytes,\n" + + '\t"diskNumStart" : ' + _diskStart + ",\n" + + '\t"inAttr" : ' + _inattr + ",\n" + + '\t"attr" : ' + _attr + ",\n" + + '\t"offset" : ' + _offset + ",\n" + + '\t"entryHeaderSize" : ' + (Constants.CENHDR + _fnameLen + _extraLen + _comLen) + " bytes\n" + + '}'; + } + } +}; diff --git a/node_modules/adm-zip/headers/index.js b/node_modules/adm-zip/headers/index.js new file mode 100644 index 0000000..b54a722 --- /dev/null +++ b/node_modules/adm-zip/headers/index.js @@ -0,0 +1,2 @@ +exports.EntryHeader = require("./entryHeader"); +exports.MainHeader = require("./mainHeader"); diff --git a/node_modules/adm-zip/headers/mainHeader.js b/node_modules/adm-zip/headers/mainHeader.js new file mode 100644 index 0000000..de8ae1a --- /dev/null +++ b/node_modules/adm-zip/headers/mainHeader.js @@ -0,0 +1,80 @@ +var Utils = require("../util"), + Constants = Utils.Constants; + +/* The entries in the end of central directory */ +module.exports = function () { + var _volumeEntries = 0, + _totalEntries = 0, + _size = 0, + _offset = 0, + _commentLength = 0; + + return { + get diskEntries () { return _volumeEntries }, + set diskEntries (/*Number*/val) { _volumeEntries = _totalEntries = val; }, + + get totalEntries () { return _totalEntries }, + set totalEntries (/*Number*/val) { _totalEntries = _volumeEntries = val; }, + + get size () { return _size }, + set size (/*Number*/val) { _size = val; }, + + get offset () { return _offset }, + set offset (/*Number*/val) { _offset = val; }, + + get commentLength () { return _commentLength }, + set commentLength (/*Number*/val) { _commentLength = val; }, + + get mainHeaderSize () { + return Constants.ENDHDR + _commentLength; + }, + + loadFromBinary : function(/*Buffer*/data) { + // data should be 22 bytes and start with "PK 05 06" + if (data.length != Constants.ENDHDR || data.readUInt32LE(0) != Constants.ENDSIG) + throw Utils.Errors.INVALID_END; + + // number of entries on this volume + _volumeEntries = data.readUInt16LE(Constants.ENDSUB); + // total number of entries + _totalEntries = data.readUInt16LE(Constants.ENDTOT); + // central directory size in bytes + _size = data.readUInt32LE(Constants.ENDSIZ); + // offset of first CEN header + _offset = data.readUInt32LE(Constants.ENDOFF); + // zip file comment length + _commentLength = data.readUInt16LE(Constants.ENDCOM); + }, + + toBinary : function() { + var b = new Buffer(Constants.ENDHDR + _commentLength); + // "PK 05 06" signature + b.writeUInt32LE(Constants.ENDSIG, 0); + b.writeUInt32LE(0, 4); + // number of entries on this volume + b.writeUInt16LE(_volumeEntries, Constants.ENDSUB); + // total number of entries + b.writeUInt16LE(_totalEntries, Constants.ENDTOT); + // central directory size in bytes + b.writeUInt32LE(_size, Constants.ENDSIZ); + // offset of first CEN header + b.writeUInt32LE(_offset, Constants.ENDOFF); + // zip file comment length + b.writeUInt16LE(_commentLength, Constants.ENDCOM); + // fill comment memory with spaces so no garbage is left there + b.fill(" ", Constants.ENDHDR); + + return b; + }, + + toString : function() { + return '{\n' + + '\t"diskEntries" : ' + _volumeEntries + ",\n" + + '\t"totalEntries" : ' + _totalEntries + ",\n" + + '\t"size" : ' + _size + " bytes,\n" + + '\t"offset" : 0x' + _offset.toString(16).toUpperCase() + ",\n" + + '\t"commentLength" : 0x' + _commentLength + "\n" + + '}'; + } + } +}; \ No newline at end of file diff --git a/node_modules/adm-zip/methods/deflater.js b/node_modules/adm-zip/methods/deflater.js new file mode 100644 index 0000000..34ef297 --- /dev/null +++ b/node_modules/adm-zip/methods/deflater.js @@ -0,0 +1,1578 @@ +/* + * $Id: rawdeflate.js,v 0.5 2013/04/09 14:25:38 dankogai Exp dankogai $ + * + * GNU General Public License, version 2 (GPL-2.0) + * http://opensource.org/licenses/GPL-2.0 + * Original: + * http://www.onicos.com/staff/iz/amuse/javascript/expert/deflate.txt + */ +function JSDeflater(/*inbuff*/inbuf) { + + /* Copyright (C) 1999 Masanao Izumo + * Version: 1.0.1 + * LastModified: Dec 25 1999 + */ + + var WSIZE = 32768, // Sliding Window size + zip_STORED_BLOCK = 0, + zip_STATIC_TREES = 1, + zip_DYN_TREES = 2, + zip_DEFAULT_LEVEL = 6, + zip_FULL_SEARCH = true, + zip_INBUFSIZ = 32768, // Input buffer size + zip_INBUF_EXTRA = 64, // Extra buffer + zip_OUTBUFSIZ = 1024 * 8, + zip_window_size = 2 * WSIZE, + MIN_MATCH = 3, + MAX_MATCH = 258, + zip_BITS = 16, + LIT_BUFSIZE = 0x2000, + zip_HASH_BITS = 13, + zip_DIST_BUFSIZE = LIT_BUFSIZE, + zip_HASH_SIZE = 1 << zip_HASH_BITS, + zip_HASH_MASK = zip_HASH_SIZE - 1, + zip_WMASK = WSIZE - 1, + zip_NIL = 0, // Tail of hash chains + zip_TOO_FAR = 4096, + zip_MIN_LOOKAHEAD = MAX_MATCH + MIN_MATCH + 1, + zip_MAX_DIST = WSIZE - zip_MIN_LOOKAHEAD, + zip_SMALLEST = 1, + zip_MAX_BITS = 15, + zip_MAX_BL_BITS = 7, + zip_LENGTH_CODES = 29, + zip_LITERALS = 256, + zip_END_BLOCK = 256, + zip_L_CODES = zip_LITERALS + 1 + zip_LENGTH_CODES, + zip_D_CODES = 30, + zip_BL_CODES = 19, + zip_REP_3_6 = 16, + zip_REPZ_3_10 = 17, + zip_REPZ_11_138 = 18, + zip_HEAP_SIZE = 2 * zip_L_CODES + 1, + zip_H_SHIFT = parseInt((zip_HASH_BITS + MIN_MATCH - 1) / MIN_MATCH); + + var zip_free_queue, zip_qhead, zip_qtail, zip_initflag, zip_outbuf = null, zip_outcnt, zip_outoff, zip_complete, + zip_window, zip_d_buf, zip_l_buf, zip_prev, zip_bi_buf, zip_bi_valid, zip_block_start, zip_ins_h, zip_hash_head, + zip_prev_match, zip_match_available, zip_match_length, zip_prev_length, zip_strstart, zip_match_start, zip_eofile, + zip_lookahead, zip_max_chain_length, zip_max_lazy_match, zip_compr_level, zip_good_match, zip_nice_match, + zip_dyn_ltree, zip_dyn_dtree, zip_static_ltree, zip_static_dtree, zip_bl_tree, zip_l_desc, zip_d_desc, zip_bl_desc, + zip_bl_count, zip_heap, zip_heap_len, zip_heap_max, zip_depth, zip_length_code, zip_dist_code, zip_base_length, + zip_base_dist, zip_flag_buf, zip_last_lit, zip_last_dist, zip_last_flags, zip_flags, zip_flag_bit, zip_opt_len, + zip_static_len, zip_deflate_data, zip_deflate_pos; + + var zip_DeflateCT = function () { + this.fc = 0; // frequency count or bit string + this.dl = 0; // father node in Huffman tree or length of bit string + }; + + var zip_DeflateTreeDesc = function () { + this.dyn_tree = null; // the dynamic tree + this.static_tree = null; // corresponding static tree or NULL + this.extra_bits = null; // extra bits for each code or NULL + this.extra_base = 0; // base index for extra_bits + this.elems = 0; // max number of elements in the tree + this.max_length = 0; // max bit length for the codes + this.max_code = 0; // largest code with non zero frequency + }; + + /* Values for max_lazy_match, good_match and max_chain_length, depending on + * the desired pack level (0..9). The values given below have been tuned to + * exclude worst case performance for pathological files. Better values may be + * found for specific files. + */ + var zip_DeflateConfiguration = function (a, b, c, d) { + this.good_length = a; // reduce lazy search above this match length + this.max_lazy = b; // do not perform lazy search above this match length + this.nice_length = c; // quit search above this match length + this.max_chain = d; + }; + + var zip_DeflateBuffer = function () { + this.next = null; + this.len = 0; + this.ptr = new Array(zip_OUTBUFSIZ); + this.off = 0; + }; + + /* constant tables */ + var zip_extra_lbits = new Array( + 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0); + var zip_extra_dbits = new Array( + 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13); + var zip_extra_blbits = new Array( + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 7); + var zip_bl_order = new Array( + 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15); + var zip_configuration_table = new Array( + new zip_DeflateConfiguration(0, 0, 0, 0), + new zip_DeflateConfiguration(4, 4, 8, 4), + new zip_DeflateConfiguration(4, 5, 16, 8), + new zip_DeflateConfiguration(4, 6, 32, 32), + new zip_DeflateConfiguration(4, 4, 16, 16), + new zip_DeflateConfiguration(8, 16, 32, 32), + new zip_DeflateConfiguration(8, 16, 128, 128), + new zip_DeflateConfiguration(8, 32, 128, 256), + new zip_DeflateConfiguration(32, 128, 258, 1024), + new zip_DeflateConfiguration(32, 258, 258, 4096)); + + + /* routines (deflate) */ + + var zip_deflate_start = function (level) { + var i; + + if (!level) + level = zip_DEFAULT_LEVEL; + else if (level < 1) + level = 1; + else if (level > 9) + level = 9; + + zip_compr_level = level; + zip_initflag = false; + zip_eofile = false; + if (zip_outbuf != null) + return; + + zip_free_queue = zip_qhead = zip_qtail = null; + zip_outbuf = new Array(zip_OUTBUFSIZ); + zip_window = new Array(zip_window_size); + zip_d_buf = new Array(zip_DIST_BUFSIZE); + zip_l_buf = new Array(zip_INBUFSIZ + zip_INBUF_EXTRA); + zip_prev = new Array(1 << zip_BITS); + zip_dyn_ltree = new Array(zip_HEAP_SIZE); + for (i = 0; i < zip_HEAP_SIZE; i++) zip_dyn_ltree[i] = new zip_DeflateCT(); + zip_dyn_dtree = new Array(2 * zip_D_CODES + 1); + for (i = 0; i < 2 * zip_D_CODES + 1; i++) zip_dyn_dtree[i] = new zip_DeflateCT(); + zip_static_ltree = new Array(zip_L_CODES + 2); + for (i = 0; i < zip_L_CODES + 2; i++) zip_static_ltree[i] = new zip_DeflateCT(); + zip_static_dtree = new Array(zip_D_CODES); + for (i = 0; i < zip_D_CODES; i++) zip_static_dtree[i] = new zip_DeflateCT(); + zip_bl_tree = new Array(2 * zip_BL_CODES + 1); + for (i = 0; i < 2 * zip_BL_CODES + 1; i++) zip_bl_tree[i] = new zip_DeflateCT(); + zip_l_desc = new zip_DeflateTreeDesc(); + zip_d_desc = new zip_DeflateTreeDesc(); + zip_bl_desc = new zip_DeflateTreeDesc(); + zip_bl_count = new Array(zip_MAX_BITS + 1); + zip_heap = new Array(2 * zip_L_CODES + 1); + zip_depth = new Array(2 * zip_L_CODES + 1); + zip_length_code = new Array(MAX_MATCH - MIN_MATCH + 1); + zip_dist_code = new Array(512); + zip_base_length = new Array(zip_LENGTH_CODES); + zip_base_dist = new Array(zip_D_CODES); + zip_flag_buf = new Array(parseInt(LIT_BUFSIZE / 8)); + }; + + var zip_deflate_end = function () { + zip_free_queue = zip_qhead = zip_qtail = null; + zip_outbuf = null; + zip_window = null; + zip_d_buf = null; + zip_l_buf = null; + zip_prev = null; + zip_dyn_ltree = null; + zip_dyn_dtree = null; + zip_static_ltree = null; + zip_static_dtree = null; + zip_bl_tree = null; + zip_l_desc = null; + zip_d_desc = null; + zip_bl_desc = null; + zip_bl_count = null; + zip_heap = null; + zip_depth = null; + zip_length_code = null; + zip_dist_code = null; + zip_base_length = null; + zip_base_dist = null; + zip_flag_buf = null; + }; + + var zip_reuse_queue = function (p) { + p.next = zip_free_queue; + zip_free_queue = p; + }; + + var zip_new_queue = function () { + var p; + + if (zip_free_queue != null) { + p = zip_free_queue; + zip_free_queue = zip_free_queue.next; + } + else + p = new zip_DeflateBuffer(); + p.next = null; + p.len = p.off = 0; + + return p; + }; + + var zip_head1 = function (i) { + return zip_prev[WSIZE + i]; + }; + + var zip_head2 = function (i, val) { + return zip_prev[WSIZE + i] = val; + }; + + /* put_byte is used for the compressed output, put_ubyte for the + * uncompressed output. However unlzw() uses window for its + * suffix table instead of its output buffer, so it does not use put_ubyte + * (to be cleaned up). + */ + var zip_put_byte = function (c) { + zip_outbuf[zip_outoff + zip_outcnt++] = c; + if (zip_outoff + zip_outcnt == zip_OUTBUFSIZ) + zip_qoutbuf(); + }; + + /* Output a 16 bit value, lsb first */ + var zip_put_short = function (w) { + w &= 0xffff; + if (zip_outoff + zip_outcnt < zip_OUTBUFSIZ - 2) { + zip_outbuf[zip_outoff + zip_outcnt++] = (w & 0xff); + zip_outbuf[zip_outoff + zip_outcnt++] = (w >>> 8); + } else { + zip_put_byte(w & 0xff); + zip_put_byte(w >>> 8); + } + }; + + /* ========================================================================== + * Insert string s in the dictionary and set match_head to the previous head + * of the hash chain (the most recent string with same hash key). Return + * the previous length of the hash chain. + * IN assertion: all calls to to INSERT_STRING are made with consecutive + * input characters and the first MIN_MATCH bytes of s are valid + * (except for the last MIN_MATCH-1 bytes of the input file). + */ + var zip_INSERT_STRING = function () { + zip_ins_h = ((zip_ins_h << zip_H_SHIFT) + ^ (zip_window[zip_strstart + MIN_MATCH - 1] & 0xff)) + & zip_HASH_MASK; + zip_hash_head = zip_head1(zip_ins_h); + zip_prev[zip_strstart & zip_WMASK] = zip_hash_head; + zip_head2(zip_ins_h, zip_strstart); + }; + + /* Send a code of the given tree. c and tree must not have side effects */ + var zip_SEND_CODE = function (c, tree) { + zip_send_bits(tree[c].fc, tree[c].dl); + }; + + /* Mapping from a distance to a distance code. dist is the distance - 1 and + * must not have side effects. dist_code[256] and dist_code[257] are never + * used. + */ + var zip_D_CODE = function (dist) { + return (dist < 256 ? zip_dist_code[dist] + : zip_dist_code[256 + (dist >> 7)]) & 0xff; + }; + + /* ========================================================================== + * Compares to subtrees, using the tree depth as tie breaker when + * the subtrees have equal frequency. This minimizes the worst case length. + */ + var zip_SMALLER = function (tree, n, m) { + return tree[n].fc < tree[m].fc || + (tree[n].fc == tree[m].fc && zip_depth[n] <= zip_depth[m]); + }; + + /* ========================================================================== + * read string data + */ + var zip_read_buff = function (buff, offset, n) { + var i; + for (i = 0; i < n && zip_deflate_pos < zip_deflate_data.length; i++) + buff[offset + i] = + zip_deflate_data[zip_deflate_pos++] & 0xff; + return i; + }; + + /* ========================================================================== + * Initialize the "longest match" routines for a new file + */ + var zip_lm_init = function () { + var j; + + /* Initialize the hash table. */ + for (j = 0; j < zip_HASH_SIZE; j++) + zip_prev[WSIZE + j] = 0; + zip_max_lazy_match = zip_configuration_table[zip_compr_level].max_lazy; + zip_good_match = zip_configuration_table[zip_compr_level].good_length; + if (!zip_FULL_SEARCH) + zip_nice_match = zip_configuration_table[zip_compr_level].nice_length; + zip_max_chain_length = zip_configuration_table[zip_compr_level].max_chain; + + zip_strstart = 0; + zip_block_start = 0; + + zip_lookahead = zip_read_buff(zip_window, 0, 2 * WSIZE); + if (zip_lookahead <= 0) { + zip_eofile = true; + zip_lookahead = 0; + return; + } + zip_eofile = false; + /* Make sure that we always have enough lookahead. This is important + * if input comes from a device such as a tty. + */ + while (zip_lookahead < zip_MIN_LOOKAHEAD && !zip_eofile) + zip_fill_window(); + + /* If lookahead < MIN_MATCH, ins_h is garbage, but this is + * not important since only literal bytes will be emitted. + */ + zip_ins_h = 0; + for (j = 0; j < MIN_MATCH - 1; j++) { + zip_ins_h = ((zip_ins_h << zip_H_SHIFT) ^ (zip_window[j] & 0xff)) & zip_HASH_MASK; + } + }; + + /* ========================================================================== + * Set match_start to the longest match starting at the given string and + * return its length. Matches shorter or equal to prev_length are discarded, + * in which case the result is equal to prev_length and match_start is + * garbage. + * IN assertions: cur_match is the head of the hash chain for the current + * string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1 + */ + var zip_longest_match = function (cur_match) { + var chain_length = zip_max_chain_length; // max hash chain length + var scanp = zip_strstart; // current string + var matchp; // matched string + var len; // length of current match + var best_len = zip_prev_length; // best match length so far + + /* Stop when cur_match becomes <= limit. To simplify the code, + * we prevent matches with the string of window index 0. + */ + var limit = (zip_strstart > zip_MAX_DIST ? zip_strstart - zip_MAX_DIST : zip_NIL); + + var strendp = zip_strstart + MAX_MATCH; + var scan_end1 = zip_window[scanp + best_len - 1]; + var scan_end = zip_window[scanp + best_len]; + + /* Do not waste too much time if we already have a good match: */ + if (zip_prev_length >= zip_good_match) + chain_length >>= 2; + + do { + matchp = cur_match; + + /* Skip to next match if the match length cannot increase + * or if the match length is less than 2: + */ + if (zip_window[matchp + best_len] != scan_end || + zip_window[matchp + best_len - 1] != scan_end1 || + zip_window[matchp] != zip_window[scanp] || + zip_window[++matchp] != zip_window[scanp + 1]) { + continue; + } + + /* The check at best_len-1 can be removed because it will be made + * again later. (This heuristic is not always a win.) + * It is not necessary to compare scan[2] and match[2] since they + * are always equal when the other bytes match, given that + * the hash keys are equal and that HASH_BITS >= 8. + */ + scanp += 2; + matchp++; + + /* We check for insufficient lookahead only every 8th comparison; + * the 256th check will be made at strstart+258. + */ + do { + } while (zip_window[++scanp] == zip_window[++matchp] && + zip_window[++scanp] == zip_window[++matchp] && + zip_window[++scanp] == zip_window[++matchp] && + zip_window[++scanp] == zip_window[++matchp] && + zip_window[++scanp] == zip_window[++matchp] && + zip_window[++scanp] == zip_window[++matchp] && + zip_window[++scanp] == zip_window[++matchp] && + zip_window[++scanp] == zip_window[++matchp] && + scanp < strendp); + + len = MAX_MATCH - (strendp - scanp); + scanp = strendp - MAX_MATCH; + + if (len > best_len) { + zip_match_start = cur_match; + best_len = len; + if (zip_FULL_SEARCH) { + if (len >= MAX_MATCH) break; + } else { + if (len >= zip_nice_match) break; + } + + scan_end1 = zip_window[scanp + best_len - 1]; + scan_end = zip_window[scanp + best_len]; + } + } while ((cur_match = zip_prev[cur_match & zip_WMASK]) > limit + && --chain_length != 0); + + return best_len; + }; + + /* ========================================================================== + * Fill the window when the lookahead becomes insufficient. + * Updates strstart and lookahead, and sets eofile if end of input file. + * IN assertion: lookahead < MIN_LOOKAHEAD && strstart + lookahead > 0 + * OUT assertions: at least one byte has been read, or eofile is set; + * file reads are performed for at least two bytes (required for the + * translate_eol option). + */ + var zip_fill_window = function () { + var n, m; + + // Amount of free space at the end of the window. + var more = zip_window_size - zip_lookahead - zip_strstart; + + /* If the window is almost full and there is insufficient lookahead, + * move the upper half to the lower one to make room in the upper half. + */ + if (more == -1) { + /* Very unlikely, but possible on 16 bit machine if strstart == 0 + * and lookahead == 1 (input done one byte at time) + */ + more--; + } else if (zip_strstart >= WSIZE + zip_MAX_DIST) { + /* By the IN assertion, the window is not empty so we can't confuse + * more == 0 with more == 64K on a 16 bit machine. + */ + for (n = 0; n < WSIZE; n++) + zip_window[n] = zip_window[n + WSIZE]; + + zip_match_start -= WSIZE; + zip_strstart -= WSIZE; + /* we now have strstart >= MAX_DIST: */ + zip_block_start -= WSIZE; + + for (n = 0; n < zip_HASH_SIZE; n++) { + m = zip_head1(n); + zip_head2(n, m >= WSIZE ? m - WSIZE : zip_NIL); + } + for (n = 0; n < WSIZE; n++) { + /* If n is not on any hash chain, prev[n] is garbage but + * its value will never be used. + */ + m = zip_prev[n]; + zip_prev[n] = (m >= WSIZE ? m - WSIZE : zip_NIL); + } + more += WSIZE; + } + // At this point, more >= 2 + if (!zip_eofile) { + n = zip_read_buff(zip_window, zip_strstart + zip_lookahead, more); + if (n <= 0) + zip_eofile = true; + else + zip_lookahead += n; + } + }; + + /* ========================================================================== + * Processes a new input file and return its compressed length. This + * function does not perform lazy evaluationof matches and inserts + * new strings in the dictionary only for unmatched strings or for short + * matches. It is used only for the fast compression options. + */ + var zip_deflate_fast = function () { + while (zip_lookahead != 0 && zip_qhead == null) { + var flush; // set if current block must be flushed + + /* Insert the string window[strstart .. strstart+2] in the + * dictionary, and set hash_head to the head of the hash chain: + */ + zip_INSERT_STRING(); + + /* Find the longest match, discarding those <= prev_length. + * At this point we have always match_length < MIN_MATCH + */ + if (zip_hash_head != zip_NIL && + zip_strstart - zip_hash_head <= zip_MAX_DIST) { + /* To simplify the code, we prevent matches with the string + * of window index 0 (in particular we have to avoid a match + * of the string with itself at the start of the input file). + */ + zip_match_length = zip_longest_match(zip_hash_head); + /* longest_match() sets match_start */ + if (zip_match_length > zip_lookahead) + zip_match_length = zip_lookahead; + } + if (zip_match_length >= MIN_MATCH) { + flush = zip_ct_tally(zip_strstart - zip_match_start, + zip_match_length - MIN_MATCH); + zip_lookahead -= zip_match_length; + + /* Insert new strings in the hash table only if the match length + * is not too large. This saves time but degrades compression. + */ + if (zip_match_length <= zip_max_lazy_match) { + zip_match_length--; // string at strstart already in hash table + do { + zip_strstart++; + zip_INSERT_STRING(); + /* strstart never exceeds WSIZE-MAX_MATCH, so there are + * always MIN_MATCH bytes ahead. If lookahead < MIN_MATCH + * these bytes are garbage, but it does not matter since + * the next lookahead bytes will be emitted as literals. + */ + } while (--zip_match_length != 0); + zip_strstart++; + } else { + zip_strstart += zip_match_length; + zip_match_length = 0; + zip_ins_h = zip_window[zip_strstart] & 0xff; + zip_ins_h = ((zip_ins_h << zip_H_SHIFT) ^ (zip_window[zip_strstart + 1] & 0xff)) & zip_HASH_MASK; + } + } else { + /* No match, output a literal byte */ + flush = zip_ct_tally(0, zip_window[zip_strstart] & 0xff); + zip_lookahead--; + zip_strstart++; + } + if (flush) { + zip_flush_block(0); + zip_block_start = zip_strstart; + } + + /* Make sure that we always have enough lookahead, except + * at the end of the input file. We need MAX_MATCH bytes + * for the next match, plus MIN_MATCH bytes to insert the + * string following the next match. + */ + while (zip_lookahead < zip_MIN_LOOKAHEAD && !zip_eofile) + zip_fill_window(); + } + }; + + var zip_deflate_better = function () { + /* Process the input block. */ + while (zip_lookahead != 0 && zip_qhead == null) { + /* Insert the string window[strstart .. strstart+2] in the + * dictionary, and set hash_head to the head of the hash chain: + */ + zip_INSERT_STRING(); + + /* Find the longest match, discarding those <= prev_length. + */ + zip_prev_length = zip_match_length; + zip_prev_match = zip_match_start; + zip_match_length = MIN_MATCH - 1; + + if (zip_hash_head != zip_NIL && + zip_prev_length < zip_max_lazy_match && + zip_strstart - zip_hash_head <= zip_MAX_DIST) { + /* To simplify the code, we prevent matches with the string + * of window index 0 (in particular we have to avoid a match + * of the string with itself at the start of the input file). + */ + zip_match_length = zip_longest_match(zip_hash_head); + /* longest_match() sets match_start */ + if (zip_match_length > zip_lookahead) + zip_match_length = zip_lookahead; + + /* Ignore a length 3 match if it is too distant: */ + if (zip_match_length == MIN_MATCH && + zip_strstart - zip_match_start > zip_TOO_FAR) { + /* If prev_match is also MIN_MATCH, match_start is garbage + * but we will ignore the current match anyway. + */ + zip_match_length--; + } + } + /* If there was a match at the previous step and the current + * match is not better, output the previous match: + */ + if (zip_prev_length >= MIN_MATCH && + zip_match_length <= zip_prev_length) { + var flush; // set if current block must be flushed + flush = zip_ct_tally(zip_strstart - 1 - zip_prev_match, + zip_prev_length - MIN_MATCH); + + /* Insert in hash table all strings up to the end of the match. + * strstart-1 and strstart are already inserted. + */ + zip_lookahead -= zip_prev_length - 1; + zip_prev_length -= 2; + do { + zip_strstart++; + zip_INSERT_STRING(); + /* strstart never exceeds WSIZE-MAX_MATCH, so there are + * always MIN_MATCH bytes ahead. If lookahead < MIN_MATCH + * these bytes are garbage, but it does not matter since the + * next lookahead bytes will always be emitted as literals. + */ + } while (--zip_prev_length != 0); + zip_match_available = 0; + zip_match_length = MIN_MATCH - 1; + zip_strstart++; + if (flush) { + zip_flush_block(0); + zip_block_start = zip_strstart; + } + } else if (zip_match_available != 0) { + /* If there was no match at the previous position, output a + * single literal. If there was a match but the current match + * is longer, truncate the previous match to a single literal. + */ + if (zip_ct_tally(0, zip_window[zip_strstart - 1] & 0xff)) { + zip_flush_block(0); + zip_block_start = zip_strstart; + } + zip_strstart++; + zip_lookahead--; + } else { + /* There is no previous match to compare with, wait for + * the next step to decide. + */ + zip_match_available = 1; + zip_strstart++; + zip_lookahead--; + } + + /* Make sure that we always have enough lookahead, except + * at the end of the input file. We need MAX_MATCH bytes + * for the next match, plus MIN_MATCH bytes to insert the + * string following the next match. + */ + while (zip_lookahead < zip_MIN_LOOKAHEAD && !zip_eofile) + zip_fill_window(); + } + }; + + var zip_init_deflate = function () { + if (zip_eofile) + return; + zip_bi_buf = 0; + zip_bi_valid = 0; + zip_ct_init(); + zip_lm_init(); + + zip_qhead = null; + zip_outcnt = 0; + zip_outoff = 0; + zip_match_available = 0; + + if (zip_compr_level <= 3) { + zip_prev_length = MIN_MATCH - 1; + zip_match_length = 0; + } + else { + zip_match_length = MIN_MATCH - 1; + zip_match_available = 0; + zip_match_available = 0; + } + + zip_complete = false; + }; + + /* ========================================================================== + * Same as above, but achieves better compression. We use a lazy + * evaluation for matches: a match is finally adopted only if there is + * no better match at the next window position. + */ + var zip_deflate_internal = function (buff, off, buff_size) { + var n; + + if (!zip_initflag) { + zip_init_deflate(); + zip_initflag = true; + if (zip_lookahead == 0) { // empty + zip_complete = true; + return 0; + } + } + + if ((n = zip_qcopy(buff, off, buff_size)) == buff_size) + return buff_size; + + if (zip_complete) + return n; + + if (zip_compr_level <= 3) // optimized for speed + zip_deflate_fast(); + else + zip_deflate_better(); + if (zip_lookahead == 0) { + if (zip_match_available != 0) + zip_ct_tally(0, zip_window[zip_strstart - 1] & 0xff); + zip_flush_block(1); + zip_complete = true; + } + return n + zip_qcopy(buff, n + off, buff_size - n); + }; + + var zip_qcopy = function (buff, off, buff_size) { + var n, i, j; + + n = 0; + while (zip_qhead != null && n < buff_size) { + i = buff_size - n; + if (i > zip_qhead.len) + i = zip_qhead.len; + for (j = 0; j < i; j++) + buff[off + n + j] = zip_qhead.ptr[zip_qhead.off + j]; + + zip_qhead.off += i; + zip_qhead.len -= i; + n += i; + if (zip_qhead.len == 0) { + var p; + p = zip_qhead; + zip_qhead = zip_qhead.next; + zip_reuse_queue(p); + } + } + + if (n == buff_size) + return n; + + if (zip_outoff < zip_outcnt) { + i = buff_size - n; + if (i > zip_outcnt - zip_outoff) + i = zip_outcnt - zip_outoff; + // System.arraycopy(outbuf, outoff, buff, off + n, i); + for (j = 0; j < i; j++) + buff[off + n + j] = zip_outbuf[zip_outoff + j]; + zip_outoff += i; + n += i; + if (zip_outcnt == zip_outoff) + zip_outcnt = zip_outoff = 0; + } + return n; + }; + + /* ========================================================================== + * Allocate the match buffer, initialize the various tables and save the + * location of the internal file attribute (ascii/binary) and method + * (DEFLATE/STORE). + */ + var zip_ct_init = function () { + var n; // iterates over tree elements + var bits; // bit counter + var length; // length value + var code; // code value + var dist; // distance index + + if (zip_static_dtree[0].dl != 0) return; // ct_init already called + + zip_l_desc.dyn_tree = zip_dyn_ltree; + zip_l_desc.static_tree = zip_static_ltree; + zip_l_desc.extra_bits = zip_extra_lbits; + zip_l_desc.extra_base = zip_LITERALS + 1; + zip_l_desc.elems = zip_L_CODES; + zip_l_desc.max_length = zip_MAX_BITS; + zip_l_desc.max_code = 0; + + zip_d_desc.dyn_tree = zip_dyn_dtree; + zip_d_desc.static_tree = zip_static_dtree; + zip_d_desc.extra_bits = zip_extra_dbits; + zip_d_desc.extra_base = 0; + zip_d_desc.elems = zip_D_CODES; + zip_d_desc.max_length = zip_MAX_BITS; + zip_d_desc.max_code = 0; + + zip_bl_desc.dyn_tree = zip_bl_tree; + zip_bl_desc.static_tree = null; + zip_bl_desc.extra_bits = zip_extra_blbits; + zip_bl_desc.extra_base = 0; + zip_bl_desc.elems = zip_BL_CODES; + zip_bl_desc.max_length = zip_MAX_BL_BITS; + zip_bl_desc.max_code = 0; + + // Initialize the mapping length (0..255) -> length code (0..28) + length = 0; + for (code = 0; code < zip_LENGTH_CODES - 1; code++) { + zip_base_length[code] = length; + for (n = 0; n < (1 << zip_extra_lbits[code]); n++) + zip_length_code[length++] = code; + } + /* Note that the length 255 (match length 258) can be represented + * in two different ways: code 284 + 5 bits or code 285, so we + * overwrite length_code[255] to use the best encoding: + */ + zip_length_code[length - 1] = code; + + /* Initialize the mapping dist (0..32K) -> dist code (0..29) */ + dist = 0; + for (code = 0; code < 16; code++) { + zip_base_dist[code] = dist; + for (n = 0; n < (1 << zip_extra_dbits[code]); n++) { + zip_dist_code[dist++] = code; + } + } + dist >>= 7; // from now on, all distances are divided by 128 + for (; code < zip_D_CODES; code++) { + zip_base_dist[code] = dist << 7; + for (n = 0; n < (1 << (zip_extra_dbits[code] - 7)); n++) + zip_dist_code[256 + dist++] = code; + } + // Construct the codes of the static literal tree + for (bits = 0; bits <= zip_MAX_BITS; bits++) + zip_bl_count[bits] = 0; + n = 0; + while (n <= 143) { + zip_static_ltree[n++].dl = 8; + zip_bl_count[8]++; + } + while (n <= 255) { + zip_static_ltree[n++].dl = 9; + zip_bl_count[9]++; + } + while (n <= 279) { + zip_static_ltree[n++].dl = 7; + zip_bl_count[7]++; + } + while (n <= 287) { + zip_static_ltree[n++].dl = 8; + zip_bl_count[8]++; + } + /* Codes 286 and 287 do not exist, but we must include them in the + * tree construction to get a canonical Huffman tree (longest code + * all ones) + */ + zip_gen_codes(zip_static_ltree, zip_L_CODES + 1); + + /* The static distance tree is trivial: */ + for (n = 0; n < zip_D_CODES; n++) { + zip_static_dtree[n].dl = 5; + zip_static_dtree[n].fc = zip_bi_reverse(n, 5); + } + + // Initialize the first block of the first file: + zip_init_block(); + }; + + /* ========================================================================== + * Initialize a new block. + */ + var zip_init_block = function () { + var n; // iterates over tree elements + + // Initialize the trees. + for (n = 0; n < zip_L_CODES; n++) zip_dyn_ltree[n].fc = 0; + for (n = 0; n < zip_D_CODES; n++) zip_dyn_dtree[n].fc = 0; + for (n = 0; n < zip_BL_CODES; n++) zip_bl_tree[n].fc = 0; + + zip_dyn_ltree[zip_END_BLOCK].fc = 1; + zip_opt_len = zip_static_len = 0; + zip_last_lit = zip_last_dist = zip_last_flags = 0; + zip_flags = 0; + zip_flag_bit = 1; + }; + + /* ========================================================================== + * Restore the heap property by moving down the tree starting at node k, + * exchanging a node with the smallest of its two sons if necessary, stopping + * when the heap property is re-established (each father smaller than its + * two sons). + */ + var zip_pqdownheap = function (tree, // the tree to restore + k) { // node to move down + var v = zip_heap[k]; + var j = k << 1; // left son of k + + while (j <= zip_heap_len) { + // Set j to the smallest of the two sons: + if (j < zip_heap_len && + zip_SMALLER(tree, zip_heap[j + 1], zip_heap[j])) + j++; + + // Exit if v is smaller than both sons + if (zip_SMALLER(tree, v, zip_heap[j])) + break; + + // Exchange v with the smallest son + zip_heap[k] = zip_heap[j]; + k = j; + + // And continue down the tree, setting j to the left son of k + j <<= 1; + } + zip_heap[k] = v; + }; + + /* ========================================================================== + * Compute the optimal bit lengths for a tree and update the total bit length + * for the current block. + * IN assertion: the fields freq and dad are set, heap[heap_max] and + * above are the tree nodes sorted by increasing frequency. + * OUT assertions: the field len is set to the optimal bit length, the + * array bl_count contains the frequencies for each bit length. + * The length opt_len is updated; static_len is also updated if stree is + * not null. + */ + var zip_gen_bitlen = function (desc) { // the tree descriptor + var tree = desc.dyn_tree; + var extra = desc.extra_bits; + var base = desc.extra_base; + var max_code = desc.max_code; + var max_length = desc.max_length; + var stree = desc.static_tree; + var h; // heap index + var n, m; // iterate over the tree elements + var bits; // bit length + var xbits; // extra bits + var f; // frequency + var overflow = 0; // number of elements with bit length too large + + for (bits = 0; bits <= zip_MAX_BITS; bits++) + zip_bl_count[bits] = 0; + + /* In a first pass, compute the optimal bit lengths (which may + * overflow in the case of the bit length tree). + */ + tree[zip_heap[zip_heap_max]].dl = 0; // root of the heap + + for (h = zip_heap_max + 1; h < zip_HEAP_SIZE; h++) { + n = zip_heap[h]; + bits = tree[tree[n].dl].dl + 1; + if (bits > max_length) { + bits = max_length; + overflow++; + } + tree[n].dl = bits; + // We overwrite tree[n].dl which is no longer needed + + if (n > max_code) + continue; // not a leaf node + + zip_bl_count[bits]++; + xbits = 0; + if (n >= base) + xbits = extra[n - base]; + f = tree[n].fc; + zip_opt_len += f * (bits + xbits); + if (stree != null) + zip_static_len += f * (stree[n].dl + xbits); + } + if (overflow == 0) + return; + + // This happens for example on obj2 and pic of the Calgary corpus + + // Find the first bit length which could increase: + do { + bits = max_length - 1; + while (zip_bl_count[bits] == 0) + bits--; + zip_bl_count[bits]--; // move one leaf down the tree + zip_bl_count[bits + 1] += 2; // move one overflow item as its brother + zip_bl_count[max_length]--; + /* The brother of the overflow item also moves one step up, + * but this does not affect bl_count[max_length] + */ + overflow -= 2; + } while (overflow > 0); + + /* Now recompute all bit lengths, scanning in increasing frequency. + * h is still equal to HEAP_SIZE. (It is simpler to reconstruct all + * lengths instead of fixing only the wrong ones. This idea is taken + * from 'ar' written by Haruhiko Okumura.) + */ + for (bits = max_length; bits != 0; bits--) { + n = zip_bl_count[bits]; + while (n != 0) { + m = zip_heap[--h]; + if (m > max_code) + continue; + if (tree[m].dl != bits) { + zip_opt_len += (bits - tree[m].dl) * tree[m].fc; + tree[m].fc = bits; + } + n--; + } + } + }; + + /* ========================================================================== + * Generate the codes for a given tree and bit counts (which need not be + * optimal). + * IN assertion: the array bl_count contains the bit length statistics for + * the given tree and the field len is set for all tree elements. + * OUT assertion: the field code is set for all tree elements of non + * zero code length. + */ + var zip_gen_codes = function (tree, // the tree to decorate + max_code) { // largest code with non zero frequency + var next_code = new Array(zip_MAX_BITS + 1); // next code value for each bit length + var code = 0; // running code value + var bits; // bit index + var n; // code index + + /* The distribution counts are first used to generate the code values + * without bit reversal. + */ + for (bits = 1; bits <= zip_MAX_BITS; bits++) { + code = ((code + zip_bl_count[bits - 1]) << 1); + next_code[bits] = code; + } + + /* Check that the bit counts in bl_count are consistent. The last code + * must be all ones. + */ + for (n = 0; n <= max_code; n++) { + var len = tree[n].dl; + if (len == 0) + continue; + // Now reverse the bits + tree[n].fc = zip_bi_reverse(next_code[len]++, len); + } + }; + + /* ========================================================================== + * Construct one Huffman tree and assigns the code bit strings and lengths. + * Update the total bit length for the current block. + * IN assertion: the field freq is set for all tree elements. + * OUT assertions: the fields len and code are set to the optimal bit length + * and corresponding code. The length opt_len is updated; static_len is + * also updated if stree is not null. The field max_code is set. + */ + var zip_build_tree = function (desc) { // the tree descriptor + var tree = desc.dyn_tree; + var stree = desc.static_tree; + var elems = desc.elems; + var n, m; // iterate over heap elements + var max_code = -1; // largest code with non zero frequency + var node = elems; // next internal node of the tree + + /* Construct the initial heap, with least frequent element in + * heap[SMALLEST]. The sons of heap[n] are heap[2*n] and heap[2*n+1]. + * heap[0] is not used. + */ + zip_heap_len = 0; + zip_heap_max = zip_HEAP_SIZE; + + for (n = 0; n < elems; n++) { + if (tree[n].fc != 0) { + zip_heap[++zip_heap_len] = max_code = n; + zip_depth[n] = 0; + } else + tree[n].dl = 0; + } + + /* The pkzip format requires that at least one distance code exists, + * and that at least one bit should be sent even if there is only one + * possible code. So to avoid special checks later on we force at least + * two codes of non zero frequency. + */ + while (zip_heap_len < 2) { + var xnew = zip_heap[++zip_heap_len] = (max_code < 2 ? ++max_code : 0); + tree[xnew].fc = 1; + zip_depth[xnew] = 0; + zip_opt_len--; + if (stree != null) + zip_static_len -= stree[xnew].dl; + // new is 0 or 1 so it does not have extra bits + } + desc.max_code = max_code; + + /* The elements heap[heap_len/2+1 .. heap_len] are leaves of the tree, + * establish sub-heaps of increasing lengths: + */ + for (n = zip_heap_len >> 1; n >= 1; n--) + zip_pqdownheap(tree, n); + + /* Construct the Huffman tree by repeatedly combining the least two + * frequent nodes. + */ + do { + n = zip_heap[zip_SMALLEST]; + zip_heap[zip_SMALLEST] = zip_heap[zip_heap_len--]; + zip_pqdownheap(tree, zip_SMALLEST); + + m = zip_heap[zip_SMALLEST]; // m = node of next least frequency + + // keep the nodes sorted by frequency + zip_heap[--zip_heap_max] = n; + zip_heap[--zip_heap_max] = m; + + // Create a new node father of n and m + tree[node].fc = tree[n].fc + tree[m].fc; + if (zip_depth[n] > zip_depth[m] + 1) + zip_depth[node] = zip_depth[n]; + else + zip_depth[node] = zip_depth[m] + 1; + tree[n].dl = tree[m].dl = node; + + // and insert the new node in the heap + zip_heap[zip_SMALLEST] = node++; + zip_pqdownheap(tree, zip_SMALLEST); + + } while (zip_heap_len >= 2); + + zip_heap[--zip_heap_max] = zip_heap[zip_SMALLEST]; + + /* At this point, the fields freq and dad are set. We can now + * generate the bit lengths. + */ + zip_gen_bitlen(desc); + + // The field len is now set, we can generate the bit codes + zip_gen_codes(tree, max_code); + }; + + /* ========================================================================== + * Scan a literal or distance tree to determine the frequencies of the codes + * in the bit length tree. Updates opt_len to take into account the repeat + * counts. (The contribution of the bit length codes will be added later + * during the construction of bl_tree.) + */ + var zip_scan_tree = function (tree,// the tree to be scanned + max_code) { // and its largest code of non zero frequency + var n; // iterates over all tree elements + var prevlen = -1; // last emitted length + var curlen; // length of current code + var nextlen = tree[0].dl; // length of next code + var count = 0; // repeat count of the current code + var max_count = 7; // max repeat count + var min_count = 4; // min repeat count + + if (nextlen == 0) { + max_count = 138; + min_count = 3; + } + tree[max_code + 1].dl = 0xffff; // guard + + for (n = 0; n <= max_code; n++) { + curlen = nextlen; + nextlen = tree[n + 1].dl; + if (++count < max_count && curlen == nextlen) + continue; + else if (count < min_count) + zip_bl_tree[curlen].fc += count; + else if (curlen != 0) { + if (curlen != prevlen) + zip_bl_tree[curlen].fc++; + zip_bl_tree[zip_REP_3_6].fc++; + } else if (count <= 10) + zip_bl_tree[zip_REPZ_3_10].fc++; + else + zip_bl_tree[zip_REPZ_11_138].fc++; + count = 0; + prevlen = curlen; + if (nextlen == 0) { + max_count = 138; + min_count = 3; + } else if (curlen == nextlen) { + max_count = 6; + min_count = 3; + } else { + max_count = 7; + min_count = 4; + } + } + }; + + /* ========================================================================== + * Send a literal or distance tree in compressed form, using the codes in + * bl_tree. + */ + var zip_send_tree = function (tree, // the tree to be scanned + max_code) { // and its largest code of non zero frequency + var n; // iterates over all tree elements + var prevlen = -1; // last emitted length + var curlen; // length of current code + var nextlen = tree[0].dl; // length of next code + var count = 0; // repeat count of the current code + var max_count = 7; // max repeat count + var min_count = 4; // min repeat count + + /* tree[max_code+1].dl = -1; */ + /* guard already set */ + if (nextlen == 0) { + max_count = 138; + min_count = 3; + } + + for (n = 0; n <= max_code; n++) { + curlen = nextlen; + nextlen = tree[n + 1].dl; + if (++count < max_count && curlen == nextlen) { + continue; + } else if (count < min_count) { + do { + zip_SEND_CODE(curlen, zip_bl_tree); + } while (--count != 0); + } else if (curlen != 0) { + if (curlen != prevlen) { + zip_SEND_CODE(curlen, zip_bl_tree); + count--; + } + // Assert(count >= 3 && count <= 6, " 3_6?"); + zip_SEND_CODE(zip_REP_3_6, zip_bl_tree); + zip_send_bits(count - 3, 2); + } else if (count <= 10) { + zip_SEND_CODE(zip_REPZ_3_10, zip_bl_tree); + zip_send_bits(count - 3, 3); + } else { + zip_SEND_CODE(zip_REPZ_11_138, zip_bl_tree); + zip_send_bits(count - 11, 7); + } + count = 0; + prevlen = curlen; + if (nextlen == 0) { + max_count = 138; + min_count = 3; + } else if (curlen == nextlen) { + max_count = 6; + min_count = 3; + } else { + max_count = 7; + min_count = 4; + } + } + }; + + /* ========================================================================== + * Construct the Huffman tree for the bit lengths and return the index in + * bl_order of the last bit length code to send. + */ + var zip_build_bl_tree = function () { + var max_blindex; // index of last bit length code of non zero freq + + // Determine the bit length frequencies for literal and distance trees + zip_scan_tree(zip_dyn_ltree, zip_l_desc.max_code); + zip_scan_tree(zip_dyn_dtree, zip_d_desc.max_code); + + // Build the bit length tree: + zip_build_tree(zip_bl_desc); + /* opt_len now includes the length of the tree representations, except + * the lengths of the bit lengths codes and the 5+5+4 bits for the counts. + */ + + /* Determine the number of bit length codes to send. The pkzip format + * requires that at least 4 bit length codes be sent. (appnote.txt says + * 3 but the actual value used is 4.) + */ + for (max_blindex = zip_BL_CODES - 1; max_blindex >= 3; max_blindex--) { + if (zip_bl_tree[zip_bl_order[max_blindex]].dl != 0) break; + } + /* Update opt_len to include the bit length tree and counts */ + zip_opt_len += 3 * (max_blindex + 1) + 5 + 5 + 4; + return max_blindex; + }; + + /* ========================================================================== + * Send the header for a block using dynamic Huffman trees: the counts, the + * lengths of the bit length codes, the literal tree and the distance tree. + * IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4. + */ + var zip_send_all_trees = function (lcodes, dcodes, blcodes) { // number of codes for each tree + var rank; // index in bl_order + zip_send_bits(lcodes - 257, 5); // not +255 as stated in appnote.txt + zip_send_bits(dcodes - 1, 5); + zip_send_bits(blcodes - 4, 4); // not -3 as stated in appnote.txt + for (rank = 0; rank < blcodes; rank++) { + zip_send_bits(zip_bl_tree[zip_bl_order[rank]].dl, 3); + } + + // send the literal tree + zip_send_tree(zip_dyn_ltree, lcodes - 1); + + // send the distance tree + zip_send_tree(zip_dyn_dtree, dcodes - 1); + }; + + /* ========================================================================== + * Determine the best encoding for the current block: dynamic trees, static + * trees or store, and output the encoded block to the zip file. + */ + var zip_flush_block = function (eof) { // true if this is the last block for a file + var opt_lenb, static_lenb; // opt_len and static_len in bytes + var max_blindex; // index of last bit length code of non zero freq + var stored_len; // length of input block + + stored_len = zip_strstart - zip_block_start; + zip_flag_buf[zip_last_flags] = zip_flags; // Save the flags for the last 8 items + + // Construct the literal and distance trees + zip_build_tree(zip_l_desc); + zip_build_tree(zip_d_desc); + /* At this point, opt_len and static_len are the total bit lengths of + * the compressed block data, excluding the tree representations. + */ + + /* Build the bit length tree for the above two trees, and get the index + * in bl_order of the last bit length code to send. + */ + max_blindex = zip_build_bl_tree(); + + // Determine the best encoding. Compute first the block length in bytes + opt_lenb = (zip_opt_len + 3 + 7) >> 3; + static_lenb = (zip_static_len + 3 + 7) >> 3; + if (static_lenb <= opt_lenb) + opt_lenb = static_lenb; + if (stored_len + 4 <= opt_lenb // 4: two words for the lengths + && zip_block_start >= 0) { + var i; + + /* The test buf != NULL is only necessary if LIT_BUFSIZE > WSIZE. + * Otherwise we can't have processed more than WSIZE input bytes since + * the last block flush, because compression would have been + * successful. If LIT_BUFSIZE <= WSIZE, it is never too late to + * transform a block into a stored block. + */ + zip_send_bits((zip_STORED_BLOCK << 1) + eof, 3); + /* send block type */ + zip_bi_windup(); + /* align on byte boundary */ + zip_put_short(stored_len); + zip_put_short(~stored_len); + + // copy block + for (i = 0; i < stored_len; i++) + zip_put_byte(zip_window[zip_block_start + i]); + + } else if (static_lenb == opt_lenb) { + zip_send_bits((zip_STATIC_TREES << 1) + eof, 3); + zip_compress_block(zip_static_ltree, zip_static_dtree); + } else { + zip_send_bits((zip_DYN_TREES << 1) + eof, 3); + zip_send_all_trees(zip_l_desc.max_code + 1, + zip_d_desc.max_code + 1, + max_blindex + 1); + zip_compress_block(zip_dyn_ltree, zip_dyn_dtree); + } + + zip_init_block(); + + if (eof != 0) + zip_bi_windup(); + }; + + /* ========================================================================== + * Save the match info and tally the frequency counts. Return true if + * the current block must be flushed. + */ + var zip_ct_tally = function (dist, // distance of matched string + lc) { // match length-MIN_MATCH or unmatched char (if dist==0) + zip_l_buf[zip_last_lit++] = lc; + if (dist == 0) { + // lc is the unmatched char + zip_dyn_ltree[lc].fc++; + } else { + // Here, lc is the match length - MIN_MATCH + dist--; // dist = match distance - 1 + zip_dyn_ltree[zip_length_code[lc] + zip_LITERALS + 1].fc++; + zip_dyn_dtree[zip_D_CODE(dist)].fc++; + + zip_d_buf[zip_last_dist++] = dist; + zip_flags |= zip_flag_bit; + } + zip_flag_bit <<= 1; + + // Output the flags if they fill a byte + if ((zip_last_lit & 7) == 0) { + zip_flag_buf[zip_last_flags++] = zip_flags; + zip_flags = 0; + zip_flag_bit = 1; + } + // Try to guess if it is profitable to stop the current block here + if (zip_compr_level > 2 && (zip_last_lit & 0xfff) == 0) { + // Compute an upper bound for the compressed length + var out_length = zip_last_lit * 8; + var in_length = zip_strstart - zip_block_start; + var dcode; + + for (dcode = 0; dcode < zip_D_CODES; dcode++) { + out_length += zip_dyn_dtree[dcode].fc * (5 + zip_extra_dbits[dcode]); + } + out_length >>= 3; + if (zip_last_dist < parseInt(zip_last_lit / 2) && + out_length < parseInt(in_length / 2)) + return true; + } + return (zip_last_lit == LIT_BUFSIZE - 1 || + zip_last_dist == zip_DIST_BUFSIZE); + /* We avoid equality with LIT_BUFSIZE because of wraparound at 64K + * on 16 bit machines and because stored blocks are restricted to + * 64K-1 bytes. + */ + }; + + /* ========================================================================== + * Send the block data compressed using the given Huffman trees + */ + var zip_compress_block = function (ltree, // literal tree + dtree) { // distance tree + var dist; // distance of matched string + var lc; // match length or unmatched char (if dist == 0) + var lx = 0; // running index in l_buf + var dx = 0; // running index in d_buf + var fx = 0; // running index in flag_buf + var flag = 0; // current flags + var code; // the code to send + var extra; // number of extra bits to send + + if (zip_last_lit != 0) do { + if ((lx & 7) == 0) + flag = zip_flag_buf[fx++]; + lc = zip_l_buf[lx++] & 0xff; + if ((flag & 1) == 0) { + zip_SEND_CODE(lc, ltree); + /* send a literal byte */ + } else { + // Here, lc is the match length - MIN_MATCH + code = zip_length_code[lc]; + zip_SEND_CODE(code + zip_LITERALS + 1, ltree); // send the length code + extra = zip_extra_lbits[code]; + if (extra != 0) { + lc -= zip_base_length[code]; + zip_send_bits(lc, extra); // send the extra length bits + } + dist = zip_d_buf[dx++]; + // Here, dist is the match distance - 1 + code = zip_D_CODE(dist); + zip_SEND_CODE(code, dtree); // send the distance code + extra = zip_extra_dbits[code]; + if (extra != 0) { + dist -= zip_base_dist[code]; + zip_send_bits(dist, extra); // send the extra distance bits + } + } // literal or match pair ? + flag >>= 1; + } while (lx < zip_last_lit); + + zip_SEND_CODE(zip_END_BLOCK, ltree); + }; + + /* ========================================================================== + * Send a value on a given number of bits. + * IN assertion: length <= 16 and value fits in length bits. + */ + var zip_Buf_size = 16; // bit size of bi_buf + var zip_send_bits = function (value, // value to send + length) { // number of bits + /* If not enough room in bi_buf, use (valid) bits from bi_buf and + * (16 - bi_valid) bits from value, leaving (width - (16-bi_valid)) + * unused bits in value. + */ + if (zip_bi_valid > zip_Buf_size - length) { + zip_bi_buf |= (value << zip_bi_valid); + zip_put_short(zip_bi_buf); + zip_bi_buf = (value >> (zip_Buf_size - zip_bi_valid)); + zip_bi_valid += length - zip_Buf_size; + } else { + zip_bi_buf |= value << zip_bi_valid; + zip_bi_valid += length; + } + }; + + /* ========================================================================== + * Reverse the first len bits of a code, using straightforward code (a faster + * method would use a table) + * IN assertion: 1 <= len <= 15 + */ + var zip_bi_reverse = function (code, // the value to invert + len) { // its bit length + var res = 0; + do { + res |= code & 1; + code >>= 1; + res <<= 1; + } while (--len > 0); + return res >> 1; + }; + + /* ========================================================================== + * Write out any remaining bits in an incomplete byte. + */ + var zip_bi_windup = function () { + if (zip_bi_valid > 8) { + zip_put_short(zip_bi_buf); + } else if (zip_bi_valid > 0) { + zip_put_byte(zip_bi_buf); + } + zip_bi_buf = 0; + zip_bi_valid = 0; + }; + + var zip_qoutbuf = function () { + if (zip_outcnt != 0) { + var q, i; + q = zip_new_queue(); + if (zip_qhead == null) + zip_qhead = zip_qtail = q; + else + zip_qtail = zip_qtail.next = q; + q.len = zip_outcnt - zip_outoff; + for (i = 0; i < q.len; i++) + q.ptr[i] = zip_outbuf[zip_outoff + i]; + zip_outcnt = zip_outoff = 0; + } + }; + + function deflate(buffData, level) { + zip_deflate_data = buffData; + zip_deflate_pos = 0; + zip_deflate_start(level); + + var buff = new Array(1024), + pages = [], + totalSize = 0, + i; + + for (i = 0; i < 1024; i++) buff[i] = 0; + while ((i = zip_deflate_internal(buff, 0, buff.length)) > 0) { + var buf = new Buffer(buff.slice(0, i)); + pages.push(buf); + totalSize += buf.length; + } + + if (pages.length == 1) { + return pages[0]; + } + + var result = new Buffer(totalSize), + index = 0; + + for (i = 0; i < pages.length; i++) { + pages[i].copy(result, index); + index = index + pages[i].length + } + + return result; + } + + return { + deflate: function () { + return deflate(inbuf, 8); + } + } +} + +module.exports = function (/*Buffer*/inbuf) { + + var zlib = require("zlib"); + + return { + deflate: function () { + return new JSDeflater(inbuf).deflate(); + }, + + deflateAsync: function (/*Function*/callback) { + var tmp = zlib.createDeflateRaw({chunkSize:(parseInt(inbuf.length / 1024) + 1)*1024}), + parts = [], total = 0; + tmp.on('data', function(data) { + parts.push(data); + total += data.length; + }); + tmp.on('end', function() { + var buf = new Buffer(total), written = 0; + buf.fill(0); + + for (var i = 0; i < parts.length; i++) { + var part = parts[i]; + part.copy(buf, written); + written += part.length; + } + callback && callback(buf); + }); + tmp.end(inbuf); + } + } +}; diff --git a/node_modules/adm-zip/methods/index.js b/node_modules/adm-zip/methods/index.js new file mode 100644 index 0000000..58c718d --- /dev/null +++ b/node_modules/adm-zip/methods/index.js @@ -0,0 +1,2 @@ +exports.Deflater = require("./deflater"); +exports.Inflater = require("./inflater"); \ No newline at end of file diff --git a/node_modules/adm-zip/methods/inflater.js b/node_modules/adm-zip/methods/inflater.js new file mode 100644 index 0000000..3739d98 --- /dev/null +++ b/node_modules/adm-zip/methods/inflater.js @@ -0,0 +1,448 @@ +var Buffer = require("buffer").Buffer; + +function JSInflater(/*Buffer*/input) { + + var WSIZE = 0x8000, + slide = new Buffer(0x10000), + windowPos = 0, + fixedTableList = null, + fixedTableDist, + fixedLookup, + bitBuf = 0, + bitLen = 0, + method = -1, + eof = false, + copyLen = 0, + copyDist = 0, + tblList, tblDist, bitList, bitdist, + + inputPosition = 0, + + MASK_BITS = [0x0000, 0x0001, 0x0003, 0x0007, 0x000f, 0x001f, 0x003f, 0x007f, 0x00ff, 0x01ff, 0x03ff, 0x07ff, 0x0fff, 0x1fff, 0x3fff, 0x7fff, 0xffff], + LENS = [3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0], + LEXT = [0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0, 99, 99], + DISTS = [1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, 8193, 12289, 16385, 24577], + DEXT = [0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13], + BITORDER = [16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15]; + + function HuffTable(clen, cnum, cval, blist, elist, lookupm) { + + this.status = 0; + this.root = null; + this.maxbit = 0; + + var el, f, tail, + offsets = [], + countTbl = [], + sTbl = [], + values = [], + tentry = {extra: 0, bitcnt: 0, lbase: 0, next: null}; + + tail = this.root = null; + for(var i = 0; i < 0x11; i++) { countTbl[i] = 0; sTbl[i] = 0; offsets[i] = 0; } + for(i = 0; i < 0x120; i++) values[i] = 0; + + el = cnum > 256 ? clen[256] : 16; + + var pidx = -1; + while (++pidx < cnum) countTbl[clen[pidx]]++; + + if(countTbl[0] == cnum) return; + + for(var j = 1; j <= 16; j++) if(countTbl[j] != 0) break; + var bitLen = j; + for(i = 16; i != 0; i--) if(countTbl[i] != 0) break; + var maxLen = i; + + lookupm < j && (lookupm = j); + + var dCodes = 1 << j; + for(; j < i; j++, dCodes <<= 1) + if((dCodes -= countTbl[j]) < 0) { + this.status = 2; + this.maxbit = lookupm; + return; + } + + if((dCodes -= countTbl[i]) < 0) { + this.status = 2; + this.maxbit = lookupm; + return; + } + + countTbl[i] += dCodes; + offsets[1] = j = 0; + pidx = 1; + var xp = 2; + while(--i > 0) offsets[xp++] = (j += countTbl[pidx++]); + pidx = 0; + i = 0; + do { + (j = clen[pidx++]) && (values[offsets[j]++] = i); + } while(++i < cnum); + cnum = offsets[maxLen]; + offsets[0] = i = 0; + pidx = 0; + + var level = -1, + w = sTbl[0] = 0, + cnode = null, + tblCnt = 0, + tblStack = []; + + for(; bitLen <= maxLen; bitLen++) { + var kccnt = countTbl[bitLen]; + while(kccnt-- > 0) { + while(bitLen > w + sTbl[1 + level]) { + w += sTbl[1 + level]; + level++; + tblCnt = (tblCnt = maxLen - w) > lookupm ? lookupm : tblCnt; + if((f = 1 << (j = bitLen - w)) > kccnt + 1) { + f -= kccnt + 1; + xp = bitLen; + while(++j < tblCnt) { + if((f <<= 1) <= countTbl[++xp]) break; + f -= countTbl[xp]; + } + } + if(w + j > el && w < el) j = el - w; + tblCnt = 1 << j; + sTbl[1 + level] = j; + cnode = []; + while (cnode.length < tblCnt) cnode.push({extra: 0, bitcnt: 0, lbase: 0, next: null}); + if (tail == null) { + tail = this.root = {next:null, list:null}; + } else { + tail = tail.next = {next:null, list:null} + } + tail.next = null; + tail.list = cnode; + + tblStack[level] = cnode; + + if(level > 0) { + offsets[level] = i; + tentry.bitcnt = sTbl[level]; + tentry.extra = 16 + j; + tentry.next = cnode; + j = (i & ((1 << w) - 1)) >> (w - sTbl[level]); + + tblStack[level-1][j].extra = tentry.extra; + tblStack[level-1][j].bitcnt = tentry.bitcnt; + tblStack[level-1][j].lbase = tentry.lbase; + tblStack[level-1][j].next = tentry.next; + } + } + tentry.bitcnt = bitLen - w; + if(pidx >= cnum) + tentry.extra = 99; + else if(values[pidx] < cval) { + tentry.extra = (values[pidx] < 256 ? 16 : 15); + tentry.lbase = values[pidx++]; + } else { + tentry.extra = elist[values[pidx] - cval]; + tentry.lbase = blist[values[pidx++] - cval]; + } + + f = 1 << (bitLen - w); + for(j = i >> w; j < tblCnt; j += f) { + cnode[j].extra = tentry.extra; + cnode[j].bitcnt = tentry.bitcnt; + cnode[j].lbase = tentry.lbase; + cnode[j].next = tentry.next; + } + for(j = 1 << (bitLen - 1); (i & j) != 0; j >>= 1) + i ^= j; + i ^= j; + while((i & ((1 << w) - 1)) != offsets[level]) { + w -= sTbl[level]; + level--; + } + } + } + + this.maxbit = sTbl[1]; + this.status = ((dCodes != 0 && maxLen != 1) ? 1 : 0); + } + + function addBits(n) { + while(bitLen < n) { + bitBuf |= input[inputPosition++] << bitLen; + bitLen += 8; + } + return bitBuf; + } + + function cutBits(n) { + bitLen -= n; + return bitBuf >>= n; + } + + function maskBits(n) { + while(bitLen < n) { + bitBuf |= input[inputPosition++] << bitLen; + bitLen += 8; + } + var res = bitBuf & MASK_BITS[n]; + bitBuf >>= n; + bitLen -= n; + return res; + } + + function codes(buff, off, size) { + var e, t; + if(size == 0) return 0; + + var n = 0; + for(;;) { + t = tblList.list[addBits(bitList) & MASK_BITS[bitList]]; + e = t.extra; + while(e > 16) { + if(e == 99) return -1; + cutBits(t.bitcnt); + e -= 16; + t = t.next[addBits(e) & MASK_BITS[e]]; + e = t.extra; + } + cutBits(t.bitcnt); + if(e == 16) { + windowPos &= WSIZE - 1; + buff[off + n++] = slide[windowPos++] = t.lbase; + if(n == size) return size; + continue; + } + if(e == 15) break; + + copyLen = t.lbase + maskBits(e); + t = tblDist.list[addBits(bitdist) & MASK_BITS[bitdist]]; + e = t.extra; + + while(e > 16) { + if(e == 99) return -1; + cutBits(t.bitcnt); + e -= 16; + t = t.next[addBits(e) & MASK_BITS[e]]; + e = t.extra + } + cutBits(t.bitcnt); + copyDist = windowPos - t.lbase - maskBits(e); + + while(copyLen > 0 && n < size) { + copyLen--; + copyDist &= WSIZE - 1; + windowPos &= WSIZE - 1; + buff[off + n++] = slide[windowPos++] = slide[copyDist++]; + } + + if(n == size) return size; + } + + method = -1; // done + return n; + } + + function stored(buff, off, size) { + cutBits(bitLen & 7); + var n = maskBits(0x10); + if(n != ((~maskBits(0x10)) & 0xffff)) return -1; + copyLen = n; + + n = 0; + while(copyLen > 0 && n < size) { + copyLen--; + windowPos &= WSIZE - 1; + buff[off + n++] = slide[windowPos++] = maskBits(8); + } + + if(copyLen == 0) method = -1; + return n; + } + + function fixed(buff, off, size) { + var fixed_bd = 0; + if(fixedTableList == null) { + var lengths = []; + + for(var symbol = 0; symbol < 144; symbol++) lengths[symbol] = 8; + for(; symbol < 256; symbol++) lengths[symbol] = 9; + for(; symbol < 280; symbol++) lengths[symbol] = 7; + for(; symbol < 288; symbol++) lengths[symbol] = 8; + + fixedLookup = 7; + + var htbl = new HuffTable(lengths, 288, 257, LENS, LEXT, fixedLookup); + + if(htbl.status != 0) return -1; + + fixedTableList = htbl.root; + fixedLookup = htbl.maxbit; + + for(symbol = 0; symbol < 30; symbol++) lengths[symbol] = 5; + fixed_bd = 5; + + htbl = new HuffTable(lengths, 30, 0, DISTS, DEXT, fixed_bd); + if(htbl.status > 1) { + fixedTableList = null; + return -1; + } + fixedTableDist = htbl.root; + fixed_bd = htbl.maxbit; + } + + tblList = fixedTableList; + tblDist = fixedTableDist; + bitList = fixedLookup; + bitdist = fixed_bd; + return codes(buff, off, size); + } + + function dynamic(buff, off, size) { + var ll = new Array(0x023C); + + for (var m = 0; m < 0x023C; m++) ll[m] = 0; + + var llencnt = 257 + maskBits(5), + dcodescnt = 1 + maskBits(5), + bitlencnt = 4 + maskBits(4); + + if(llencnt > 286 || dcodescnt > 30) return -1; + + for(var j = 0; j < bitlencnt; j++) ll[BITORDER[j]] = maskBits(3); + for(; j < 19; j++) ll[BITORDER[j]] = 0; + + // build decoding table for trees--single level, 7 bit lookup + bitList = 7; + var hufTable = new HuffTable(ll, 19, 19, null, null, bitList); + if(hufTable.status != 0) + return -1; // incomplete code set + + tblList = hufTable.root; + bitList = hufTable.maxbit; + var lencnt = llencnt + dcodescnt, + i = 0, + lastLen = 0; + while(i < lencnt) { + var hufLcode = tblList.list[addBits(bitList) & MASK_BITS[bitList]]; + j = hufLcode.bitcnt; + cutBits(j); + j = hufLcode.lbase; + if(j < 16) + ll[i++] = lastLen = j; + else if(j == 16) { + j = 3 + maskBits(2); + if(i + j > lencnt) return -1; + while(j-- > 0) ll[i++] = lastLen; + } else if(j == 17) { + j = 3 + maskBits(3); + if(i + j > lencnt) return -1; + while(j-- > 0) ll[i++] = 0; + lastLen = 0; + } else { + j = 11 + maskBits(7); + if(i + j > lencnt) return -1; + while(j-- > 0) ll[i++] = 0; + lastLen = 0; + } + } + bitList = 9; + hufTable = new HuffTable(ll, llencnt, 257, LENS, LEXT, bitList); + bitList == 0 && (hufTable.status = 1); + + if (hufTable.status != 0) return -1; + + tblList = hufTable.root; + bitList = hufTable.maxbit; + + for(i = 0; i < dcodescnt; i++) ll[i] = ll[i + llencnt]; + bitdist = 6; + hufTable = new HuffTable(ll, dcodescnt, 0, DISTS, DEXT, bitdist); + tblDist = hufTable.root; + bitdist = hufTable.maxbit; + + if((bitdist == 0 && llencnt > 257) || hufTable.status != 0) return -1; + + return codes(buff, off, size); + } + + return { + inflate : function(/*Buffer*/outputBuffer) { + tblList = null; + + var size = outputBuffer.length, + offset = 0, i; + + while(offset < size) { + if(eof && method == -1) return; + if(copyLen > 0) { + if(method != 0) { + while(copyLen > 0 && offset < size) { + copyLen--; + copyDist &= WSIZE - 1; + windowPos &= WSIZE - 1; + outputBuffer[offset++] = (slide[windowPos++] = slide[copyDist++]); + } + } else { + while(copyLen > 0 && offset < size) { + copyLen--; + windowPos &= WSIZE - 1; + outputBuffer[offset++] = (slide[windowPos++] = maskBits(8)); + } + copyLen == 0 && (method = -1); // done + } + if (offset == size) return; + } + + if(method == -1) { + if(eof) break; + eof = maskBits(1) != 0; + method = maskBits(2); + tblList = null; + copyLen = 0; + } + switch(method) { + case 0: i = stored(outputBuffer, offset, size - offset); break; + case 1: i = tblList != null ? codes(outputBuffer, offset, size - offset) : fixed(outputBuffer, offset, size - offset); break; + case 2: i = tblList != null ? codes(outputBuffer, offset, size - offset) : dynamic(outputBuffer, offset, size - offset); break; + default: i = -1; break; + } + + if(i == -1) return; + offset += i; + } + } + }; +} + +module.exports = function(/*Buffer*/inbuf) { + var zlib = require("zlib"); + return { + inflateAsync : function(/*Function*/callback) { + var tmp = zlib.createInflateRaw(), + parts = [], total = 0; + tmp.on('data', function(data) { + parts.push(data); + total += data.length; + }); + tmp.on('end', function() { + var buf = new Buffer(total), written = 0; + buf.fill(0); + + for (var i = 0; i < parts.length; i++) { + var part = parts[i]; + part.copy(buf, written); + written += part.length; + } + callback && callback(buf); + }); + tmp.end(inbuf) + }, + + inflate : function(/*Buffer*/outputBuffer) { + var x = { + x: new JSInflater(inbuf) + }; + x.x.inflate(outputBuffer); + delete(x.x); + } + } +}; diff --git a/node_modules/adm-zip/package.json b/node_modules/adm-zip/package.json new file mode 100644 index 0000000..0a7fc5d --- /dev/null +++ b/node_modules/adm-zip/package.json @@ -0,0 +1,51 @@ +{ + "name": "adm-zip", + "version": "0.4.7", + "description": "A Javascript implementation of zip for nodejs. Allows user to create or extract zip files both in memory or to/from disk", + "keywords": [ + "zip", + "methods", + "archive", + "unzip" + ], + "homepage": "http://github.com/cthackers/adm-zip", + "author": { + "name": "Nasca Iacob", + "email": "sy@another-d-mention.ro", + "url": "https://github.com/cthackers" + }, + "bugs": { + "url": "https://github.com/cthackers/adm-zip/issues", + "email": "sy@another-d-mention.ro" + }, + "licenses": [ + { + "type": "MIT", + "url": "https://raw.github.com/cthackers/adm-zip/master/MIT-LICENSE.txt" + } + ], + "files": [ + "adm-zip.js", + "headers", + "methods", + "util", + "zipEntry.js", + "zipFile.js" + ], + "main": "adm-zip.js", + "repository": { + "type": "git", + "url": "https://github.com/cthackers/adm-zip.git" + }, + "engines": { + "node": ">=0.3.0" + }, + "readme": "# ADM-ZIP for NodeJS\r\n\r\nADM-ZIP is a pure JavaScript implementation for zip data compression for [NodeJS](http://nodejs.org/). \r\n\r\n# Installation\r\n\r\nWith [npm](http://npmjs.org) do:\r\n\r\n $ npm install adm-zip\r\n\t\r\n## What is it good for?\r\nThe library allows you to:\r\n\r\n* decompress zip files directly to disk or in memory buffers\r\n* compress files and store them to disk in .zip format or in compressed buffers\r\n* update content of/add new/delete files from an existing .zip\r\n\r\n# Dependencies\r\nThere are no other nodeJS libraries that ADM-ZIP is dependent of\r\n\r\n# Examples\r\n\r\n## Basic usage\r\n```javascript\r\n\r\n\tvar AdmZip = require('adm-zip');\r\n\r\n\t// reading archives\r\n\tvar zip = new AdmZip(\"./my_file.zip\");\r\n\tvar zipEntries = zip.getEntries(); // an array of ZipEntry records\r\n\r\n\tzipEntries.forEach(function(zipEntry) {\r\n\t console.log(zipEntry.toString()); // outputs zip entries information\r\n\t\tif (zipEntry.entryName == \"my_file.txt\") {\r\n\t\t console.log(zipEntry.data.toString('utf8')); \r\n\t\t}\r\n\t});\r\n\t// outputs the content of some_folder/my_file.txt\r\n\tconsole.log(zip.readAsText(\"some_folder/my_file.txt\")); \r\n\t// extracts the specified file to the specified location\r\n\tzip.extractEntryTo(/*entry name*/\"some_folder/my_file.txt\", /*target path*/\"/home/me/tempfolder\", /*maintainEntryPath*/false, /*overwrite*/true);\r\n\t// extracts everything\r\n\tzip.extractAllTo(/*target path*/\"/home/me/zipcontent/\", /*overwrite*/true);\r\n\t\r\n\t\r\n\t// creating archives\r\n\tvar zip = new AdmZip();\r\n\t\r\n\t// add file directly\r\n\tzip.addFile(\"test.txt\", new Buffer(\"inner content of the file\"), \"entry comment goes here\");\r\n\t// add local file\r\n\tzip.addLocalFile(\"/home/me/some_picture.png\");\r\n\t// get everything as a buffer\r\n\tvar willSendthis = zip.toBuffer();\r\n\t// or write everything to disk\r\n\tzip.writeZip(/*target file name*/\"/home/me/files.zip\");\r\n\t\r\n\t\r\n\t// ... more examples in the wiki\r\n```\r\n\r\nFor more detailed information please check out the [wiki](https://github.com/cthackers/adm-zip/wiki).\r\n\r\n[![build status](https://secure.travis-ci.org/cthackers/adm-zip.png)](http://travis-ci.org/cthackers/adm-zip)\r\n", + "readmeFilename": "README.md", + "_id": "adm-zip@0.4.7", + "dist": { + "shasum": "49655542931f009301b38697d2d2e5a793e4733d" + }, + "_from": "adm-zip@", + "_resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.7.tgz" +} diff --git a/node_modules/adm-zip/util/constants.js b/node_modules/adm-zip/util/constants.js new file mode 100644 index 0000000..02de1e9 --- /dev/null +++ b/node_modules/adm-zip/util/constants.js @@ -0,0 +1,115 @@ +module.exports = { + /* The local file header */ + LOCHDR : 30, // LOC header size + LOCSIG : 0x04034b50, // "PK\003\004" + LOCVER : 4, // version needed to extract + LOCFLG : 6, // general purpose bit flag + LOCHOW : 8, // compression method + LOCTIM : 10, // modification time (2 bytes time, 2 bytes date) + LOCCRC : 14, // uncompressed file crc-32 value + LOCSIZ : 18, // compressed size + LOCLEN : 22, // uncompressed size + LOCNAM : 26, // filename length + LOCEXT : 28, // extra field length + + /* The Data descriptor */ + EXTSIG : 0x08074b50, // "PK\007\008" + EXTHDR : 16, // EXT header size + EXTCRC : 4, // uncompressed file crc-32 value + EXTSIZ : 8, // compressed size + EXTLEN : 12, // uncompressed size + + /* The central directory file header */ + CENHDR : 46, // CEN header size + CENSIG : 0x02014b50, // "PK\001\002" + CENVEM : 4, // version made by + CENVER : 6, // version needed to extract + CENFLG : 8, // encrypt, decrypt flags + CENHOW : 10, // compression method + CENTIM : 12, // modification time (2 bytes time, 2 bytes date) + CENCRC : 16, // uncompressed file crc-32 value + CENSIZ : 20, // compressed size + CENLEN : 24, // uncompressed size + CENNAM : 28, // filename length + CENEXT : 30, // extra field length + CENCOM : 32, // file comment length + CENDSK : 34, // volume number start + CENATT : 36, // internal file attributes + CENATX : 38, // external file attributes (host system dependent) + CENOFF : 42, // LOC header offset + + /* The entries in the end of central directory */ + ENDHDR : 22, // END header size + ENDSIG : 0x06054b50, // "PK\005\006" + ENDSUB : 8, // number of entries on this disk + ENDTOT : 10, // total number of entries + ENDSIZ : 12, // central directory size in bytes + ENDOFF : 16, // offset of first CEN header + ENDCOM : 20, // zip file comment length + + /* Compression methods */ + STORED : 0, // no compression + SHRUNK : 1, // shrunk + REDUCED1 : 2, // reduced with compression factor 1 + REDUCED2 : 3, // reduced with compression factor 2 + REDUCED3 : 4, // reduced with compression factor 3 + REDUCED4 : 5, // reduced with compression factor 4 + IMPLODED : 6, // imploded + // 7 reserved + DEFLATED : 8, // deflated + ENHANCED_DEFLATED: 9, // enhanced deflated + PKWARE : 10,// PKWare DCL imploded + // 11 reserved + BZIP2 : 12, // compressed using BZIP2 + // 13 reserved + LZMA : 14, // LZMA + // 15-17 reserved + IBM_TERSE : 18, // compressed using IBM TERSE + IBM_LZ77 : 19, //IBM LZ77 z + + /* General purpose bit flag */ + FLG_ENC : 0, // encripted file + FLG_COMP1 : 1, // compression option + FLG_COMP2 : 2, // compression option + FLG_DESC : 4, // data descriptor + FLG_ENH : 8, // enhanced deflation + FLG_STR : 16, // strong encryption + FLG_LNG : 1024, // language encoding + FLG_MSK : 4096, // mask header values + + /* Load type */ + FILE : 0, + BUFFER : 1, + NONE : 2, + + /* 4.5 Extensible data fields */ + EF_ID : 0, + EF_SIZE : 2, + + /* Header IDs */ + ID_ZIP64 : 0x0001, + ID_AVINFO : 0x0007, + ID_PFS : 0x0008, + ID_OS2 : 0x0009, + ID_NTFS : 0x000a, + ID_OPENVMS : 0x000c, + ID_UNIX : 0x000d, + ID_FORK : 0x000e, + ID_PATCH : 0x000f, + ID_X509_PKCS7 : 0x0014, + ID_X509_CERTID_F : 0x0015, + ID_X509_CERTID_C : 0x0016, + ID_STRONGENC : 0x0017, + ID_RECORD_MGT : 0x0018, + ID_X509_PKCS7_RL : 0x0019, + ID_IBM1 : 0x0065, + ID_IBM2 : 0x0066, + ID_POSZIP : 0x4690, + + EF_ZIP64_OR_32 : 0xffffffff, + EF_ZIP64_OR_16 : 0xffff, + EF_ZIP64_SUNCOMP : 0, + EF_ZIP64_SCOMP : 8, + EF_ZIP64_RHO : 16, + EF_ZIP64_DSN : 24 +}; diff --git a/node_modules/adm-zip/util/errors.js b/node_modules/adm-zip/util/errors.js new file mode 100644 index 0000000..50931c3 --- /dev/null +++ b/node_modules/adm-zip/util/errors.js @@ -0,0 +1,35 @@ +module.exports = { + /* Header error messages */ + "INVALID_LOC" : "Invalid LOC header (bad signature)", + "INVALID_CEN" : "Invalid CEN header (bad signature)", + "INVALID_END" : "Invalid END header (bad signature)", + + /* ZipEntry error messages*/ + "NO_DATA" : "Nothing to decompress", + "BAD_CRC" : "CRC32 checksum failed", + "FILE_IN_THE_WAY" : "There is a file in the way: %s", + "UNKNOWN_METHOD" : "Invalid/unsupported compression method", + + /* Inflater error messages */ + "AVAIL_DATA" : "inflate::Available inflate data did not terminate", + "INVALID_DISTANCE" : "inflate::Invalid literal/length or distance code in fixed or dynamic block", + "TO_MANY_CODES" : "inflate::Dynamic block code description: too many length or distance codes", + "INVALID_REPEAT_LEN" : "inflate::Dynamic block code description: repeat more than specified lengths", + "INVALID_REPEAT_FIRST" : "inflate::Dynamic block code description: repeat lengths with no first length", + "INCOMPLETE_CODES" : "inflate::Dynamic block code description: code lengths codes incomplete", + "INVALID_DYN_DISTANCE": "inflate::Dynamic block code description: invalid distance code lengths", + "INVALID_CODES_LEN": "inflate::Dynamic block code description: invalid literal/length code lengths", + "INVALID_STORE_BLOCK" : "inflate::Stored block length did not match one's complement", + "INVALID_BLOCK_TYPE" : "inflate::Invalid block type (type == 3)", + + /* ADM-ZIP error messages */ + "CANT_EXTRACT_FILE" : "Could not extract the file", + "CANT_OVERRIDE" : "Target file already exists", + "NO_ZIP" : "No zip file was loaded", + "NO_ENTRY" : "Entry doesn't exist", + "DIRECTORY_CONTENT_ERROR" : "A directory cannot have content", + "FILE_NOT_FOUND" : "File not found: %s", + "NOT_IMPLEMENTED" : "Not implemented", + "INVALID_FILENAME" : "Invalid filename", + "INVALID_FORMAT" : "Invalid or unsupported zip format. No END header found" +}; \ No newline at end of file diff --git a/node_modules/adm-zip/util/fattr.js b/node_modules/adm-zip/util/fattr.js new file mode 100644 index 0000000..4f247ea --- /dev/null +++ b/node_modules/adm-zip/util/fattr.js @@ -0,0 +1,84 @@ +var fs = require("fs"), + pth = require("path"); + +fs.existsSync = fs.existsSync || pth.existsSync; + +module.exports = function(/*String*/path) { + + var _path = path || "", + _permissions = 0, + _obj = newAttr(), + _stat = null; + + function newAttr() { + return { + directory : false, + readonly : false, + hidden : false, + executable : false, + mtime : 0, + atime : 0 + } + } + + if (_path && fs.existsSync(_path)) { + _stat = fs.statSync(_path); + _obj.directory = _stat.isDirectory(); + _obj.mtime = _stat.mtime; + _obj.atime = _stat.atime; + _obj.executable = !!(1 & parseInt ((_stat.mode & parseInt ("777", 8)).toString (8)[0])); + _obj.readonly = !!(2 & parseInt ((_stat.mode & parseInt ("777", 8)).toString (8)[0])); + _obj.hidden = pth.basename(_path)[0] === "."; + } else { + console.warn("Invalid path: " + _path) + } + + return { + + get directory () { + return _obj.directory; + }, + + get readOnly () { + return _obj.readonly; + }, + + get hidden () { + return _obj.hidden; + }, + + get mtime () { + return _obj.mtime; + }, + + get atime () { + return _obj.atime; + }, + + + get executable () { + return _obj.executable; + }, + + decodeAttributes : function(val) { + + }, + + encodeAttributes : function (val) { + + }, + + toString : function() { + return '{\n' + + '\t"path" : "' + _path + ",\n" + + '\t"isDirectory" : ' + _obj.directory + ",\n" + + '\t"isReadOnly" : ' + _obj.readonly + ",\n" + + '\t"isHidden" : ' + _obj.hidden + ",\n" + + '\t"isExecutable" : ' + _obj.executable + ",\n" + + '\t"mTime" : ' + _obj.mtime + "\n" + + '\t"aTime" : ' + _obj.atime + "\n" + + '}'; + } + } + +}; diff --git a/node_modules/adm-zip/util/index.js b/node_modules/adm-zip/util/index.js new file mode 100644 index 0000000..d77b980 --- /dev/null +++ b/node_modules/adm-zip/util/index.js @@ -0,0 +1,4 @@ +module.exports = require("./utils"); +module.exports.Constants = require("./constants"); +module.exports.Errors = require("./errors"); +module.exports.FileAttr = require("./fattr"); \ No newline at end of file diff --git a/node_modules/adm-zip/util/utils.js b/node_modules/adm-zip/util/utils.js new file mode 100644 index 0000000..52a8ed9 --- /dev/null +++ b/node_modules/adm-zip/util/utils.js @@ -0,0 +1,199 @@ +var fs = require("fs"), + pth = require('path'); + +fs.existsSync = fs.existsSync || pth.existsSync; + +module.exports = (function() { + + var crcTable = [], + Constants = require('./constants'), + Errors = require('./errors'), + + PATH_SEPARATOR = pth.normalize("/"); + + + function mkdirSync(/*String*/path) { + var resolvedPath = path.split(PATH_SEPARATOR)[0]; + path.split(PATH_SEPARATOR).forEach(function(name) { + if (!name || name.substr(-1,1) == ":") return; + resolvedPath += PATH_SEPARATOR + name; + var stat; + try { + stat = fs.statSync(resolvedPath); + } catch (e) { + fs.mkdirSync(resolvedPath); + } + if (stat && stat.isFile()) + throw Errors.FILE_IN_THE_WAY.replace("%s", resolvedPath); + }); + } + + function findSync(/*String*/root, /*RegExp*/pattern, /*Boolean*/recoursive) { + if (typeof pattern === 'boolean') { + recoursive = pattern; + pattern = undefined; + } + var files = []; + fs.readdirSync(root).forEach(function(file) { + var path = pth.join(root, file); + + if (fs.statSync(path).isDirectory() && recoursive) + files = files.concat(findSync(path, pattern, recoursive)); + + if (!pattern || pattern.test(path)) { + files.push(pth.normalize(path) + (fs.statSync(path).isDirectory() ? PATH_SEPARATOR : "")); + } + + }); + return files; + } + + return { + makeDir : function(/*String*/path) { + mkdirSync(path); + }, + + crc32 : function(buf) { + var b = new Buffer(4); + if (!crcTable.length) { + for (var n = 0; n < 256; n++) { + var c = n; + for (var k = 8; --k >= 0;) // + if ((c & 1) != 0) { c = 0xedb88320 ^ (c >>> 1); } else { c = c >>> 1; } + if (c < 0) { + b.writeInt32LE(c, 0); + c = b.readUInt32LE(0); + } + crcTable[n] = c; + } + } + var crc = 0, off = 0, len = buf.length, c1 = ~crc; + while(--len >= 0) c1 = crcTable[(c1 ^ buf[off++]) & 0xff] ^ (c1 >>> 8); + crc = ~c1; + b.writeInt32LE(crc & 0xffffffff, 0); + return b.readUInt32LE(0); + }, + + methodToString : function(/*Number*/method) { + switch (method) { + case Constants.STORED: + return 'STORED (' + method + ')'; + case Constants.DEFLATED: + return 'DEFLATED (' + method + ')'; + default: + return 'UNSUPPORTED (' + method + ')'; + } + + }, + + writeFileTo : function(/*String*/path, /*Buffer*/content, /*Boolean*/overwrite, /*Number*/attr) { + if (fs.existsSync(path)) { + if (!overwrite) + return false; // cannot overwite + + var stat = fs.statSync(path); + if (stat.isDirectory()) { + return false; + } + } + var folder = pth.dirname(path); + if (!fs.existsSync(folder)) { + mkdirSync(folder); + } + + var fd; + try { + fd = fs.openSync(path, 'w', 438); // 0666 + } catch(e) { + fs.chmodSync(path, 438); + fd = fs.openSync(path, 'w', 438); + } + if (fd) { + fs.writeSync(fd, content, 0, content.length, 0); + fs.closeSync(fd); + } + fs.chmodSync(path, attr || 438); + return true; + }, + + writeFileToAsync : function(/*String*/path, /*Buffer*/content, /*Boolean*/overwrite, /*Number*/attr, /*Function*/callback) { + if(typeof attr === 'function') { + callback = attr; + attr = undefined; + } + + fs.exists(path, function(exists) { + if(exists && !overwrite) + return callback(false); + + fs.stat(path, function(err, stat) { + if(exists &&stat.isDirectory()) { + return callback(false); + } + + var folder = pth.dirname(path); + fs.exists(folder, function(exists) { + if(!exists) + mkdirSync(folder); + + fs.open(path, 'w', 438, function(err, fd) { + if(err) { + fs.chmod(path, 438, function(err) { + fs.open(path, 'w', 438, function(err, fd) { + fs.write(fd, content, 0, content.length, 0, function(err, written, buffer) { + fs.close(fd, function(err) { + fs.chmod(path, attr || 438, function() { + callback(true); + }) + }); + }); + }); + }) + } else { + if(fd) { + fs.write(fd, content, 0, content.length, 0, function(err, written, buffer) { + fs.close(fd, function(err) { + fs.chmod(path, attr || 438, function() { + callback(true); + }) + }); + }); + } else { + fs.chmod(path, attr || 438, function() { + callback(true); + }) + } + } + }); + }) + }) + }) + }, + + findFiles : function(/*String*/path) { + return findSync(path, true); + }, + + getAttributes : function(/*String*/path) { + + }, + + setAttributes : function(/*String*/path) { + + }, + + toBuffer : function(input) { + if (Buffer.isBuffer(input)) { + return input; + } else { + if (input.length == 0) { + return new Buffer(0) + } + return new Buffer(input, 'utf8'); + } + }, + + Constants : Constants, + Errors : Errors + } +})(); diff --git a/node_modules/adm-zip/zipEntry.js b/node_modules/adm-zip/zipEntry.js new file mode 100644 index 0000000..6b1309b --- /dev/null +++ b/node_modules/adm-zip/zipEntry.js @@ -0,0 +1,284 @@ +var Utils = require("./util"), + Headers = require("./headers"), + Constants = Utils.Constants, + Methods = require("./methods"); + +module.exports = function (/*Buffer*/input) { + + var _entryHeader = new Headers.EntryHeader(), + _entryName = new Buffer(0), + _comment = new Buffer(0), + _isDirectory = false, + uncompressedData = null, + _extra = new Buffer(0); + + function getCompressedDataFromZip() { + if (!input || !Buffer.isBuffer(input)) { + return new Buffer(0); + } + _entryHeader.loadDataHeaderFromBinary(input); + return input.slice(_entryHeader.realDataOffset, _entryHeader.realDataOffset + _entryHeader.compressedSize) + } + + function crc32OK(data) { + // if bit 3 (0x08) of the general-purpose flags field is set, then the CRC-32 and file sizes are not known when the header is written + if (_entryHeader.flags & 0x8 != 0x8) { + if (Utils.crc32(data) != _entryHeader.crc) { + return false; + } + } else { + // @TODO: load and check data descriptor header + // The fields in the local header are filled with zero, and the CRC-32 and size are appended in a 12-byte structure + // (optionally preceded by a 4-byte signature) immediately after the compressed data: + } + return true; + } + + function decompress(/*Boolean*/async, /*Function*/callback, /*String*/pass) { + if(typeof callback === 'undefined' && typeof async === 'string') { + pass=async; + async=void 0; + } + if (_isDirectory) { + if (async && callback) { + callback(new Buffer(0), Utils.Errors.DIRECTORY_CONTENT_ERROR); //si added error. + } + return new Buffer(0); + } + + var compressedData = getCompressedDataFromZip(); + + if (compressedData.length == 0) { + if (async && callback) callback(compressedData, Utils.Errors.NO_DATA);//si added error. + return compressedData; + } + + var data = new Buffer(_entryHeader.size); + data.fill(0); + + switch (_entryHeader.method) { + case Utils.Constants.STORED: + compressedData.copy(data); + if (!crc32OK(data)) { + if (async && callback) callback(data, Utils.Errors.BAD_CRC);//si added error + return Utils.Errors.BAD_CRC; + } else {//si added otherwise did not seem to return data. + if (async && callback) callback(data); + return data; + } + break; + case Utils.Constants.DEFLATED: + var inflater = new Methods.Inflater(compressedData); + if (!async) { + inflater.inflate(data); + if (!crc32OK(data)) { + console.warn(Utils.Errors.BAD_CRC + " " + _entryName.toString()) + } + return data; + } else { + inflater.inflateAsync(function(result) { + result.copy(data, 0); + if (!crc32OK(data)) { + if (callback) callback(data, Utils.Errors.BAD_CRC); //si added error + } else { //si added otherwise did not seem to return data. + if (callback) callback(data); + } + }) + } + break; + default: + if (async && callback) callback(new Buffer(0), Utils.Errors.UNKNOWN_METHOD); + return Utils.Errors.UNKNOWN_METHOD; + } + } + + function compress(/*Boolean*/async, /*Function*/callback) { + if ((!uncompressedData || !uncompressedData.length) && Buffer.isBuffer(input)) { + // no data set or the data wasn't changed to require recompression + if (async && callback) callback(getCompressedDataFromZip()); + return getCompressedDataFromZip(); + } + + if (uncompressedData.length && !_isDirectory) { + var compressedData; + // Local file header + switch (_entryHeader.method) { + case Utils.Constants.STORED: + _entryHeader.compressedSize = _entryHeader.size; + + compressedData = new Buffer(uncompressedData.length); + uncompressedData.copy(compressedData); + + if (async && callback) callback(compressedData); + return compressedData; + + break; + default: + case Utils.Constants.DEFLATED: + + var deflater = new Methods.Deflater(uncompressedData); + if (!async) { + var deflated = deflater.deflate(); + _entryHeader.compressedSize = deflated.length; + return deflated; + } else { + deflater.deflateAsync(function(data) { + compressedData = new Buffer(data.length); + _entryHeader.compressedSize = data.length; + data.copy(compressedData); + callback && callback(compressedData); + }) + } + deflater = null; + break; + } + } else { + if (async && callback) { + callback(new Buffer(0)); + } else { + return new Buffer(0); + } + } + } + + function readUInt64LE(buffer, offset) { + return (buffer.readUInt32LE(offset + 4) << 4) + buffer.readUInt32LE(offset); + } + + function parseExtra(data) { + var offset = 0; + var signature, size, part; + while(offset= Constants.EF_ZIP64_SCOMP) { + size = readUInt64LE(data, Constants.EF_ZIP64_SUNCOMP); + if(_entryHeader.size === Constants.EF_ZIP64_OR_32) { + _entryHeader.size = size; + } + } + if(data.length >= Constants.EF_ZIP64_RHO) { + compressedSize = readUInt64LE(data, Constants.EF_ZIP64_SCOMP); + if(_entryHeader.compressedSize === Constants.EF_ZIP64_OR_32) { + _entryHeader.compressedSize = compressedSize; + } + } + if(data.length >= Constants.EF_ZIP64_DSN) { + offset = readUInt64LE(data, Constants.EF_ZIP64_RHO); + if(_entryHeader.offset === Constants.EF_ZIP64_OR_32) { + _entryHeader.offset = offset; + } + } + if(data.length >= Constants.EF_ZIP64_DSN+4) { + diskNumStart = data.readUInt32LE(Constants.EF_ZIP64_DSN); + if(_entryHeader.diskNumStart === Constants.EF_ZIP64_OR_16) { + _entryHeader.diskNumStart = diskNumStart; + } + } + } + + + return { + get entryName () { return _entryName.toString(); }, + get rawEntryName() { return _entryName; }, + set entryName (val) { + _entryName = Utils.toBuffer(val); + var lastChar = _entryName[_entryName.length - 1]; + _isDirectory = (lastChar == 47) || (lastChar == 92); + _entryHeader.fileNameLength = _entryName.length; + }, + + get extra () { return _extra; }, + set extra (val) { + _extra = val; + _entryHeader.extraLength = val.length; + parseExtra(val); + }, + + get comment () { return _comment.toString(); }, + set comment (val) { + _comment = Utils.toBuffer(val); + _entryHeader.commentLength = _comment.length; + }, + + get name () { var n = _entryName.toString(); return _isDirectory ? n.substr(n.length - 1).split("/").pop() : n.split("/").pop(); }, + get isDirectory () { return _isDirectory }, + + getCompressedData : function() { + return compress(false, null) + }, + + getCompressedDataAsync : function(/*Function*/callback) { + compress(true, callback) + }, + + setData : function(value) { + uncompressedData = Utils.toBuffer(value); + if (!_isDirectory && uncompressedData.length) { + _entryHeader.size = uncompressedData.length; + _entryHeader.method = Utils.Constants.DEFLATED; + _entryHeader.crc = Utils.crc32(value); + } else { // folders and blank files should be stored + _entryHeader.method = Utils.Constants.STORED; + } + }, + + getData : function(pass) { + return decompress(false, null, pass); + }, + + getDataAsync : function(/*Function*/callback, pass) { + decompress(true, callback, pass) + }, + + set attr(attr) { _entryHeader.attr = attr; }, + get attr() { return _entryHeader.attr; }, + + set header(/*Buffer*/data) { + _entryHeader.loadFromBinary(data); + }, + + get header() { + return _entryHeader; + }, + + packHeader : function() { + var header = _entryHeader.entryHeaderToBinary(); + // add + _entryName.copy(header, Utils.Constants.CENHDR); + if (_entryHeader.extraLength) { + _extra.copy(header, Utils.Constants.CENHDR + _entryName.length) + } + if (_entryHeader.commentLength) { + _comment.copy(header, Utils.Constants.CENHDR + _entryName.length + _entryHeader.extraLength, _comment.length); + } + return header; + }, + + toString : function() { + return '{\n' + + '\t"entryName" : "' + _entryName.toString() + "\",\n" + + '\t"name" : "' + _entryName.toString().split("/").pop() + "\",\n" + + '\t"comment" : "' + _comment.toString() + "\",\n" + + '\t"isDirectory" : ' + _isDirectory + ",\n" + + '\t"header" : ' + _entryHeader.toString().replace(/\t/mg, "\t\t") + ",\n" + + '\t"compressedData" : <' + (input && input.length + " bytes buffer" || "null") + ">\n" + + '\t"data" : <' + (uncompressedData && uncompressedData.length + " bytes buffer" || "null") + ">\n" + + '}'; + } + } +}; diff --git a/node_modules/adm-zip/zipFile.js b/node_modules/adm-zip/zipFile.js new file mode 100644 index 0000000..794afdb --- /dev/null +++ b/node_modules/adm-zip/zipFile.js @@ -0,0 +1,311 @@ +var ZipEntry = require("./zipEntry"), + Headers = require("./headers"), + Utils = require("./util"); + +module.exports = function(/*String|Buffer*/input, /*Number*/inputType) { + var entryList = [], + entryTable = {}, + _comment = new Buffer(0), + filename = "", + fs = require("fs"), + inBuffer = null, + mainHeader = new Headers.MainHeader(); + + if (inputType == Utils.Constants.FILE) { + // is a filename + filename = input; + inBuffer = fs.readFileSync(filename); + readMainHeader(); + } else if (inputType == Utils.Constants.BUFFER) { + // is a memory buffer + inBuffer = input; + readMainHeader(); + } else { + // none. is a new file + } + + function readEntries() { + entryTable = {}; + entryList = new Array(mainHeader.diskEntries); // total number of entries + var index = mainHeader.offset; // offset of first CEN header + for(var i = 0; i < entryList.length; i++) { + + var tmp = index, + entry = new ZipEntry(inBuffer); + entry.header = inBuffer.slice(tmp, tmp += Utils.Constants.CENHDR); + + entry.entryName = inBuffer.slice(tmp, tmp += entry.header.fileNameLength); + + if (entry.header.extraLength) { + entry.extra = inBuffer.slice(tmp, tmp += entry.header.extraLength); + } + + if (entry.header.commentLength) + entry.comment = inBuffer.slice(tmp, tmp + entry.header.commentLength); + + index += entry.header.entryHeaderSize; + + entryList[i] = entry; + entryTable[entry.entryName] = entry; + } + } + + function readMainHeader() { + var i = inBuffer.length - Utils.Constants.ENDHDR, // END header size + n = Math.max(0, i - 0xFFFF), // 0xFFFF is the max zip file comment length + endOffset = -1; // Start offset of the END header + + for (i; i >= n; i--) { + if (inBuffer[i] != 0x50) continue; // quick check that the byte is 'P' + if (inBuffer.readUInt32LE(i) == Utils.Constants.ENDSIG) { // "PK\005\006" + endOffset = i; + break; + } + } + if (!~endOffset) + throw Utils.Errors.INVALID_FORMAT; + + mainHeader.loadFromBinary(inBuffer.slice(endOffset, endOffset + Utils.Constants.ENDHDR)); + if (mainHeader.commentLength) { + _comment = inBuffer.slice(endOffset + Utils.Constants.ENDHDR); + } + readEntries(); + } + + return { + /** + * Returns an array of ZipEntry objects existent in the current opened archive + * @return Array + */ + get entries () { + return entryList; + }, + + /** + * Archive comment + * @return {String} + */ + get comment () { return _comment.toString(); }, + set comment(val) { + mainHeader.commentLength = val.length; + _comment = val; + }, + + /** + * Returns a reference to the entry with the given name or null if entry is inexistent + * + * @param entryName + * @return ZipEntry + */ + getEntry : function(/*String*/entryName) { + return entryTable[entryName] || null; + }, + + /** + * Adds the given entry to the entry list + * + * @param entry + */ + setEntry : function(/*ZipEntry*/entry) { + entryList.push(entry); + entryTable[entry.entryName] = entry; + mainHeader.totalEntries = entryList.length; + }, + + /** + * Removes the entry with the given name from the entry list. + * + * If the entry is a directory, then all nested files and directories will be removed + * @param entryName + */ + deleteEntry : function(/*String*/entryName) { + var entry = entryTable[entryName]; + if (entry && entry.isDirectory) { + var _self = this; + this.getEntryChildren(entry).forEach(function(child) { + if (child.entryName != entryName) { + _self.deleteEntry(child.entryName) + } + }) + } + entryList.splice(entryList.indexOf(entry), 1); + delete(entryTable[entryName]); + mainHeader.totalEntries = entryList.length; + }, + + /** + * Iterates and returns all nested files and directories of the given entry + * + * @param entry + * @return Array + */ + getEntryChildren : function(/*ZipEntry*/entry) { + if (entry.isDirectory) { + var list = [], + name = entry.entryName, + len = name.length; + + entryList.forEach(function(zipEntry) { + if (zipEntry.entryName.substr(0, len) == name) { + list.push(zipEntry); + } + }); + return list; + } + return [] + }, + + /** + * Returns the zip file + * + * @return Buffer + */ + compressToBuffer : function() { + if (entryList.length > 1) { + entryList.sort(function(a, b) { + var nameA = a.entryName.toLowerCase(); + var nameB = b.entryName.toLowerCase(); + if (nameA < nameB) {return -1} + if (nameA > nameB) {return 1} + return 0; + }); + } + + var totalSize = 0, + dataBlock = [], + entryHeaders = [], + dindex = 0; + + mainHeader.size = 0; + mainHeader.offset = 0; + + entryList.forEach(function(entry) { + entry.header.offset = dindex; + + // compress data and set local and entry header accordingly. Reason why is called first + var compressedData = entry.getCompressedData(); + // data header + var dataHeader = entry.header.dataHeaderToBinary(); + var postHeader = new Buffer(entry.entryName + entry.extra.toString()); + var dataLength = dataHeader.length + postHeader.length + compressedData.length; + + dindex += dataLength; + + dataBlock.push(dataHeader); + dataBlock.push(postHeader); + dataBlock.push(compressedData); + + var entryHeader = entry.packHeader(); + entryHeaders.push(entryHeader); + mainHeader.size += entryHeader.length; + totalSize += (dataLength + entryHeader.length); + }); + + totalSize += mainHeader.mainHeaderSize; // also includes zip file comment length + // point to end of data and begining of central directory first record + mainHeader.offset = dindex; + + dindex = 0; + var outBuffer = new Buffer(totalSize); + dataBlock.forEach(function(content) { + content.copy(outBuffer, dindex); // write data blocks + dindex += content.length; + }); + entryHeaders.forEach(function(content) { + content.copy(outBuffer, dindex); // write central directory entries + dindex += content.length; + }); + + var mh = mainHeader.toBinary(); + if (_comment) { + _comment.copy(mh, Utils.Constants.ENDHDR); // add zip file comment + } + + mh.copy(outBuffer, dindex); // write main header + + return outBuffer + }, + + toAsyncBuffer : function(/*Function*/onSuccess,/*Function*/onFail,/*Function*/onItemStart,/*Function*/onItemEnd) { + if (entryList.length > 1) { + entryList.sort(function(a, b) { + var nameA = a.entryName.toLowerCase(); + var nameB = b.entryName.toLowerCase(); + if (nameA > nameB) {return -1} + if (nameA < nameB) {return 1} + return 0; + }); + } + + var totalSize = 0, + dataBlock = [], + entryHeaders = [], + dindex = 0; + + mainHeader.size = 0; + mainHeader.offset = 0; + + var compress=function(entryList){ + var self=arguments.callee; + var entry; + if(entryList.length){ + var entry=entryList.pop(); + var name=entry.entryName + entry.extra.toString(); + if(onItemStart)onItemStart(name); + entry.getCompressedDataAsync(function(compressedData){ + if(onItemEnd)onItemEnd(name); + + entry.header.offset = dindex; + // data header + var dataHeader = entry.header.dataHeaderToBinary(); + var postHeader = new Buffer(name); + var dataLength = dataHeader.length + postHeader.length + compressedData.length; + + dindex += dataLength; + + dataBlock.push(dataHeader); + dataBlock.push(postHeader); + dataBlock.push(compressedData); + + var entryHeader = entry.packHeader(); + entryHeaders.push(entryHeader); + mainHeader.size += entryHeader.length; + totalSize += (dataLength + entryHeader.length); + + if(entryList.length){ + self(entryList); + }else{ + + + totalSize += mainHeader.mainHeaderSize; // also includes zip file comment length + // point to end of data and begining of central directory first record + mainHeader.offset = dindex; + + dindex = 0; + var outBuffer = new Buffer(totalSize); + dataBlock.forEach(function(content) { + content.copy(outBuffer, dindex); // write data blocks + dindex += content.length; + }); + entryHeaders.forEach(function(content) { + content.copy(outBuffer, dindex); // write central directory entries + dindex += content.length; + }); + + var mh = mainHeader.toBinary(); + if (_comment) { + _comment.copy(mh, Utils.Constants.ENDHDR); // add zip file comment + } + + mh.copy(outBuffer, dindex); // write main header + + onSuccess(outBuffer); + } + }); + } + }; + + compress(entryList); + } + } +}; diff --git a/node_modules/fs-extra/LICENSE b/node_modules/fs-extra/LICENSE new file mode 100644 index 0000000..f109d23 --- /dev/null +++ b/node_modules/fs-extra/LICENSE @@ -0,0 +1,15 @@ +(The MIT License) + +Copyright (c) 2011-2016 JP Richardson + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files +(the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, + merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS +OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/fs-extra/README.md b/node_modules/fs-extra/README.md new file mode 100644 index 0000000..c4c11c0 --- /dev/null +++ b/node_modules/fs-extra/README.md @@ -0,0 +1,588 @@ +Node.js: fs-extra +================= + +`fs-extra` adds file system methods that aren't included in the native `fs` module. It is a drop in replacement for `fs`. + +[![npm Package](https://img.shields.io/npm/v/fs-extra.svg?style=flat-square)](https://www.npmjs.org/package/fs-extra) +[![build status](https://api.travis-ci.org/jprichardson/node-fs-extra.svg)](http://travis-ci.org/jprichardson/node-fs-extra) +[![windows Build status](https://img.shields.io/appveyor/ci/jprichardson/node-fs-extra/master.svg?label=windows%20build)](https://ci.appveyor.com/project/jprichardson/node-fs-extra/branch/master) +[![downloads per month](http://img.shields.io/npm/dm/fs-extra.svg)](https://www.npmjs.org/package/fs-extra) +[![Coverage Status](https://img.shields.io/coveralls/jprichardson/node-fs-extra.svg)](https://coveralls.io/r/jprichardson/node-fs-extra) + +Standard JavaScript + +**NOTE (2016-04-28):** Node v0.10 will be unsupported 2016-10-01. Node v0.12 will be unsupported on 2017-04-01. + + +Why? +---- + +I got tired of including `mkdirp`, `rimraf`, and `ncp` in most of my projects. + + + + +Installation +------------ + + npm install --save fs-extra + + + +Usage +----- + +`fs-extra` is a drop in replacement for native `fs`. All methods in `fs` are unmodified and attached to `fs-extra`. + +You don't ever need to include the original `fs` module again: + +```js +var fs = require('fs') // this is no longer necessary +``` + +you can now do this: + +```js +var fs = require('fs-extra') +``` + +or if you prefer to make it clear that you're using `fs-extra` and not `fs`, you may want +to name your `fs` variable `fse` like so: + +```js +var fse = require('fs-extra') +``` + +you can also keep both, but it's redundant: + +```js +var fs = require('fs') +var fse = require('fs-extra') +``` + +Sync vs Async +------------- +Most methods are async by default (they take a callback with an `Error` as first argument). + +Sync methods on the other hand will throw if an error occurs. + +Example: + +```js +var fs = require('fs-extra') + +fs.copy('/tmp/myfile', '/tmp/mynewfile', function (err) { + if (err) return console.error(err) + console.log("success!") +}); + +try { + fs.copySync('/tmp/myfile', '/tmp/mynewfile') + console.log("success!") +} catch (err) { + console.error(err) +} +``` + + +Methods +------- +- [copy](#copy) +- [copySync](#copy) +- [emptyDir](#emptydirdir-callback) +- [emptyDirSync](#emptydirdir-callback) +- [ensureFile](#ensurefilefile-callback) +- [ensureFileSync](#ensurefilefile-callback) +- [ensureDir](#ensuredirdir-callback) +- [ensureDirSync](#ensuredirdir-callback) +- [ensureLink](#ensurelinksrcpath-dstpath-callback) +- [ensureLinkSync](#ensurelinksrcpath-dstpath-callback) +- [ensureSymlink](#ensuresymlinksrcpath-dstpath-type-callback) +- [ensureSymlinkSync](#ensuresymlinksrcpath-dstpath-type-callback) +- [mkdirs](#mkdirsdir-callback) +- [mkdirsSync](#mkdirsdir-callback) +- [move](#movesrc-dest-options-callback) +- [outputFile](#outputfilefile-data-options-callback) +- [outputFileSync](#outputfilefile-data-options-callback) +- [outputJson](#outputjsonfile-data-options-callback) +- [outputJsonSync](#outputjsonfile-data-options-callback) +- [readJson](#readjsonfile-options-callback) +- [readJsonSync](#readjsonfile-options-callback) +- [remove](#removedir-callback) +- [removeSync](#removedir-callback) +- [walk](#walk) +- [writeJson](#writejsonfile-object-options-callback) +- [writeJsonSync](#writejsonfile-object-options-callback) + + +**NOTE:** You can still use the native Node.js methods. They are copied over to `fs-extra`. + + +### copy() + +**copy(src, dest, [options], callback)** + + +Copy a file or directory. The directory can have contents. Like `cp -r`. + +Options: +- clobber (boolean): overwrite existing file or directory +- dereference (boolean): dereference symlinks +- preserveTimestamps (boolean): will set last modification and access times to the ones of the original source files, default is `false`. +- filter: Function or RegExp to filter copied files. If function, return true to include, false to exclude. If RegExp, same as function, where `filter` is `filter.test`. + +Sync: `copySync()` + +Example: + +```js +var fs = require('fs-extra') + +fs.copy('/tmp/myfile', '/tmp/mynewfile', function (err) { + if (err) return console.error(err) + console.log("success!") +}) // copies file + +fs.copy('/tmp/mydir', '/tmp/mynewdir', function (err) { + if (err) return console.error(err) + console.log('success!') +}) // copies directory, even if it has subdirectories or files +``` + + +### emptyDir(dir, [callback]) + +Ensures that a directory is empty. Deletes directory contents if the directory is not empty. If the directory does not exist, it is created. The directory itself is not deleted. + +Alias: `emptydir()` + +Sync: `emptyDirSync()`, `emptydirSync()` + +Example: + +```js +var fs = require('fs-extra') + +// assume this directory has a lot of files and folders +fs.emptyDir('/tmp/some/dir', function (err) { + if (!err) console.log('success!') +}) +``` + + +### ensureFile(file, callback) + +Ensures that the file exists. If the file that is requested to be created is in directories that do not exist, these directories are created. If the file already exists, it is **NOT MODIFIED**. + +Alias: `createFile()` + +Sync: `createFileSync()`,`ensureFileSync()` + + +Example: + +```js +var fs = require('fs-extra') + +var file = '/tmp/this/path/does/not/exist/file.txt' +fs.ensureFile(file, function (err) { + console.log(err) // => null + // file has now been created, including the directory it is to be placed in +}) +``` + + +### ensureDir(dir, callback) + +Ensures that the directory exists. If the directory structure does not exist, it is created. + +Sync: `ensureDirSync()` + + +Example: + +```js +var fs = require('fs-extra') + +var dir = '/tmp/this/path/does/not/exist' +fs.ensureDir(dir, function (err) { + console.log(err) // => null + // dir has now been created, including the directory it is to be placed in +}) +``` + + +### ensureLink(srcpath, dstpath, callback) + +Ensures that the link exists. If the directory structure does not exist, it is created. + +Sync: `ensureLinkSync()` + + +Example: + +```js +var fs = require('fs-extra') + +var srcpath = '/tmp/file.txt' +var dstpath = '/tmp/this/path/does/not/exist/file.txt' +fs.ensureLink(srcpath, dstpath, function (err) { + console.log(err) // => null + // link has now been created, including the directory it is to be placed in +}) +``` + + +### ensureSymlink(srcpath, dstpath, [type], callback) + +Ensures that the symlink exists. If the directory structure does not exist, it is created. + +Sync: `ensureSymlinkSync()` + + +Example: + +```js +var fs = require('fs-extra') + +var srcpath = '/tmp/file.txt' +var dstpath = '/tmp/this/path/does/not/exist/file.txt' +fs.ensureSymlink(srcpath, dstpath, function (err) { + console.log(err) // => null + // symlink has now been created, including the directory it is to be placed in +}) +``` + + +### mkdirs(dir, callback) + +Creates a directory. If the parent hierarchy doesn't exist, it's created. Like `mkdir -p`. + +Alias: `mkdirp()` + +Sync: `mkdirsSync()` / `mkdirpSync()` + + +Examples: + +```js +var fs = require('fs-extra') + +fs.mkdirs('/tmp/some/long/path/that/prob/doesnt/exist', function (err) { + if (err) return console.error(err) + console.log("success!") +}) + +fs.mkdirsSync('/tmp/another/path') +``` + + +### move(src, dest, [options], callback) + +Moves a file or directory, even across devices. + +Options: +- clobber (boolean): overwrite existing file or directory +- limit (number): number of concurrent moves, see ncp for more information + +Example: + +```js +var fs = require('fs-extra') + +fs.move('/tmp/somefile', '/tmp/does/not/exist/yet/somefile', function (err) { + if (err) return console.error(err) + console.log("success!") +}) +``` + + +### outputFile(file, data, [options], callback) + +Almost the same as `writeFile` (i.e. it [overwrites](http://pages.citebite.com/v2o5n8l2f5reb)), except that if the parent directory does not exist, it's created. `options` are what you'd pass to [`fs.writeFile()`](https://nodejs.org/api/fs.html#fs_fs_writefile_file_data_options_callback). + +Sync: `outputFileSync()` + + +Example: + +```js +var fs = require('fs-extra') +var file = '/tmp/this/path/does/not/exist/file.txt' + +fs.outputFile(file, 'hello!', function (err) { + console.log(err) // => null + + fs.readFile(file, 'utf8', function (err, data) { + console.log(data) // => hello! + }) +}) +``` + + + +### outputJson(file, data, [options], callback) + +Almost the same as `writeJson`, except that if the directory does not exist, it's created. +`options` are what you'd pass to [`jsonFile.writeFile()`](https://github.com/jprichardson/node-jsonfile#writefilefilename-options-callback). + +Alias: `outputJSON()` + +Sync: `outputJsonSync()`, `outputJSONSync()` + + +Example: + +```js +var fs = require('fs-extra') +var file = '/tmp/this/path/does/not/exist/file.txt' + +fs.outputJson(file, {name: 'JP'}, function (err) { + console.log(err) // => null + + fs.readJson(file, function(err, data) { + console.log(data.name) // => JP + }) +}) +``` + + + +### readJson(file, [options], callback) + +Reads a JSON file and then parses it into an object. `options` are the same +that you'd pass to [`jsonFile.readFile`](https://github.com/jprichardson/node-jsonfile#readfilefilename-options-callback). + +Alias: `readJSON()` + +Sync: `readJsonSync()`, `readJSONSync()` + + +Example: + +```js +var fs = require('fs-extra') + +fs.readJson('./package.json', function (err, packageObj) { + console.log(packageObj.version) // => 0.1.3 +}) +``` + +`readJsonSync()` can take a `throws` option set to `false` and it won't throw if the JSON is invalid. Example: + +```js +var fs = require('fs-extra') +var file = path.join('/tmp/some-invalid.json') +var data = '{not valid JSON' +fs.writeFileSync(file, data) + +var obj = fs.readJsonSync(file, {throws: false}) +console.log(obj) // => null +``` + + +### remove(dir, callback) + +Removes a file or directory. The directory can have contents. Like `rm -rf`. + +Sync: `removeSync()` + + +Examples: + +```js +var fs = require('fs-extra') + +fs.remove('/tmp/myfile', function (err) { + if (err) return console.error(err) + + console.log('success!') +}) + +fs.removeSync('/home/jprichardson') //I just deleted my entire HOME directory. +``` + +### walk() + +**walk(dir, [streamOptions])** + +The function `walk()` from the module [`klaw`](https://github.com/jprichardson/node-klaw). + +Returns a [Readable stream](https://nodejs.org/api/stream.html#stream_class_stream_readable) that iterates +through every file and directory starting with `dir` as the root. Every `read()` or `data` event +returns an object with two properties: `path` and `stats`. `path` is the full path of the file and +`stats` is an instance of [fs.Stats](https://nodejs.org/api/fs.html#fs_class_fs_stats). + +Streams 1 (push) example: + +```js +var items = [] // files, directories, symlinks, etc +fse.walk(TEST_DIR) + .on('data', function (item) { + items.push(item.path) + }) + .on('end', function () { + console.dir(items) // => [ ... array of files] + }) +``` + +Streams 2 & 3 (pull) example: + +```js +var items = [] // files, directories, symlinks, etc +fse.walk(TEST_DIR) + .on('readable', function () { + var item + while ((item = this.read())) { + items.push(item.path) + } + }) + .on('end', function () { + console.dir(items) // => [ ... array of files] + }) +``` + +If you're not sure of the differences on Node.js streams 1, 2, 3 then I'd +recommend this resource as a good starting point: https://strongloop.com/strongblog/whats-new-io-js-beta-streams3/. + +**See [`klaw` documentation](https://github.com/jprichardson/node-klaw) for more detailed usage.** + + +### writeJson(file, object, [options], callback) + +Writes an object to a JSON file. `options` are the same that +you'd pass to [`jsonFile.writeFile()`](https://github.com/jprichardson/node-jsonfile#writefilefilename-options-callback). + +Alias: `writeJSON()` + +Sync: `writeJsonSync()`, `writeJSONSync()` + +Example: + +```js +var fs = require('fs-extra') +fs.writeJson('./package.json', {name: 'fs-extra'}, function (err) { + console.log(err) +}) +``` + + +Third Party +----------- + +### Promises + +Use [Bluebird](https://github.com/petkaantonov/bluebird). See https://github.com/petkaantonov/bluebird/blob/master/API.md#promisification. `fs-extra` is +explicitly listed as supported. + +```js +var Promise = require('bluebird') +var fs = Promise.promisifyAll(require('fs-extra')) +``` + +Or you can use the package [`fs-extra-promise`](https://github.com/overlookmotel/fs-extra-promise) that marries the two together. + + +### TypeScript + +If you like TypeScript, you can use `fs-extra` with it: https://github.com/borisyankov/DefinitelyTyped/tree/master/fs-extra + + +### File / Directory Watching + +If you want to watch for changes to files or directories, then you should use [chokidar](https://github.com/paulmillr/chokidar). + + +### Misc. + +- [mfs](https://github.com/cadorn/mfs) - Monitor your fs-extra calls. + + + +Hacking on fs-extra +------------------- + +Wanna hack on `fs-extra`? Great! Your help is needed! [fs-extra is one of the most depended upon Node.js packages](http://nodei.co/npm/fs-extra.png?downloads=true&downloadRank=true&stars=true). This project +uses [JavaScript Standard Style](https://github.com/feross/standard) - if the name or style choices bother you, +you're gonna have to get over it :) If `standard` is good enough for `npm`, it's good enough for `fs-extra`. + +[![js-standard-style](https://cdn.rawgit.com/feross/standard/master/badge.svg)](https://github.com/feross/standard) + +What's needed? +- First, take a look at existing issues. Those are probably going to be where the priority lies. +- More tests for edge cases. Specifically on different platforms. There can never be enough tests. +- Improve test coverage. See coveralls output for more info. +- After the directory walker is integrated, any function that needs to traverse directories like +`copy`, `remove`, or `mkdirs` should be built on top of it. + +Note: If you make any big changes, **you should definitely file an issue for discussion first.** + +### Running the Test Suite + +fs-extra contains hundreds of tests. + +- `npm run lint`: runs the linter ([standard](http://standardjs.com/)) +- `npm run unit`: runs the unit tests +- `npm test`: runs both the linter and the tests + + +### Windows + +If you run the tests on the Windows and receive a lot of symbolic link `EPERM` permission errors, it's +because on Windows you need elevated privilege to create symbolic links. You can add this to your Windows's +account by following the instructions here: http://superuser.com/questions/104845/permission-to-make-symbolic-links-in-windows-7 +However, I didn't have much luck doing this. + +Since I develop on Mac OS X, I use VMWare Fusion for Windows testing. I create a shared folder that I map to a drive on Windows. +I open the `Node.js command prompt` and run as `Administrator`. I then map the network drive running the following command: + + net use z: "\\vmware-host\Shared Folders" + +I can then navigate to my `fs-extra` directory and run the tests. + + +Naming +------ + +I put a lot of thought into the naming of these functions. Inspired by @coolaj86's request. So he deserves much of the credit for raising the issue. See discussion(s) here: + +* https://github.com/jprichardson/node-fs-extra/issues/2 +* https://github.com/flatiron/utile/issues/11 +* https://github.com/ryanmcgrath/wrench-js/issues/29 +* https://github.com/substack/node-mkdirp/issues/17 + +First, I believe that in as many cases as possible, the [Node.js naming schemes](http://nodejs.org/api/fs.html) should be chosen. However, there are problems with the Node.js own naming schemes. + +For example, `fs.readFile()` and `fs.readdir()`: the **F** is capitalized in *File* and the **d** is not capitalized in *dir*. Perhaps a bit pedantic, but they should still be consistent. Also, Node.js has chosen a lot of POSIX naming schemes, which I believe is great. See: `fs.mkdir()`, `fs.rmdir()`, `fs.chown()`, etc. + +We have a dilemma though. How do you consistently name methods that perform the following POSIX commands: `cp`, `cp -r`, `mkdir -p`, and `rm -rf`? + +My perspective: when in doubt, err on the side of simplicity. A directory is just a hierarchical grouping of directories and files. Consider that for a moment. So when you want to copy it or remove it, in most cases you'll want to copy or remove all of its contents. When you want to create a directory, if the directory that it's suppose to be contained in does not exist, then in most cases you'll want to create that too. + +So, if you want to remove a file or a directory regardless of whether it has contents, just call `fs.remove(path)`. If you want to copy a file or a directory whether it has contents, just call `fs.copy(source, destination)`. If you want to create a directory regardless of whether its parent directories exist, just call `fs.mkdirs(path)` or `fs.mkdirp(path)`. + + +Credit +------ + +`fs-extra` wouldn't be possible without using the modules from the following authors: + +- [Isaac Shlueter](https://github.com/isaacs) +- [Charlie McConnel](https://github.com/avianflu) +- [James Halliday](https://github.com/substack) +- [Andrew Kelley](https://github.com/andrewrk) + + + + +License +------- + +Licensed under MIT + +Copyright (c) 2011-2016 [JP Richardson](https://github.com/jprichardson) + +[1]: http://nodejs.org/docs/latest/api/fs.html + + +[jsonfile]: https://github.com/jprichardson/node-jsonfile diff --git a/node_modules/fs-extra/lib/copy-sync/copy-file-sync.js b/node_modules/fs-extra/lib/copy-sync/copy-file-sync.js new file mode 100644 index 0000000..c6c5711 --- /dev/null +++ b/node_modules/fs-extra/lib/copy-sync/copy-file-sync.js @@ -0,0 +1,39 @@ +var fs = require('graceful-fs') + +var BUF_LENGTH = 64 * 1024 +var _buff = new Buffer(BUF_LENGTH) + +function copyFileSync (srcFile, destFile, options) { + var clobber = options.clobber + var preserveTimestamps = options.preserveTimestamps + + if (fs.existsSync(destFile)) { + if (clobber) { + fs.chmodSync(destFile, parseInt('777', 8)) + fs.unlinkSync(destFile) + } else { + throw Error('EEXIST') + } + } + + var fdr = fs.openSync(srcFile, 'r') + var stat = fs.fstatSync(fdr) + var fdw = fs.openSync(destFile, 'w', stat.mode) + var bytesRead = 1 + var pos = 0 + + while (bytesRead > 0) { + bytesRead = fs.readSync(fdr, _buff, 0, BUF_LENGTH, pos) + fs.writeSync(fdw, _buff, 0, bytesRead) + pos += bytesRead + } + + if (preserveTimestamps) { + fs.futimesSync(fdw, stat.atime, stat.mtime) + } + + fs.closeSync(fdr) + fs.closeSync(fdw) +} + +module.exports = copyFileSync diff --git a/node_modules/fs-extra/lib/copy-sync/copy-sync.js b/node_modules/fs-extra/lib/copy-sync/copy-sync.js new file mode 100644 index 0000000..8168dee --- /dev/null +++ b/node_modules/fs-extra/lib/copy-sync/copy-sync.js @@ -0,0 +1,48 @@ +var fs = require('graceful-fs') +var path = require('path') +var copyFileSync = require('./copy-file-sync') +var mkdir = require('../mkdirs') + +function copySync (src, dest, options) { + if (typeof options === 'function' || options instanceof RegExp) { + options = {filter: options} + } + + options = options || {} + options.recursive = !!options.recursive + + // default to true for now + options.clobber = 'clobber' in options ? !!options.clobber : true + options.dereference = 'dereference' in options ? !!options.dereference : false + options.preserveTimestamps = 'preserveTimestamps' in options ? !!options.preserveTimestamps : false + + options.filter = options.filter || function () { return true } + + var stats = (options.recursive && !options.dereference) ? fs.lstatSync(src) : fs.statSync(src) + var destFolder = path.dirname(dest) + var destFolderExists = fs.existsSync(destFolder) + var performCopy = false + + if (stats.isFile()) { + if (options.filter instanceof RegExp) performCopy = options.filter.test(src) + else if (typeof options.filter === 'function') performCopy = options.filter(src) + + if (performCopy) { + if (!destFolderExists) mkdir.mkdirsSync(destFolder) + copyFileSync(src, dest, {clobber: options.clobber, preserveTimestamps: options.preserveTimestamps}) + } + } else if (stats.isDirectory()) { + if (!fs.existsSync(dest)) mkdir.mkdirsSync(dest) + var contents = fs.readdirSync(src) + contents.forEach(function (content) { + var opts = options + opts.recursive = true + copySync(path.join(src, content), path.join(dest, content), opts) + }) + } else if (options.recursive && stats.isSymbolicLink()) { + var srcPath = fs.readlinkSync(src) + fs.symlinkSync(srcPath, dest) + } +} + +module.exports = copySync diff --git a/node_modules/fs-extra/lib/copy-sync/index.js b/node_modules/fs-extra/lib/copy-sync/index.js new file mode 100644 index 0000000..ebc7e0b --- /dev/null +++ b/node_modules/fs-extra/lib/copy-sync/index.js @@ -0,0 +1,3 @@ +module.exports = { + copySync: require('./copy-sync') +} diff --git a/node_modules/fs-extra/lib/copy/copy.js b/node_modules/fs-extra/lib/copy/copy.js new file mode 100644 index 0000000..d9d2912 --- /dev/null +++ b/node_modules/fs-extra/lib/copy/copy.js @@ -0,0 +1,44 @@ +var fs = require('graceful-fs') +var path = require('path') +var ncp = require('./ncp') +var mkdir = require('../mkdirs') + +function copy (src, dest, options, callback) { + if (typeof options === 'function' && !callback) { + callback = options + options = {} + } else if (typeof options === 'function' || options instanceof RegExp) { + options = {filter: options} + } + callback = callback || function () {} + options = options || {} + + // don't allow src and dest to be the same + var basePath = process.cwd() + var currentPath = path.resolve(basePath, src) + var targetPath = path.resolve(basePath, dest) + if (currentPath === targetPath) return callback(new Error('Source and destination must not be the same.')) + + fs.lstat(src, function (err, stats) { + if (err) return callback(err) + + var dir = null + if (stats.isDirectory()) { + var parts = dest.split(path.sep) + parts.pop() + dir = parts.join(path.sep) + } else { + dir = path.dirname(dest) + } + + fs.exists(dir, function (dirExists) { + if (dirExists) return ncp(src, dest, options, callback) + mkdir.mkdirs(dir, function (err) { + if (err) return callback(err) + ncp(src, dest, options, callback) + }) + }) + }) +} + +module.exports = copy diff --git a/node_modules/fs-extra/lib/copy/index.js b/node_modules/fs-extra/lib/copy/index.js new file mode 100644 index 0000000..3e09016 --- /dev/null +++ b/node_modules/fs-extra/lib/copy/index.js @@ -0,0 +1,3 @@ +module.exports = { + copy: require('./copy') +} diff --git a/node_modules/fs-extra/lib/copy/ncp.js b/node_modules/fs-extra/lib/copy/ncp.js new file mode 100644 index 0000000..d30cae5 --- /dev/null +++ b/node_modules/fs-extra/lib/copy/ncp.js @@ -0,0 +1,243 @@ +// imported from ncp (this is temporary, will rewrite) + +var fs = require('graceful-fs') +var path = require('path') +var utimes = require('../util/utimes') + +function ncp (source, dest, options, callback) { + if (!callback) { + callback = options + options = {} + } + + var basePath = process.cwd() + var currentPath = path.resolve(basePath, source) + var targetPath = path.resolve(basePath, dest) + + var filter = options.filter + var transform = options.transform + var clobber = options.clobber !== false + var dereference = options.dereference + var preserveTimestamps = options.preserveTimestamps === true + + var errs = null + + var started = 0 + var finished = 0 + var running = 0 + // this is pretty useless now that we're using graceful-fs + // consider removing + var limit = options.limit || 512 + + startCopy(currentPath) + + function startCopy (source) { + started++ + if (filter) { + if (filter instanceof RegExp) { + if (!filter.test(source)) { + return doneOne(true) + } + } else if (typeof filter === 'function') { + if (!filter(source)) { + return doneOne(true) + } + } + } + return getStats(source) + } + + function getStats (source) { + var stat = dereference ? fs.stat : fs.lstat + if (running >= limit) { + return setImmediate(function () { + getStats(source) + }) + } + running++ + stat(source, function (err, stats) { + if (err) return onError(err) + + // We need to get the mode from the stats object and preserve it. + var item = { + name: source, + mode: stats.mode, + mtime: stats.mtime, // modified time + atime: stats.atime, // access time + stats: stats // temporary + } + + if (stats.isDirectory()) { + return onDir(item) + } else if (stats.isFile() || stats.isCharacterDevice() || stats.isBlockDevice()) { + return onFile(item) + } else if (stats.isSymbolicLink()) { + // Symlinks don't really need to know about the mode. + return onLink(source) + } + }) + } + + function onFile (file) { + var target = file.name.replace(currentPath, targetPath) + isWritable(target, function (writable) { + if (writable) { + copyFile(file, target) + } else { + if (clobber) { + rmFile(target, function () { + copyFile(file, target) + }) + } else { + doneOne() + } + } + }) + } + + function copyFile (file, target) { + var readStream = fs.createReadStream(file.name) + var writeStream = fs.createWriteStream(target, { mode: file.mode }) + + readStream.on('error', onError) + writeStream.on('error', onError) + + if (transform) { + transform(readStream, writeStream, file) + } else { + writeStream.on('open', function () { + readStream.pipe(writeStream) + }) + } + + writeStream.once('finish', function () { + fs.chmod(target, file.mode, function (err) { + if (err) return onError(err) + if (preserveTimestamps) { + utimes.utimesMillis(target, file.atime, file.mtime, function (err) { + if (err) return onError(err) + return doneOne() + }) + } else { + doneOne() + } + }) + }) + } + + function rmFile (file, done) { + fs.unlink(file, function (err) { + if (err) return onError(err) + return done() + }) + } + + function onDir (dir) { + var target = dir.name.replace(currentPath, targetPath) + isWritable(target, function (writable) { + if (writable) { + return mkDir(dir, target) + } + copyDir(dir.name) + }) + } + + function mkDir (dir, target) { + fs.mkdir(target, dir.mode, function (err) { + if (err) return onError(err) + // despite setting mode in fs.mkdir, doesn't seem to work + // so we set it here. + fs.chmod(target, dir.mode, function (err) { + if (err) return onError(err) + copyDir(dir.name) + }) + }) + } + + function copyDir (dir) { + fs.readdir(dir, function (err, items) { + if (err) return onError(err) + items.forEach(function (item) { + startCopy(path.join(dir, item)) + }) + return doneOne() + }) + } + + function onLink (link) { + var target = link.replace(currentPath, targetPath) + fs.readlink(link, function (err, resolvedPath) { + if (err) return onError(err) + checkLink(resolvedPath, target) + }) + } + + function checkLink (resolvedPath, target) { + if (dereference) { + resolvedPath = path.resolve(basePath, resolvedPath) + } + isWritable(target, function (writable) { + if (writable) { + return makeLink(resolvedPath, target) + } + fs.readlink(target, function (err, targetDest) { + if (err) return onError(err) + + if (dereference) { + targetDest = path.resolve(basePath, targetDest) + } + if (targetDest === resolvedPath) { + return doneOne() + } + return rmFile(target, function () { + makeLink(resolvedPath, target) + }) + }) + }) + } + + function makeLink (linkPath, target) { + fs.symlink(linkPath, target, function (err) { + if (err) return onError(err) + return doneOne() + }) + } + + function isWritable (path, done) { + fs.lstat(path, function (err) { + if (err) { + if (err.code === 'ENOENT') return done(true) + return done(false) + } + return done(false) + }) + } + + function onError (err) { + if (options.stopOnError) { + return callback(err) + } else if (!errs && options.errs) { + errs = fs.createWriteStream(options.errs) + } else if (!errs) { + errs = [] + } + if (typeof errs.write === 'undefined') { + errs.push(err) + } else { + errs.write(err.stack + '\n\n') + } + return doneOne() + } + + function doneOne (skipped) { + if (!skipped) running-- + finished++ + if ((started === finished) && (running === 0)) { + if (callback !== undefined) { + return errs ? callback(errs) : callback(null) + } + } + } +} + +module.exports = ncp diff --git a/node_modules/fs-extra/lib/empty/index.js b/node_modules/fs-extra/lib/empty/index.js new file mode 100644 index 0000000..a17cbae --- /dev/null +++ b/node_modules/fs-extra/lib/empty/index.js @@ -0,0 +1,47 @@ +var fs = require('fs') +var path = require('path') +var mkdir = require('../mkdirs') +var remove = require('../remove') + +function emptyDir (dir, callback) { + callback = callback || function () {} + fs.readdir(dir, function (err, items) { + if (err) return mkdir.mkdirs(dir, callback) + + items = items.map(function (item) { + return path.join(dir, item) + }) + + deleteItem() + + function deleteItem () { + var item = items.pop() + if (!item) return callback() + remove.remove(item, function (err) { + if (err) return callback(err) + deleteItem() + }) + } + }) +} + +function emptyDirSync (dir) { + var items + try { + items = fs.readdirSync(dir) + } catch (err) { + return mkdir.mkdirsSync(dir) + } + + items.forEach(function (item) { + item = path.join(dir, item) + remove.removeSync(item) + }) +} + +module.exports = { + emptyDirSync: emptyDirSync, + emptydirSync: emptyDirSync, + emptyDir: emptyDir, + emptydir: emptyDir +} diff --git a/node_modules/fs-extra/lib/ensure/file.js b/node_modules/fs-extra/lib/ensure/file.js new file mode 100644 index 0000000..1c9c2de --- /dev/null +++ b/node_modules/fs-extra/lib/ensure/file.js @@ -0,0 +1,43 @@ +var path = require('path') +var fs = require('graceful-fs') +var mkdir = require('../mkdirs') + +function createFile (file, callback) { + function makeFile () { + fs.writeFile(file, '', function (err) { + if (err) return callback(err) + callback() + }) + } + + fs.exists(file, function (fileExists) { + if (fileExists) return callback() + var dir = path.dirname(file) + fs.exists(dir, function (dirExists) { + if (dirExists) return makeFile() + mkdir.mkdirs(dir, function (err) { + if (err) return callback(err) + makeFile() + }) + }) + }) +} + +function createFileSync (file) { + if (fs.existsSync(file)) return + + var dir = path.dirname(file) + if (!fs.existsSync(dir)) { + mkdir.mkdirsSync(dir) + } + + fs.writeFileSync(file, '') +} + +module.exports = { + createFile: createFile, + createFileSync: createFileSync, + // alias + ensureFile: createFile, + ensureFileSync: createFileSync +} diff --git a/node_modules/fs-extra/lib/ensure/index.js b/node_modules/fs-extra/lib/ensure/index.js new file mode 100644 index 0000000..26e8705 --- /dev/null +++ b/node_modules/fs-extra/lib/ensure/index.js @@ -0,0 +1,21 @@ +var file = require('./file') +var link = require('./link') +var symlink = require('./symlink') + +module.exports = { + // file + createFile: file.createFile, + createFileSync: file.createFileSync, + ensureFile: file.createFile, + ensureFileSync: file.createFileSync, + // link + createLink: link.createLink, + createLinkSync: link.createLinkSync, + ensureLink: link.createLink, + ensureLinkSync: link.createLinkSync, + // symlink + createSymlink: symlink.createSymlink, + createSymlinkSync: symlink.createSymlinkSync, + ensureSymlink: symlink.createSymlink, + ensureSymlinkSync: symlink.createSymlinkSync +} diff --git a/node_modules/fs-extra/lib/ensure/link.js b/node_modules/fs-extra/lib/ensure/link.js new file mode 100644 index 0000000..4e4e283 --- /dev/null +++ b/node_modules/fs-extra/lib/ensure/link.js @@ -0,0 +1,58 @@ +var path = require('path') +var fs = require('graceful-fs') +var mkdir = require('../mkdirs') + +function createLink (srcpath, dstpath, callback) { + function makeLink (srcpath, dstpath) { + fs.link(srcpath, dstpath, function (err) { + if (err) return callback(err) + callback(null) + }) + } + + fs.exists(dstpath, function (destinationExists) { + if (destinationExists) return callback(null) + fs.lstat(srcpath, function (err, stat) { + if (err) { + err.message = err.message.replace('lstat', 'ensureLink') + return callback(err) + } + + var dir = path.dirname(dstpath) + fs.exists(dir, function (dirExists) { + if (dirExists) return makeLink(srcpath, dstpath) + mkdir.mkdirs(dir, function (err) { + if (err) return callback(err) + makeLink(srcpath, dstpath) + }) + }) + }) + }) +} + +function createLinkSync (srcpath, dstpath, callback) { + var destinationExists = fs.existsSync(dstpath) + if (destinationExists) return undefined + + try { + fs.lstatSync(srcpath) + } catch (err) { + err.message = err.message.replace('lstat', 'ensureLink') + throw err + } + + var dir = path.dirname(dstpath) + var dirExists = fs.existsSync(dir) + if (dirExists) return fs.linkSync(srcpath, dstpath) + mkdir.mkdirsSync(dir) + + return fs.linkSync(srcpath, dstpath) +} + +module.exports = { + createLink: createLink, + createLinkSync: createLinkSync, + // alias + ensureLink: createLink, + ensureLinkSync: createLinkSync +} diff --git a/node_modules/fs-extra/lib/ensure/symlink-paths.js b/node_modules/fs-extra/lib/ensure/symlink-paths.js new file mode 100644 index 0000000..cc27d04 --- /dev/null +++ b/node_modules/fs-extra/lib/ensure/symlink-paths.js @@ -0,0 +1,97 @@ +var path = require('path') +// path.isAbsolute shim for Node.js 0.10 support +path.isAbsolute = (path.isAbsolute) ? path.isAbsolute : require('path-is-absolute') +var fs = require('graceful-fs') + +/** + * Function that returns two types of paths, one relative to symlink, and one + * relative to the current working directory. Checks if path is absolute or + * relative. If the path is relative, this function checks if the path is + * relative to symlink or relative to current working directory. This is an + * initiative to find a smarter `srcpath` to supply when building symlinks. + * This allows you to determine which path to use out of one of three possible + * types of source paths. The first is an absolute path. This is detected by + * `path.isAbsolute()`. When an absolute path is provided, it is checked to + * see if it exists. If it does it's used, if not an error is returned + * (callback)/ thrown (sync). The other two options for `srcpath` are a + * relative url. By default Node's `fs.symlink` works by creating a symlink + * using `dstpath` and expects the `srcpath` to be relative to the newly + * created symlink. If you provide a `srcpath` that does not exist on the file + * system it results in a broken symlink. To minimize this, the function + * checks to see if the 'relative to symlink' source file exists, and if it + * does it will use it. If it does not, it checks if there's a file that + * exists that is relative to the current working directory, if does its used. + * This preserves the expectations of the original fs.symlink spec and adds + * the ability to pass in `relative to current working direcotry` paths. + */ + +function symlinkPaths (srcpath, dstpath, callback) { + if (path.isAbsolute(srcpath)) { + return fs.lstat(srcpath, function (err, stat) { + if (err) { + err.message = err.message.replace('lstat', 'ensureSymlink') + return callback(err) + } + return callback(null, { + 'toCwd': srcpath, + 'toDst': srcpath + }) + }) + } else { + var dstdir = path.dirname(dstpath) + var relativeToDst = path.join(dstdir, srcpath) + return fs.exists(relativeToDst, function (exists) { + if (exists) { + return callback(null, { + 'toCwd': relativeToDst, + 'toDst': srcpath + }) + } else { + return fs.lstat(srcpath, function (err, stat) { + if (err) { + err.message = err.message.replace('lstat', 'ensureSymlink') + return callback(err) + } + return callback(null, { + 'toCwd': srcpath, + 'toDst': path.relative(dstdir, srcpath) + }) + }) + } + }) + } +} + +function symlinkPathsSync (srcpath, dstpath) { + var exists + if (path.isAbsolute(srcpath)) { + exists = fs.existsSync(srcpath) + if (!exists) throw new Error('absolute srcpath does not exist') + return { + 'toCwd': srcpath, + 'toDst': srcpath + } + } else { + var dstdir = path.dirname(dstpath) + var relativeToDst = path.join(dstdir, srcpath) + exists = fs.existsSync(relativeToDst) + if (exists) { + return { + 'toCwd': relativeToDst, + 'toDst': srcpath + } + } else { + exists = fs.existsSync(srcpath) + if (!exists) throw new Error('relative srcpath does not exist') + return { + 'toCwd': srcpath, + 'toDst': path.relative(dstdir, srcpath) + } + } + } +} + +module.exports = { + 'symlinkPaths': symlinkPaths, + 'symlinkPathsSync': symlinkPathsSync +} diff --git a/node_modules/fs-extra/lib/ensure/symlink-type.js b/node_modules/fs-extra/lib/ensure/symlink-type.js new file mode 100644 index 0000000..81e3588 --- /dev/null +++ b/node_modules/fs-extra/lib/ensure/symlink-type.js @@ -0,0 +1,27 @@ +var fs = require('graceful-fs') + +function symlinkType (srcpath, type, callback) { + callback = (typeof type === 'function') ? type : callback + type = (typeof type === 'function') ? false : type + if (type) return callback(null, type) + fs.lstat(srcpath, function (err, stats) { + if (err) return callback(null, 'file') + type = (stats && stats.isDirectory()) ? 'dir' : 'file' + callback(null, type) + }) +} + +function symlinkTypeSync (srcpath, type) { + if (type) return type + try { + var stats = fs.lstatSync(srcpath) + } catch (e) { + return 'file' + } + return (stats && stats.isDirectory()) ? 'dir' : 'file' +} + +module.exports = { + symlinkType: symlinkType, + symlinkTypeSync: symlinkTypeSync +} diff --git a/node_modules/fs-extra/lib/ensure/symlink.js b/node_modules/fs-extra/lib/ensure/symlink.js new file mode 100644 index 0000000..6244790 --- /dev/null +++ b/node_modules/fs-extra/lib/ensure/symlink.js @@ -0,0 +1,62 @@ +var path = require('path') +var fs = require('graceful-fs') +var _mkdirs = require('../mkdirs') +var mkdirs = _mkdirs.mkdirs +var mkdirsSync = _mkdirs.mkdirsSync + +var _symlinkPaths = require('./symlink-paths') +var symlinkPaths = _symlinkPaths.symlinkPaths +var symlinkPathsSync = _symlinkPaths.symlinkPathsSync + +var _symlinkType = require('./symlink-type') +var symlinkType = _symlinkType.symlinkType +var symlinkTypeSync = _symlinkType.symlinkTypeSync + +function createSymlink (srcpath, dstpath, type, callback) { + callback = (typeof type === 'function') ? type : callback + type = (typeof type === 'function') ? false : type + + fs.exists(dstpath, function (destinationExists) { + if (destinationExists) return callback(null) + symlinkPaths(srcpath, dstpath, function (err, relative) { + if (err) return callback(err) + srcpath = relative.toDst + symlinkType(relative.toCwd, type, function (err, type) { + if (err) return callback(err) + var dir = path.dirname(dstpath) + fs.exists(dir, function (dirExists) { + if (dirExists) return fs.symlink(srcpath, dstpath, type, callback) + mkdirs(dir, function (err) { + if (err) return callback(err) + fs.symlink(srcpath, dstpath, type, callback) + }) + }) + }) + }) + }) +} + +function createSymlinkSync (srcpath, dstpath, type, callback) { + callback = (typeof type === 'function') ? type : callback + type = (typeof type === 'function') ? false : type + + var destinationExists = fs.existsSync(dstpath) + if (destinationExists) return undefined + + var relative = symlinkPathsSync(srcpath, dstpath) + srcpath = relative.toDst + type = symlinkTypeSync(relative.toCwd, type) + var dir = path.dirname(dstpath) + var exists = fs.existsSync(dir) + if (exists) return fs.symlinkSync(srcpath, dstpath, type) + mkdirsSync(dir) + return fs.symlinkSync(srcpath, dstpath, type) +} + +module.exports = { + createSymlink: createSymlink, + createSymlinkSync: createSymlinkSync, + // alias + ensureSymlink: createSymlink, + ensureSymlinkSync: createSymlinkSync +} diff --git a/node_modules/fs-extra/lib/index.js b/node_modules/fs-extra/lib/index.js new file mode 100644 index 0000000..a56bb0c --- /dev/null +++ b/node_modules/fs-extra/lib/index.js @@ -0,0 +1,37 @@ +var assign = require('./util/assign') + +var fse = {} +var gfs = require('graceful-fs') + +// attach fs methods to fse +Object.keys(gfs).forEach(function (key) { + fse[key] = gfs[key] +}) + +var fs = fse + +assign(fs, require('./copy')) +assign(fs, require('./copy-sync')) +assign(fs, require('./mkdirs')) +assign(fs, require('./remove')) +assign(fs, require('./json')) +assign(fs, require('./move')) +assign(fs, require('./empty')) +assign(fs, require('./ensure')) +assign(fs, require('./output')) +assign(fs, require('./walk')) + +module.exports = fs + +// maintain backwards compatibility for awhile +var jsonfile = {} +Object.defineProperty(jsonfile, 'spaces', { + get: function () { + return fs.spaces // found in ./json + }, + set: function (val) { + fs.spaces = val + } +}) + +module.exports.jsonfile = jsonfile // so users of fs-extra can modify jsonFile.spaces diff --git a/node_modules/fs-extra/lib/json/index.js b/node_modules/fs-extra/lib/json/index.js new file mode 100644 index 0000000..b13cf54 --- /dev/null +++ b/node_modules/fs-extra/lib/json/index.js @@ -0,0 +1,9 @@ +var jsonFile = require('./jsonfile') + +jsonFile.outputJsonSync = require('./output-json-sync') +jsonFile.outputJson = require('./output-json') +// aliases +jsonFile.outputJSONSync = require('./output-json-sync') +jsonFile.outputJSON = require('./output-json') + +module.exports = jsonFile diff --git a/node_modules/fs-extra/lib/json/jsonfile.js b/node_modules/fs-extra/lib/json/jsonfile.js new file mode 100644 index 0000000..51d8390 --- /dev/null +++ b/node_modules/fs-extra/lib/json/jsonfile.js @@ -0,0 +1,14 @@ +var jsonFile = require('jsonfile') + +module.exports = { + // jsonfile exports + readJson: jsonFile.readFile, + readJSON: jsonFile.readFile, + readJsonSync: jsonFile.readFileSync, + readJSONSync: jsonFile.readFileSync, + writeJson: jsonFile.writeFile, + writeJSON: jsonFile.writeFile, + writeJsonSync: jsonFile.writeFileSync, + writeJSONSync: jsonFile.writeFileSync, + spaces: 2 // default in fs-extra +} diff --git a/node_modules/fs-extra/lib/json/output-json-sync.js b/node_modules/fs-extra/lib/json/output-json-sync.js new file mode 100644 index 0000000..7684843 --- /dev/null +++ b/node_modules/fs-extra/lib/json/output-json-sync.js @@ -0,0 +1,16 @@ +var fs = require('graceful-fs') +var path = require('path') +var jsonFile = require('./jsonfile') +var mkdir = require('../mkdirs') + +function outputJsonSync (file, data, options) { + var dir = path.dirname(file) + + if (!fs.existsSync(dir)) { + mkdir.mkdirsSync(dir) + } + + jsonFile.writeJsonSync(file, data, options) +} + +module.exports = outputJsonSync diff --git a/node_modules/fs-extra/lib/json/output-json.js b/node_modules/fs-extra/lib/json/output-json.js new file mode 100644 index 0000000..7824597 --- /dev/null +++ b/node_modules/fs-extra/lib/json/output-json.js @@ -0,0 +1,24 @@ +var fs = require('graceful-fs') +var path = require('path') +var jsonFile = require('./jsonfile') +var mkdir = require('../mkdirs') + +function outputJson (file, data, options, callback) { + if (typeof options === 'function') { + callback = options + options = {} + } + + var dir = path.dirname(file) + + fs.exists(dir, function (itDoes) { + if (itDoes) return jsonFile.writeJson(file, data, options, callback) + + mkdir.mkdirs(dir, function (err) { + if (err) return callback(err) + jsonFile.writeJson(file, data, options, callback) + }) + }) +} + +module.exports = outputJson diff --git a/node_modules/fs-extra/lib/mkdirs/index.js b/node_modules/fs-extra/lib/mkdirs/index.js new file mode 100644 index 0000000..2611217 --- /dev/null +++ b/node_modules/fs-extra/lib/mkdirs/index.js @@ -0,0 +1,9 @@ +module.exports = { + mkdirs: require('./mkdirs'), + mkdirsSync: require('./mkdirs-sync'), + // alias + mkdirp: require('./mkdirs'), + mkdirpSync: require('./mkdirs-sync'), + ensureDir: require('./mkdirs'), + ensureDirSync: require('./mkdirs-sync') +} diff --git a/node_modules/fs-extra/lib/mkdirs/mkdirs-sync.js b/node_modules/fs-extra/lib/mkdirs/mkdirs-sync.js new file mode 100644 index 0000000..3f30680 --- /dev/null +++ b/node_modules/fs-extra/lib/mkdirs/mkdirs-sync.js @@ -0,0 +1,57 @@ +var fs = require('graceful-fs') +var path = require('path') +var invalidWin32Path = require('./win32').invalidWin32Path + +var o777 = parseInt('0777', 8) + +function mkdirsSync (p, opts, made) { + if (!opts || typeof opts !== 'object') { + opts = { mode: opts } + } + + var mode = opts.mode + var xfs = opts.fs || fs + + if (process.platform === 'win32' && invalidWin32Path(p)) { + var errInval = new Error(p + ' contains invalid WIN32 path characters.') + errInval.code = 'EINVAL' + throw errInval + } + + if (mode === undefined) { + mode = o777 & (~process.umask()) + } + if (!made) made = null + + p = path.resolve(p) + + try { + xfs.mkdirSync(p, mode) + made = made || p + } catch (err0) { + switch (err0.code) { + case 'ENOENT': + if (path.dirname(p) === p) throw err0 + made = mkdirsSync(path.dirname(p), opts, made) + mkdirsSync(p, opts, made) + break + + // In the case of any other error, just see if there's a dir + // there already. If so, then hooray! If not, then something + // is borked. + default: + var stat + try { + stat = xfs.statSync(p) + } catch (err1) { + throw err0 + } + if (!stat.isDirectory()) throw err0 + break + } + } + + return made +} + +module.exports = mkdirsSync diff --git a/node_modules/fs-extra/lib/mkdirs/mkdirs.js b/node_modules/fs-extra/lib/mkdirs/mkdirs.js new file mode 100644 index 0000000..939776c --- /dev/null +++ b/node_modules/fs-extra/lib/mkdirs/mkdirs.js @@ -0,0 +1,61 @@ +var fs = require('graceful-fs') +var path = require('path') +var invalidWin32Path = require('./win32').invalidWin32Path + +var o777 = parseInt('0777', 8) + +function mkdirs (p, opts, callback, made) { + if (typeof opts === 'function') { + callback = opts + opts = {} + } else if (!opts || typeof opts !== 'object') { + opts = { mode: opts } + } + + if (process.platform === 'win32' && invalidWin32Path(p)) { + var errInval = new Error(p + ' contains invalid WIN32 path characters.') + errInval.code = 'EINVAL' + return callback(errInval) + } + + var mode = opts.mode + var xfs = opts.fs || fs + + if (mode === undefined) { + mode = o777 & (~process.umask()) + } + if (!made) made = null + + callback = callback || function () {} + p = path.resolve(p) + + xfs.mkdir(p, mode, function (er) { + if (!er) { + made = made || p + return callback(null, made) + } + switch (er.code) { + case 'ENOENT': + if (path.dirname(p) === p) return callback(er) + mkdirs(path.dirname(p), opts, function (er, made) { + if (er) callback(er, made) + else mkdirs(p, opts, callback, made) + }) + break + + // In the case of any other error, just see if there's a dir + // there already. If so, then hooray! If not, then something + // is borked. + default: + xfs.stat(p, function (er2, stat) { + // if the stat fails, then that's super weird. + // let the original error be the failure reason. + if (er2 || !stat.isDirectory()) callback(er, made) + else callback(null, made) + }) + break + } + }) +} + +module.exports = mkdirs diff --git a/node_modules/fs-extra/lib/mkdirs/win32.js b/node_modules/fs-extra/lib/mkdirs/win32.js new file mode 100644 index 0000000..569ac1a --- /dev/null +++ b/node_modules/fs-extra/lib/mkdirs/win32.js @@ -0,0 +1,24 @@ +'use strict' +var path = require('path') + +// get drive on windows +function getRootPath (p) { + p = path.normalize(path.resolve(p)).split(path.sep) + if (p.length > 0) return p[0] + else return null +} + +// http://stackoverflow.com/a/62888/10333 contains more accurate +// TODO: expand to include the rest +var INVALID_PATH_CHARS = /[<>:"|?*]/ + +function invalidWin32Path (p) { + var rp = getRootPath(p) + p = p.replace(rp, '') + return INVALID_PATH_CHARS.test(p) +} + +module.exports = { + getRootPath: getRootPath, + invalidWin32Path: invalidWin32Path +} diff --git a/node_modules/fs-extra/lib/move/index.js b/node_modules/fs-extra/lib/move/index.js new file mode 100644 index 0000000..f28152f --- /dev/null +++ b/node_modules/fs-extra/lib/move/index.js @@ -0,0 +1,161 @@ +// most of this code was written by Andrew Kelley +// licensed under the BSD license: see +// https://github.com/andrewrk/node-mv/blob/master/package.json + +// this needs a cleanup + +var fs = require('graceful-fs') +var ncp = require('../copy/ncp') +var path = require('path') +var rimraf = require('rimraf') +var mkdirp = require('../mkdirs').mkdirs + +function mv (source, dest, options, callback) { + if (typeof options === 'function') { + callback = options + options = {} + } + + var shouldMkdirp = ('mkdirp' in options) ? options.mkdirp : true + var clobber = ('clobber' in options) ? options.clobber : false + + var limit = options.limit || 16 + + if (shouldMkdirp) { + mkdirs() + } else { + doRename() + } + + function mkdirs () { + mkdirp(path.dirname(dest), function (err) { + if (err) return callback(err) + doRename() + }) + } + + function doRename () { + if (clobber) { + fs.rename(source, dest, function (err) { + if (!err) return callback() + + if (err.code === 'ENOTEMPTY' || err.code === 'EEXIST') { + rimraf(dest, function (err) { + if (err) return callback(err) + options.clobber = false // just clobbered it, no need to do it again + mv(source, dest, options, callback) + }) + return + } + + // weird Windows shit + if (err.code === 'EPERM') { + setTimeout(function () { + rimraf(dest, function (err) { + if (err) return callback(err) + options.clobber = false + mv(source, dest, options, callback) + }) + }, 200) + return + } + + if (err.code !== 'EXDEV') return callback(err) + moveAcrossDevice(source, dest, clobber, limit, callback) + }) + } else { + fs.link(source, dest, function (err) { + if (err) { + if (err.code === 'EXDEV' || err.code === 'EISDIR' || err.code === 'EPERM') { + moveAcrossDevice(source, dest, clobber, limit, callback) + return + } + callback(err) + return + } + fs.unlink(source, callback) + }) + } + } +} + +function moveAcrossDevice (source, dest, clobber, limit, callback) { + fs.stat(source, function (err, stat) { + if (err) { + callback(err) + return + } + + if (stat.isDirectory()) { + moveDirAcrossDevice(source, dest, clobber, limit, callback) + } else { + moveFileAcrossDevice(source, dest, clobber, limit, callback) + } + }) +} + +function moveFileAcrossDevice (source, dest, clobber, limit, callback) { + var outFlags = clobber ? 'w' : 'wx' + var ins = fs.createReadStream(source) + var outs = fs.createWriteStream(dest, {flags: outFlags}) + + ins.on('error', function (err) { + ins.destroy() + outs.destroy() + outs.removeListener('close', onClose) + + // may want to create a directory but `out` line above + // creates an empty file for us: See #108 + // don't care about error here + fs.unlink(dest, function () { + // note: `err` here is from the input stream errror + if (err.code === 'EISDIR' || err.code === 'EPERM') { + moveDirAcrossDevice(source, dest, clobber, limit, callback) + } else { + callback(err) + } + }) + }) + + outs.on('error', function (err) { + ins.destroy() + outs.destroy() + outs.removeListener('close', onClose) + callback(err) + }) + + outs.once('close', onClose) + ins.pipe(outs) + + function onClose () { + fs.unlink(source, callback) + } +} + +function moveDirAcrossDevice (source, dest, clobber, limit, callback) { + var options = { + stopOnErr: true, + clobber: false, + limit: limit + } + + function startNcp () { + ncp(source, dest, options, function (errList) { + if (errList) return callback(errList[0]) + rimraf(source, callback) + }) + } + + if (clobber) { + rimraf(dest, function (err) { + if (err) return callback(err) + startNcp() + }) + } else { + startNcp() + } +} + +module.exports = { + move: mv +} diff --git a/node_modules/fs-extra/lib/output/index.js b/node_modules/fs-extra/lib/output/index.js new file mode 100644 index 0000000..e8f45f3 --- /dev/null +++ b/node_modules/fs-extra/lib/output/index.js @@ -0,0 +1,35 @@ +var path = require('path') +var fs = require('graceful-fs') +var mkdir = require('../mkdirs') + +function outputFile (file, data, encoding, callback) { + if (typeof encoding === 'function') { + callback = encoding + encoding = 'utf8' + } + + var dir = path.dirname(file) + fs.exists(dir, function (itDoes) { + if (itDoes) return fs.writeFile(file, data, encoding, callback) + + mkdir.mkdirs(dir, function (err) { + if (err) return callback(err) + + fs.writeFile(file, data, encoding, callback) + }) + }) +} + +function outputFileSync (file, data, encoding) { + var dir = path.dirname(file) + if (fs.existsSync(dir)) { + return fs.writeFileSync.apply(fs, arguments) + } + mkdir.mkdirsSync(dir) + fs.writeFileSync.apply(fs, arguments) +} + +module.exports = { + outputFile: outputFile, + outputFileSync: outputFileSync +} diff --git a/node_modules/fs-extra/lib/remove/index.js b/node_modules/fs-extra/lib/remove/index.js new file mode 100644 index 0000000..925de67 --- /dev/null +++ b/node_modules/fs-extra/lib/remove/index.js @@ -0,0 +1,14 @@ +var rimraf = require('rimraf') + +function removeSync (dir) { + return rimraf.sync(dir) +} + +function remove (dir, callback) { + return callback ? rimraf(dir, callback) : rimraf(dir, function () {}) +} + +module.exports = { + remove: remove, + removeSync: removeSync +} diff --git a/node_modules/fs-extra/lib/util/assign.js b/node_modules/fs-extra/lib/util/assign.js new file mode 100644 index 0000000..8e41f9a --- /dev/null +++ b/node_modules/fs-extra/lib/util/assign.js @@ -0,0 +1,14 @@ +// simple mutable assign +function assign () { + var args = [].slice.call(arguments).filter(function (i) { return i }) + var dest = args.shift() + args.forEach(function (src) { + Object.keys(src).forEach(function (key) { + dest[key] = src[key] + }) + }) + + return dest +} + +module.exports = assign diff --git a/node_modules/fs-extra/lib/util/utimes.js b/node_modules/fs-extra/lib/util/utimes.js new file mode 100644 index 0000000..c99b010 --- /dev/null +++ b/node_modules/fs-extra/lib/util/utimes.js @@ -0,0 +1,69 @@ +var fs = require('graceful-fs') +var path = require('path') +var os = require('os') + +// HFS, ext{2,3}, FAT do not, Node.js v0.10 does not +function hasMillisResSync () { + var tmpfile = path.join('millis-test-sync' + Date.now().toString() + Math.random().toString().slice(2)) + tmpfile = path.join(os.tmpdir(), tmpfile) + + // 550 millis past UNIX epoch + var d = new Date(1435410243862) + fs.writeFileSync(tmpfile, 'https://github.com/jprichardson/node-fs-extra/pull/141') + var fd = fs.openSync(tmpfile, 'r+') + fs.futimesSync(fd, d, d) + fs.closeSync(fd) + return fs.statSync(tmpfile).mtime > 1435410243000 +} + +function hasMillisRes (callback) { + var tmpfile = path.join('millis-test' + Date.now().toString() + Math.random().toString().slice(2)) + tmpfile = path.join(os.tmpdir(), tmpfile) + + // 550 millis past UNIX epoch + var d = new Date(1435410243862) + fs.writeFile(tmpfile, 'https://github.com/jprichardson/node-fs-extra/pull/141', function (err) { + if (err) return callback(err) + fs.open(tmpfile, 'r+', function (err, fd) { + if (err) return callback(err) + fs.futimes(fd, d, d, function (err) { + if (err) return callback(err) + fs.close(fd, function (err) { + if (err) return callback(err) + fs.stat(tmpfile, function (err, stats) { + if (err) return callback(err) + callback(null, stats.mtime > 1435410243000) + }) + }) + }) + }) + }) +} + +function timeRemoveMillis (timestamp) { + if (typeof timestamp === 'number') { + return Math.floor(timestamp / 1000) * 1000 + } else if (timestamp instanceof Date) { + return new Date(Math.floor(timestamp.getTime() / 1000) * 1000) + } else { + throw new Error('fs-extra: timeRemoveMillis() unknown parameter type') + } +} + +function utimesMillis (path, atime, mtime, callback) { + // if (!HAS_MILLIS_RES) return fs.utimes(path, atime, mtime, callback) + fs.open(path, 'r+', function (err, fd) { + if (err) return callback(err) + fs.futimes(fd, atime, mtime, function (err) { + if (err) return callback(err) + fs.close(fd, callback) + }) + }) +} + +module.exports = { + hasMillisRes: hasMillisRes, + hasMillisResSync: hasMillisResSync, + timeRemoveMillis: timeRemoveMillis, + utimesMillis: utimesMillis +} diff --git a/node_modules/fs-extra/lib/walk/index.js b/node_modules/fs-extra/lib/walk/index.js new file mode 100644 index 0000000..8626d47 --- /dev/null +++ b/node_modules/fs-extra/lib/walk/index.js @@ -0,0 +1,5 @@ +var klaw = require('klaw') + +module.exports = { + walk: klaw +} diff --git a/node_modules/fs-extra/node_modules/graceful-fs/LICENSE b/node_modules/fs-extra/node_modules/graceful-fs/LICENSE new file mode 100644 index 0000000..9d2c803 --- /dev/null +++ b/node_modules/fs-extra/node_modules/graceful-fs/LICENSE @@ -0,0 +1,15 @@ +The ISC License + +Copyright (c) Isaac Z. Schlueter, Ben Noordhuis, and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/node_modules/fs-extra/node_modules/graceful-fs/README.md b/node_modules/fs-extra/node_modules/graceful-fs/README.md new file mode 100644 index 0000000..5273a50 --- /dev/null +++ b/node_modules/fs-extra/node_modules/graceful-fs/README.md @@ -0,0 +1,133 @@ +# graceful-fs + +graceful-fs functions as a drop-in replacement for the fs module, +making various improvements. + +The improvements are meant to normalize behavior across different +platforms and environments, and to make filesystem access more +resilient to errors. + +## Improvements over [fs module](https://nodejs.org/api/fs.html) + +* Queues up `open` and `readdir` calls, and retries them once + something closes if there is an EMFILE error from too many file + descriptors. +* fixes `lchmod` for Node versions prior to 0.6.2. +* implements `fs.lutimes` if possible. Otherwise it becomes a noop. +* ignores `EINVAL` and `EPERM` errors in `chown`, `fchown` or + `lchown` if the user isn't root. +* makes `lchmod` and `lchown` become noops, if not available. +* retries reading a file if `read` results in EAGAIN error. + +On Windows, it retries renaming a file for up to one second if `EACCESS` +or `EPERM` error occurs, likely because antivirus software has locked +the directory. + +## USAGE + +```javascript +// use just like fs +var fs = require('graceful-fs') + +// now go and do stuff with it... +fs.readFileSync('some-file-or-whatever') +``` + +## Global Patching + +If you want to patch the global fs module (or any other fs-like +module) you can do this: + +```javascript +// Make sure to read the caveat below. +var realFs = require('fs') +var gracefulFs = require('graceful-fs') +gracefulFs.gracefulify(realFs) +``` + +This should only ever be done at the top-level application layer, in +order to delay on EMFILE errors from any fs-using dependencies. You +should **not** do this in a library, because it can cause unexpected +delays in other parts of the program. + +## Changes + +This module is fairly stable at this point, and used by a lot of +things. That being said, because it implements a subtle behavior +change in a core part of the node API, even modest changes can be +extremely breaking, and the versioning is thus biased towards +bumping the major when in doubt. + +The main change between major versions has been switching between +providing a fully-patched `fs` module vs monkey-patching the node core +builtin, and the approach by which a non-monkey-patched `fs` was +created. + +The goal is to trade `EMFILE` errors for slower fs operations. So, if +you try to open a zillion files, rather than crashing, `open` +operations will be queued up and wait for something else to `close`. + +There are advantages to each approach. Monkey-patching the fs means +that no `EMFILE` errors can possibly occur anywhere in your +application, because everything is using the same core `fs` module, +which is patched. However, it can also obviously cause undesirable +side-effects, especially if the module is loaded multiple times. + +Implementing a separate-but-identical patched `fs` module is more +surgical (and doesn't run the risk of patching multiple times), but +also imposes the challenge of keeping in sync with the core module. + +The current approach loads the `fs` module, and then creates a +lookalike object that has all the same methods, except a few that are +patched. It is safe to use in all versions of Node from 0.8 through +7.0. + +### v4 + +* Do not monkey-patch the fs module. This module may now be used as a + drop-in dep, and users can opt into monkey-patching the fs builtin + if their app requires it. + +### v3 + +* Monkey-patch fs, because the eval approach no longer works on recent + node. +* fixed possible type-error throw if rename fails on windows +* verify that we *never* get EMFILE errors +* Ignore ENOSYS from chmod/chown +* clarify that graceful-fs must be used as a drop-in + +### v2.1.0 + +* Use eval rather than monkey-patching fs. +* readdir: Always sort the results +* win32: requeue a file if error has an OK status + +### v2.0 + +* A return to monkey patching +* wrap process.cwd + +### v1.1 + +* wrap readFile +* Wrap fs.writeFile. +* readdir protection +* Don't clobber the fs builtin +* Handle fs.read EAGAIN errors by trying again +* Expose the curOpen counter +* No-op lchown/lchmod if not implemented +* fs.rename patch only for win32 +* Patch fs.rename to handle AV software on Windows +* Close #4 Chown should not fail on einval or eperm if non-root +* Fix isaacs/fstream#1 Only wrap fs one time +* Fix #3 Start at 1024 max files, then back off on EMFILE +* lutimes that doens't blow up on Linux +* A full on-rewrite using a queue instead of just swallowing the EMFILE error +* Wrap Read/Write streams as well + +### 1.0 + +* Update engines for node 0.6 +* Be lstat-graceful on Windows +* first diff --git a/node_modules/fs-extra/node_modules/graceful-fs/fs.js b/node_modules/fs-extra/node_modules/graceful-fs/fs.js new file mode 100644 index 0000000..8ad4a38 --- /dev/null +++ b/node_modules/fs-extra/node_modules/graceful-fs/fs.js @@ -0,0 +1,21 @@ +'use strict' + +var fs = require('fs') + +module.exports = clone(fs) + +function clone (obj) { + if (obj === null || typeof obj !== 'object') + return obj + + if (obj instanceof Object) + var copy = { __proto__: obj.__proto__ } + else + var copy = Object.create(null) + + Object.getOwnPropertyNames(obj).forEach(function (key) { + Object.defineProperty(copy, key, Object.getOwnPropertyDescriptor(obj, key)) + }) + + return copy +} diff --git a/node_modules/fs-extra/node_modules/graceful-fs/graceful-fs.js b/node_modules/fs-extra/node_modules/graceful-fs/graceful-fs.js new file mode 100644 index 0000000..33b30d2 --- /dev/null +++ b/node_modules/fs-extra/node_modules/graceful-fs/graceful-fs.js @@ -0,0 +1,262 @@ +var fs = require('fs') +var polyfills = require('./polyfills.js') +var legacy = require('./legacy-streams.js') +var queue = [] + +var util = require('util') + +function noop () {} + +var debug = noop +if (util.debuglog) + debug = util.debuglog('gfs4') +else if (/\bgfs4\b/i.test(process.env.NODE_DEBUG || '')) + debug = function() { + var m = util.format.apply(util, arguments) + m = 'GFS4: ' + m.split(/\n/).join('\nGFS4: ') + console.error(m) + } + +if (/\bgfs4\b/i.test(process.env.NODE_DEBUG || '')) { + process.on('exit', function() { + debug(queue) + require('assert').equal(queue.length, 0) + }) +} + +module.exports = patch(require('./fs.js')) +if (process.env.TEST_GRACEFUL_FS_GLOBAL_PATCH) { + module.exports = patch(fs) +} + +// Always patch fs.close/closeSync, because we want to +// retry() whenever a close happens *anywhere* in the program. +// This is essential when multiple graceful-fs instances are +// in play at the same time. +module.exports.close = +fs.close = (function (fs$close) { return function (fd, cb) { + return fs$close.call(fs, fd, function (err) { + if (!err) + retry() + + if (typeof cb === 'function') + cb.apply(this, arguments) + }) +}})(fs.close) + +module.exports.closeSync = +fs.closeSync = (function (fs$closeSync) { return function (fd) { + // Note that graceful-fs also retries when fs.closeSync() fails. + // Looks like a bug to me, although it's probably a harmless one. + var rval = fs$closeSync.apply(fs, arguments) + retry() + return rval +}})(fs.closeSync) + +function patch (fs) { + // Everything that references the open() function needs to be in here + polyfills(fs) + fs.gracefulify = patch + fs.FileReadStream = ReadStream; // Legacy name. + fs.FileWriteStream = WriteStream; // Legacy name. + fs.createReadStream = createReadStream + fs.createWriteStream = createWriteStream + var fs$readFile = fs.readFile + fs.readFile = readFile + function readFile (path, options, cb) { + if (typeof options === 'function') + cb = options, options = null + + return go$readFile(path, options, cb) + + function go$readFile (path, options, cb) { + return fs$readFile(path, options, function (err) { + if (err && (err.code === 'EMFILE' || err.code === 'ENFILE')) + enqueue([go$readFile, [path, options, cb]]) + else { + if (typeof cb === 'function') + cb.apply(this, arguments) + retry() + } + }) + } + } + + var fs$writeFile = fs.writeFile + fs.writeFile = writeFile + function writeFile (path, data, options, cb) { + if (typeof options === 'function') + cb = options, options = null + + return go$writeFile(path, data, options, cb) + + function go$writeFile (path, data, options, cb) { + return fs$writeFile(path, data, options, function (err) { + if (err && (err.code === 'EMFILE' || err.code === 'ENFILE')) + enqueue([go$writeFile, [path, data, options, cb]]) + else { + if (typeof cb === 'function') + cb.apply(this, arguments) + retry() + } + }) + } + } + + var fs$appendFile = fs.appendFile + if (fs$appendFile) + fs.appendFile = appendFile + function appendFile (path, data, options, cb) { + if (typeof options === 'function') + cb = options, options = null + + return go$appendFile(path, data, options, cb) + + function go$appendFile (path, data, options, cb) { + return fs$appendFile(path, data, options, function (err) { + if (err && (err.code === 'EMFILE' || err.code === 'ENFILE')) + enqueue([go$appendFile, [path, data, options, cb]]) + else { + if (typeof cb === 'function') + cb.apply(this, arguments) + retry() + } + }) + } + } + + var fs$readdir = fs.readdir + fs.readdir = readdir + function readdir (path, options, cb) { + var args = [path] + if (typeof options !== 'function') { + args.push(options) + } else { + cb = options + } + args.push(go$readdir$cb) + + return go$readdir(args) + + function go$readdir$cb (err, files) { + if (files && files.sort) + files.sort() + + if (err && (err.code === 'EMFILE' || err.code === 'ENFILE')) + enqueue([go$readdir, [args]]) + else { + if (typeof cb === 'function') + cb.apply(this, arguments) + retry() + } + } + } + + function go$readdir (args) { + return fs$readdir.apply(fs, args) + } + + if (process.version.substr(0, 4) === 'v0.8') { + var legStreams = legacy(fs) + ReadStream = legStreams.ReadStream + WriteStream = legStreams.WriteStream + } + + var fs$ReadStream = fs.ReadStream + ReadStream.prototype = Object.create(fs$ReadStream.prototype) + ReadStream.prototype.open = ReadStream$open + + var fs$WriteStream = fs.WriteStream + WriteStream.prototype = Object.create(fs$WriteStream.prototype) + WriteStream.prototype.open = WriteStream$open + + fs.ReadStream = ReadStream + fs.WriteStream = WriteStream + + function ReadStream (path, options) { + if (this instanceof ReadStream) + return fs$ReadStream.apply(this, arguments), this + else + return ReadStream.apply(Object.create(ReadStream.prototype), arguments) + } + + function ReadStream$open () { + var that = this + open(that.path, that.flags, that.mode, function (err, fd) { + if (err) { + if (that.autoClose) + that.destroy() + + that.emit('error', err) + } else { + that.fd = fd + that.emit('open', fd) + that.read() + } + }) + } + + function WriteStream (path, options) { + if (this instanceof WriteStream) + return fs$WriteStream.apply(this, arguments), this + else + return WriteStream.apply(Object.create(WriteStream.prototype), arguments) + } + + function WriteStream$open () { + var that = this + open(that.path, that.flags, that.mode, function (err, fd) { + if (err) { + that.destroy() + that.emit('error', err) + } else { + that.fd = fd + that.emit('open', fd) + } + }) + } + + function createReadStream (path, options) { + return new ReadStream(path, options) + } + + function createWriteStream (path, options) { + return new WriteStream(path, options) + } + + var fs$open = fs.open + fs.open = open + function open (path, flags, mode, cb) { + if (typeof mode === 'function') + cb = mode, mode = null + + return go$open(path, flags, mode, cb) + + function go$open (path, flags, mode, cb) { + return fs$open(path, flags, mode, function (err, fd) { + if (err && (err.code === 'EMFILE' || err.code === 'ENFILE')) + enqueue([go$open, [path, flags, mode, cb]]) + else { + if (typeof cb === 'function') + cb.apply(this, arguments) + retry() + } + }) + } + } + + return fs +} + +function enqueue (elem) { + debug('ENQUEUE', elem[0].name, elem[1]) + queue.push(elem) +} + +function retry () { + var elem = queue.shift() + if (elem) { + debug('RETRY', elem[0].name, elem[1]) + elem[0].apply(null, elem[1]) + } +} diff --git a/node_modules/fs-extra/node_modules/graceful-fs/legacy-streams.js b/node_modules/fs-extra/node_modules/graceful-fs/legacy-streams.js new file mode 100644 index 0000000..d617b50 --- /dev/null +++ b/node_modules/fs-extra/node_modules/graceful-fs/legacy-streams.js @@ -0,0 +1,118 @@ +var Stream = require('stream').Stream + +module.exports = legacy + +function legacy (fs) { + return { + ReadStream: ReadStream, + WriteStream: WriteStream + } + + function ReadStream (path, options) { + if (!(this instanceof ReadStream)) return new ReadStream(path, options); + + Stream.call(this); + + var self = this; + + this.path = path; + this.fd = null; + this.readable = true; + this.paused = false; + + this.flags = 'r'; + this.mode = 438; /*=0666*/ + this.bufferSize = 64 * 1024; + + options = options || {}; + + // Mixin options into this + var keys = Object.keys(options); + for (var index = 0, length = keys.length; index < length; index++) { + var key = keys[index]; + this[key] = options[key]; + } + + if (this.encoding) this.setEncoding(this.encoding); + + if (this.start !== undefined) { + if ('number' !== typeof this.start) { + throw TypeError('start must be a Number'); + } + if (this.end === undefined) { + this.end = Infinity; + } else if ('number' !== typeof this.end) { + throw TypeError('end must be a Number'); + } + + if (this.start > this.end) { + throw new Error('start must be <= end'); + } + + this.pos = this.start; + } + + if (this.fd !== null) { + process.nextTick(function() { + self._read(); + }); + return; + } + + fs.open(this.path, this.flags, this.mode, function (err, fd) { + if (err) { + self.emit('error', err); + self.readable = false; + return; + } + + self.fd = fd; + self.emit('open', fd); + self._read(); + }) + } + + function WriteStream (path, options) { + if (!(this instanceof WriteStream)) return new WriteStream(path, options); + + Stream.call(this); + + this.path = path; + this.fd = null; + this.writable = true; + + this.flags = 'w'; + this.encoding = 'binary'; + this.mode = 438; /*=0666*/ + this.bytesWritten = 0; + + options = options || {}; + + // Mixin options into this + var keys = Object.keys(options); + for (var index = 0, length = keys.length; index < length; index++) { + var key = keys[index]; + this[key] = options[key]; + } + + if (this.start !== undefined) { + if ('number' !== typeof this.start) { + throw TypeError('start must be a Number'); + } + if (this.start < 0) { + throw new Error('start must be >= zero'); + } + + this.pos = this.start; + } + + this.busy = false; + this._queue = []; + + if (this.fd === null) { + this._open = fs.open; + this._queue.push([this._open, this.path, this.flags, this.mode, undefined]); + this.flush(); + } + } +} diff --git a/node_modules/fs-extra/node_modules/graceful-fs/package.json b/node_modules/fs-extra/node_modules/graceful-fs/package.json new file mode 100644 index 0000000..7f2f3af --- /dev/null +++ b/node_modules/fs-extra/node_modules/graceful-fs/package.json @@ -0,0 +1,77 @@ +{ + "name": "graceful-fs", + "description": "A drop-in replacement for fs, making various improvements.", + "version": "4.1.9", + "repository": { + "type": "git", + "url": "git+https://github.com/isaacs/node-graceful-fs.git" + }, + "main": "graceful-fs.js", + "engines": { + "node": ">=0.4.0" + }, + "directories": { + "test": "test" + }, + "scripts": { + "test": "node test.js | tap -" + }, + "keywords": [ + "fs", + "module", + "reading", + "retry", + "retries", + "queue", + "error", + "errors", + "handling", + "EMFILE", + "EAGAIN", + "EINVAL", + "EPERM", + "EACCESS" + ], + "license": "ISC", + "devDependencies": { + "mkdirp": "^0.5.0", + "rimraf": "^2.2.8", + "tap": "^5.4.2" + }, + "files": [ + "fs.js", + "graceful-fs.js", + "legacy-streams.js", + "polyfills.js" + ], + "gitHead": "0798db3711e33de92de5a93979278bb89d629143", + "bugs": { + "url": "https://github.com/isaacs/node-graceful-fs/issues" + }, + "homepage": "https://github.com/isaacs/node-graceful-fs#readme", + "_id": "graceful-fs@4.1.9", + "_shasum": "baacba37d19d11f9d146d3578bc99958c3787e29", + "_from": "graceful-fs@>=4.1.2 <5.0.0", + "_npmVersion": "3.10.7", + "_nodeVersion": "6.5.0", + "_npmUser": { + "name": "isaacs", + "email": "i@izs.me" + }, + "dist": { + "shasum": "baacba37d19d11f9d146d3578bc99958c3787e29", + "tarball": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.9.tgz" + }, + "maintainers": [ + { + "name": "isaacs", + "email": "i@izs.me" + } + ], + "_npmOperationalInternal": { + "host": "packages-12-west.internal.npmjs.com", + "tmp": "tmp/graceful-fs-4.1.9.tgz_1475103672016_0.7011275647673756" + }, + "_resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.9.tgz", + "readme": "ERROR: No README data found!" +} diff --git a/node_modules/fs-extra/node_modules/graceful-fs/polyfills.js b/node_modules/fs-extra/node_modules/graceful-fs/polyfills.js new file mode 100644 index 0000000..cf474df --- /dev/null +++ b/node_modules/fs-extra/node_modules/graceful-fs/polyfills.js @@ -0,0 +1,310 @@ +var fs = require('./fs.js') +var constants = require('constants') + +var origCwd = process.cwd +var cwd = null +process.cwd = function() { + if (!cwd) + cwd = origCwd.call(process) + return cwd +} +try { + process.cwd() +} catch (er) {} + +var chdir = process.chdir +process.chdir = function(d) { + cwd = null + chdir.call(process, d) +} + +module.exports = patch + +function patch (fs) { + // (re-)implement some things that are known busted or missing. + + // lchmod, broken prior to 0.6.2 + // back-port the fix here. + if (constants.hasOwnProperty('O_SYMLINK') && + process.version.match(/^v0\.6\.[0-2]|^v0\.5\./)) { + patchLchmod(fs) + } + + // lutimes implementation, or no-op + if (!fs.lutimes) { + patchLutimes(fs) + } + + // https://github.com/isaacs/node-graceful-fs/issues/4 + // Chown should not fail on einval or eperm if non-root. + // It should not fail on enosys ever, as this just indicates + // that a fs doesn't support the intended operation. + + fs.chown = chownFix(fs.chown) + fs.fchown = chownFix(fs.fchown) + fs.lchown = chownFix(fs.lchown) + + fs.chmod = chmodFix(fs.chmod) + fs.fchmod = chmodFix(fs.fchmod) + fs.lchmod = chmodFix(fs.lchmod) + + fs.chownSync = chownFixSync(fs.chownSync) + fs.fchownSync = chownFixSync(fs.fchownSync) + fs.lchownSync = chownFixSync(fs.lchownSync) + + fs.chmodSync = chmodFixSync(fs.chmodSync) + fs.fchmodSync = chmodFixSync(fs.fchmodSync) + fs.lchmodSync = chmodFixSync(fs.lchmodSync) + + fs.stat = statFix(fs.stat) + fs.fstat = statFix(fs.fstat) + fs.lstat = statFix(fs.lstat) + + fs.statSync = statFixSync(fs.statSync) + fs.fstatSync = statFixSync(fs.fstatSync) + fs.lstatSync = statFixSync(fs.lstatSync) + + // if lchmod/lchown do not exist, then make them no-ops + if (!fs.lchmod) { + fs.lchmod = function (path, mode, cb) { + if (cb) process.nextTick(cb) + } + fs.lchmodSync = function () {} + } + if (!fs.lchown) { + fs.lchown = function (path, uid, gid, cb) { + if (cb) process.nextTick(cb) + } + fs.lchownSync = function () {} + } + + // on Windows, A/V software can lock the directory, causing this + // to fail with an EACCES or EPERM if the directory contains newly + // created files. Try again on failure, for up to 1 second. + if (process.platform === "win32") { + fs.rename = (function (fs$rename) { return function (from, to, cb) { + var start = Date.now() + fs$rename(from, to, function CB (er) { + if (er + && (er.code === "EACCES" || er.code === "EPERM") + && Date.now() - start < 1000) { + return fs$rename(from, to, CB) + } + if (cb) cb(er) + }) + }})(fs.rename) + } + + // if read() returns EAGAIN, then just try it again. + fs.read = (function (fs$read) { return function (fd, buffer, offset, length, position, callback_) { + var callback + if (callback_ && typeof callback_ === 'function') { + var eagCounter = 0 + callback = function (er, _, __) { + if (er && er.code === 'EAGAIN' && eagCounter < 10) { + eagCounter ++ + return fs$read.call(fs, fd, buffer, offset, length, position, callback) + } + callback_.apply(this, arguments) + } + } + return fs$read.call(fs, fd, buffer, offset, length, position, callback) + }})(fs.read) + + fs.readSync = (function (fs$readSync) { return function (fd, buffer, offset, length, position) { + var eagCounter = 0 + while (true) { + try { + return fs$readSync.call(fs, fd, buffer, offset, length, position) + } catch (er) { + if (er.code === 'EAGAIN' && eagCounter < 10) { + eagCounter ++ + continue + } + throw er + } + } + }})(fs.readSync) +} + +function patchLchmod (fs) { + fs.lchmod = function (path, mode, callback) { + fs.open( path + , constants.O_WRONLY | constants.O_SYMLINK + , mode + , function (err, fd) { + if (err) { + if (callback) callback(err) + return + } + // prefer to return the chmod error, if one occurs, + // but still try to close, and report closing errors if they occur. + fs.fchmod(fd, mode, function (err) { + fs.close(fd, function(err2) { + if (callback) callback(err || err2) + }) + }) + }) + } + + fs.lchmodSync = function (path, mode) { + var fd = fs.openSync(path, constants.O_WRONLY | constants.O_SYMLINK, mode) + + // prefer to return the chmod error, if one occurs, + // but still try to close, and report closing errors if they occur. + var threw = true + var ret + try { + ret = fs.fchmodSync(fd, mode) + threw = false + } finally { + if (threw) { + try { + fs.closeSync(fd) + } catch (er) {} + } else { + fs.closeSync(fd) + } + } + return ret + } +} + +function patchLutimes (fs) { + if (constants.hasOwnProperty("O_SYMLINK")) { + fs.lutimes = function (path, at, mt, cb) { + fs.open(path, constants.O_SYMLINK, function (er, fd) { + if (er) { + if (cb) cb(er) + return + } + fs.futimes(fd, at, mt, function (er) { + fs.close(fd, function (er2) { + if (cb) cb(er || er2) + }) + }) + }) + } + + fs.lutimesSync = function (path, at, mt) { + var fd = fs.openSync(path, constants.O_SYMLINK) + var ret + var threw = true + try { + ret = fs.futimesSync(fd, at, mt) + threw = false + } finally { + if (threw) { + try { + fs.closeSync(fd) + } catch (er) {} + } else { + fs.closeSync(fd) + } + } + return ret + } + + } else { + fs.lutimes = function (_a, _b, _c, cb) { if (cb) process.nextTick(cb) } + fs.lutimesSync = function () {} + } +} + +function chmodFix (orig) { + if (!orig) return orig + return function (target, mode, cb) { + return orig.call(fs, target, mode, function (er) { + if (chownErOk(er)) er = null + if (cb) cb.apply(this, arguments) + }) + } +} + +function chmodFixSync (orig) { + if (!orig) return orig + return function (target, mode) { + try { + return orig.call(fs, target, mode) + } catch (er) { + if (!chownErOk(er)) throw er + } + } +} + + +function chownFix (orig) { + if (!orig) return orig + return function (target, uid, gid, cb) { + return orig.call(fs, target, uid, gid, function (er) { + if (chownErOk(er)) er = null + if (cb) cb.apply(this, arguments) + }) + } +} + +function chownFixSync (orig) { + if (!orig) return orig + return function (target, uid, gid) { + try { + return orig.call(fs, target, uid, gid) + } catch (er) { + if (!chownErOk(er)) throw er + } + } +} + + +function statFix (orig) { + if (!orig) return orig + // Older versions of Node erroneously returned signed integers for + // uid + gid. + return function (target, cb) { + return orig.call(fs, target, function (er, stats) { + if (!stats) return cb.apply(this, arguments) + if (stats.uid < 0) stats.uid += 0x100000000 + if (stats.gid < 0) stats.gid += 0x100000000 + if (cb) cb.apply(this, arguments) + }) + } +} + +function statFixSync (orig) { + if (!orig) return orig + // Older versions of Node erroneously returned signed integers for + // uid + gid. + return function (target) { + var stats = orig.call(fs, target) + if (stats.uid < 0) stats.uid += 0x100000000 + if (stats.gid < 0) stats.gid += 0x100000000 + return stats; + } +} + +// ENOSYS means that the fs doesn't support the op. Just ignore +// that, because it doesn't matter. +// +// if there's no getuid, or if getuid() is something other +// than 0, and the error is EINVAL or EPERM, then just ignore +// it. +// +// This specific case is a silent failure in cp, install, tar, +// and most other unix tools that manage permissions. +// +// When running as root, or if other types of errors are +// encountered, then it's strict. +function chownErOk (er) { + if (!er) + return true + + if (er.code === "ENOSYS") + return true + + var nonroot = !process.getuid || process.getuid() !== 0 + if (nonroot) { + if (er.code === "EINVAL" || er.code === "EPERM") + return true + } + + return false +} diff --git a/node_modules/fs-extra/node_modules/jsonfile/LICENSE b/node_modules/fs-extra/node_modules/jsonfile/LICENSE new file mode 100644 index 0000000..cb7e807 --- /dev/null +++ b/node_modules/fs-extra/node_modules/jsonfile/LICENSE @@ -0,0 +1,15 @@ +(The MIT License) + +Copyright (c) 2012-2015, JP Richardson + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files +(the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, + merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS +OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/fs-extra/node_modules/jsonfile/README.md b/node_modules/fs-extra/node_modules/jsonfile/README.md new file mode 100644 index 0000000..54bca05 --- /dev/null +++ b/node_modules/fs-extra/node_modules/jsonfile/README.md @@ -0,0 +1,162 @@ +Node.js - jsonfile +================ + +Easily read/write JSON files. + +[![npm Package](https://img.shields.io/npm/v/jsonfile.svg?style=flat-square)](https://www.npmjs.org/package/jsonfile) +[![build status](https://secure.travis-ci.org/jprichardson/node-jsonfile.svg)](http://travis-ci.org/jprichardson/node-jsonfile) +[![windows Build status](https://img.shields.io/appveyor/ci/jprichardson/node-jsonfile/master.svg?label=windows%20build)](https://ci.appveyor.com/project/jprichardson/node-jsonfile/branch/master) + +Standard JavaScript + +Why? +---- + +Writing `JSON.stringify()` and then `fs.writeFile()` and `JSON.parse()` with `fs.readFile()` enclosed in `try/catch` blocks became annoying. + + + +Installation +------------ + + npm install --save jsonfile + + + +API +--- + +### readFile(filename, [options], callback) + +`options` (`object`, default `undefined`): Pass in any `fs.readFile` options or set `reviver` for a [JSON reviver](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/parse). + - `throws` (`boolean`, default: `true`). If `JSON.parse` throws an error, pass this error to the callback. + If `false`, returns `null` for the object. + + +```js +var jsonfile = require('jsonfile') +var file = '/tmp/data.json' +jsonfile.readFile(file, function(err, obj) { + console.dir(obj) +}) +``` + + +### readFileSync(filename, [options]) + +`options` (`object`, default `undefined`): Pass in any `fs.readFileSync` options or set `reviver` for a [JSON reviver](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/parse). +- `throws` (`boolean`, default: `true`). If `JSON.parse` throws an error, throw the error. +If `false`, returns `null` for the object. + +```js +var jsonfile = require('jsonfile') +var file = '/tmp/data.json' + +console.dir(jsonfile.readFileSync(file)) +``` + + +### writeFile(filename, obj, [options], callback) + +`options`: Pass in any `fs.writeFile` options or set `replacer` for a [JSON replacer](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify). Can also pass in `spaces`. + + +```js +var jsonfile = require('jsonfile') + +var file = '/tmp/data.json' +var obj = {name: 'JP'} + +jsonfile.writeFile(file, obj, function (err) { + console.error(err) +}) +``` + +**formatting with spaces:** + +```js +var jsonfile = require('jsonfile') + +var file = '/tmp/data.json' +var obj = {name: 'JP'} + +jsonfile.writeFile(file, obj, {spaces: 2}, function(err) { + console.error(err) +}) +``` + + +### writeFileSync(filename, obj, [options]) + +`options`: Pass in any `fs.writeFileSync` options or set `replacer` for a [JSON replacer](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify). Can also pass in `spaces`. + +```js +var jsonfile = require('jsonfile') + +var file = '/tmp/data.json' +var obj = {name: 'JP'} + +jsonfile.writeFileSync(file, obj) +``` + +**formatting with spaces:** + +```js +var jsonfile = require('jsonfile') + +var file = '/tmp/data.json' +var obj = {name: 'JP'} + +jsonfile.writeFileSync(file, obj, {spaces: 2}) +``` + + + +### spaces + +Global configuration to set spaces to indent JSON files. + +**default:** `null` + +```js +var jsonfile = require('jsonfile') + +jsonfile.spaces = 4 + +var file = '/tmp/data.json' +var obj = {name: 'JP'} + +// json file has four space indenting now +jsonfile.writeFile(file, obj, function (err) { + console.error(err) +}) +``` + +Note, it's bound to `this.spaces`. So, if you do this: + +```js +var myObj = {} +myObj.writeJsonSync = jsonfile.writeFileSync +// => this.spaces = null +``` + +Could do the following: + +```js +var jsonfile = require('jsonfile') +jsonfile.spaces = 4 +jsonfile.writeFileSync(file, obj) // will have 4 spaces indentation + +var myCrazyObj = {spaces: 32} +myCrazyObj.writeJsonSync = jsonfile.writeFileSync +myCrazyObj.writeJsonSync(file, obj) // will have 32 space indentation +myCrazyObj.writeJsonSync(file, obj, {spaces: 2}) // will have only 2 +``` + + +License +------- + +(MIT License) + +Copyright 2012-2016, JP Richardson diff --git a/node_modules/fs-extra/node_modules/jsonfile/index.js b/node_modules/fs-extra/node_modules/jsonfile/index.js new file mode 100644 index 0000000..7111e15 --- /dev/null +++ b/node_modules/fs-extra/node_modules/jsonfile/index.js @@ -0,0 +1,133 @@ +var _fs +try { + _fs = require('graceful-fs') +} catch (_) { + _fs = require('fs') +} + +function readFile (file, options, callback) { + if (callback == null) { + callback = options + options = {} + } + + if (typeof options === 'string') { + options = {encoding: options} + } + + options = options || {} + var fs = options.fs || _fs + + var shouldThrow = true + // DO NOT USE 'passParsingErrors' THE NAME WILL CHANGE!!!, use 'throws' instead + if ('passParsingErrors' in options) { + shouldThrow = options.passParsingErrors + } else if ('throws' in options) { + shouldThrow = options.throws + } + + fs.readFile(file, options, function (err, data) { + if (err) return callback(err) + + data = stripBom(data) + + var obj + try { + obj = JSON.parse(data, options ? options.reviver : null) + } catch (err2) { + if (shouldThrow) { + err2.message = file + ': ' + err2.message + return callback(err2) + } else { + return callback(null, null) + } + } + + callback(null, obj) + }) +} + +function readFileSync (file, options) { + options = options || {} + if (typeof options === 'string') { + options = {encoding: options} + } + + var fs = options.fs || _fs + + var shouldThrow = true + // DO NOT USE 'passParsingErrors' THE NAME WILL CHANGE!!!, use 'throws' instead + if ('passParsingErrors' in options) { + shouldThrow = options.passParsingErrors + } else if ('throws' in options) { + shouldThrow = options.throws + } + + var content = fs.readFileSync(file, options) + content = stripBom(content) + + try { + return JSON.parse(content, options.reviver) + } catch (err) { + if (shouldThrow) { + err.message = file + ': ' + err.message + throw err + } else { + return null + } + } +} + +function writeFile (file, obj, options, callback) { + if (callback == null) { + callback = options + options = {} + } + options = options || {} + var fs = options.fs || _fs + + var spaces = typeof options === 'object' && options !== null + ? 'spaces' in options + ? options.spaces : this.spaces + : this.spaces + + var str = '' + try { + str = JSON.stringify(obj, options ? options.replacer : null, spaces) + '\n' + } catch (err) { + if (callback) return callback(err, null) + } + + fs.writeFile(file, str, options, callback) +} + +function writeFileSync (file, obj, options) { + options = options || {} + var fs = options.fs || _fs + + var spaces = typeof options === 'object' && options !== null + ? 'spaces' in options + ? options.spaces : this.spaces + : this.spaces + + var str = JSON.stringify(obj, options.replacer, spaces) + '\n' + // not sure if fs.writeFileSync returns anything, but just in case + return fs.writeFileSync(file, str, options) +} + +function stripBom (content) { + // we do this because JSON.parse would convert it to a utf8 string if encoding wasn't specified + if (Buffer.isBuffer(content)) content = content.toString('utf8') + content = content.replace(/^\uFEFF/, '') + return content +} + +var jsonfile = { + spaces: null, + readFile: readFile, + readFileSync: readFileSync, + writeFile: writeFile, + writeFileSync: writeFileSync +} + +module.exports = jsonfile diff --git a/node_modules/fs-extra/node_modules/jsonfile/package.json b/node_modules/fs-extra/node_modules/jsonfile/package.json new file mode 100644 index 0000000..e590138 --- /dev/null +++ b/node_modules/fs-extra/node_modules/jsonfile/package.json @@ -0,0 +1,71 @@ +{ + "name": "jsonfile", + "version": "2.4.0", + "description": "Easily read/write JSON files.", + "repository": { + "type": "git", + "url": "git+ssh://git@github.com/jprichardson/node-jsonfile.git" + }, + "keywords": [ + "read", + "write", + "file", + "json", + "fs", + "fs-extra" + ], + "author": { + "name": "JP Richardson", + "email": "jprichardson@gmail.com" + }, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.1.6" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + }, + "devDependencies": { + "mocha": "2.x", + "mock-fs": "^3.8.0", + "rimraf": "^2.4.0", + "standard": "^6.0.8" + }, + "main": "index.js", + "scripts": { + "lint": "standard", + "test": "npm run lint && npm run unit", + "unit": "mocha" + }, + "gitHead": "00b3983ac4aade79c64c7a8c2ced257078625c6d", + "bugs": { + "url": "https://github.com/jprichardson/node-jsonfile/issues" + }, + "homepage": "https://github.com/jprichardson/node-jsonfile#readme", + "_id": "jsonfile@2.4.0", + "_shasum": "3736a2b428b87bbda0cc83b53fa3d633a35c2ae8", + "_from": "jsonfile@>=2.1.0 <3.0.0", + "_npmVersion": "3.8.6", + "_nodeVersion": "6.1.0", + "_npmUser": { + "name": "jprichardson", + "email": "jprichardson@gmail.com" + }, + "maintainers": [ + { + "name": "jprichardson", + "email": "jprichardson@gmail.com" + } + ], + "dist": { + "shasum": "3736a2b428b87bbda0cc83b53fa3d633a35c2ae8", + "tarball": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz" + }, + "_npmOperationalInternal": { + "host": "packages-12-west.internal.npmjs.com", + "tmp": "tmp/jsonfile-2.4.0.tgz_1473989978270_0.6271681792568415" + }, + "directories": {}, + "_resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", + "readme": "ERROR: No README data found!" +} diff --git a/node_modules/fs-extra/node_modules/klaw/LICENSE b/node_modules/fs-extra/node_modules/klaw/LICENSE new file mode 100644 index 0000000..ddb217c --- /dev/null +++ b/node_modules/fs-extra/node_modules/klaw/LICENSE @@ -0,0 +1,15 @@ +(The MIT License) + +Copyright (c) 2015-2016 JP Richardson + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files +(the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, + merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS +OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/fs-extra/node_modules/klaw/README.md b/node_modules/fs-extra/node_modules/klaw/README.md new file mode 100644 index 0000000..78386e4 --- /dev/null +++ b/node_modules/fs-extra/node_modules/klaw/README.md @@ -0,0 +1,270 @@ +Node.js - klaw +============== + +A Node.js file system walker extracted from [fs-extra](https://github.com/jprichardson/node-fs-extra). + +[![npm Package](https://img.shields.io/npm/v/klaw.svg?style=flat-square)](https://www.npmjs.org/package/klaw) +[![build status](https://api.travis-ci.org/jprichardson/node-klaw.svg)](http://travis-ci.org/jprichardson/node-klaw) +[![windows build status](https://ci.appveyor.com/api/projects/status/github/jprichardson/node-klaw?branch=master&svg=true)](https://ci.appveyor.com/project/jprichardson/node-klaw/branch/master) + + +Standard + +Install +------- + + npm i --save klaw + + +Name +---- + +`klaw` is `walk` backwards :p + + +Usage +----- + +### klaw(directory, [options]) + +Returns a [Readable stream](https://nodejs.org/api/stream.html#stream_class_stream_readable) that iterates +through every file and directory starting with `dir` as the root. Every `read()` or `data` event +returns an object with two properties: `path` and `stats`. `path` is the full path of the file and +`stats` is an instance of [fs.Stats](https://nodejs.org/api/fs.html#fs_class_fs_stats). + +- `directory`: The directory to recursively walk. Type `string`. +- `options`: [Readable stream options](https://nodejs.org/api/stream.html#stream_new_stream_readable_options) and +the following: + - `queueMethod` (`string`, default: `'shift'`): Either `'shift'` or `'pop'`. On `readdir()` array, call either `shift()` or `pop()`. + - `pathSorter` (`function`, default: `undefined`): Sorting [function for Arrays](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort). + - `fs` (`object`, default: `require('fs')`): Use this to hook into the `fs` methods or to use [`mock-fs`](https://github.com/tschaub/mock-fs) + - `filter` (`function`, default: `undefined`): Filtering [function for Arrays](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter) + +**Streams 1 (push) example:** + +```js +var klaw = require('klaw') + +var items = [] // files, directories, symlinks, etc +klaw('/some/dir') + .on('data', function (item) { + items.push(item.path) + }) + .on('end', function () { + console.dir(items) // => [ ... array of files] + }) +``` + +**Streams 2 & 3 (pull) example:** + +```js +var klaw = require('klaw') + +var items = [] // files, directories, symlinks, etc +klaw('/some/dir') + .on('readable', function () { + var item + while ((item = this.read())) { + items.push(item.path) + } + }) + .on('end', function () { + console.dir(items) // => [ ... array of files] + }) +``` + +If you're not sure of the differences on Node.js streams 1, 2, 3 then I'd +recommend this resource as a good starting point: https://strongloop.com/strongblog/whats-new-io-js-beta-streams3/. + + +### Error Handling + +Listen for the `error` event. + +Example: + +```js +var klaw = require('klaw') +klaw('/some/dir') + .on('readable', function () { + var item + while ((item = this.read())) { + // do something with the file + } + }) + .on('error', function (err, item) { + console.log(err.message) + console.log(item.path) // the file the error occurred on + }) + .on('end', function () { + console.dir(items) // => [ ... array of files] + }) + +``` + + +### Aggregation / Filtering / Executing Actions (Through Streams) + +On many occasions you may want to filter files based upon size, extension, etc. +Or you may want to aggregate stats on certain file types. Or maybe you want to +perform an action on certain file types. + +You should use the module [`through2`](https://www.npmjs.com/package/through2) to easily +accomplish this. + +Install `through2`: + + npm i --save through2 + + +**Example (skipping directories):** + +```js +var klaw = require('klaw') +var through2 = require('through2') + +var excludeDirFilter = through2.obj(function (item, enc, next) { + if (!item.stats.isDirectory()) this.push(item) + next() +}) + +var items = [] // files, directories, symlinks, etc +klaw('/some/dir') + .pipe(excludeDirFilter) + .on('data', function (item) { + items.push(item.path) + }) + .on('end', function () { + console.dir(items) // => [ ... array of files without directories] + }) + +``` +**Example (ignore hidden directories):** +```js +var klaw = require('klaw') +var path = require('path') + +var filterFunc = function(item){ + var basename = path.basename(item) + return basename === '.' || basename[0] !== '.' +} + +klaw('/some/dir', { filter : filterFunc }) + .on('data', function(item){ + // only items of none hidden folders will reach here + }) + +``` + +**Example (totaling size of PNG files):** + +```js +var klaw = require('klaw') +var path = require('path') +var through2 = require('through2') + +var totalPngsInBytes = 0 +var aggregatePngSize = through2.obj(function (item, enc, next) { + if (path.extname(item.path) === '.png') { + totalPngsInBytes += item.stats.size + } + this.push(item) + next() +}) + +klaw('/some/dir') + .pipe(aggregatePngSize) + .on('data', function (item) { + items.push(item.path) + }) + .on('end', function () { + console.dir(totalPngsInBytes) // => total of all pngs (bytes) + }) +``` + + +**Example (deleting all .tmp files):** + +```js +var fs = require('fs') +var klaw = require('klaw') +var through2 = require('through2') + +var deleteAction = through2.obj(function (item, enc, next) { + this.push(item) + + if (path.extname(item.path) === '.tmp') { + item.deleted = true + fs.unklink(item.path, next) + } else { + item.deleted = false + next() + } +}) + +var deletedFiles = [] +klaw('/some/dir') + .pipe(deleteAction) + .on('data', function (item) { + if (!item.deleted) return + deletedFiles.push(item.path) + }) + .on('end', function () { + console.dir(deletedFiles) // => all deleted files + }) +``` + +You can even chain a bunch of these filters and aggregators together. By using +multiple pipes. + +**Example (using multiple filters / aggregators):** + +```js +klaw('/some/dir') + .pipe(filterCertainFiles) + .pipe(deleteSomeOtherFiles) + .on('end', function () { + console.log('all done!') + }) +``` + +**Example passing (piping) through errors:** + +Node.js does not `pipe()` errors. This means that the error on one stream, like +`klaw` will not pipe through to the next. If you want to do this, do the following: + +```js +var klaw = require('klaw') +var through2 = require('through2') + +var excludeDirFilter = through2.obj(function (item, enc, next) { + if (!item.stats.isDirectory()) this.push(item) + next() +}) + +var items = [] // files, directories, symlinks, etc +klaw('/some/dir') + .on('error', function (err) { excludeDirFilter.emit('error', err) }) // forward the error on + .pipe(excludeDirFilter) + .on('data', function (item) { + items.push(item.path) + }) + .on('end', function () { + console.dir(items) // => [ ... array of files without directories] + }) +``` + + +### Searching Strategy + +Pass in options for `queueMethod` and `pathSorter` to affect how the file system +is recursively iterated. See the code for more details, it's less than 50 lines :) + + + +License +------- + +MIT + +Copyright (c) 2015 [JP Richardson](https://github.com/jprichardson) diff --git a/node_modules/fs-extra/node_modules/klaw/package.json b/node_modules/fs-extra/node_modules/klaw/package.json new file mode 100644 index 0000000..b285756 --- /dev/null +++ b/node_modules/fs-extra/node_modules/klaw/package.json @@ -0,0 +1,66 @@ +{ + "name": "klaw", + "version": "1.3.0", + "description": "File system walker with Readable stream interface.", + "main": "./src/index.js", + "scripts": { + "lint": "standard", + "test": "npm run lint && npm run unit", + "unit": "tape tests/**/*.js | tap-spec" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/jprichardson/node-klaw.git" + }, + "keywords": [ + "walk", + "walker", + "fs", + "fs-extra", + "readable", + "streams" + ], + "author": { + "name": "JP Richardson" + }, + "license": "MIT", + "bugs": { + "url": "https://github.com/jprichardson/node-klaw/issues" + }, + "homepage": "https://github.com/jprichardson/node-klaw#readme", + "devDependencies": { + "mkdirp": "^0.5.1", + "mock-fs": "^3.8.0", + "rimraf": "^2.4.3", + "standard": "^5.3.1", + "tap-spec": "^4.1.1", + "tape": "^4.2.2" + }, + "gitHead": "26645107af1fe05ee9ec9446eeca619dcbe0ff29", + "_id": "klaw@1.3.0", + "_shasum": "8857bfbc1d824badf13d3d0241d8bbe46fb12f73", + "_from": "klaw@>=1.0.0 <2.0.0", + "_npmVersion": "3.5.4", + "_nodeVersion": "5.3.0", + "_npmUser": { + "name": "jprichardson", + "email": "jprichardson@gmail.com" + }, + "dist": { + "shasum": "8857bfbc1d824badf13d3d0241d8bbe46fb12f73", + "tarball": "https://registry.npmjs.org/klaw/-/klaw-1.3.0.tgz" + }, + "maintainers": [ + { + "name": "jprichardson", + "email": "jprichardson@gmail.com" + } + ], + "_npmOperationalInternal": { + "host": "packages-12-west.internal.npmjs.com", + "tmp": "tmp/klaw-1.3.0.tgz_1465471482762_0.7382311346009374" + }, + "directories": {}, + "_resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.0.tgz", + "readme": "ERROR: No README data found!" +} diff --git a/node_modules/fs-extra/node_modules/klaw/src/assign.js b/node_modules/fs-extra/node_modules/klaw/src/assign.js new file mode 100644 index 0000000..69740f6 --- /dev/null +++ b/node_modules/fs-extra/node_modules/klaw/src/assign.js @@ -0,0 +1,16 @@ +// simple mutable assign (extracted from fs-extra) +// I really like object-assign package, but I wanted a lean package with zero deps +function _assign () { + var args = [].slice.call(arguments).filter(function (i) { return i }) + var dest = args.shift() + args.forEach(function (src) { + Object.keys(src).forEach(function (key) { + dest[key] = src[key] + }) + }) + + return dest +} + +// thank you baby Jesus for Node v4 and Object.assign +module.exports = Object.assign || _assign diff --git a/node_modules/fs-extra/node_modules/klaw/src/index.js b/node_modules/fs-extra/node_modules/klaw/src/index.js new file mode 100644 index 0000000..3b33df6 --- /dev/null +++ b/node_modules/fs-extra/node_modules/klaw/src/index.js @@ -0,0 +1,52 @@ +var assert = require('assert') +var fs = require('fs') +var path = require('path') +var Readable = require('stream').Readable +var util = require('util') +var assign = require('./assign') + +function Walker (dir, options) { + assert.strictEqual(typeof dir, 'string', '`dir` parameter should be of type string. Got type: ' + typeof dir) + var defaultStreamOptions = { objectMode: true } + var defaultOpts = { queueMethod: 'shift', pathSorter: undefined, filter: undefined } + options = assign(defaultOpts, options, defaultStreamOptions) + + Readable.call(this, options) + this.root = path.resolve(dir) + this.paths = [this.root] + this.options = options + this.fs = options.fs || fs // mock-fs +} +util.inherits(Walker, Readable) + +Walker.prototype._read = function () { + if (this.paths.length === 0) return this.push(null) + var self = this + var pathItem = this.paths[this.options.queueMethod]() + + self.fs.lstat(pathItem, function (err, stats) { + var item = { path: pathItem, stats: stats } + if (err) return self.emit('error', err, item) + if (!stats.isDirectory()) return self.push(item) + + self.fs.readdir(pathItem, function (err, pathItems) { + if (err) { + self.push(item) + return self.emit('error', err, item) + } + + pathItems = pathItems.map(function (part) { return path.join(pathItem, part) }) + if (self.options.filter) pathItems = pathItems.filter(self.options.filter) + if (self.options.pathSorter) pathItems.sort(self.options.pathSorter) + pathItems.forEach(function (pi) { self.paths.push(pi) }) + + self.push(item) + }) + }) +} + +function walk (root, options) { + return new Walker(root, options) +} + +module.exports = walk diff --git a/node_modules/fs-extra/node_modules/path-is-absolute/index.js b/node_modules/fs-extra/node_modules/path-is-absolute/index.js new file mode 100644 index 0000000..22aa6c3 --- /dev/null +++ b/node_modules/fs-extra/node_modules/path-is-absolute/index.js @@ -0,0 +1,20 @@ +'use strict'; + +function posix(path) { + return path.charAt(0) === '/'; +} + +function win32(path) { + // https://github.com/nodejs/node/blob/b3fcc245fb25539909ef1d5eaa01dbf92e168633/lib/path.js#L56 + var splitDeviceRe = /^([a-zA-Z]:|[\\\/]{2}[^\\\/]+[\\\/]+[^\\\/]+)?([\\\/])?([\s\S]*?)$/; + var result = splitDeviceRe.exec(path); + var device = result[1] || ''; + var isUnc = Boolean(device && device.charAt(1) !== ':'); + + // UNC paths are always absolute + return Boolean(result[2] || isUnc); +} + +module.exports = process.platform === 'win32' ? win32 : posix; +module.exports.posix = posix; +module.exports.win32 = win32; diff --git a/node_modules/fs-extra/node_modules/path-is-absolute/license b/node_modules/fs-extra/node_modules/path-is-absolute/license new file mode 100644 index 0000000..654d0bf --- /dev/null +++ b/node_modules/fs-extra/node_modules/path-is-absolute/license @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/node_modules/fs-extra/node_modules/path-is-absolute/package.json b/node_modules/fs-extra/node_modules/path-is-absolute/package.json new file mode 100644 index 0000000..851195e --- /dev/null +++ b/node_modules/fs-extra/node_modules/path-is-absolute/package.json @@ -0,0 +1,77 @@ +{ + "name": "path-is-absolute", + "version": "1.0.1", + "description": "Node.js 0.12 path.isAbsolute() ponyfill", + "license": "MIT", + "repository": { + "type": "git", + "url": "git+https://github.com/sindresorhus/path-is-absolute.git" + }, + "author": { + "name": "Sindre Sorhus", + "email": "sindresorhus@gmail.com", + "url": "sindresorhus.com" + }, + "engines": { + "node": ">=0.10.0" + }, + "scripts": { + "test": "xo && node test.js" + }, + "files": [ + "index.js" + ], + "keywords": [ + "path", + "paths", + "file", + "dir", + "absolute", + "isabsolute", + "is-absolute", + "built-in", + "util", + "utils", + "core", + "ponyfill", + "polyfill", + "shim", + "is", + "detect", + "check" + ], + "devDependencies": { + "xo": "^0.16.0" + }, + "gitHead": "edc91d348b21dac2ab65ea2fbec2868e2eff5eb6", + "bugs": { + "url": "https://github.com/sindresorhus/path-is-absolute/issues" + }, + "homepage": "https://github.com/sindresorhus/path-is-absolute#readme", + "_id": "path-is-absolute@1.0.1", + "_shasum": "174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f", + "_from": "path-is-absolute@>=1.0.0 <2.0.0", + "_npmVersion": "3.10.3", + "_nodeVersion": "6.6.0", + "_npmUser": { + "name": "sindresorhus", + "email": "sindresorhus@gmail.com" + }, + "dist": { + "shasum": "174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f", + "tarball": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" + }, + "maintainers": [ + { + "name": "sindresorhus", + "email": "sindresorhus@gmail.com" + } + ], + "_npmOperationalInternal": { + "host": "packages-12-west.internal.npmjs.com", + "tmp": "tmp/path-is-absolute-1.0.1.tgz_1475210523565_0.9876507974695414" + }, + "directories": {}, + "_resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "readme": "ERROR: No README data found!" +} diff --git a/node_modules/fs-extra/node_modules/path-is-absolute/readme.md b/node_modules/fs-extra/node_modules/path-is-absolute/readme.md new file mode 100644 index 0000000..8dbdf5f --- /dev/null +++ b/node_modules/fs-extra/node_modules/path-is-absolute/readme.md @@ -0,0 +1,59 @@ +# path-is-absolute [![Build Status](https://travis-ci.org/sindresorhus/path-is-absolute.svg?branch=master)](https://travis-ci.org/sindresorhus/path-is-absolute) + +> Node.js 0.12 [`path.isAbsolute()`](http://nodejs.org/api/path.html#path_path_isabsolute_path) [ponyfill](https://ponyfill.com) + + +## Install + +``` +$ npm install --save path-is-absolute +``` + + +## Usage + +```js +const pathIsAbsolute = require('path-is-absolute'); + +// Running on Linux +pathIsAbsolute('/home/foo'); +//=> true +pathIsAbsolute('C:/Users/foo'); +//=> false + +// Running on Windows +pathIsAbsolute('C:/Users/foo'); +//=> true +pathIsAbsolute('/home/foo'); +//=> false + +// Running on any OS +pathIsAbsolute.posix('/home/foo'); +//=> true +pathIsAbsolute.posix('C:/Users/foo'); +//=> false +pathIsAbsolute.win32('C:/Users/foo'); +//=> true +pathIsAbsolute.win32('/home/foo'); +//=> false +``` + + +## API + +See the [`path.isAbsolute()` docs](http://nodejs.org/api/path.html#path_path_isabsolute_path). + +### pathIsAbsolute(path) + +### pathIsAbsolute.posix(path) + +POSIX specific version. + +### pathIsAbsolute.win32(path) + +Windows specific version. + + +## License + +MIT © [Sindre Sorhus](https://sindresorhus.com) diff --git a/node_modules/fs-extra/node_modules/rimraf/LICENSE b/node_modules/fs-extra/node_modules/rimraf/LICENSE new file mode 100644 index 0000000..19129e3 --- /dev/null +++ b/node_modules/fs-extra/node_modules/rimraf/LICENSE @@ -0,0 +1,15 @@ +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/node_modules/fs-extra/node_modules/rimraf/README.md b/node_modules/fs-extra/node_modules/rimraf/README.md new file mode 100644 index 0000000..423b8cf --- /dev/null +++ b/node_modules/fs-extra/node_modules/rimraf/README.md @@ -0,0 +1,101 @@ +[![Build Status](https://travis-ci.org/isaacs/rimraf.svg?branch=master)](https://travis-ci.org/isaacs/rimraf) [![Dependency Status](https://david-dm.org/isaacs/rimraf.svg)](https://david-dm.org/isaacs/rimraf) [![devDependency Status](https://david-dm.org/isaacs/rimraf/dev-status.svg)](https://david-dm.org/isaacs/rimraf#info=devDependencies) + +The [UNIX command](http://en.wikipedia.org/wiki/Rm_(Unix)) `rm -rf` for node. + +Install with `npm install rimraf`, or just drop rimraf.js somewhere. + +## API + +`rimraf(f, [opts], callback)` + +The first parameter will be interpreted as a globbing pattern for files. If you +want to disable globbing you can do so with `opts.disableGlob` (defaults to +`false`). This might be handy, for instance, if you have filenames that contain +globbing wildcard characters. + +The callback will be called with an error if there is one. Certain +errors are handled for you: + +* Windows: `EBUSY` and `ENOTEMPTY` - rimraf will back off a maximum of + `opts.maxBusyTries` times before giving up, adding 100ms of wait + between each attempt. The default `maxBusyTries` is 3. +* `ENOENT` - If the file doesn't exist, rimraf will return + successfully, since your desired outcome is already the case. +* `EMFILE` - Since `readdir` requires opening a file descriptor, it's + possible to hit `EMFILE` if too many file descriptors are in use. + In the sync case, there's nothing to be done for this. But in the + async case, rimraf will gradually back off with timeouts up to + `opts.emfileWait` ms, which defaults to 1000. + +## options + +* unlink, chmod, stat, lstat, rmdir, readdir, + unlinkSync, chmodSync, statSync, lstatSync, rmdirSync, readdirSync + + In order to use a custom file system library, you can override + specific fs functions on the options object. + + If any of these functions are present on the options object, then + the supplied function will be used instead of the default fs + method. + + Sync methods are only relevant for `rimraf.sync()`, of course. + + For example: + + ```javascript + var myCustomFS = require('some-custom-fs') + + rimraf('some-thing', myCustomFS, callback) + ``` + +* maxBusyTries + + If an `EBUSY`, `ENOTEMPTY`, or `EPERM` error code is encountered + on Windows systems, then rimraf will retry with a linear backoff + wait of 100ms longer on each try. The default maxBusyTries is 3. + + Only relevant for async usage. + +* emfileWait + + If an `EMFILE` error is encountered, then rimraf will retry + repeatedly with a linear backoff of 1ms longer on each try, until + the timeout counter hits this max. The default limit is 1000. + + If you repeatedly encounter `EMFILE` errors, then consider using + [graceful-fs](http://npm.im/graceful-fs) in your program. + + Only relevant for async usage. + +* glob + + Set to `false` to disable [glob](http://npm.im/glob) pattern + matching. + + Set to an object to pass options to the glob module. The default + glob options are `{ nosort: true, silent: true }`. + + Glob version 6 is used in this module. + + Relevant for both sync and async usage. + +* disableGlob + + Set to any non-falsey value to disable globbing entirely. + (Equivalent to setting `glob: false`.) + +## rimraf.sync + +It can remove stuff synchronously, too. But that's not so good. Use +the async API. It's better. + +## CLI + +If installed with `npm install rimraf -g` it can be used as a global +command `rimraf [ ...]` which is useful for cross platform support. + +## mkdirp + +If you need to create a directory recursively, check out +[mkdirp](https://github.com/substack/node-mkdirp). diff --git a/node_modules/fs-extra/node_modules/rimraf/bin.js b/node_modules/fs-extra/node_modules/rimraf/bin.js new file mode 100644 index 0000000..1bd5a0d --- /dev/null +++ b/node_modules/fs-extra/node_modules/rimraf/bin.js @@ -0,0 +1,40 @@ +#!/usr/bin/env node + +var rimraf = require('./') + +var help = false +var dashdash = false +var args = process.argv.slice(2).filter(function(arg) { + if (dashdash) + return !!arg + else if (arg === '--') + dashdash = true + else if (arg.match(/^(-+|\/)(h(elp)?|\?)$/)) + help = true + else + return !!arg +}); + +if (help || args.length === 0) { + // If they didn't ask for help, then this is not a "success" + var log = help ? console.log : console.error + log('Usage: rimraf [ ...]') + log('') + log(' Deletes all files and folders at "path" recursively.') + log('') + log('Options:') + log('') + log(' -h, --help Display this usage info') + process.exit(help ? 0 : 1) +} else + go(0) + +function go (n) { + if (n >= args.length) + return + rimraf(args[n], function (er) { + if (er) + throw er + go(n+1) + }) +} diff --git a/node_modules/fs-extra/node_modules/rimraf/node_modules/glob/LICENSE b/node_modules/fs-extra/node_modules/rimraf/node_modules/glob/LICENSE new file mode 100644 index 0000000..19129e3 --- /dev/null +++ b/node_modules/fs-extra/node_modules/rimraf/node_modules/glob/LICENSE @@ -0,0 +1,15 @@ +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/node_modules/fs-extra/node_modules/rimraf/node_modules/glob/README.md b/node_modules/fs-extra/node_modules/rimraf/node_modules/glob/README.md new file mode 100644 index 0000000..baa1d1b --- /dev/null +++ b/node_modules/fs-extra/node_modules/rimraf/node_modules/glob/README.md @@ -0,0 +1,368 @@ +# Glob + +Match files using the patterns the shell uses, like stars and stuff. + +[![Build Status](https://travis-ci.org/isaacs/node-glob.svg?branch=master)](https://travis-ci.org/isaacs/node-glob/) [![Build Status](https://ci.appveyor.com/api/projects/status/kd7f3yftf7unxlsx?svg=true)](https://ci.appveyor.com/project/isaacs/node-glob) [![Coverage Status](https://coveralls.io/repos/isaacs/node-glob/badge.svg?branch=master&service=github)](https://coveralls.io/github/isaacs/node-glob?branch=master) + +This is a glob implementation in JavaScript. It uses the `minimatch` +library to do its matching. + +![](oh-my-glob.gif) + +## Usage + +Install with npm + +``` +npm i glob +``` + +```javascript +var glob = require("glob") + +// options is optional +glob("**/*.js", options, function (er, files) { + // files is an array of filenames. + // If the `nonull` option is set, and nothing + // was found, then files is ["**/*.js"] + // er is an error object or null. +}) +``` + +## Glob Primer + +"Globs" are the patterns you type when you do stuff like `ls *.js` on +the command line, or put `build/*` in a `.gitignore` file. + +Before parsing the path part patterns, braced sections are expanded +into a set. Braced sections start with `{` and end with `}`, with any +number of comma-delimited sections within. Braced sections may contain +slash characters, so `a{/b/c,bcd}` would expand into `a/b/c` and `abcd`. + +The following characters have special magic meaning when used in a +path portion: + +* `*` Matches 0 or more characters in a single path portion +* `?` Matches 1 character +* `[...]` Matches a range of characters, similar to a RegExp range. + If the first character of the range is `!` or `^` then it matches + any character not in the range. +* `!(pattern|pattern|pattern)` Matches anything that does not match + any of the patterns provided. +* `?(pattern|pattern|pattern)` Matches zero or one occurrence of the + patterns provided. +* `+(pattern|pattern|pattern)` Matches one or more occurrences of the + patterns provided. +* `*(a|b|c)` Matches zero or more occurrences of the patterns provided +* `@(pattern|pat*|pat?erN)` Matches exactly one of the patterns + provided +* `**` If a "globstar" is alone in a path portion, then it matches + zero or more directories and subdirectories searching for matches. + It does not crawl symlinked directories. + +### Dots + +If a file or directory path portion has a `.` as the first character, +then it will not match any glob pattern unless that pattern's +corresponding path part also has a `.` as its first character. + +For example, the pattern `a/.*/c` would match the file at `a/.b/c`. +However the pattern `a/*/c` would not, because `*` does not start with +a dot character. + +You can make glob treat dots as normal characters by setting +`dot:true` in the options. + +### Basename Matching + +If you set `matchBase:true` in the options, and the pattern has no +slashes in it, then it will seek for any file anywhere in the tree +with a matching basename. For example, `*.js` would match +`test/simple/basic.js`. + +### Empty Sets + +If no matching files are found, then an empty array is returned. This +differs from the shell, where the pattern itself is returned. For +example: + + $ echo a*s*d*f + a*s*d*f + +To get the bash-style behavior, set the `nonull:true` in the options. + +### See Also: + +* `man sh` +* `man bash` (Search for "Pattern Matching") +* `man 3 fnmatch` +* `man 5 gitignore` +* [minimatch documentation](https://github.com/isaacs/minimatch) + +## glob.hasMagic(pattern, [options]) + +Returns `true` if there are any special characters in the pattern, and +`false` otherwise. + +Note that the options affect the results. If `noext:true` is set in +the options object, then `+(a|b)` will not be considered a magic +pattern. If the pattern has a brace expansion, like `a/{b/c,x/y}` +then that is considered magical, unless `nobrace:true` is set in the +options. + +## glob(pattern, [options], cb) + +* `pattern` `{String}` Pattern to be matched +* `options` `{Object}` +* `cb` `{Function}` + * `err` `{Error | null}` + * `matches` `{Array}` filenames found matching the pattern + +Perform an asynchronous glob search. + +## glob.sync(pattern, [options]) + +* `pattern` `{String}` Pattern to be matched +* `options` `{Object}` +* return: `{Array}` filenames found matching the pattern + +Perform a synchronous glob search. + +## Class: glob.Glob + +Create a Glob object by instantiating the `glob.Glob` class. + +```javascript +var Glob = require("glob").Glob +var mg = new Glob(pattern, options, cb) +``` + +It's an EventEmitter, and starts walking the filesystem to find matches +immediately. + +### new glob.Glob(pattern, [options], [cb]) + +* `pattern` `{String}` pattern to search for +* `options` `{Object}` +* `cb` `{Function}` Called when an error occurs, or matches are found + * `err` `{Error | null}` + * `matches` `{Array}` filenames found matching the pattern + +Note that if the `sync` flag is set in the options, then matches will +be immediately available on the `g.found` member. + +### Properties + +* `minimatch` The minimatch object that the glob uses. +* `options` The options object passed in. +* `aborted` Boolean which is set to true when calling `abort()`. There + is no way at this time to continue a glob search after aborting, but + you can re-use the statCache to avoid having to duplicate syscalls. +* `cache` Convenience object. Each field has the following possible + values: + * `false` - Path does not exist + * `true` - Path exists + * `'FILE'` - Path exists, and is not a directory + * `'DIR'` - Path exists, and is a directory + * `[file, entries, ...]` - Path exists, is a directory, and the + array value is the results of `fs.readdir` +* `statCache` Cache of `fs.stat` results, to prevent statting the same + path multiple times. +* `symlinks` A record of which paths are symbolic links, which is + relevant in resolving `**` patterns. +* `realpathCache` An optional object which is passed to `fs.realpath` + to minimize unnecessary syscalls. It is stored on the instantiated + Glob object, and may be re-used. + +### Events + +* `end` When the matching is finished, this is emitted with all the + matches found. If the `nonull` option is set, and no match was found, + then the `matches` list contains the original pattern. The matches + are sorted, unless the `nosort` flag is set. +* `match` Every time a match is found, this is emitted with the specific + thing that matched. It is not deduplicated or resolved to a realpath. +* `error` Emitted when an unexpected error is encountered, or whenever + any fs error occurs if `options.strict` is set. +* `abort` When `abort()` is called, this event is raised. + +### Methods + +* `pause` Temporarily stop the search +* `resume` Resume the search +* `abort` Stop the search forever + +### Options + +All the options that can be passed to Minimatch can also be passed to +Glob to change pattern matching behavior. Also, some have been added, +or have glob-specific ramifications. + +All options are false by default, unless otherwise noted. + +All options are added to the Glob object, as well. + +If you are running many `glob` operations, you can pass a Glob object +as the `options` argument to a subsequent operation to shortcut some +`stat` and `readdir` calls. At the very least, you may pass in shared +`symlinks`, `statCache`, `realpathCache`, and `cache` options, so that +parallel glob operations will be sped up by sharing information about +the filesystem. + +* `cwd` The current working directory in which to search. Defaults + to `process.cwd()`. +* `root` The place where patterns starting with `/` will be mounted + onto. Defaults to `path.resolve(options.cwd, "/")` (`/` on Unix + systems, and `C:\` or some such on Windows.) +* `dot` Include `.dot` files in normal matches and `globstar` matches. + Note that an explicit dot in a portion of the pattern will always + match dot files. +* `nomount` By default, a pattern starting with a forward-slash will be + "mounted" onto the root setting, so that a valid filesystem path is + returned. Set this flag to disable that behavior. +* `mark` Add a `/` character to directory matches. Note that this + requires additional stat calls. +* `nosort` Don't sort the results. +* `stat` Set to true to stat *all* results. This reduces performance + somewhat, and is completely unnecessary, unless `readdir` is presumed + to be an untrustworthy indicator of file existence. +* `silent` When an unusual error is encountered when attempting to + read a directory, a warning will be printed to stderr. Set the + `silent` option to true to suppress these warnings. +* `strict` When an unusual error is encountered when attempting to + read a directory, the process will just continue on in search of + other matches. Set the `strict` option to raise an error in these + cases. +* `cache` See `cache` property above. Pass in a previously generated + cache object to save some fs calls. +* `statCache` A cache of results of filesystem information, to prevent + unnecessary stat calls. While it should not normally be necessary + to set this, you may pass the statCache from one glob() call to the + options object of another, if you know that the filesystem will not + change between calls. (See "Race Conditions" below.) +* `symlinks` A cache of known symbolic links. You may pass in a + previously generated `symlinks` object to save `lstat` calls when + resolving `**` matches. +* `sync` DEPRECATED: use `glob.sync(pattern, opts)` instead. +* `nounique` In some cases, brace-expanded patterns can result in the + same file showing up multiple times in the result set. By default, + this implementation prevents duplicates in the result set. Set this + flag to disable that behavior. +* `nonull` Set to never return an empty set, instead returning a set + containing the pattern itself. This is the default in glob(3). +* `debug` Set to enable debug logging in minimatch and glob. +* `nobrace` Do not expand `{a,b}` and `{1..3}` brace sets. +* `noglobstar` Do not match `**` against multiple filenames. (Ie, + treat it as a normal `*` instead.) +* `noext` Do not match `+(a|b)` "extglob" patterns. +* `nocase` Perform a case-insensitive match. Note: on + case-insensitive filesystems, non-magic patterns will match by + default, since `stat` and `readdir` will not raise errors. +* `matchBase` Perform a basename-only match if the pattern does not + contain any slash characters. That is, `*.js` would be treated as + equivalent to `**/*.js`, matching all js files in all directories. +* `nodir` Do not match directories, only files. (Note: to match + *only* directories, simply put a `/` at the end of the pattern.) +* `ignore` Add a pattern or an array of glob patterns to exclude matches. + Note: `ignore` patterns are *always* in `dot:true` mode, regardless + of any other settings. +* `follow` Follow symlinked directories when expanding `**` patterns. + Note that this can result in a lot of duplicate references in the + presence of cyclic links. +* `realpath` Set to true to call `fs.realpath` on all of the results. + In the case of a symlink that cannot be resolved, the full absolute + path to the matched entry is returned (though it will usually be a + broken symlink) +* `absolute` Set to true to always receive absolute paths for matched + files. Unlike `realpath`, this also affects the values returned in + the `match` event. + +## Comparisons to other fnmatch/glob implementations + +While strict compliance with the existing standards is a worthwhile +goal, some discrepancies exist between node-glob and other +implementations, and are intentional. + +The double-star character `**` is supported by default, unless the +`noglobstar` flag is set. This is supported in the manner of bsdglob +and bash 4.3, where `**` only has special significance if it is the only +thing in a path part. That is, `a/**/b` will match `a/x/y/b`, but +`a/**b` will not. + +Note that symlinked directories are not crawled as part of a `**`, +though their contents may match against subsequent portions of the +pattern. This prevents infinite loops and duplicates and the like. + +If an escaped pattern has no matches, and the `nonull` flag is set, +then glob returns the pattern as-provided, rather than +interpreting the character escapes. For example, +`glob.match([], "\\*a\\?")` will return `"\\*a\\?"` rather than +`"*a?"`. This is akin to setting the `nullglob` option in bash, except +that it does not resolve escaped pattern characters. + +If brace expansion is not disabled, then it is performed before any +other interpretation of the glob pattern. Thus, a pattern like +`+(a|{b),c)}`, which would not be valid in bash or zsh, is expanded +**first** into the set of `+(a|b)` and `+(a|c)`, and those patterns are +checked for validity. Since those two are valid, matching proceeds. + +### Comments and Negation + +Previously, this module let you mark a pattern as a "comment" if it +started with a `#` character, or a "negated" pattern if it started +with a `!` character. + +These options were deprecated in version 5, and removed in version 6. + +To specify things that should not match, use the `ignore` option. + +## Windows + +**Please only use forward-slashes in glob expressions.** + +Though windows uses either `/` or `\` as its path separator, only `/` +characters are used by this glob implementation. You must use +forward-slashes **only** in glob expressions. Back-slashes will always +be interpreted as escape characters, not path separators. + +Results from absolute patterns such as `/foo/*` are mounted onto the +root setting using `path.join`. On windows, this will by default result +in `/foo/*` matching `C:\foo\bar.txt`. + +## Race Conditions + +Glob searching, by its very nature, is susceptible to race conditions, +since it relies on directory walking and such. + +As a result, it is possible that a file that exists when glob looks for +it may have been deleted or modified by the time it returns the result. + +As part of its internal implementation, this program caches all stat +and readdir calls that it makes, in order to cut down on system +overhead. However, this also makes it even more susceptible to races, +especially if the cache or statCache objects are reused between glob +calls. + +Users are thus advised not to use a glob result as a guarantee of +filesystem state in the face of rapid changes. For the vast majority +of operations, this is never a problem. + +## Contributing + +Any change to behavior (including bugfixes) must come with a test. + +Patches that fail tests or reduce performance will be rejected. + +``` +# to run tests +npm test + +# to re-generate test fixtures +npm run test-regen + +# to benchmark against bash/zsh +npm run bench + +# to profile javascript +npm run prof +``` diff --git a/node_modules/fs-extra/node_modules/rimraf/node_modules/glob/common.js b/node_modules/fs-extra/node_modules/rimraf/node_modules/glob/common.js new file mode 100644 index 0000000..78362b8 --- /dev/null +++ b/node_modules/fs-extra/node_modules/rimraf/node_modules/glob/common.js @@ -0,0 +1,236 @@ +exports.alphasort = alphasort +exports.alphasorti = alphasorti +exports.setopts = setopts +exports.ownProp = ownProp +exports.makeAbs = makeAbs +exports.finish = finish +exports.mark = mark +exports.isIgnored = isIgnored +exports.childrenIgnored = childrenIgnored + +function ownProp (obj, field) { + return Object.prototype.hasOwnProperty.call(obj, field) +} + +var path = require("path") +var minimatch = require("minimatch") +var isAbsolute = require("path-is-absolute") +var Minimatch = minimatch.Minimatch + +function alphasorti (a, b) { + return a.toLowerCase().localeCompare(b.toLowerCase()) +} + +function alphasort (a, b) { + return a.localeCompare(b) +} + +function setupIgnores (self, options) { + self.ignore = options.ignore || [] + + if (!Array.isArray(self.ignore)) + self.ignore = [self.ignore] + + if (self.ignore.length) { + self.ignore = self.ignore.map(ignoreMap) + } +} + +// ignore patterns are always in dot:true mode. +function ignoreMap (pattern) { + var gmatcher = null + if (pattern.slice(-3) === '/**') { + var gpattern = pattern.replace(/(\/\*\*)+$/, '') + gmatcher = new Minimatch(gpattern, { dot: true }) + } + + return { + matcher: new Minimatch(pattern, { dot: true }), + gmatcher: gmatcher + } +} + +function setopts (self, pattern, options) { + if (!options) + options = {} + + // base-matching: just use globstar for that. + if (options.matchBase && -1 === pattern.indexOf("/")) { + if (options.noglobstar) { + throw new Error("base matching requires globstar") + } + pattern = "**/" + pattern + } + + self.silent = !!options.silent + self.pattern = pattern + self.strict = options.strict !== false + self.realpath = !!options.realpath + self.realpathCache = options.realpathCache || Object.create(null) + self.follow = !!options.follow + self.dot = !!options.dot + self.mark = !!options.mark + self.nodir = !!options.nodir + if (self.nodir) + self.mark = true + self.sync = !!options.sync + self.nounique = !!options.nounique + self.nonull = !!options.nonull + self.nosort = !!options.nosort + self.nocase = !!options.nocase + self.stat = !!options.stat + self.noprocess = !!options.noprocess + self.absolute = !!options.absolute + + self.maxLength = options.maxLength || Infinity + self.cache = options.cache || Object.create(null) + self.statCache = options.statCache || Object.create(null) + self.symlinks = options.symlinks || Object.create(null) + + setupIgnores(self, options) + + self.changedCwd = false + var cwd = process.cwd() + if (!ownProp(options, "cwd")) + self.cwd = cwd + else { + self.cwd = path.resolve(options.cwd) + self.changedCwd = self.cwd !== cwd + } + + self.root = options.root || path.resolve(self.cwd, "/") + self.root = path.resolve(self.root) + if (process.platform === "win32") + self.root = self.root.replace(/\\/g, "/") + + self.cwdAbs = makeAbs(self, self.cwd) + self.nomount = !!options.nomount + + // disable comments and negation in Minimatch. + // Note that they are not supported in Glob itself anyway. + options.nonegate = true + options.nocomment = true + + self.minimatch = new Minimatch(pattern, options) + self.options = self.minimatch.options +} + +function finish (self) { + var nou = self.nounique + var all = nou ? [] : Object.create(null) + + for (var i = 0, l = self.matches.length; i < l; i ++) { + var matches = self.matches[i] + if (!matches || Object.keys(matches).length === 0) { + if (self.nonull) { + // do like the shell, and spit out the literal glob + var literal = self.minimatch.globSet[i] + if (nou) + all.push(literal) + else + all[literal] = true + } + } else { + // had matches + var m = Object.keys(matches) + if (nou) + all.push.apply(all, m) + else + m.forEach(function (m) { + all[m] = true + }) + } + } + + if (!nou) + all = Object.keys(all) + + if (!self.nosort) + all = all.sort(self.nocase ? alphasorti : alphasort) + + // at *some* point we statted all of these + if (self.mark) { + for (var i = 0; i < all.length; i++) { + all[i] = self._mark(all[i]) + } + if (self.nodir) { + all = all.filter(function (e) { + var notDir = !(/\/$/.test(e)) + var c = self.cache[e] || self.cache[makeAbs(self, e)] + if (notDir && c) + notDir = c !== 'DIR' && !Array.isArray(c) + return notDir + }) + } + } + + if (self.ignore.length) + all = all.filter(function(m) { + return !isIgnored(self, m) + }) + + self.found = all +} + +function mark (self, p) { + var abs = makeAbs(self, p) + var c = self.cache[abs] + var m = p + if (c) { + var isDir = c === 'DIR' || Array.isArray(c) + var slash = p.slice(-1) === '/' + + if (isDir && !slash) + m += '/' + else if (!isDir && slash) + m = m.slice(0, -1) + + if (m !== p) { + var mabs = makeAbs(self, m) + self.statCache[mabs] = self.statCache[abs] + self.cache[mabs] = self.cache[abs] + } + } + + return m +} + +// lotta situps... +function makeAbs (self, f) { + var abs = f + if (f.charAt(0) === '/') { + abs = path.join(self.root, f) + } else if (isAbsolute(f) || f === '') { + abs = f + } else if (self.changedCwd) { + abs = path.resolve(self.cwd, f) + } else { + abs = path.resolve(f) + } + + if (process.platform === 'win32') + abs = abs.replace(/\\/g, '/') + + return abs +} + + +// Return true, if pattern ends with globstar '**', for the accompanying parent directory. +// Ex:- If node_modules/** is the pattern, add 'node_modules' to ignore list along with it's contents +function isIgnored (self, path) { + if (!self.ignore.length) + return false + + return self.ignore.some(function(item) { + return item.matcher.match(path) || !!(item.gmatcher && item.gmatcher.match(path)) + }) +} + +function childrenIgnored (self, path) { + if (!self.ignore.length) + return false + + return self.ignore.some(function(item) { + return !!(item.gmatcher && item.gmatcher.match(path)) + }) +} diff --git a/node_modules/fs-extra/node_modules/rimraf/node_modules/glob/glob.js b/node_modules/fs-extra/node_modules/rimraf/node_modules/glob/glob.js new file mode 100644 index 0000000..4078f46 --- /dev/null +++ b/node_modules/fs-extra/node_modules/rimraf/node_modules/glob/glob.js @@ -0,0 +1,790 @@ +// Approach: +// +// 1. Get the minimatch set +// 2. For each pattern in the set, PROCESS(pattern, false) +// 3. Store matches per-set, then uniq them +// +// PROCESS(pattern, inGlobStar) +// Get the first [n] items from pattern that are all strings +// Join these together. This is PREFIX. +// If there is no more remaining, then stat(PREFIX) and +// add to matches if it succeeds. END. +// +// If inGlobStar and PREFIX is symlink and points to dir +// set ENTRIES = [] +// else readdir(PREFIX) as ENTRIES +// If fail, END +// +// with ENTRIES +// If pattern[n] is GLOBSTAR +// // handle the case where the globstar match is empty +// // by pruning it out, and testing the resulting pattern +// PROCESS(pattern[0..n] + pattern[n+1 .. $], false) +// // handle other cases. +// for ENTRY in ENTRIES (not dotfiles) +// // attach globstar + tail onto the entry +// // Mark that this entry is a globstar match +// PROCESS(pattern[0..n] + ENTRY + pattern[n .. $], true) +// +// else // not globstar +// for ENTRY in ENTRIES (not dotfiles, unless pattern[n] is dot) +// Test ENTRY against pattern[n] +// If fails, continue +// If passes, PROCESS(pattern[0..n] + item + pattern[n+1 .. $]) +// +// Caveat: +// Cache all stats and readdirs results to minimize syscall. Since all +// we ever care about is existence and directory-ness, we can just keep +// `true` for files, and [children,...] for directories, or `false` for +// things that don't exist. + +module.exports = glob + +var fs = require('fs') +var rp = require('fs.realpath') +var minimatch = require('minimatch') +var Minimatch = minimatch.Minimatch +var inherits = require('inherits') +var EE = require('events').EventEmitter +var path = require('path') +var assert = require('assert') +var isAbsolute = require('path-is-absolute') +var globSync = require('./sync.js') +var common = require('./common.js') +var alphasort = common.alphasort +var alphasorti = common.alphasorti +var setopts = common.setopts +var ownProp = common.ownProp +var inflight = require('inflight') +var util = require('util') +var childrenIgnored = common.childrenIgnored +var isIgnored = common.isIgnored + +var once = require('once') + +function glob (pattern, options, cb) { + if (typeof options === 'function') cb = options, options = {} + if (!options) options = {} + + if (options.sync) { + if (cb) + throw new TypeError('callback provided to sync glob') + return globSync(pattern, options) + } + + return new Glob(pattern, options, cb) +} + +glob.sync = globSync +var GlobSync = glob.GlobSync = globSync.GlobSync + +// old api surface +glob.glob = glob + +function extend (origin, add) { + if (add === null || typeof add !== 'object') { + return origin + } + + var keys = Object.keys(add) + var i = keys.length + while (i--) { + origin[keys[i]] = add[keys[i]] + } + return origin +} + +glob.hasMagic = function (pattern, options_) { + var options = extend({}, options_) + options.noprocess = true + + var g = new Glob(pattern, options) + var set = g.minimatch.set + + if (!pattern) + return false + + if (set.length > 1) + return true + + for (var j = 0; j < set[0].length; j++) { + if (typeof set[0][j] !== 'string') + return true + } + + return false +} + +glob.Glob = Glob +inherits(Glob, EE) +function Glob (pattern, options, cb) { + if (typeof options === 'function') { + cb = options + options = null + } + + if (options && options.sync) { + if (cb) + throw new TypeError('callback provided to sync glob') + return new GlobSync(pattern, options) + } + + if (!(this instanceof Glob)) + return new Glob(pattern, options, cb) + + setopts(this, pattern, options) + this._didRealPath = false + + // process each pattern in the minimatch set + var n = this.minimatch.set.length + + // The matches are stored as {: true,...} so that + // duplicates are automagically pruned. + // Later, we do an Object.keys() on these. + // Keep them as a list so we can fill in when nonull is set. + this.matches = new Array(n) + + if (typeof cb === 'function') { + cb = once(cb) + this.on('error', cb) + this.on('end', function (matches) { + cb(null, matches) + }) + } + + var self = this + var n = this.minimatch.set.length + this._processing = 0 + this.matches = new Array(n) + + this._emitQueue = [] + this._processQueue = [] + this.paused = false + + if (this.noprocess) + return this + + if (n === 0) + return done() + + var sync = true + for (var i = 0; i < n; i ++) { + this._process(this.minimatch.set[i], i, false, done) + } + sync = false + + function done () { + --self._processing + if (self._processing <= 0) { + if (sync) { + process.nextTick(function () { + self._finish() + }) + } else { + self._finish() + } + } + } +} + +Glob.prototype._finish = function () { + assert(this instanceof Glob) + if (this.aborted) + return + + if (this.realpath && !this._didRealpath) + return this._realpath() + + common.finish(this) + this.emit('end', this.found) +} + +Glob.prototype._realpath = function () { + if (this._didRealpath) + return + + this._didRealpath = true + + var n = this.matches.length + if (n === 0) + return this._finish() + + var self = this + for (var i = 0; i < this.matches.length; i++) + this._realpathSet(i, next) + + function next () { + if (--n === 0) + self._finish() + } +} + +Glob.prototype._realpathSet = function (index, cb) { + var matchset = this.matches[index] + if (!matchset) + return cb() + + var found = Object.keys(matchset) + var self = this + var n = found.length + + if (n === 0) + return cb() + + var set = this.matches[index] = Object.create(null) + found.forEach(function (p, i) { + // If there's a problem with the stat, then it means that + // one or more of the links in the realpath couldn't be + // resolved. just return the abs value in that case. + p = self._makeAbs(p) + rp.realpath(p, self.realpathCache, function (er, real) { + if (!er) + set[real] = true + else if (er.syscall === 'stat') + set[p] = true + else + self.emit('error', er) // srsly wtf right here + + if (--n === 0) { + self.matches[index] = set + cb() + } + }) + }) +} + +Glob.prototype._mark = function (p) { + return common.mark(this, p) +} + +Glob.prototype._makeAbs = function (f) { + return common.makeAbs(this, f) +} + +Glob.prototype.abort = function () { + this.aborted = true + this.emit('abort') +} + +Glob.prototype.pause = function () { + if (!this.paused) { + this.paused = true + this.emit('pause') + } +} + +Glob.prototype.resume = function () { + if (this.paused) { + this.emit('resume') + this.paused = false + if (this._emitQueue.length) { + var eq = this._emitQueue.slice(0) + this._emitQueue.length = 0 + for (var i = 0; i < eq.length; i ++) { + var e = eq[i] + this._emitMatch(e[0], e[1]) + } + } + if (this._processQueue.length) { + var pq = this._processQueue.slice(0) + this._processQueue.length = 0 + for (var i = 0; i < pq.length; i ++) { + var p = pq[i] + this._processing-- + this._process(p[0], p[1], p[2], p[3]) + } + } + } +} + +Glob.prototype._process = function (pattern, index, inGlobStar, cb) { + assert(this instanceof Glob) + assert(typeof cb === 'function') + + if (this.aborted) + return + + this._processing++ + if (this.paused) { + this._processQueue.push([pattern, index, inGlobStar, cb]) + return + } + + //console.error('PROCESS %d', this._processing, pattern) + + // Get the first [n] parts of pattern that are all strings. + var n = 0 + while (typeof pattern[n] === 'string') { + n ++ + } + // now n is the index of the first one that is *not* a string. + + // see if there's anything else + var prefix + switch (n) { + // if not, then this is rather simple + case pattern.length: + this._processSimple(pattern.join('/'), index, cb) + return + + case 0: + // pattern *starts* with some non-trivial item. + // going to readdir(cwd), but not include the prefix in matches. + prefix = null + break + + default: + // pattern has some string bits in the front. + // whatever it starts with, whether that's 'absolute' like /foo/bar, + // or 'relative' like '../baz' + prefix = pattern.slice(0, n).join('/') + break + } + + var remain = pattern.slice(n) + + // get the list of entries. + var read + if (prefix === null) + read = '.' + else if (isAbsolute(prefix) || isAbsolute(pattern.join('/'))) { + if (!prefix || !isAbsolute(prefix)) + prefix = '/' + prefix + read = prefix + } else + read = prefix + + var abs = this._makeAbs(read) + + //if ignored, skip _processing + if (childrenIgnored(this, read)) + return cb() + + var isGlobStar = remain[0] === minimatch.GLOBSTAR + if (isGlobStar) + this._processGlobStar(prefix, read, abs, remain, index, inGlobStar, cb) + else + this._processReaddir(prefix, read, abs, remain, index, inGlobStar, cb) +} + +Glob.prototype._processReaddir = function (prefix, read, abs, remain, index, inGlobStar, cb) { + var self = this + this._readdir(abs, inGlobStar, function (er, entries) { + return self._processReaddir2(prefix, read, abs, remain, index, inGlobStar, entries, cb) + }) +} + +Glob.prototype._processReaddir2 = function (prefix, read, abs, remain, index, inGlobStar, entries, cb) { + + // if the abs isn't a dir, then nothing can match! + if (!entries) + return cb() + + // It will only match dot entries if it starts with a dot, or if + // dot is set. Stuff like @(.foo|.bar) isn't allowed. + var pn = remain[0] + var negate = !!this.minimatch.negate + var rawGlob = pn._glob + var dotOk = this.dot || rawGlob.charAt(0) === '.' + + var matchedEntries = [] + for (var i = 0; i < entries.length; i++) { + var e = entries[i] + if (e.charAt(0) !== '.' || dotOk) { + var m + if (negate && !prefix) { + m = !e.match(pn) + } else { + m = e.match(pn) + } + if (m) + matchedEntries.push(e) + } + } + + //console.error('prd2', prefix, entries, remain[0]._glob, matchedEntries) + + var len = matchedEntries.length + // If there are no matched entries, then nothing matches. + if (len === 0) + return cb() + + // if this is the last remaining pattern bit, then no need for + // an additional stat *unless* the user has specified mark or + // stat explicitly. We know they exist, since readdir returned + // them. + + if (remain.length === 1 && !this.mark && !this.stat) { + if (!this.matches[index]) + this.matches[index] = Object.create(null) + + for (var i = 0; i < len; i ++) { + var e = matchedEntries[i] + if (prefix) { + if (prefix !== '/') + e = prefix + '/' + e + else + e = prefix + e + } + + if (e.charAt(0) === '/' && !this.nomount) { + e = path.join(this.root, e) + } + this._emitMatch(index, e) + } + // This was the last one, and no stats were needed + return cb() + } + + // now test all matched entries as stand-ins for that part + // of the pattern. + remain.shift() + for (var i = 0; i < len; i ++) { + var e = matchedEntries[i] + var newPattern + if (prefix) { + if (prefix !== '/') + e = prefix + '/' + e + else + e = prefix + e + } + this._process([e].concat(remain), index, inGlobStar, cb) + } + cb() +} + +Glob.prototype._emitMatch = function (index, e) { + if (this.aborted) + return + + if (isIgnored(this, e)) + return + + if (this.paused) { + this._emitQueue.push([index, e]) + return + } + + var abs = this._makeAbs(e) + + if (this.mark) + e = this._mark(e) + + if (this.absolute) + e = abs + + if (this.matches[index][e]) + return + + if (this.nodir) { + var c = this.cache[abs] + if (c === 'DIR' || Array.isArray(c)) + return + } + + this.matches[index][e] = true + + var st = this.statCache[abs] + if (st) + this.emit('stat', e, st) + + this.emit('match', e) +} + +Glob.prototype._readdirInGlobStar = function (abs, cb) { + if (this.aborted) + return + + // follow all symlinked directories forever + // just proceed as if this is a non-globstar situation + if (this.follow) + return this._readdir(abs, false, cb) + + var lstatkey = 'lstat\0' + abs + var self = this + var lstatcb = inflight(lstatkey, lstatcb_) + + if (lstatcb) + fs.lstat(abs, lstatcb) + + function lstatcb_ (er, lstat) { + if (er) + return cb() + + var isSym = lstat.isSymbolicLink() + self.symlinks[abs] = isSym + + // If it's not a symlink or a dir, then it's definitely a regular file. + // don't bother doing a readdir in that case. + if (!isSym && !lstat.isDirectory()) { + self.cache[abs] = 'FILE' + cb() + } else + self._readdir(abs, false, cb) + } +} + +Glob.prototype._readdir = function (abs, inGlobStar, cb) { + if (this.aborted) + return + + cb = inflight('readdir\0'+abs+'\0'+inGlobStar, cb) + if (!cb) + return + + //console.error('RD %j %j', +inGlobStar, abs) + if (inGlobStar && !ownProp(this.symlinks, abs)) + return this._readdirInGlobStar(abs, cb) + + if (ownProp(this.cache, abs)) { + var c = this.cache[abs] + if (!c || c === 'FILE') + return cb() + + if (Array.isArray(c)) + return cb(null, c) + } + + var self = this + fs.readdir(abs, readdirCb(this, abs, cb)) +} + +function readdirCb (self, abs, cb) { + return function (er, entries) { + if (er) + self._readdirError(abs, er, cb) + else + self._readdirEntries(abs, entries, cb) + } +} + +Glob.prototype._readdirEntries = function (abs, entries, cb) { + if (this.aborted) + return + + // if we haven't asked to stat everything, then just + // assume that everything in there exists, so we can avoid + // having to stat it a second time. + if (!this.mark && !this.stat) { + for (var i = 0; i < entries.length; i ++) { + var e = entries[i] + if (abs === '/') + e = abs + e + else + e = abs + '/' + e + this.cache[e] = true + } + } + + this.cache[abs] = entries + return cb(null, entries) +} + +Glob.prototype._readdirError = function (f, er, cb) { + if (this.aborted) + return + + // handle errors, and cache the information + switch (er.code) { + case 'ENOTSUP': // https://github.com/isaacs/node-glob/issues/205 + case 'ENOTDIR': // totally normal. means it *does* exist. + var abs = this._makeAbs(f) + this.cache[abs] = 'FILE' + if (abs === this.cwdAbs) { + var error = new Error(er.code + ' invalid cwd ' + this.cwd) + error.path = this.cwd + error.code = er.code + this.emit('error', error) + this.abort() + } + break + + case 'ENOENT': // not terribly unusual + case 'ELOOP': + case 'ENAMETOOLONG': + case 'UNKNOWN': + this.cache[this._makeAbs(f)] = false + break + + default: // some unusual error. Treat as failure. + this.cache[this._makeAbs(f)] = false + if (this.strict) { + this.emit('error', er) + // If the error is handled, then we abort + // if not, we threw out of here + this.abort() + } + if (!this.silent) + console.error('glob error', er) + break + } + + return cb() +} + +Glob.prototype._processGlobStar = function (prefix, read, abs, remain, index, inGlobStar, cb) { + var self = this + this._readdir(abs, inGlobStar, function (er, entries) { + self._processGlobStar2(prefix, read, abs, remain, index, inGlobStar, entries, cb) + }) +} + + +Glob.prototype._processGlobStar2 = function (prefix, read, abs, remain, index, inGlobStar, entries, cb) { + //console.error('pgs2', prefix, remain[0], entries) + + // no entries means not a dir, so it can never have matches + // foo.txt/** doesn't match foo.txt + if (!entries) + return cb() + + // test without the globstar, and with every child both below + // and replacing the globstar. + var remainWithoutGlobStar = remain.slice(1) + var gspref = prefix ? [ prefix ] : [] + var noGlobStar = gspref.concat(remainWithoutGlobStar) + + // the noGlobStar pattern exits the inGlobStar state + this._process(noGlobStar, index, false, cb) + + var isSym = this.symlinks[abs] + var len = entries.length + + // If it's a symlink, and we're in a globstar, then stop + if (isSym && inGlobStar) + return cb() + + for (var i = 0; i < len; i++) { + var e = entries[i] + if (e.charAt(0) === '.' && !this.dot) + continue + + // these two cases enter the inGlobStar state + var instead = gspref.concat(entries[i], remainWithoutGlobStar) + this._process(instead, index, true, cb) + + var below = gspref.concat(entries[i], remain) + this._process(below, index, true, cb) + } + + cb() +} + +Glob.prototype._processSimple = function (prefix, index, cb) { + // XXX review this. Shouldn't it be doing the mounting etc + // before doing stat? kinda weird? + var self = this + this._stat(prefix, function (er, exists) { + self._processSimple2(prefix, index, er, exists, cb) + }) +} +Glob.prototype._processSimple2 = function (prefix, index, er, exists, cb) { + + //console.error('ps2', prefix, exists) + + if (!this.matches[index]) + this.matches[index] = Object.create(null) + + // If it doesn't exist, then just mark the lack of results + if (!exists) + return cb() + + if (prefix && isAbsolute(prefix) && !this.nomount) { + var trail = /[\/\\]$/.test(prefix) + if (prefix.charAt(0) === '/') { + prefix = path.join(this.root, prefix) + } else { + prefix = path.resolve(this.root, prefix) + if (trail) + prefix += '/' + } + } + + if (process.platform === 'win32') + prefix = prefix.replace(/\\/g, '/') + + // Mark this as a match + this._emitMatch(index, prefix) + cb() +} + +// Returns either 'DIR', 'FILE', or false +Glob.prototype._stat = function (f, cb) { + var abs = this._makeAbs(f) + var needDir = f.slice(-1) === '/' + + if (f.length > this.maxLength) + return cb() + + if (!this.stat && ownProp(this.cache, abs)) { + var c = this.cache[abs] + + if (Array.isArray(c)) + c = 'DIR' + + // It exists, but maybe not how we need it + if (!needDir || c === 'DIR') + return cb(null, c) + + if (needDir && c === 'FILE') + return cb() + + // otherwise we have to stat, because maybe c=true + // if we know it exists, but not what it is. + } + + var exists + var stat = this.statCache[abs] + if (stat !== undefined) { + if (stat === false) + return cb(null, stat) + else { + var type = stat.isDirectory() ? 'DIR' : 'FILE' + if (needDir && type === 'FILE') + return cb() + else + return cb(null, type, stat) + } + } + + var self = this + var statcb = inflight('stat\0' + abs, lstatcb_) + if (statcb) + fs.lstat(abs, statcb) + + function lstatcb_ (er, lstat) { + if (lstat && lstat.isSymbolicLink()) { + // If it's a symlink, then treat it as the target, unless + // the target does not exist, then treat it as a file. + return fs.stat(abs, function (er, stat) { + if (er) + self._stat2(f, abs, null, lstat, cb) + else + self._stat2(f, abs, er, stat, cb) + }) + } else { + self._stat2(f, abs, er, lstat, cb) + } + } +} + +Glob.prototype._stat2 = function (f, abs, er, stat, cb) { + if (er) { + this.statCache[abs] = false + return cb() + } + + var needDir = f.slice(-1) === '/' + this.statCache[abs] = stat + + if (abs.slice(-1) === '/' && !stat.isDirectory()) + return cb(null, false, stat) + + var c = stat.isDirectory() ? 'DIR' : 'FILE' + this.cache[abs] = this.cache[abs] || c + + if (needDir && c !== 'DIR') + return cb() + + return cb(null, c, stat) +} diff --git a/node_modules/fs-extra/node_modules/rimraf/node_modules/glob/node_modules/inflight/LICENSE b/node_modules/fs-extra/node_modules/rimraf/node_modules/glob/node_modules/inflight/LICENSE new file mode 100644 index 0000000..05eeeb8 --- /dev/null +++ b/node_modules/fs-extra/node_modules/rimraf/node_modules/glob/node_modules/inflight/LICENSE @@ -0,0 +1,15 @@ +The ISC License + +Copyright (c) Isaac Z. Schlueter + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/node_modules/fs-extra/node_modules/rimraf/node_modules/glob/node_modules/inflight/README.md b/node_modules/fs-extra/node_modules/rimraf/node_modules/glob/node_modules/inflight/README.md new file mode 100644 index 0000000..6dc8929 --- /dev/null +++ b/node_modules/fs-extra/node_modules/rimraf/node_modules/glob/node_modules/inflight/README.md @@ -0,0 +1,37 @@ +# inflight + +Add callbacks to requests in flight to avoid async duplication + +## USAGE + +```javascript +var inflight = require('inflight') + +// some request that does some stuff +function req(key, callback) { + // key is any random string. like a url or filename or whatever. + // + // will return either a falsey value, indicating that the + // request for this key is already in flight, or a new callback + // which when called will call all callbacks passed to inflightk + // with the same key + callback = inflight(key, callback) + + // If we got a falsey value back, then there's already a req going + if (!callback) return + + // this is where you'd fetch the url or whatever + // callback is also once()-ified, so it can safely be assigned + // to multiple events etc. First call wins. + setTimeout(function() { + callback(null, key) + }, 100) +} + +// only assigns a single setTimeout +// when it dings, all cbs get called +req('foo', cb1) +req('foo', cb2) +req('foo', cb3) +req('foo', cb4) +``` diff --git a/node_modules/fs-extra/node_modules/rimraf/node_modules/glob/node_modules/inflight/inflight.js b/node_modules/fs-extra/node_modules/rimraf/node_modules/glob/node_modules/inflight/inflight.js new file mode 100644 index 0000000..8bc96cb --- /dev/null +++ b/node_modules/fs-extra/node_modules/rimraf/node_modules/glob/node_modules/inflight/inflight.js @@ -0,0 +1,44 @@ +var wrappy = require('wrappy') +var reqs = Object.create(null) +var once = require('once') + +module.exports = wrappy(inflight) + +function inflight (key, cb) { + if (reqs[key]) { + reqs[key].push(cb) + return null + } else { + reqs[key] = [cb] + return makeres(key) + } +} + +function makeres (key) { + return once(function RES () { + var cbs = reqs[key] + var len = cbs.length + var args = slice(arguments) + for (var i = 0; i < len; i++) { + cbs[i].apply(null, args) + } + if (cbs.length > len) { + // added more in the interim. + // de-zalgo, just in case, but don't call again. + cbs.splice(0, len) + process.nextTick(function () { + RES.apply(null, args) + }) + } else { + delete reqs[key] + } + }) +} + +function slice (args) { + var length = args.length + var array = [] + + for (var i = 0; i < length; i++) array[i] = args[i] + return array +} diff --git a/node_modules/fs-extra/node_modules/rimraf/node_modules/glob/node_modules/inflight/node_modules/wrappy/LICENSE b/node_modules/fs-extra/node_modules/rimraf/node_modules/glob/node_modules/inflight/node_modules/wrappy/LICENSE new file mode 100644 index 0000000..19129e3 --- /dev/null +++ b/node_modules/fs-extra/node_modules/rimraf/node_modules/glob/node_modules/inflight/node_modules/wrappy/LICENSE @@ -0,0 +1,15 @@ +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/node_modules/fs-extra/node_modules/rimraf/node_modules/glob/node_modules/inflight/node_modules/wrappy/README.md b/node_modules/fs-extra/node_modules/rimraf/node_modules/glob/node_modules/inflight/node_modules/wrappy/README.md new file mode 100644 index 0000000..98eab25 --- /dev/null +++ b/node_modules/fs-extra/node_modules/rimraf/node_modules/glob/node_modules/inflight/node_modules/wrappy/README.md @@ -0,0 +1,36 @@ +# wrappy + +Callback wrapping utility + +## USAGE + +```javascript +var wrappy = require("wrappy") + +// var wrapper = wrappy(wrapperFunction) + +// make sure a cb is called only once +// See also: http://npm.im/once for this specific use case +var once = wrappy(function (cb) { + var called = false + return function () { + if (called) return + called = true + return cb.apply(this, arguments) + } +}) + +function printBoo () { + console.log('boo') +} +// has some rando property +printBoo.iAmBooPrinter = true + +var onlyPrintOnce = once(printBoo) + +onlyPrintOnce() // prints 'boo' +onlyPrintOnce() // does nothing + +// random property is retained! +assert.equal(onlyPrintOnce.iAmBooPrinter, true) +``` diff --git a/node_modules/fs-extra/node_modules/rimraf/node_modules/glob/node_modules/inflight/node_modules/wrappy/package.json b/node_modules/fs-extra/node_modules/rimraf/node_modules/glob/node_modules/inflight/node_modules/wrappy/package.json new file mode 100644 index 0000000..de3bfd5 --- /dev/null +++ b/node_modules/fs-extra/node_modules/rimraf/node_modules/glob/node_modules/inflight/node_modules/wrappy/package.json @@ -0,0 +1,63 @@ +{ + "name": "wrappy", + "version": "1.0.2", + "description": "Callback wrapping utility", + "main": "wrappy.js", + "files": [ + "wrappy.js" + ], + "directories": { + "test": "test" + }, + "dependencies": {}, + "devDependencies": { + "tap": "^2.3.1" + }, + "scripts": { + "test": "tap --coverage test/*.js" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/npm/wrappy.git" + }, + "author": { + "name": "Isaac Z. Schlueter", + "email": "i@izs.me", + "url": "http://blog.izs.me/" + }, + "license": "ISC", + "bugs": { + "url": "https://github.com/npm/wrappy/issues" + }, + "homepage": "https://github.com/npm/wrappy", + "gitHead": "71d91b6dc5bdeac37e218c2cf03f9ab55b60d214", + "_id": "wrappy@1.0.2", + "_shasum": "b5243d8f3ec1aa35f1364605bc0d1036e30ab69f", + "_from": "wrappy@>=1.0.0 <2.0.0", + "_npmVersion": "3.9.1", + "_nodeVersion": "5.10.1", + "_npmUser": { + "name": "zkat", + "email": "kat@sykosomatic.org" + }, + "dist": { + "shasum": "b5243d8f3ec1aa35f1364605bc0d1036e30ab69f", + "tarball": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" + }, + "maintainers": [ + { + "name": "isaacs", + "email": "i@izs.me" + }, + { + "name": "zkat", + "email": "kat@sykosomatic.org" + } + ], + "_npmOperationalInternal": { + "host": "packages-16-east.internal.npmjs.com", + "tmp": "tmp/wrappy-1.0.2.tgz_1463527848281_0.037129373755306005" + }, + "_resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "readme": "ERROR: No README data found!" +} diff --git a/node_modules/fs-extra/node_modules/rimraf/node_modules/glob/node_modules/inflight/node_modules/wrappy/wrappy.js b/node_modules/fs-extra/node_modules/rimraf/node_modules/glob/node_modules/inflight/node_modules/wrappy/wrappy.js new file mode 100644 index 0000000..bb7e7d6 --- /dev/null +++ b/node_modules/fs-extra/node_modules/rimraf/node_modules/glob/node_modules/inflight/node_modules/wrappy/wrappy.js @@ -0,0 +1,33 @@ +// Returns a wrapper function that returns a wrapped callback +// The wrapper function should do some stuff, and return a +// presumably different callback function. +// This makes sure that own properties are retained, so that +// decorations and such are not lost along the way. +module.exports = wrappy +function wrappy (fn, cb) { + if (fn && cb) return wrappy(fn)(cb) + + if (typeof fn !== 'function') + throw new TypeError('need wrapper function') + + Object.keys(fn).forEach(function (k) { + wrapper[k] = fn[k] + }) + + return wrapper + + function wrapper() { + var args = new Array(arguments.length) + for (var i = 0; i < args.length; i++) { + args[i] = arguments[i] + } + var ret = fn.apply(this, args) + var cb = args[args.length-1] + if (typeof ret === 'function' && ret !== cb) { + Object.keys(cb).forEach(function (k) { + ret[k] = cb[k] + }) + } + return ret + } +} diff --git a/node_modules/fs-extra/node_modules/rimraf/node_modules/glob/node_modules/inflight/package.json b/node_modules/fs-extra/node_modules/rimraf/node_modules/glob/node_modules/inflight/package.json new file mode 100644 index 0000000..077c122 --- /dev/null +++ b/node_modules/fs-extra/node_modules/rimraf/node_modules/glob/node_modules/inflight/package.json @@ -0,0 +1,72 @@ +{ + "name": "inflight", + "version": "1.0.5", + "description": "Add callbacks to requests in flight to avoid async duplication", + "main": "inflight.js", + "files": [ + "inflight.js" + ], + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + }, + "devDependencies": { + "tap": "^1.2.0" + }, + "scripts": { + "test": "tap test.js" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/npm/inflight.git" + }, + "author": { + "name": "Isaac Z. Schlueter", + "email": "i@izs.me", + "url": "http://blog.izs.me/" + }, + "bugs": { + "url": "https://github.com/isaacs/inflight/issues" + }, + "homepage": "https://github.com/isaacs/inflight", + "license": "ISC", + "gitHead": "559e37b4f6327fca797fe8d7fe8ed6d9cae08821", + "_id": "inflight@1.0.5", + "_shasum": "db3204cd5a9de2e6cd890b85c6e2f66bcf4f620a", + "_from": "inflight@>=1.0.4 <2.0.0", + "_npmVersion": "3.9.1", + "_nodeVersion": "5.10.1", + "_npmUser": { + "name": "zkat", + "email": "kat@sykosomatic.org" + }, + "dist": { + "shasum": "db3204cd5a9de2e6cd890b85c6e2f66bcf4f620a", + "tarball": "https://registry.npmjs.org/inflight/-/inflight-1.0.5.tgz" + }, + "maintainers": [ + { + "name": "iarna", + "email": "me@re-becca.org" + }, + { + "name": "isaacs", + "email": "i@izs.me" + }, + { + "name": "othiym23", + "email": "ogd@aoaioxxysz.net" + }, + { + "name": "zkat", + "email": "kat@sykosomatic.org" + } + ], + "_npmOperationalInternal": { + "host": "packages-12-west.internal.npmjs.com", + "tmp": "tmp/inflight-1.0.5.tgz_1463529611443_0.00041943578980863094" + }, + "directories": {}, + "_resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.5.tgz", + "readme": "ERROR: No README data found!" +} diff --git a/node_modules/fs-extra/node_modules/rimraf/node_modules/glob/node_modules/inherits/LICENSE b/node_modules/fs-extra/node_modules/rimraf/node_modules/glob/node_modules/inherits/LICENSE new file mode 100644 index 0000000..dea3013 --- /dev/null +++ b/node_modules/fs-extra/node_modules/rimraf/node_modules/glob/node_modules/inherits/LICENSE @@ -0,0 +1,16 @@ +The ISC License + +Copyright (c) Isaac Z. Schlueter + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. + diff --git a/node_modules/fs-extra/node_modules/rimraf/node_modules/glob/node_modules/inherits/README.md b/node_modules/fs-extra/node_modules/rimraf/node_modules/glob/node_modules/inherits/README.md new file mode 100644 index 0000000..b1c5665 --- /dev/null +++ b/node_modules/fs-extra/node_modules/rimraf/node_modules/glob/node_modules/inherits/README.md @@ -0,0 +1,42 @@ +Browser-friendly inheritance fully compatible with standard node.js +[inherits](http://nodejs.org/api/util.html#util_util_inherits_constructor_superconstructor). + +This package exports standard `inherits` from node.js `util` module in +node environment, but also provides alternative browser-friendly +implementation through [browser +field](https://gist.github.com/shtylman/4339901). Alternative +implementation is a literal copy of standard one located in standalone +module to avoid requiring of `util`. It also has a shim for old +browsers with no `Object.create` support. + +While keeping you sure you are using standard `inherits` +implementation in node.js environment, it allows bundlers such as +[browserify](https://github.com/substack/node-browserify) to not +include full `util` package to your client code if all you need is +just `inherits` function. It worth, because browser shim for `util` +package is large and `inherits` is often the single function you need +from it. + +It's recommended to use this package instead of +`require('util').inherits` for any code that has chances to be used +not only in node.js but in browser too. + +## usage + +```js +var inherits = require('inherits'); +// then use exactly as the standard one +``` + +## note on version ~1.0 + +Version ~1.0 had completely different motivation and is not compatible +neither with 2.0 nor with standard node.js `inherits`. + +If you are using version ~1.0 and planning to switch to ~2.0, be +careful: + +* new version uses `super_` instead of `super` for referencing + superclass +* new version overwrites current prototype while old one preserves any + existing fields on it diff --git a/node_modules/fs-extra/node_modules/rimraf/node_modules/glob/node_modules/inherits/inherits.js b/node_modules/fs-extra/node_modules/rimraf/node_modules/glob/node_modules/inherits/inherits.js new file mode 100644 index 0000000..3b94763 --- /dev/null +++ b/node_modules/fs-extra/node_modules/rimraf/node_modules/glob/node_modules/inherits/inherits.js @@ -0,0 +1,7 @@ +try { + var util = require('util'); + if (typeof util.inherits !== 'function') throw ''; + module.exports = util.inherits; +} catch (e) { + module.exports = require('./inherits_browser.js'); +} diff --git a/node_modules/fs-extra/node_modules/rimraf/node_modules/glob/node_modules/inherits/inherits_browser.js b/node_modules/fs-extra/node_modules/rimraf/node_modules/glob/node_modules/inherits/inherits_browser.js new file mode 100644 index 0000000..c1e78a7 --- /dev/null +++ b/node_modules/fs-extra/node_modules/rimraf/node_modules/glob/node_modules/inherits/inherits_browser.js @@ -0,0 +1,23 @@ +if (typeof Object.create === 'function') { + // implementation from standard node.js 'util' module + module.exports = function inherits(ctor, superCtor) { + ctor.super_ = superCtor + ctor.prototype = Object.create(superCtor.prototype, { + constructor: { + value: ctor, + enumerable: false, + writable: true, + configurable: true + } + }); + }; +} else { + // old school shim for old browsers + module.exports = function inherits(ctor, superCtor) { + ctor.super_ = superCtor + var TempCtor = function () {} + TempCtor.prototype = superCtor.prototype + ctor.prototype = new TempCtor() + ctor.prototype.constructor = ctor + } +} diff --git a/node_modules/fs-extra/node_modules/rimraf/node_modules/glob/node_modules/inherits/package.json b/node_modules/fs-extra/node_modules/rimraf/node_modules/glob/node_modules/inherits/package.json new file mode 100644 index 0000000..ecb5a35 --- /dev/null +++ b/node_modules/fs-extra/node_modules/rimraf/node_modules/glob/node_modules/inherits/package.json @@ -0,0 +1,63 @@ +{ + "name": "inherits", + "description": "Browser-friendly inheritance fully compatible with standard node.js inherits()", + "version": "2.0.3", + "keywords": [ + "inheritance", + "class", + "klass", + "oop", + "object-oriented", + "inherits", + "browser", + "browserify" + ], + "main": "./inherits.js", + "browser": "./inherits_browser.js", + "repository": { + "type": "git", + "url": "git://github.com/isaacs/inherits.git" + }, + "license": "ISC", + "scripts": { + "test": "node test" + }, + "devDependencies": { + "tap": "^7.1.0" + }, + "files": [ + "inherits.js", + "inherits_browser.js" + ], + "gitHead": "e05d0fb27c61a3ec687214f0476386b765364d5f", + "bugs": { + "url": "https://github.com/isaacs/inherits/issues" + }, + "homepage": "https://github.com/isaacs/inherits#readme", + "_id": "inherits@2.0.3", + "_shasum": "633c2c83e3da42a502f52466022480f4208261de", + "_from": "inherits@>=2.0.0 <3.0.0", + "_npmVersion": "3.10.7", + "_nodeVersion": "6.5.0", + "_npmUser": { + "name": "isaacs", + "email": "i@izs.me" + }, + "dist": { + "shasum": "633c2c83e3da42a502f52466022480f4208261de", + "tarball": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz" + }, + "maintainers": [ + { + "name": "isaacs", + "email": "i@izs.me" + } + ], + "_npmOperationalInternal": { + "host": "packages-16-east.internal.npmjs.com", + "tmp": "tmp/inherits-2.0.3.tgz_1473295776489_0.08142363070510328" + }, + "directories": {}, + "_resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "readme": "ERROR: No README data found!" +} diff --git a/node_modules/fs-extra/node_modules/rimraf/node_modules/glob/node_modules/minimatch/LICENSE b/node_modules/fs-extra/node_modules/rimraf/node_modules/glob/node_modules/minimatch/LICENSE new file mode 100644 index 0000000..19129e3 --- /dev/null +++ b/node_modules/fs-extra/node_modules/rimraf/node_modules/glob/node_modules/minimatch/LICENSE @@ -0,0 +1,15 @@ +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/node_modules/fs-extra/node_modules/rimraf/node_modules/glob/node_modules/minimatch/README.md b/node_modules/fs-extra/node_modules/rimraf/node_modules/glob/node_modules/minimatch/README.md new file mode 100644 index 0000000..ad72b81 --- /dev/null +++ b/node_modules/fs-extra/node_modules/rimraf/node_modules/glob/node_modules/minimatch/README.md @@ -0,0 +1,209 @@ +# minimatch + +A minimal matching utility. + +[![Build Status](https://secure.travis-ci.org/isaacs/minimatch.svg)](http://travis-ci.org/isaacs/minimatch) + + +This is the matching library used internally by npm. + +It works by converting glob expressions into JavaScript `RegExp` +objects. + +## Usage + +```javascript +var minimatch = require("minimatch") + +minimatch("bar.foo", "*.foo") // true! +minimatch("bar.foo", "*.bar") // false! +minimatch("bar.foo", "*.+(bar|foo)", { debug: true }) // true, and noisy! +``` + +## Features + +Supports these glob features: + +* Brace Expansion +* Extended glob matching +* "Globstar" `**` matching + +See: + +* `man sh` +* `man bash` +* `man 3 fnmatch` +* `man 5 gitignore` + +## Minimatch Class + +Create a minimatch object by instantiating the `minimatch.Minimatch` class. + +```javascript +var Minimatch = require("minimatch").Minimatch +var mm = new Minimatch(pattern, options) +``` + +### Properties + +* `pattern` The original pattern the minimatch object represents. +* `options` The options supplied to the constructor. +* `set` A 2-dimensional array of regexp or string expressions. + Each row in the + array corresponds to a brace-expanded pattern. Each item in the row + corresponds to a single path-part. For example, the pattern + `{a,b/c}/d` would expand to a set of patterns like: + + [ [ a, d ] + , [ b, c, d ] ] + + If a portion of the pattern doesn't have any "magic" in it + (that is, it's something like `"foo"` rather than `fo*o?`), then it + will be left as a string rather than converted to a regular + expression. + +* `regexp` Created by the `makeRe` method. A single regular expression + expressing the entire pattern. This is useful in cases where you wish + to use the pattern somewhat like `fnmatch(3)` with `FNM_PATH` enabled. +* `negate` True if the pattern is negated. +* `comment` True if the pattern is a comment. +* `empty` True if the pattern is `""`. + +### Methods + +* `makeRe` Generate the `regexp` member if necessary, and return it. + Will return `false` if the pattern is invalid. +* `match(fname)` Return true if the filename matches the pattern, or + false otherwise. +* `matchOne(fileArray, patternArray, partial)` Take a `/`-split + filename, and match it against a single row in the `regExpSet`. This + method is mainly for internal use, but is exposed so that it can be + used by a glob-walker that needs to avoid excessive filesystem calls. + +All other methods are internal, and will be called as necessary. + +### minimatch(path, pattern, options) + +Main export. Tests a path against the pattern using the options. + +```javascript +var isJS = minimatch(file, "*.js", { matchBase: true }) +``` + +### minimatch.filter(pattern, options) + +Returns a function that tests its +supplied argument, suitable for use with `Array.filter`. Example: + +```javascript +var javascripts = fileList.filter(minimatch.filter("*.js", {matchBase: true})) +``` + +### minimatch.match(list, pattern, options) + +Match against the list of +files, in the style of fnmatch or glob. If nothing is matched, and +options.nonull is set, then return a list containing the pattern itself. + +```javascript +var javascripts = minimatch.match(fileList, "*.js", {matchBase: true})) +``` + +### minimatch.makeRe(pattern, options) + +Make a regular expression object from the pattern. + +## Options + +All options are `false` by default. + +### debug + +Dump a ton of stuff to stderr. + +### nobrace + +Do not expand `{a,b}` and `{1..3}` brace sets. + +### noglobstar + +Disable `**` matching against multiple folder names. + +### dot + +Allow patterns to match filenames starting with a period, even if +the pattern does not explicitly have a period in that spot. + +Note that by default, `a/**/b` will **not** match `a/.d/b`, unless `dot` +is set. + +### noext + +Disable "extglob" style patterns like `+(a|b)`. + +### nocase + +Perform a case-insensitive match. + +### nonull + +When a match is not found by `minimatch.match`, return a list containing +the pattern itself if this option is set. When not set, an empty list +is returned if there are no matches. + +### matchBase + +If set, then patterns without slashes will be matched +against the basename of the path if it contains slashes. For example, +`a?b` would match the path `/xyz/123/acb`, but not `/xyz/acb/123`. + +### nocomment + +Suppress the behavior of treating `#` at the start of a pattern as a +comment. + +### nonegate + +Suppress the behavior of treating a leading `!` character as negation. + +### flipNegate + +Returns from negate expressions the same as if they were not negated. +(Ie, true on a hit, false on a miss.) + + +## Comparisons to other fnmatch/glob implementations + +While strict compliance with the existing standards is a worthwhile +goal, some discrepancies exist between minimatch and other +implementations, and are intentional. + +If the pattern starts with a `!` character, then it is negated. Set the +`nonegate` flag to suppress this behavior, and treat leading `!` +characters normally. This is perhaps relevant if you wish to start the +pattern with a negative extglob pattern like `!(a|B)`. Multiple `!` +characters at the start of a pattern will negate the pattern multiple +times. + +If a pattern starts with `#`, then it is treated as a comment, and +will not match anything. Use `\#` to match a literal `#` at the +start of a line, or set the `nocomment` flag to suppress this behavior. + +The double-star character `**` is supported by default, unless the +`noglobstar` flag is set. This is supported in the manner of bsdglob +and bash 4.1, where `**` only has special significance if it is the only +thing in a path part. That is, `a/**/b` will match `a/x/y/b`, but +`a/**b` will not. + +If an escaped pattern has no matches, and the `nonull` flag is set, +then minimatch.match returns the pattern as-provided, rather than +interpreting the character escapes. For example, +`minimatch.match([], "\\*a\\?")` will return `"\\*a\\?"` rather than +`"*a?"`. This is akin to setting the `nullglob` option in bash, except +that it does not resolve escaped pattern characters. + +If brace expansion is not disabled, then it is performed before any +other interpretation of the glob pattern. Thus, a pattern like +`+(a|{b),c)}`, which would not be valid in bash or zsh, is expanded +**first** into the set of `+(a|b)` and `+(a|c)`, and those patterns are +checked for validity. Since those two are valid, matching proceeds. diff --git a/node_modules/fs-extra/node_modules/rimraf/node_modules/glob/node_modules/minimatch/minimatch.js b/node_modules/fs-extra/node_modules/rimraf/node_modules/glob/node_modules/minimatch/minimatch.js new file mode 100644 index 0000000..5b5f8cf --- /dev/null +++ b/node_modules/fs-extra/node_modules/rimraf/node_modules/glob/node_modules/minimatch/minimatch.js @@ -0,0 +1,923 @@ +module.exports = minimatch +minimatch.Minimatch = Minimatch + +var path = { sep: '/' } +try { + path = require('path') +} catch (er) {} + +var GLOBSTAR = minimatch.GLOBSTAR = Minimatch.GLOBSTAR = {} +var expand = require('brace-expansion') + +var plTypes = { + '!': { open: '(?:(?!(?:', close: '))[^/]*?)'}, + '?': { open: '(?:', close: ')?' }, + '+': { open: '(?:', close: ')+' }, + '*': { open: '(?:', close: ')*' }, + '@': { open: '(?:', close: ')' } +} + +// any single thing other than / +// don't need to escape / when using new RegExp() +var qmark = '[^/]' + +// * => any number of characters +var star = qmark + '*?' + +// ** when dots are allowed. Anything goes, except .. and . +// not (^ or / followed by one or two dots followed by $ or /), +// followed by anything, any number of times. +var twoStarDot = '(?:(?!(?:\\\/|^)(?:\\.{1,2})($|\\\/)).)*?' + +// not a ^ or / followed by a dot, +// followed by anything, any number of times. +var twoStarNoDot = '(?:(?!(?:\\\/|^)\\.).)*?' + +// characters that need to be escaped in RegExp. +var reSpecials = charSet('().*{}+?[]^$\\!') + +// "abc" -> { a:true, b:true, c:true } +function charSet (s) { + return s.split('').reduce(function (set, c) { + set[c] = true + return set + }, {}) +} + +// normalizes slashes. +var slashSplit = /\/+/ + +minimatch.filter = filter +function filter (pattern, options) { + options = options || {} + return function (p, i, list) { + return minimatch(p, pattern, options) + } +} + +function ext (a, b) { + a = a || {} + b = b || {} + var t = {} + Object.keys(b).forEach(function (k) { + t[k] = b[k] + }) + Object.keys(a).forEach(function (k) { + t[k] = a[k] + }) + return t +} + +minimatch.defaults = function (def) { + if (!def || !Object.keys(def).length) return minimatch + + var orig = minimatch + + var m = function minimatch (p, pattern, options) { + return orig.minimatch(p, pattern, ext(def, options)) + } + + m.Minimatch = function Minimatch (pattern, options) { + return new orig.Minimatch(pattern, ext(def, options)) + } + + return m +} + +Minimatch.defaults = function (def) { + if (!def || !Object.keys(def).length) return Minimatch + return minimatch.defaults(def).Minimatch +} + +function minimatch (p, pattern, options) { + if (typeof pattern !== 'string') { + throw new TypeError('glob pattern string required') + } + + if (!options) options = {} + + // shortcut: comments match nothing. + if (!options.nocomment && pattern.charAt(0) === '#') { + return false + } + + // "" only matches "" + if (pattern.trim() === '') return p === '' + + return new Minimatch(pattern, options).match(p) +} + +function Minimatch (pattern, options) { + if (!(this instanceof Minimatch)) { + return new Minimatch(pattern, options) + } + + if (typeof pattern !== 'string') { + throw new TypeError('glob pattern string required') + } + + if (!options) options = {} + pattern = pattern.trim() + + // windows support: need to use /, not \ + if (path.sep !== '/') { + pattern = pattern.split(path.sep).join('/') + } + + this.options = options + this.set = [] + this.pattern = pattern + this.regexp = null + this.negate = false + this.comment = false + this.empty = false + + // make the set of regexps etc. + this.make() +} + +Minimatch.prototype.debug = function () {} + +Minimatch.prototype.make = make +function make () { + // don't do it more than once. + if (this._made) return + + var pattern = this.pattern + var options = this.options + + // empty patterns and comments match nothing. + if (!options.nocomment && pattern.charAt(0) === '#') { + this.comment = true + return + } + if (!pattern) { + this.empty = true + return + } + + // step 1: figure out negation, etc. + this.parseNegate() + + // step 2: expand braces + var set = this.globSet = this.braceExpand() + + if (options.debug) this.debug = console.error + + this.debug(this.pattern, set) + + // step 3: now we have a set, so turn each one into a series of path-portion + // matching patterns. + // These will be regexps, except in the case of "**", which is + // set to the GLOBSTAR object for globstar behavior, + // and will not contain any / characters + set = this.globParts = set.map(function (s) { + return s.split(slashSplit) + }) + + this.debug(this.pattern, set) + + // glob --> regexps + set = set.map(function (s, si, set) { + return s.map(this.parse, this) + }, this) + + this.debug(this.pattern, set) + + // filter out everything that didn't compile properly. + set = set.filter(function (s) { + return s.indexOf(false) === -1 + }) + + this.debug(this.pattern, set) + + this.set = set +} + +Minimatch.prototype.parseNegate = parseNegate +function parseNegate () { + var pattern = this.pattern + var negate = false + var options = this.options + var negateOffset = 0 + + if (options.nonegate) return + + for (var i = 0, l = pattern.length + ; i < l && pattern.charAt(i) === '!' + ; i++) { + negate = !negate + negateOffset++ + } + + if (negateOffset) this.pattern = pattern.substr(negateOffset) + this.negate = negate +} + +// Brace expansion: +// a{b,c}d -> abd acd +// a{b,}c -> abc ac +// a{0..3}d -> a0d a1d a2d a3d +// a{b,c{d,e}f}g -> abg acdfg acefg +// a{b,c}d{e,f}g -> abdeg acdeg abdeg abdfg +// +// Invalid sets are not expanded. +// a{2..}b -> a{2..}b +// a{b}c -> a{b}c +minimatch.braceExpand = function (pattern, options) { + return braceExpand(pattern, options) +} + +Minimatch.prototype.braceExpand = braceExpand + +function braceExpand (pattern, options) { + if (!options) { + if (this instanceof Minimatch) { + options = this.options + } else { + options = {} + } + } + + pattern = typeof pattern === 'undefined' + ? this.pattern : pattern + + if (typeof pattern === 'undefined') { + throw new TypeError('undefined pattern') + } + + if (options.nobrace || + !pattern.match(/\{.*\}/)) { + // shortcut. no need to expand. + return [pattern] + } + + return expand(pattern) +} + +// parse a component of the expanded set. +// At this point, no pattern may contain "/" in it +// so we're going to return a 2d array, where each entry is the full +// pattern, split on '/', and then turned into a regular expression. +// A regexp is made at the end which joins each array with an +// escaped /, and another full one which joins each regexp with |. +// +// Following the lead of Bash 4.1, note that "**" only has special meaning +// when it is the *only* thing in a path portion. Otherwise, any series +// of * is equivalent to a single *. Globstar behavior is enabled by +// default, and can be disabled by setting options.noglobstar. +Minimatch.prototype.parse = parse +var SUBPARSE = {} +function parse (pattern, isSub) { + if (pattern.length > 1024 * 64) { + throw new TypeError('pattern is too long') + } + + var options = this.options + + // shortcuts + if (!options.noglobstar && pattern === '**') return GLOBSTAR + if (pattern === '') return '' + + var re = '' + var hasMagic = !!options.nocase + var escaping = false + // ? => one single character + var patternListStack = [] + var negativeLists = [] + var stateChar + var inClass = false + var reClassStart = -1 + var classStart = -1 + // . and .. never match anything that doesn't start with ., + // even when options.dot is set. + var patternStart = pattern.charAt(0) === '.' ? '' // anything + // not (start or / followed by . or .. followed by / or end) + : options.dot ? '(?!(?:^|\\\/)\\.{1,2}(?:$|\\\/))' + : '(?!\\.)' + var self = this + + function clearStateChar () { + if (stateChar) { + // we had some state-tracking character + // that wasn't consumed by this pass. + switch (stateChar) { + case '*': + re += star + hasMagic = true + break + case '?': + re += qmark + hasMagic = true + break + default: + re += '\\' + stateChar + break + } + self.debug('clearStateChar %j %j', stateChar, re) + stateChar = false + } + } + + for (var i = 0, len = pattern.length, c + ; (i < len) && (c = pattern.charAt(i)) + ; i++) { + this.debug('%s\t%s %s %j', pattern, i, re, c) + + // skip over any that are escaped. + if (escaping && reSpecials[c]) { + re += '\\' + c + escaping = false + continue + } + + switch (c) { + case '/': + // completely not allowed, even escaped. + // Should already be path-split by now. + return false + + case '\\': + clearStateChar() + escaping = true + continue + + // the various stateChar values + // for the "extglob" stuff. + case '?': + case '*': + case '+': + case '@': + case '!': + this.debug('%s\t%s %s %j <-- stateChar', pattern, i, re, c) + + // all of those are literals inside a class, except that + // the glob [!a] means [^a] in regexp + if (inClass) { + this.debug(' in class') + if (c === '!' && i === classStart + 1) c = '^' + re += c + continue + } + + // if we already have a stateChar, then it means + // that there was something like ** or +? in there. + // Handle the stateChar, then proceed with this one. + self.debug('call clearStateChar %j', stateChar) + clearStateChar() + stateChar = c + // if extglob is disabled, then +(asdf|foo) isn't a thing. + // just clear the statechar *now*, rather than even diving into + // the patternList stuff. + if (options.noext) clearStateChar() + continue + + case '(': + if (inClass) { + re += '(' + continue + } + + if (!stateChar) { + re += '\\(' + continue + } + + patternListStack.push({ + type: stateChar, + start: i - 1, + reStart: re.length, + open: plTypes[stateChar].open, + close: plTypes[stateChar].close + }) + // negation is (?:(?!js)[^/]*) + re += stateChar === '!' ? '(?:(?!(?:' : '(?:' + this.debug('plType %j %j', stateChar, re) + stateChar = false + continue + + case ')': + if (inClass || !patternListStack.length) { + re += '\\)' + continue + } + + clearStateChar() + hasMagic = true + var pl = patternListStack.pop() + // negation is (?:(?!js)[^/]*) + // The others are (?:) + re += pl.close + if (pl.type === '!') { + negativeLists.push(pl) + } + pl.reEnd = re.length + continue + + case '|': + if (inClass || !patternListStack.length || escaping) { + re += '\\|' + escaping = false + continue + } + + clearStateChar() + re += '|' + continue + + // these are mostly the same in regexp and glob + case '[': + // swallow any state-tracking char before the [ + clearStateChar() + + if (inClass) { + re += '\\' + c + continue + } + + inClass = true + classStart = i + reClassStart = re.length + re += c + continue + + case ']': + // a right bracket shall lose its special + // meaning and represent itself in + // a bracket expression if it occurs + // first in the list. -- POSIX.2 2.8.3.2 + if (i === classStart + 1 || !inClass) { + re += '\\' + c + escaping = false + continue + } + + // handle the case where we left a class open. + // "[z-a]" is valid, equivalent to "\[z-a\]" + if (inClass) { + // split where the last [ was, make sure we don't have + // an invalid re. if so, re-walk the contents of the + // would-be class to re-translate any characters that + // were passed through as-is + // TODO: It would probably be faster to determine this + // without a try/catch and a new RegExp, but it's tricky + // to do safely. For now, this is safe and works. + var cs = pattern.substring(classStart + 1, i) + try { + RegExp('[' + cs + ']') + } catch (er) { + // not a valid class! + var sp = this.parse(cs, SUBPARSE) + re = re.substr(0, reClassStart) + '\\[' + sp[0] + '\\]' + hasMagic = hasMagic || sp[1] + inClass = false + continue + } + } + + // finish up the class. + hasMagic = true + inClass = false + re += c + continue + + default: + // swallow any state char that wasn't consumed + clearStateChar() + + if (escaping) { + // no need + escaping = false + } else if (reSpecials[c] + && !(c === '^' && inClass)) { + re += '\\' + } + + re += c + + } // switch + } // for + + // handle the case where we left a class open. + // "[abc" is valid, equivalent to "\[abc" + if (inClass) { + // split where the last [ was, and escape it + // this is a huge pita. We now have to re-walk + // the contents of the would-be class to re-translate + // any characters that were passed through as-is + cs = pattern.substr(classStart + 1) + sp = this.parse(cs, SUBPARSE) + re = re.substr(0, reClassStart) + '\\[' + sp[0] + hasMagic = hasMagic || sp[1] + } + + // handle the case where we had a +( thing at the *end* + // of the pattern. + // each pattern list stack adds 3 chars, and we need to go through + // and escape any | chars that were passed through as-is for the regexp. + // Go through and escape them, taking care not to double-escape any + // | chars that were already escaped. + for (pl = patternListStack.pop(); pl; pl = patternListStack.pop()) { + var tail = re.slice(pl.reStart + pl.open.length) + this.debug('setting tail', re, pl) + // maybe some even number of \, then maybe 1 \, followed by a | + tail = tail.replace(/((?:\\{2}){0,64})(\\?)\|/g, function (_, $1, $2) { + if (!$2) { + // the | isn't already escaped, so escape it. + $2 = '\\' + } + + // need to escape all those slashes *again*, without escaping the + // one that we need for escaping the | character. As it works out, + // escaping an even number of slashes can be done by simply repeating + // it exactly after itself. That's why this trick works. + // + // I am sorry that you have to see this. + return $1 + $1 + $2 + '|' + }) + + this.debug('tail=%j\n %s', tail, tail, pl, re) + var t = pl.type === '*' ? star + : pl.type === '?' ? qmark + : '\\' + pl.type + + hasMagic = true + re = re.slice(0, pl.reStart) + t + '\\(' + tail + } + + // handle trailing things that only matter at the very end. + clearStateChar() + if (escaping) { + // trailing \\ + re += '\\\\' + } + + // only need to apply the nodot start if the re starts with + // something that could conceivably capture a dot + var addPatternStart = false + switch (re.charAt(0)) { + case '.': + case '[': + case '(': addPatternStart = true + } + + // Hack to work around lack of negative lookbehind in JS + // A pattern like: *.!(x).!(y|z) needs to ensure that a name + // like 'a.xyz.yz' doesn't match. So, the first negative + // lookahead, has to look ALL the way ahead, to the end of + // the pattern. + for (var n = negativeLists.length - 1; n > -1; n--) { + var nl = negativeLists[n] + + var nlBefore = re.slice(0, nl.reStart) + var nlFirst = re.slice(nl.reStart, nl.reEnd - 8) + var nlLast = re.slice(nl.reEnd - 8, nl.reEnd) + var nlAfter = re.slice(nl.reEnd) + + nlLast += nlAfter + + // Handle nested stuff like *(*.js|!(*.json)), where open parens + // mean that we should *not* include the ) in the bit that is considered + // "after" the negated section. + var openParensBefore = nlBefore.split('(').length - 1 + var cleanAfter = nlAfter + for (i = 0; i < openParensBefore; i++) { + cleanAfter = cleanAfter.replace(/\)[+*?]?/, '') + } + nlAfter = cleanAfter + + var dollar = '' + if (nlAfter === '' && isSub !== SUBPARSE) { + dollar = '$' + } + var newRe = nlBefore + nlFirst + nlAfter + dollar + nlLast + re = newRe + } + + // if the re is not "" at this point, then we need to make sure + // it doesn't match against an empty path part. + // Otherwise a/* will match a/, which it should not. + if (re !== '' && hasMagic) { + re = '(?=.)' + re + } + + if (addPatternStart) { + re = patternStart + re + } + + // parsing just a piece of a larger pattern. + if (isSub === SUBPARSE) { + return [re, hasMagic] + } + + // skip the regexp for non-magical patterns + // unescape anything in it, though, so that it'll be + // an exact match against a file etc. + if (!hasMagic) { + return globUnescape(pattern) + } + + var flags = options.nocase ? 'i' : '' + try { + var regExp = new RegExp('^' + re + '$', flags) + } catch (er) { + // If it was an invalid regular expression, then it can't match + // anything. This trick looks for a character after the end of + // the string, which is of course impossible, except in multi-line + // mode, but it's not a /m regex. + return new RegExp('$.') + } + + regExp._glob = pattern + regExp._src = re + + return regExp +} + +minimatch.makeRe = function (pattern, options) { + return new Minimatch(pattern, options || {}).makeRe() +} + +Minimatch.prototype.makeRe = makeRe +function makeRe () { + if (this.regexp || this.regexp === false) return this.regexp + + // at this point, this.set is a 2d array of partial + // pattern strings, or "**". + // + // It's better to use .match(). This function shouldn't + // be used, really, but it's pretty convenient sometimes, + // when you just want to work with a regex. + var set = this.set + + if (!set.length) { + this.regexp = false + return this.regexp + } + var options = this.options + + var twoStar = options.noglobstar ? star + : options.dot ? twoStarDot + : twoStarNoDot + var flags = options.nocase ? 'i' : '' + + var re = set.map(function (pattern) { + return pattern.map(function (p) { + return (p === GLOBSTAR) ? twoStar + : (typeof p === 'string') ? regExpEscape(p) + : p._src + }).join('\\\/') + }).join('|') + + // must match entire pattern + // ending in a * or ** will make it less strict. + re = '^(?:' + re + ')$' + + // can match anything, as long as it's not this. + if (this.negate) re = '^(?!' + re + ').*$' + + try { + this.regexp = new RegExp(re, flags) + } catch (ex) { + this.regexp = false + } + return this.regexp +} + +minimatch.match = function (list, pattern, options) { + options = options || {} + var mm = new Minimatch(pattern, options) + list = list.filter(function (f) { + return mm.match(f) + }) + if (mm.options.nonull && !list.length) { + list.push(pattern) + } + return list +} + +Minimatch.prototype.match = match +function match (f, partial) { + this.debug('match', f, this.pattern) + // short-circuit in the case of busted things. + // comments, etc. + if (this.comment) return false + if (this.empty) return f === '' + + if (f === '/' && partial) return true + + var options = this.options + + // windows: need to use /, not \ + if (path.sep !== '/') { + f = f.split(path.sep).join('/') + } + + // treat the test path as a set of pathparts. + f = f.split(slashSplit) + this.debug(this.pattern, 'split', f) + + // just ONE of the pattern sets in this.set needs to match + // in order for it to be valid. If negating, then just one + // match means that we have failed. + // Either way, return on the first hit. + + var set = this.set + this.debug(this.pattern, 'set', set) + + // Find the basename of the path by looking for the last non-empty segment + var filename + var i + for (i = f.length - 1; i >= 0; i--) { + filename = f[i] + if (filename) break + } + + for (i = 0; i < set.length; i++) { + var pattern = set[i] + var file = f + if (options.matchBase && pattern.length === 1) { + file = [filename] + } + var hit = this.matchOne(file, pattern, partial) + if (hit) { + if (options.flipNegate) return true + return !this.negate + } + } + + // didn't get any hits. this is success if it's a negative + // pattern, failure otherwise. + if (options.flipNegate) return false + return this.negate +} + +// set partial to true to test if, for example, +// "/a/b" matches the start of "/*/b/*/d" +// Partial means, if you run out of file before you run +// out of pattern, then that's fine, as long as all +// the parts match. +Minimatch.prototype.matchOne = function (file, pattern, partial) { + var options = this.options + + this.debug('matchOne', + { 'this': this, file: file, pattern: pattern }) + + this.debug('matchOne', file.length, pattern.length) + + for (var fi = 0, + pi = 0, + fl = file.length, + pl = pattern.length + ; (fi < fl) && (pi < pl) + ; fi++, pi++) { + this.debug('matchOne loop') + var p = pattern[pi] + var f = file[fi] + + this.debug(pattern, p, f) + + // should be impossible. + // some invalid regexp stuff in the set. + if (p === false) return false + + if (p === GLOBSTAR) { + this.debug('GLOBSTAR', [pattern, p, f]) + + // "**" + // a/**/b/**/c would match the following: + // a/b/x/y/z/c + // a/x/y/z/b/c + // a/b/x/b/x/c + // a/b/c + // To do this, take the rest of the pattern after + // the **, and see if it would match the file remainder. + // If so, return success. + // If not, the ** "swallows" a segment, and try again. + // This is recursively awful. + // + // a/**/b/**/c matching a/b/x/y/z/c + // - a matches a + // - doublestar + // - matchOne(b/x/y/z/c, b/**/c) + // - b matches b + // - doublestar + // - matchOne(x/y/z/c, c) -> no + // - matchOne(y/z/c, c) -> no + // - matchOne(z/c, c) -> no + // - matchOne(c, c) yes, hit + var fr = fi + var pr = pi + 1 + if (pr === pl) { + this.debug('** at the end') + // a ** at the end will just swallow the rest. + // We have found a match. + // however, it will not swallow /.x, unless + // options.dot is set. + // . and .. are *never* matched by **, for explosively + // exponential reasons. + for (; fi < fl; fi++) { + if (file[fi] === '.' || file[fi] === '..' || + (!options.dot && file[fi].charAt(0) === '.')) return false + } + return true + } + + // ok, let's see if we can swallow whatever we can. + while (fr < fl) { + var swallowee = file[fr] + + this.debug('\nglobstar while', file, fr, pattern, pr, swallowee) + + // XXX remove this slice. Just pass the start index. + if (this.matchOne(file.slice(fr), pattern.slice(pr), partial)) { + this.debug('globstar found match!', fr, fl, swallowee) + // found a match. + return true + } else { + // can't swallow "." or ".." ever. + // can only swallow ".foo" when explicitly asked. + if (swallowee === '.' || swallowee === '..' || + (!options.dot && swallowee.charAt(0) === '.')) { + this.debug('dot detected!', file, fr, pattern, pr) + break + } + + // ** swallows a segment, and continue. + this.debug('globstar swallow a segment, and continue') + fr++ + } + } + + // no match was found. + // However, in partial mode, we can't say this is necessarily over. + // If there's more *pattern* left, then + if (partial) { + // ran out of file + this.debug('\n>>> no match, partial?', file, fr, pattern, pr) + if (fr === fl) return true + } + return false + } + + // something other than ** + // non-magic patterns just have to match exactly + // patterns with magic have been turned into regexps. + var hit + if (typeof p === 'string') { + if (options.nocase) { + hit = f.toLowerCase() === p.toLowerCase() + } else { + hit = f === p + } + this.debug('string match', p, f, hit) + } else { + hit = f.match(p) + this.debug('pattern match', p, f, hit) + } + + if (!hit) return false + } + + // Note: ending in / means that we'll get a final "" + // at the end of the pattern. This can only match a + // corresponding "" at the end of the file. + // If the file ends in /, then it can only match a + // a pattern that ends in /, unless the pattern just + // doesn't have any more for it. But, a/b/ should *not* + // match "a/b/*", even though "" matches against the + // [^/]*? pattern, except in partial mode, where it might + // simply not be reached yet. + // However, a/b/ should still satisfy a/* + + // now either we fell off the end of the pattern, or we're done. + if (fi === fl && pi === pl) { + // ran out of pattern and filename at the same time. + // an exact hit! + return true + } else if (fi === fl) { + // ran out of file, but still had pattern left. + // this is ok if we're doing the match as part of + // a glob fs traversal. + return partial + } else if (pi === pl) { + // ran out of pattern, still have file left. + // this is only acceptable if we're on the very last + // empty segment of a file with a trailing slash. + // a/* should match a/b/ + var emptyFileEnd = (fi === fl - 1) && (file[fi] === '') + return emptyFileEnd + } + + // should be unreachable. + throw new Error('wtf?') +} + +// replace stuff like \* with * +function globUnescape (s) { + return s.replace(/\\(.)/g, '$1') +} + +function regExpEscape (s) { + return s.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&') +} diff --git a/node_modules/fs-extra/node_modules/rimraf/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/README.md b/node_modules/fs-extra/node_modules/rimraf/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/README.md new file mode 100644 index 0000000..1793929 --- /dev/null +++ b/node_modules/fs-extra/node_modules/rimraf/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/README.md @@ -0,0 +1,122 @@ +# brace-expansion + +[Brace expansion](https://www.gnu.org/software/bash/manual/html_node/Brace-Expansion.html), +as known from sh/bash, in JavaScript. + +[![build status](https://secure.travis-ci.org/juliangruber/brace-expansion.svg)](http://travis-ci.org/juliangruber/brace-expansion) +[![downloads](https://img.shields.io/npm/dm/brace-expansion.svg)](https://www.npmjs.org/package/brace-expansion) + +[![testling badge](https://ci.testling.com/juliangruber/brace-expansion.png)](https://ci.testling.com/juliangruber/brace-expansion) + +## Example + +```js +var expand = require('brace-expansion'); + +expand('file-{a,b,c}.jpg') +// => ['file-a.jpg', 'file-b.jpg', 'file-c.jpg'] + +expand('-v{,,}') +// => ['-v', '-v', '-v'] + +expand('file{0..2}.jpg') +// => ['file0.jpg', 'file1.jpg', 'file2.jpg'] + +expand('file-{a..c}.jpg') +// => ['file-a.jpg', 'file-b.jpg', 'file-c.jpg'] + +expand('file{2..0}.jpg') +// => ['file2.jpg', 'file1.jpg', 'file0.jpg'] + +expand('file{0..4..2}.jpg') +// => ['file0.jpg', 'file2.jpg', 'file4.jpg'] + +expand('file-{a..e..2}.jpg') +// => ['file-a.jpg', 'file-c.jpg', 'file-e.jpg'] + +expand('file{00..10..5}.jpg') +// => ['file00.jpg', 'file05.jpg', 'file10.jpg'] + +expand('{{A..C},{a..c}}') +// => ['A', 'B', 'C', 'a', 'b', 'c'] + +expand('ppp{,config,oe{,conf}}') +// => ['ppp', 'pppconfig', 'pppoe', 'pppoeconf'] +``` + +## API + +```js +var expand = require('brace-expansion'); +``` + +### var expanded = expand(str) + +Return an array of all possible and valid expansions of `str`. If none are +found, `[str]` is returned. + +Valid expansions are: + +```js +/^(.*,)+(.+)?$/ +// {a,b,...} +``` + +A comma seperated list of options, like `{a,b}` or `{a,{b,c}}` or `{,a,}`. + +```js +/^-?\d+\.\.-?\d+(\.\.-?\d+)?$/ +// {x..y[..incr]} +``` + +A numeric sequence from `x` to `y` inclusive, with optional increment. +If `x` or `y` start with a leading `0`, all the numbers will be padded +to have equal length. Negative numbers and backwards iteration work too. + +```js +/^-?\d+\.\.-?\d+(\.\.-?\d+)?$/ +// {x..y[..incr]} +``` + +An alphabetic sequence from `x` to `y` inclusive, with optional increment. +`x` and `y` must be exactly one character, and if given, `incr` must be a +number. + +For compatibility reasons, the string `${` is not eligible for brace expansion. + +## Installation + +With [npm](https://npmjs.org) do: + +```bash +npm install brace-expansion +``` + +## Contributors + +- [Julian Gruber](https://github.com/juliangruber) +- [Isaac Z. Schlueter](https://github.com/isaacs) + +## License + +(MIT) + +Copyright (c) 2013 Julian Gruber <julian@juliangruber.com> + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/node_modules/fs-extra/node_modules/rimraf/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/index.js b/node_modules/fs-extra/node_modules/rimraf/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/index.js new file mode 100644 index 0000000..955f27c --- /dev/null +++ b/node_modules/fs-extra/node_modules/rimraf/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/index.js @@ -0,0 +1,201 @@ +var concatMap = require('concat-map'); +var balanced = require('balanced-match'); + +module.exports = expandTop; + +var escSlash = '\0SLASH'+Math.random()+'\0'; +var escOpen = '\0OPEN'+Math.random()+'\0'; +var escClose = '\0CLOSE'+Math.random()+'\0'; +var escComma = '\0COMMA'+Math.random()+'\0'; +var escPeriod = '\0PERIOD'+Math.random()+'\0'; + +function numeric(str) { + return parseInt(str, 10) == str + ? parseInt(str, 10) + : str.charCodeAt(0); +} + +function escapeBraces(str) { + return str.split('\\\\').join(escSlash) + .split('\\{').join(escOpen) + .split('\\}').join(escClose) + .split('\\,').join(escComma) + .split('\\.').join(escPeriod); +} + +function unescapeBraces(str) { + return str.split(escSlash).join('\\') + .split(escOpen).join('{') + .split(escClose).join('}') + .split(escComma).join(',') + .split(escPeriod).join('.'); +} + + +// Basically just str.split(","), but handling cases +// where we have nested braced sections, which should be +// treated as individual members, like {a,{b,c},d} +function parseCommaParts(str) { + if (!str) + return ['']; + + var parts = []; + var m = balanced('{', '}', str); + + if (!m) + return str.split(','); + + var pre = m.pre; + var body = m.body; + var post = m.post; + var p = pre.split(','); + + p[p.length-1] += '{' + body + '}'; + var postParts = parseCommaParts(post); + if (post.length) { + p[p.length-1] += postParts.shift(); + p.push.apply(p, postParts); + } + + parts.push.apply(parts, p); + + return parts; +} + +function expandTop(str) { + if (!str) + return []; + + // I don't know why Bash 4.3 does this, but it does. + // Anything starting with {} will have the first two bytes preserved + // but *only* at the top level, so {},a}b will not expand to anything, + // but a{},b}c will be expanded to [a}c,abc]. + // One could argue that this is a bug in Bash, but since the goal of + // this module is to match Bash's rules, we escape a leading {} + if (str.substr(0, 2) === '{}') { + str = '\\{\\}' + str.substr(2); + } + + return expand(escapeBraces(str), true).map(unescapeBraces); +} + +function identity(e) { + return e; +} + +function embrace(str) { + return '{' + str + '}'; +} +function isPadded(el) { + return /^-?0\d/.test(el); +} + +function lte(i, y) { + return i <= y; +} +function gte(i, y) { + return i >= y; +} + +function expand(str, isTop) { + var expansions = []; + + var m = balanced('{', '}', str); + if (!m || /\$$/.test(m.pre)) return [str]; + + var isNumericSequence = /^-?\d+\.\.-?\d+(?:\.\.-?\d+)?$/.test(m.body); + var isAlphaSequence = /^[a-zA-Z]\.\.[a-zA-Z](?:\.\.-?\d+)?$/.test(m.body); + var isSequence = isNumericSequence || isAlphaSequence; + var isOptions = /^(.*,)+(.+)?$/.test(m.body); + if (!isSequence && !isOptions) { + // {a},b} + if (m.post.match(/,.*\}/)) { + str = m.pre + '{' + m.body + escClose + m.post; + return expand(str); + } + return [str]; + } + + var n; + if (isSequence) { + n = m.body.split(/\.\./); + } else { + n = parseCommaParts(m.body); + if (n.length === 1) { + // x{{a,b}}y ==> x{a}y x{b}y + n = expand(n[0], false).map(embrace); + if (n.length === 1) { + var post = m.post.length + ? expand(m.post, false) + : ['']; + return post.map(function(p) { + return m.pre + n[0] + p; + }); + } + } + } + + // at this point, n is the parts, and we know it's not a comma set + // with a single entry. + + // no need to expand pre, since it is guaranteed to be free of brace-sets + var pre = m.pre; + var post = m.post.length + ? expand(m.post, false) + : ['']; + + var N; + + if (isSequence) { + var x = numeric(n[0]); + var y = numeric(n[1]); + var width = Math.max(n[0].length, n[1].length) + var incr = n.length == 3 + ? Math.abs(numeric(n[2])) + : 1; + var test = lte; + var reverse = y < x; + if (reverse) { + incr *= -1; + test = gte; + } + var pad = n.some(isPadded); + + N = []; + + for (var i = x; test(i, y); i += incr) { + var c; + if (isAlphaSequence) { + c = String.fromCharCode(i); + if (c === '\\') + c = ''; + } else { + c = String(i); + if (pad) { + var need = width - c.length; + if (need > 0) { + var z = new Array(need + 1).join('0'); + if (i < 0) + c = '-' + z + c.slice(1); + else + c = z + c; + } + } + } + N.push(c); + } + } else { + N = concatMap(n, function(el) { return expand(el, false) }); + } + + for (var j = 0; j < N.length; j++) { + for (var k = 0; k < post.length; k++) { + var expansion = pre + N[j] + post[k]; + if (!isTop || isSequence || expansion) + expansions.push(expansion); + } + } + + return expansions; +} + diff --git a/node_modules/fs-extra/node_modules/rimraf/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/README.md b/node_modules/fs-extra/node_modules/rimraf/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/README.md new file mode 100644 index 0000000..08e918c --- /dev/null +++ b/node_modules/fs-extra/node_modules/rimraf/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/README.md @@ -0,0 +1,91 @@ +# balanced-match + +Match balanced string pairs, like `{` and `}` or `` and ``. Supports regular expressions as well! + +[![build status](https://secure.travis-ci.org/juliangruber/balanced-match.svg)](http://travis-ci.org/juliangruber/balanced-match) +[![downloads](https://img.shields.io/npm/dm/balanced-match.svg)](https://www.npmjs.org/package/balanced-match) + +[![testling badge](https://ci.testling.com/juliangruber/balanced-match.png)](https://ci.testling.com/juliangruber/balanced-match) + +## Example + +Get the first matching pair of braces: + +```js +var balanced = require('balanced-match'); + +console.log(balanced('{', '}', 'pre{in{nested}}post')); +console.log(balanced('{', '}', 'pre{first}between{second}post')); +console.log(balanced(/\s+\{\s+/, /\s+\}\s+/, 'pre { in{nest} } post')); +``` + +The matches are: + +```bash +$ node example.js +{ start: 3, end: 14, pre: 'pre', body: 'in{nested}', post: 'post' } +{ start: 3, + end: 9, + pre: 'pre', + body: 'first', + post: 'between{second}post' } +{ start: 3, end: 17, pre: 'pre', body: 'in{nest}', post: 'post' } +``` + +## API + +### var m = balanced(a, b, str) + +For the first non-nested matching pair of `a` and `b` in `str`, return an +object with those keys: + +* **start** the index of the first match of `a` +* **end** the index of the matching `b` +* **pre** the preamble, `a` and `b` not included +* **body** the match, `a` and `b` not included +* **post** the postscript, `a` and `b` not included + +If there's no match, `undefined` will be returned. + +If the `str` contains more `a` than `b` / there are unmatched pairs, the first match that was closed will be used. For example, `{{a}` will match `['{', 'a', '']` and `{a}}` will match `['', 'a', '}']`. + +### var r = balanced.range(a, b, str) + +For the first non-nested matching pair of `a` and `b` in `str`, return an +array with indexes: `[ , ]`. + +If there's no match, `undefined` will be returned. + +If the `str` contains more `a` than `b` / there are unmatched pairs, the first match that was closed will be used. For example, `{{a}` will match `[ 1, 3 ]` and `{a}}` will match `[0, 2]`. + +## Installation + +With [npm](https://npmjs.org) do: + +```bash +npm install balanced-match +``` + +## License + +(MIT) + +Copyright (c) 2013 Julian Gruber <julian@juliangruber.com> + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/node_modules/fs-extra/node_modules/rimraf/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/index.js b/node_modules/fs-extra/node_modules/rimraf/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/index.js new file mode 100644 index 0000000..e8d8587 --- /dev/null +++ b/node_modules/fs-extra/node_modules/rimraf/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/index.js @@ -0,0 +1,58 @@ +module.exports = balanced; +function balanced(a, b, str) { + if (a instanceof RegExp) a = maybeMatch(a, str); + if (b instanceof RegExp) b = maybeMatch(b, str); + + var r = range(a, b, str); + + return r && { + start: r[0], + end: r[1], + pre: str.slice(0, r[0]), + body: str.slice(r[0] + a.length, r[1]), + post: str.slice(r[1] + b.length) + }; +} + +function maybeMatch(reg, str) { + var m = str.match(reg); + return m ? m[0] : null; +} + +balanced.range = range; +function range(a, b, str) { + var begs, beg, left, right, result; + var ai = str.indexOf(a); + var bi = str.indexOf(b, ai + 1); + var i = ai; + + if (ai >= 0 && bi > 0) { + begs = []; + left = str.length; + + while (i >= 0 && !result) { + if (i == ai) { + begs.push(i); + ai = str.indexOf(a, i + 1); + } else if (begs.length == 1) { + result = [ begs.pop(), bi ]; + } else { + beg = begs.pop(); + if (beg < left) { + left = beg; + right = bi; + } + + bi = str.indexOf(b, i + 1); + } + + i = ai < bi && ai >= 0 ? ai : bi; + } + + if (begs.length) { + result = [ left, right ]; + } + } + + return result; +} diff --git a/node_modules/fs-extra/node_modules/rimraf/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/package.json b/node_modules/fs-extra/node_modules/rimraf/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/package.json new file mode 100644 index 0000000..2557dda --- /dev/null +++ b/node_modules/fs-extra/node_modules/rimraf/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/package.json @@ -0,0 +1,77 @@ +{ + "name": "balanced-match", + "description": "Match balanced character pairs, like \"{\" and \"}\"", + "version": "0.4.2", + "repository": { + "type": "git", + "url": "git://github.com/juliangruber/balanced-match.git" + }, + "homepage": "https://github.com/juliangruber/balanced-match", + "main": "index.js", + "scripts": { + "test": "make test" + }, + "dependencies": {}, + "devDependencies": { + "tape": "^4.6.0" + }, + "keywords": [ + "match", + "regexp", + "test", + "balanced", + "parse" + ], + "author": { + "name": "Julian Gruber", + "email": "mail@juliangruber.com", + "url": "http://juliangruber.com" + }, + "license": "MIT", + "testling": { + "files": "test/*.js", + "browsers": [ + "ie/8..latest", + "firefox/20..latest", + "firefox/nightly", + "chrome/25..latest", + "chrome/canary", + "opera/12..latest", + "opera/next", + "safari/5.1..latest", + "ipad/6.0..latest", + "iphone/6.0..latest", + "android-browser/4.2..latest" + ] + }, + "gitHead": "57c2ea29d89a2844ae3bdcc637c6e2cbb73725e2", + "bugs": { + "url": "https://github.com/juliangruber/balanced-match/issues" + }, + "_id": "balanced-match@0.4.2", + "_shasum": "cb3f3e3c732dc0f01ee70b403f302e61d7709838", + "_from": "balanced-match@>=0.4.1 <0.5.0", + "_npmVersion": "2.15.8", + "_nodeVersion": "4.4.7", + "_npmUser": { + "name": "juliangruber", + "email": "julian@juliangruber.com" + }, + "dist": { + "shasum": "cb3f3e3c732dc0f01ee70b403f302e61d7709838", + "tarball": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz" + }, + "maintainers": [ + { + "name": "juliangruber", + "email": "julian@juliangruber.com" + } + ], + "_npmOperationalInternal": { + "host": "packages-16-east.internal.npmjs.com", + "tmp": "tmp/balanced-match-0.4.2.tgz_1468834991581_0.6590619895141572" + }, + "directories": {}, + "_resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", + "readme": "ERROR: No README data found!" +} diff --git a/node_modules/fs-extra/node_modules/rimraf/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/LICENSE b/node_modules/fs-extra/node_modules/rimraf/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/LICENSE new file mode 100644 index 0000000..ee27ba4 --- /dev/null +++ b/node_modules/fs-extra/node_modules/rimraf/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/LICENSE @@ -0,0 +1,18 @@ +This software is released under the MIT license: + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/fs-extra/node_modules/rimraf/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/example/map.js b/node_modules/fs-extra/node_modules/rimraf/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/example/map.js new file mode 100644 index 0000000..3365621 --- /dev/null +++ b/node_modules/fs-extra/node_modules/rimraf/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/example/map.js @@ -0,0 +1,6 @@ +var concatMap = require('../'); +var xs = [ 1, 2, 3, 4, 5, 6 ]; +var ys = concatMap(xs, function (x) { + return x % 2 ? [ x - 0.1, x, x + 0.1 ] : []; +}); +console.dir(ys); diff --git a/node_modules/fs-extra/node_modules/rimraf/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/index.js b/node_modules/fs-extra/node_modules/rimraf/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/index.js new file mode 100644 index 0000000..b29a781 --- /dev/null +++ b/node_modules/fs-extra/node_modules/rimraf/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/index.js @@ -0,0 +1,13 @@ +module.exports = function (xs, fn) { + var res = []; + for (var i = 0; i < xs.length; i++) { + var x = fn(xs[i], i); + if (isArray(x)) res.push.apply(res, x); + else res.push(x); + } + return res; +}; + +var isArray = Array.isArray || function (xs) { + return Object.prototype.toString.call(xs) === '[object Array]'; +}; diff --git a/node_modules/fs-extra/node_modules/rimraf/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/package.json b/node_modules/fs-extra/node_modules/rimraf/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/package.json new file mode 100644 index 0000000..b516138 --- /dev/null +++ b/node_modules/fs-extra/node_modules/rimraf/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/package.json @@ -0,0 +1,83 @@ +{ + "name": "concat-map", + "description": "concatenative mapdashery", + "version": "0.0.1", + "repository": { + "type": "git", + "url": "git://github.com/substack/node-concat-map.git" + }, + "main": "index.js", + "keywords": [ + "concat", + "concatMap", + "map", + "functional", + "higher-order" + ], + "directories": { + "example": "example", + "test": "test" + }, + "scripts": { + "test": "tape test/*.js" + }, + "devDependencies": { + "tape": "~2.4.0" + }, + "license": "MIT", + "author": { + "name": "James Halliday", + "email": "mail@substack.net", + "url": "http://substack.net" + }, + "testling": { + "files": "test/*.js", + "browsers": { + "ie": [ + 6, + 7, + 8, + 9 + ], + "ff": [ + 3.5, + 10, + 15 + ], + "chrome": [ + 10, + 22 + ], + "safari": [ + 5.1 + ], + "opera": [ + 12 + ] + } + }, + "bugs": { + "url": "https://github.com/substack/node-concat-map/issues" + }, + "homepage": "https://github.com/substack/node-concat-map", + "_id": "concat-map@0.0.1", + "dist": { + "shasum": "d8a96bd77fd68df7793a73036a3ba0d5405d477b", + "tarball": "http://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" + }, + "_from": "concat-map@0.0.1", + "_npmVersion": "1.3.21", + "_npmUser": { + "name": "substack", + "email": "mail@substack.net" + }, + "maintainers": [ + { + "name": "substack", + "email": "mail@substack.net" + } + ], + "_shasum": "d8a96bd77fd68df7793a73036a3ba0d5405d477b", + "_resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "readme": "ERROR: No README data found!" +} diff --git a/node_modules/fs-extra/node_modules/rimraf/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/test/map.js b/node_modules/fs-extra/node_modules/rimraf/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/test/map.js new file mode 100644 index 0000000..fdbd702 --- /dev/null +++ b/node_modules/fs-extra/node_modules/rimraf/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/test/map.js @@ -0,0 +1,39 @@ +var concatMap = require('../'); +var test = require('tape'); + +test('empty or not', function (t) { + var xs = [ 1, 2, 3, 4, 5, 6 ]; + var ixes = []; + var ys = concatMap(xs, function (x, ix) { + ixes.push(ix); + return x % 2 ? [ x - 0.1, x, x + 0.1 ] : []; + }); + t.same(ys, [ 0.9, 1, 1.1, 2.9, 3, 3.1, 4.9, 5, 5.1 ]); + t.same(ixes, [ 0, 1, 2, 3, 4, 5 ]); + t.end(); +}); + +test('always something', function (t) { + var xs = [ 'a', 'b', 'c', 'd' ]; + var ys = concatMap(xs, function (x) { + return x === 'b' ? [ 'B', 'B', 'B' ] : [ x ]; + }); + t.same(ys, [ 'a', 'B', 'B', 'B', 'c', 'd' ]); + t.end(); +}); + +test('scalars', function (t) { + var xs = [ 'a', 'b', 'c', 'd' ]; + var ys = concatMap(xs, function (x) { + return x === 'b' ? [ 'B', 'B', 'B' ] : x; + }); + t.same(ys, [ 'a', 'B', 'B', 'B', 'c', 'd' ]); + t.end(); +}); + +test('undefs', function (t) { + var xs = [ 'a', 'b', 'c', 'd' ]; + var ys = concatMap(xs, function () {}); + t.same(ys, [ undefined, undefined, undefined, undefined ]); + t.end(); +}); diff --git a/node_modules/fs-extra/node_modules/rimraf/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/package.json b/node_modules/fs-extra/node_modules/rimraf/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/package.json new file mode 100644 index 0000000..e00a73a --- /dev/null +++ b/node_modules/fs-extra/node_modules/rimraf/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/package.json @@ -0,0 +1,79 @@ +{ + "name": "brace-expansion", + "description": "Brace expansion as known from sh/bash", + "version": "1.1.6", + "repository": { + "type": "git", + "url": "git://github.com/juliangruber/brace-expansion.git" + }, + "homepage": "https://github.com/juliangruber/brace-expansion", + "main": "index.js", + "scripts": { + "test": "tape test/*.js", + "gentest": "bash test/generate.sh" + }, + "dependencies": { + "balanced-match": "^0.4.1", + "concat-map": "0.0.1" + }, + "devDependencies": { + "tape": "^4.6.0" + }, + "keywords": [], + "author": { + "name": "Julian Gruber", + "email": "mail@juliangruber.com", + "url": "http://juliangruber.com" + }, + "license": "MIT", + "testling": { + "files": "test/*.js", + "browsers": [ + "ie/8..latest", + "firefox/20..latest", + "firefox/nightly", + "chrome/25..latest", + "chrome/canary", + "opera/12..latest", + "opera/next", + "safari/5.1..latest", + "ipad/6.0..latest", + "iphone/6.0..latest", + "android-browser/4.2..latest" + ] + }, + "gitHead": "791262fa06625e9c5594cde529a21d82086af5f2", + "bugs": { + "url": "https://github.com/juliangruber/brace-expansion/issues" + }, + "_id": "brace-expansion@1.1.6", + "_shasum": "7197d7eaa9b87e648390ea61fc66c84427420df9", + "_from": "brace-expansion@>=1.0.0 <2.0.0", + "_npmVersion": "2.15.8", + "_nodeVersion": "4.4.7", + "_npmUser": { + "name": "juliangruber", + "email": "julian@juliangruber.com" + }, + "dist": { + "shasum": "7197d7eaa9b87e648390ea61fc66c84427420df9", + "tarball": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.6.tgz" + }, + "maintainers": [ + { + "name": "juliangruber", + "email": "julian@juliangruber.com" + }, + { + "name": "isaacs", + "email": "isaacs@npmjs.com" + } + ], + "_npmOperationalInternal": { + "host": "packages-16-east.internal.npmjs.com", + "tmp": "tmp/brace-expansion-1.1.6.tgz_1469047715600_0.9362958471756428" + }, + "directories": {}, + "_resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.6.tgz", + "readme": "ERROR: No README data found!" +} diff --git a/node_modules/fs-extra/node_modules/rimraf/node_modules/glob/node_modules/minimatch/package.json b/node_modules/fs-extra/node_modules/rimraf/node_modules/glob/node_modules/minimatch/package.json new file mode 100644 index 0000000..0f48702 --- /dev/null +++ b/node_modules/fs-extra/node_modules/rimraf/node_modules/glob/node_modules/minimatch/package.json @@ -0,0 +1,64 @@ +{ + "author": { + "name": "Isaac Z. Schlueter", + "email": "i@izs.me", + "url": "http://blog.izs.me" + }, + "name": "minimatch", + "description": "a glob matcher in javascript", + "version": "3.0.3", + "repository": { + "type": "git", + "url": "git://github.com/isaacs/minimatch.git" + }, + "main": "minimatch.js", + "scripts": { + "posttest": "standard minimatch.js test/*.js", + "test": "tap test/*.js" + }, + "engines": { + "node": "*" + }, + "dependencies": { + "brace-expansion": "^1.0.0" + }, + "devDependencies": { + "standard": "^3.7.2", + "tap": "^5.6.0" + }, + "license": "ISC", + "files": [ + "minimatch.js" + ], + "gitHead": "eed89491bd4a4e6bc463aac0dfb5c29ef0d1dc13", + "bugs": { + "url": "https://github.com/isaacs/minimatch/issues" + }, + "homepage": "https://github.com/isaacs/minimatch#readme", + "_id": "minimatch@3.0.3", + "_shasum": "2a4e4090b96b2db06a9d7df01055a62a77c9b774", + "_from": "minimatch@>=3.0.2 <4.0.0", + "_npmVersion": "3.10.6", + "_nodeVersion": "4.4.4", + "_npmUser": { + "name": "isaacs", + "email": "i@izs.me" + }, + "dist": { + "shasum": "2a4e4090b96b2db06a9d7df01055a62a77c9b774", + "tarball": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.3.tgz" + }, + "maintainers": [ + { + "name": "isaacs", + "email": "i@izs.me" + } + ], + "_npmOperationalInternal": { + "host": "packages-12-west.internal.npmjs.com", + "tmp": "tmp/minimatch-3.0.3.tgz_1470678322731_0.1892083385027945" + }, + "directories": {}, + "_resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.3.tgz", + "readme": "ERROR: No README data found!" +} diff --git a/node_modules/fs-extra/node_modules/rimraf/node_modules/glob/node_modules/once/LICENSE b/node_modules/fs-extra/node_modules/rimraf/node_modules/glob/node_modules/once/LICENSE new file mode 100644 index 0000000..19129e3 --- /dev/null +++ b/node_modules/fs-extra/node_modules/rimraf/node_modules/glob/node_modules/once/LICENSE @@ -0,0 +1,15 @@ +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/node_modules/fs-extra/node_modules/rimraf/node_modules/glob/node_modules/once/README.md b/node_modules/fs-extra/node_modules/rimraf/node_modules/glob/node_modules/once/README.md new file mode 100644 index 0000000..1f1ffca --- /dev/null +++ b/node_modules/fs-extra/node_modules/rimraf/node_modules/glob/node_modules/once/README.md @@ -0,0 +1,79 @@ +# once + +Only call a function once. + +## usage + +```javascript +var once = require('once') + +function load (file, cb) { + cb = once(cb) + loader.load('file') + loader.once('load', cb) + loader.once('error', cb) +} +``` + +Or add to the Function.prototype in a responsible way: + +```javascript +// only has to be done once +require('once').proto() + +function load (file, cb) { + cb = cb.once() + loader.load('file') + loader.once('load', cb) + loader.once('error', cb) +} +``` + +Ironically, the prototype feature makes this module twice as +complicated as necessary. + +To check whether you function has been called, use `fn.called`. Once the +function is called for the first time the return value of the original +function is saved in `fn.value` and subsequent calls will continue to +return this value. + +```javascript +var once = require('once') + +function load (cb) { + cb = once(cb) + var stream = createStream() + stream.once('data', cb) + stream.once('end', function () { + if (!cb.called) cb(new Error('not found')) + }) +} +``` + +## `once.strict(func)` + +Throw an error if the function is called twice. + +Some functions are expected to be called only once. Using `once` for them would +potentially hide logical errors. + +In the example below, the `greet` function has to call the callback only once: + +```javascript +function greet (name, cb) { + // return is missing from the if statement + // when no name is passed, the callback is called twice + if (!name) cb('Hello anonymous') + cb('Hello ' + name) +} + +function log (msg) { + console.log(msg) +} + +// this will print 'Hello anonymous' but the logical error will be missed +greet(null, once(msg)) + +// once.strict will print 'Hello anonymous' and throw an error when the callback will be called the second time +greet(null, once.strict(msg)) +``` diff --git a/node_modules/fs-extra/node_modules/rimraf/node_modules/glob/node_modules/once/node_modules/wrappy/LICENSE b/node_modules/fs-extra/node_modules/rimraf/node_modules/glob/node_modules/once/node_modules/wrappy/LICENSE new file mode 100644 index 0000000..19129e3 --- /dev/null +++ b/node_modules/fs-extra/node_modules/rimraf/node_modules/glob/node_modules/once/node_modules/wrappy/LICENSE @@ -0,0 +1,15 @@ +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/node_modules/fs-extra/node_modules/rimraf/node_modules/glob/node_modules/once/node_modules/wrappy/README.md b/node_modules/fs-extra/node_modules/rimraf/node_modules/glob/node_modules/once/node_modules/wrappy/README.md new file mode 100644 index 0000000..98eab25 --- /dev/null +++ b/node_modules/fs-extra/node_modules/rimraf/node_modules/glob/node_modules/once/node_modules/wrappy/README.md @@ -0,0 +1,36 @@ +# wrappy + +Callback wrapping utility + +## USAGE + +```javascript +var wrappy = require("wrappy") + +// var wrapper = wrappy(wrapperFunction) + +// make sure a cb is called only once +// See also: http://npm.im/once for this specific use case +var once = wrappy(function (cb) { + var called = false + return function () { + if (called) return + called = true + return cb.apply(this, arguments) + } +}) + +function printBoo () { + console.log('boo') +} +// has some rando property +printBoo.iAmBooPrinter = true + +var onlyPrintOnce = once(printBoo) + +onlyPrintOnce() // prints 'boo' +onlyPrintOnce() // does nothing + +// random property is retained! +assert.equal(onlyPrintOnce.iAmBooPrinter, true) +``` diff --git a/node_modules/fs-extra/node_modules/rimraf/node_modules/glob/node_modules/once/node_modules/wrappy/package.json b/node_modules/fs-extra/node_modules/rimraf/node_modules/glob/node_modules/once/node_modules/wrappy/package.json new file mode 100644 index 0000000..de3bfd5 --- /dev/null +++ b/node_modules/fs-extra/node_modules/rimraf/node_modules/glob/node_modules/once/node_modules/wrappy/package.json @@ -0,0 +1,63 @@ +{ + "name": "wrappy", + "version": "1.0.2", + "description": "Callback wrapping utility", + "main": "wrappy.js", + "files": [ + "wrappy.js" + ], + "directories": { + "test": "test" + }, + "dependencies": {}, + "devDependencies": { + "tap": "^2.3.1" + }, + "scripts": { + "test": "tap --coverage test/*.js" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/npm/wrappy.git" + }, + "author": { + "name": "Isaac Z. Schlueter", + "email": "i@izs.me", + "url": "http://blog.izs.me/" + }, + "license": "ISC", + "bugs": { + "url": "https://github.com/npm/wrappy/issues" + }, + "homepage": "https://github.com/npm/wrappy", + "gitHead": "71d91b6dc5bdeac37e218c2cf03f9ab55b60d214", + "_id": "wrappy@1.0.2", + "_shasum": "b5243d8f3ec1aa35f1364605bc0d1036e30ab69f", + "_from": "wrappy@>=1.0.0 <2.0.0", + "_npmVersion": "3.9.1", + "_nodeVersion": "5.10.1", + "_npmUser": { + "name": "zkat", + "email": "kat@sykosomatic.org" + }, + "dist": { + "shasum": "b5243d8f3ec1aa35f1364605bc0d1036e30ab69f", + "tarball": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" + }, + "maintainers": [ + { + "name": "isaacs", + "email": "i@izs.me" + }, + { + "name": "zkat", + "email": "kat@sykosomatic.org" + } + ], + "_npmOperationalInternal": { + "host": "packages-16-east.internal.npmjs.com", + "tmp": "tmp/wrappy-1.0.2.tgz_1463527848281_0.037129373755306005" + }, + "_resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "readme": "ERROR: No README data found!" +} diff --git a/node_modules/fs-extra/node_modules/rimraf/node_modules/glob/node_modules/once/node_modules/wrappy/wrappy.js b/node_modules/fs-extra/node_modules/rimraf/node_modules/glob/node_modules/once/node_modules/wrappy/wrappy.js new file mode 100644 index 0000000..bb7e7d6 --- /dev/null +++ b/node_modules/fs-extra/node_modules/rimraf/node_modules/glob/node_modules/once/node_modules/wrappy/wrappy.js @@ -0,0 +1,33 @@ +// Returns a wrapper function that returns a wrapped callback +// The wrapper function should do some stuff, and return a +// presumably different callback function. +// This makes sure that own properties are retained, so that +// decorations and such are not lost along the way. +module.exports = wrappy +function wrappy (fn, cb) { + if (fn && cb) return wrappy(fn)(cb) + + if (typeof fn !== 'function') + throw new TypeError('need wrapper function') + + Object.keys(fn).forEach(function (k) { + wrapper[k] = fn[k] + }) + + return wrapper + + function wrapper() { + var args = new Array(arguments.length) + for (var i = 0; i < args.length; i++) { + args[i] = arguments[i] + } + var ret = fn.apply(this, args) + var cb = args[args.length-1] + if (typeof ret === 'function' && ret !== cb) { + Object.keys(cb).forEach(function (k) { + ret[k] = cb[k] + }) + } + return ret + } +} diff --git a/node_modules/fs-extra/node_modules/rimraf/node_modules/glob/node_modules/once/once.js b/node_modules/fs-extra/node_modules/rimraf/node_modules/glob/node_modules/once/once.js new file mode 100644 index 0000000..2354067 --- /dev/null +++ b/node_modules/fs-extra/node_modules/rimraf/node_modules/glob/node_modules/once/once.js @@ -0,0 +1,42 @@ +var wrappy = require('wrappy') +module.exports = wrappy(once) +module.exports.strict = wrappy(onceStrict) + +once.proto = once(function () { + Object.defineProperty(Function.prototype, 'once', { + value: function () { + return once(this) + }, + configurable: true + }) + + Object.defineProperty(Function.prototype, 'onceStrict', { + value: function () { + return onceStrict(this) + }, + configurable: true + }) +}) + +function once (fn) { + var f = function () { + if (f.called) return f.value + f.called = true + return f.value = fn.apply(this, arguments) + } + f.called = false + return f +} + +function onceStrict (fn) { + var f = function () { + if (f.called) + throw new Error(f.onceError) + f.called = true + return f.value = fn.apply(this, arguments) + } + var name = fn.name || 'Function wrapped with `once`' + f.onceError = name + " shouldn't be called more than once" + f.called = false + return f +} diff --git a/node_modules/fs-extra/node_modules/rimraf/node_modules/glob/node_modules/once/package.json b/node_modules/fs-extra/node_modules/rimraf/node_modules/glob/node_modules/once/package.json new file mode 100644 index 0000000..9800997 --- /dev/null +++ b/node_modules/fs-extra/node_modules/rimraf/node_modules/glob/node_modules/once/package.json @@ -0,0 +1,67 @@ +{ + "name": "once", + "version": "1.4.0", + "description": "Run a function exactly one time", + "main": "once.js", + "directories": { + "test": "test" + }, + "dependencies": { + "wrappy": "1" + }, + "devDependencies": { + "tap": "^7.0.1" + }, + "scripts": { + "test": "tap test/*.js" + }, + "files": [ + "once.js" + ], + "repository": { + "type": "git", + "url": "git://github.com/isaacs/once.git" + }, + "keywords": [ + "once", + "function", + "one", + "single" + ], + "author": { + "name": "Isaac Z. Schlueter", + "email": "i@izs.me", + "url": "http://blog.izs.me/" + }, + "license": "ISC", + "gitHead": "0e614d9f5a7e6f0305c625f6b581f6d80b33b8a6", + "bugs": { + "url": "https://github.com/isaacs/once/issues" + }, + "homepage": "https://github.com/isaacs/once#readme", + "_id": "once@1.4.0", + "_shasum": "583b1aa775961d4b113ac17d9c50baef9dd76bd1", + "_from": "once@>=1.3.0 <2.0.0", + "_npmVersion": "3.10.7", + "_nodeVersion": "6.5.0", + "_npmUser": { + "name": "isaacs", + "email": "i@izs.me" + }, + "dist": { + "shasum": "583b1aa775961d4b113ac17d9c50baef9dd76bd1", + "tarball": "https://registry.npmjs.org/once/-/once-1.4.0.tgz" + }, + "maintainers": [ + { + "name": "isaacs", + "email": "i@izs.me" + } + ], + "_npmOperationalInternal": { + "host": "packages-12-west.internal.npmjs.com", + "tmp": "tmp/once-1.4.0.tgz_1473196269128_0.537820661207661" + }, + "_resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "readme": "ERROR: No README data found!" +} diff --git a/node_modules/fs-extra/node_modules/rimraf/node_modules/glob/package.json b/node_modules/fs-extra/node_modules/rimraf/node_modules/glob/package.json new file mode 100644 index 0000000..335f064 --- /dev/null +++ b/node_modules/fs-extra/node_modules/rimraf/node_modules/glob/package.json @@ -0,0 +1,78 @@ +{ + "author": { + "name": "Isaac Z. Schlueter", + "email": "i@izs.me", + "url": "http://blog.izs.me/" + }, + "name": "glob", + "description": "a little globber", + "version": "7.1.0", + "repository": { + "type": "git", + "url": "git://github.com/isaacs/node-glob.git" + }, + "main": "glob.js", + "files": [ + "glob.js", + "sync.js", + "common.js" + ], + "engines": { + "node": "*" + }, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.2", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "devDependencies": { + "mkdirp": "0", + "rimraf": "^2.2.8", + "tap": "^7.1.2", + "tick": "0.0.6" + }, + "scripts": { + "prepublish": "npm run benchclean", + "profclean": "rm -f v8.log profile.txt", + "test": "tap test/*.js --cov", + "test-regen": "npm run profclean && TEST_REGEN=1 node test/00-setup.js", + "bench": "bash benchmark.sh", + "prof": "bash prof.sh && cat profile.txt", + "benchclean": "node benchclean.js" + }, + "license": "ISC", + "gitHead": "f65f9eb7eda113528c5257b58fac4ca685ee6c4f", + "bugs": { + "url": "https://github.com/isaacs/node-glob/issues" + }, + "homepage": "https://github.com/isaacs/node-glob#readme", + "_id": "glob@7.1.0", + "_shasum": "36add856d746d0d99e4cc2797bba1ae2c67272fd", + "_from": "glob@>=7.0.5 <8.0.0", + "_npmVersion": "3.10.7", + "_nodeVersion": "6.5.0", + "_npmUser": { + "name": "isaacs", + "email": "i@izs.me" + }, + "dist": { + "shasum": "36add856d746d0d99e4cc2797bba1ae2c67272fd", + "tarball": "https://registry.npmjs.org/glob/-/glob-7.1.0.tgz" + }, + "maintainers": [ + { + "name": "isaacs", + "email": "i@izs.me" + } + ], + "_npmOperationalInternal": { + "host": "packages-12-west.internal.npmjs.com", + "tmp": "tmp/glob-7.1.0.tgz_1474396131090_0.08145137410610914" + }, + "directories": {}, + "_resolved": "https://registry.npmjs.org/glob/-/glob-7.1.0.tgz", + "readme": "ERROR: No README data found!" +} diff --git a/node_modules/fs-extra/node_modules/rimraf/node_modules/glob/sync.js b/node_modules/fs-extra/node_modules/rimraf/node_modules/glob/sync.js new file mode 100644 index 0000000..f9834dc --- /dev/null +++ b/node_modules/fs-extra/node_modules/rimraf/node_modules/glob/sync.js @@ -0,0 +1,478 @@ +module.exports = globSync +globSync.GlobSync = GlobSync + +var fs = require('fs') +var rp = require('fs.realpath') +var minimatch = require('minimatch') +var Minimatch = minimatch.Minimatch +var Glob = require('./glob.js').Glob +var util = require('util') +var path = require('path') +var assert = require('assert') +var isAbsolute = require('path-is-absolute') +var common = require('./common.js') +var alphasort = common.alphasort +var alphasorti = common.alphasorti +var setopts = common.setopts +var ownProp = common.ownProp +var childrenIgnored = common.childrenIgnored +var isIgnored = common.isIgnored + +function globSync (pattern, options) { + if (typeof options === 'function' || arguments.length === 3) + throw new TypeError('callback provided to sync glob\n'+ + 'See: https://github.com/isaacs/node-glob/issues/167') + + return new GlobSync(pattern, options).found +} + +function GlobSync (pattern, options) { + if (!pattern) + throw new Error('must provide pattern') + + if (typeof options === 'function' || arguments.length === 3) + throw new TypeError('callback provided to sync glob\n'+ + 'See: https://github.com/isaacs/node-glob/issues/167') + + if (!(this instanceof GlobSync)) + return new GlobSync(pattern, options) + + setopts(this, pattern, options) + + if (this.noprocess) + return this + + var n = this.minimatch.set.length + this.matches = new Array(n) + for (var i = 0; i < n; i ++) { + this._process(this.minimatch.set[i], i, false) + } + this._finish() +} + +GlobSync.prototype._finish = function () { + assert(this instanceof GlobSync) + if (this.realpath) { + var self = this + this.matches.forEach(function (matchset, index) { + var set = self.matches[index] = Object.create(null) + for (var p in matchset) { + try { + p = self._makeAbs(p) + var real = rp.realpathSync(p, self.realpathCache) + set[real] = true + } catch (er) { + if (er.syscall === 'stat') + set[self._makeAbs(p)] = true + else + throw er + } + } + }) + } + common.finish(this) +} + + +GlobSync.prototype._process = function (pattern, index, inGlobStar) { + assert(this instanceof GlobSync) + + // Get the first [n] parts of pattern that are all strings. + var n = 0 + while (typeof pattern[n] === 'string') { + n ++ + } + // now n is the index of the first one that is *not* a string. + + // See if there's anything else + var prefix + switch (n) { + // if not, then this is rather simple + case pattern.length: + this._processSimple(pattern.join('/'), index) + return + + case 0: + // pattern *starts* with some non-trivial item. + // going to readdir(cwd), but not include the prefix in matches. + prefix = null + break + + default: + // pattern has some string bits in the front. + // whatever it starts with, whether that's 'absolute' like /foo/bar, + // or 'relative' like '../baz' + prefix = pattern.slice(0, n).join('/') + break + } + + var remain = pattern.slice(n) + + // get the list of entries. + var read + if (prefix === null) + read = '.' + else if (isAbsolute(prefix) || isAbsolute(pattern.join('/'))) { + if (!prefix || !isAbsolute(prefix)) + prefix = '/' + prefix + read = prefix + } else + read = prefix + + var abs = this._makeAbs(read) + + //if ignored, skip processing + if (childrenIgnored(this, read)) + return + + var isGlobStar = remain[0] === minimatch.GLOBSTAR + if (isGlobStar) + this._processGlobStar(prefix, read, abs, remain, index, inGlobStar) + else + this._processReaddir(prefix, read, abs, remain, index, inGlobStar) +} + + +GlobSync.prototype._processReaddir = function (prefix, read, abs, remain, index, inGlobStar) { + var entries = this._readdir(abs, inGlobStar) + + // if the abs isn't a dir, then nothing can match! + if (!entries) + return + + // It will only match dot entries if it starts with a dot, or if + // dot is set. Stuff like @(.foo|.bar) isn't allowed. + var pn = remain[0] + var negate = !!this.minimatch.negate + var rawGlob = pn._glob + var dotOk = this.dot || rawGlob.charAt(0) === '.' + + var matchedEntries = [] + for (var i = 0; i < entries.length; i++) { + var e = entries[i] + if (e.charAt(0) !== '.' || dotOk) { + var m + if (negate && !prefix) { + m = !e.match(pn) + } else { + m = e.match(pn) + } + if (m) + matchedEntries.push(e) + } + } + + var len = matchedEntries.length + // If there are no matched entries, then nothing matches. + if (len === 0) + return + + // if this is the last remaining pattern bit, then no need for + // an additional stat *unless* the user has specified mark or + // stat explicitly. We know they exist, since readdir returned + // them. + + if (remain.length === 1 && !this.mark && !this.stat) { + if (!this.matches[index]) + this.matches[index] = Object.create(null) + + for (var i = 0; i < len; i ++) { + var e = matchedEntries[i] + if (prefix) { + if (prefix.slice(-1) !== '/') + e = prefix + '/' + e + else + e = prefix + e + } + + if (e.charAt(0) === '/' && !this.nomount) { + e = path.join(this.root, e) + } + this._emitMatch(index, e) + } + // This was the last one, and no stats were needed + return + } + + // now test all matched entries as stand-ins for that part + // of the pattern. + remain.shift() + for (var i = 0; i < len; i ++) { + var e = matchedEntries[i] + var newPattern + if (prefix) + newPattern = [prefix, e] + else + newPattern = [e] + this._process(newPattern.concat(remain), index, inGlobStar) + } +} + + +GlobSync.prototype._emitMatch = function (index, e) { + if (isIgnored(this, e)) + return + + var abs = this._makeAbs(e) + + if (this.mark) + e = this._mark(e) + + if (this.absolute) { + e = abs + } + + if (this.matches[index][e]) + return + + if (this.nodir) { + var c = this.cache[abs] + if (c === 'DIR' || Array.isArray(c)) + return + } + + this.matches[index][e] = true + + if (this.stat) + this._stat(e) +} + + +GlobSync.prototype._readdirInGlobStar = function (abs) { + // follow all symlinked directories forever + // just proceed as if this is a non-globstar situation + if (this.follow) + return this._readdir(abs, false) + + var entries + var lstat + var stat + try { + lstat = fs.lstatSync(abs) + } catch (er) { + // lstat failed, doesn't exist + return null + } + + var isSym = lstat.isSymbolicLink() + this.symlinks[abs] = isSym + + // If it's not a symlink or a dir, then it's definitely a regular file. + // don't bother doing a readdir in that case. + if (!isSym && !lstat.isDirectory()) + this.cache[abs] = 'FILE' + else + entries = this._readdir(abs, false) + + return entries +} + +GlobSync.prototype._readdir = function (abs, inGlobStar) { + var entries + + if (inGlobStar && !ownProp(this.symlinks, abs)) + return this._readdirInGlobStar(abs) + + if (ownProp(this.cache, abs)) { + var c = this.cache[abs] + if (!c || c === 'FILE') + return null + + if (Array.isArray(c)) + return c + } + + try { + return this._readdirEntries(abs, fs.readdirSync(abs)) + } catch (er) { + this._readdirError(abs, er) + return null + } +} + +GlobSync.prototype._readdirEntries = function (abs, entries) { + // if we haven't asked to stat everything, then just + // assume that everything in there exists, so we can avoid + // having to stat it a second time. + if (!this.mark && !this.stat) { + for (var i = 0; i < entries.length; i ++) { + var e = entries[i] + if (abs === '/') + e = abs + e + else + e = abs + '/' + e + this.cache[e] = true + } + } + + this.cache[abs] = entries + + // mark and cache dir-ness + return entries +} + +GlobSync.prototype._readdirError = function (f, er) { + // handle errors, and cache the information + switch (er.code) { + case 'ENOTSUP': // https://github.com/isaacs/node-glob/issues/205 + case 'ENOTDIR': // totally normal. means it *does* exist. + var abs = this._makeAbs(f) + this.cache[abs] = 'FILE' + if (abs === this.cwdAbs) { + var error = new Error(er.code + ' invalid cwd ' + this.cwd) + error.path = this.cwd + error.code = er.code + throw error + } + break + + case 'ENOENT': // not terribly unusual + case 'ELOOP': + case 'ENAMETOOLONG': + case 'UNKNOWN': + this.cache[this._makeAbs(f)] = false + break + + default: // some unusual error. Treat as failure. + this.cache[this._makeAbs(f)] = false + if (this.strict) + throw er + if (!this.silent) + console.error('glob error', er) + break + } +} + +GlobSync.prototype._processGlobStar = function (prefix, read, abs, remain, index, inGlobStar) { + + var entries = this._readdir(abs, inGlobStar) + + // no entries means not a dir, so it can never have matches + // foo.txt/** doesn't match foo.txt + if (!entries) + return + + // test without the globstar, and with every child both below + // and replacing the globstar. + var remainWithoutGlobStar = remain.slice(1) + var gspref = prefix ? [ prefix ] : [] + var noGlobStar = gspref.concat(remainWithoutGlobStar) + + // the noGlobStar pattern exits the inGlobStar state + this._process(noGlobStar, index, false) + + var len = entries.length + var isSym = this.symlinks[abs] + + // If it's a symlink, and we're in a globstar, then stop + if (isSym && inGlobStar) + return + + for (var i = 0; i < len; i++) { + var e = entries[i] + if (e.charAt(0) === '.' && !this.dot) + continue + + // these two cases enter the inGlobStar state + var instead = gspref.concat(entries[i], remainWithoutGlobStar) + this._process(instead, index, true) + + var below = gspref.concat(entries[i], remain) + this._process(below, index, true) + } +} + +GlobSync.prototype._processSimple = function (prefix, index) { + // XXX review this. Shouldn't it be doing the mounting etc + // before doing stat? kinda weird? + var exists = this._stat(prefix) + + if (!this.matches[index]) + this.matches[index] = Object.create(null) + + // If it doesn't exist, then just mark the lack of results + if (!exists) + return + + if (prefix && isAbsolute(prefix) && !this.nomount) { + var trail = /[\/\\]$/.test(prefix) + if (prefix.charAt(0) === '/') { + prefix = path.join(this.root, prefix) + } else { + prefix = path.resolve(this.root, prefix) + if (trail) + prefix += '/' + } + } + + if (process.platform === 'win32') + prefix = prefix.replace(/\\/g, '/') + + // Mark this as a match + this._emitMatch(index, prefix) +} + +// Returns either 'DIR', 'FILE', or false +GlobSync.prototype._stat = function (f) { + var abs = this._makeAbs(f) + var needDir = f.slice(-1) === '/' + + if (f.length > this.maxLength) + return false + + if (!this.stat && ownProp(this.cache, abs)) { + var c = this.cache[abs] + + if (Array.isArray(c)) + c = 'DIR' + + // It exists, but maybe not how we need it + if (!needDir || c === 'DIR') + return c + + if (needDir && c === 'FILE') + return false + + // otherwise we have to stat, because maybe c=true + // if we know it exists, but not what it is. + } + + var exists + var stat = this.statCache[abs] + if (!stat) { + var lstat + try { + lstat = fs.lstatSync(abs) + } catch (er) { + return false + } + + if (lstat.isSymbolicLink()) { + try { + stat = fs.statSync(abs) + } catch (er) { + stat = lstat + } + } else { + stat = lstat + } + } + + this.statCache[abs] = stat + + var c = stat.isDirectory() ? 'DIR' : 'FILE' + this.cache[abs] = this.cache[abs] || c + + if (needDir && c !== 'DIR') + return false + + return c +} + +GlobSync.prototype._mark = function (p) { + return common.mark(this, p) +} + +GlobSync.prototype._makeAbs = function (f) { + return common.makeAbs(this, f) +} diff --git a/node_modules/fs-extra/node_modules/rimraf/package.json b/node_modules/fs-extra/node_modules/rimraf/package.json new file mode 100644 index 0000000..6f768e6 --- /dev/null +++ b/node_modules/fs-extra/node_modules/rimraf/package.json @@ -0,0 +1,66 @@ +{ + "name": "rimraf", + "version": "2.5.4", + "main": "rimraf.js", + "description": "A deep deletion module for node (like `rm -rf`)", + "author": { + "name": "Isaac Z. Schlueter", + "email": "i@izs.me", + "url": "http://blog.izs.me/" + }, + "license": "ISC", + "repository": { + "type": "git", + "url": "git://github.com/isaacs/rimraf.git" + }, + "scripts": { + "test": "tap test/*.js" + }, + "bin": { + "rimraf": "./bin.js" + }, + "dependencies": { + "glob": "^7.0.5" + }, + "files": [ + "LICENSE", + "README.md", + "bin.js", + "rimraf.js" + ], + "devDependencies": { + "mkdirp": "^0.5.1", + "tap": "^6.1.1" + }, + "gitHead": "2af08bbbd0a03549b278414309dc5d8097699443", + "bugs": { + "url": "https://github.com/isaacs/rimraf/issues" + }, + "homepage": "https://github.com/isaacs/rimraf#readme", + "_id": "rimraf@2.5.4", + "_shasum": "96800093cbf1a0c86bd95b4625467535c29dfa04", + "_from": "rimraf@>=2.2.8 <3.0.0", + "_npmVersion": "3.10.6", + "_nodeVersion": "4.4.4", + "_npmUser": { + "name": "isaacs", + "email": "i@izs.me" + }, + "dist": { + "shasum": "96800093cbf1a0c86bd95b4625467535c29dfa04", + "tarball": "https://registry.npmjs.org/rimraf/-/rimraf-2.5.4.tgz" + }, + "maintainers": [ + { + "name": "isaacs", + "email": "i@izs.me" + } + ], + "_npmOperationalInternal": { + "host": "packages-16-east.internal.npmjs.com", + "tmp": "tmp/rimraf-2.5.4.tgz_1469206941888_0.8645927573088557" + }, + "directories": {}, + "_resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.5.4.tgz", + "readme": "ERROR: No README data found!" +} diff --git a/node_modules/fs-extra/node_modules/rimraf/rimraf.js b/node_modules/fs-extra/node_modules/rimraf/rimraf.js new file mode 100644 index 0000000..5d9a576 --- /dev/null +++ b/node_modules/fs-extra/node_modules/rimraf/rimraf.js @@ -0,0 +1,343 @@ +module.exports = rimraf +rimraf.sync = rimrafSync + +var assert = require("assert") +var path = require("path") +var fs = require("fs") +var glob = require("glob") + +var defaultGlobOpts = { + nosort: true, + silent: true +} + +// for EMFILE handling +var timeout = 0 + +var isWindows = (process.platform === "win32") + +function defaults (options) { + var methods = [ + 'unlink', + 'chmod', + 'stat', + 'lstat', + 'rmdir', + 'readdir' + ] + methods.forEach(function(m) { + options[m] = options[m] || fs[m] + m = m + 'Sync' + options[m] = options[m] || fs[m] + }) + + options.maxBusyTries = options.maxBusyTries || 3 + options.emfileWait = options.emfileWait || 1000 + if (options.glob === false) { + options.disableGlob = true + } + options.disableGlob = options.disableGlob || false + options.glob = options.glob || defaultGlobOpts +} + +function rimraf (p, options, cb) { + if (typeof options === 'function') { + cb = options + options = {} + } + + assert(p, 'rimraf: missing path') + assert.equal(typeof p, 'string', 'rimraf: path should be a string') + assert.equal(typeof cb, 'function', 'rimraf: callback function required') + assert(options, 'rimraf: invalid options argument provided') + assert.equal(typeof options, 'object', 'rimraf: options should be object') + + defaults(options) + + var busyTries = 0 + var errState = null + var n = 0 + + if (options.disableGlob || !glob.hasMagic(p)) + return afterGlob(null, [p]) + + options.lstat(p, function (er, stat) { + if (!er) + return afterGlob(null, [p]) + + glob(p, options.glob, afterGlob) + }) + + function next (er) { + errState = errState || er + if (--n === 0) + cb(errState) + } + + function afterGlob (er, results) { + if (er) + return cb(er) + + n = results.length + if (n === 0) + return cb() + + results.forEach(function (p) { + rimraf_(p, options, function CB (er) { + if (er) { + if (isWindows && (er.code === "EBUSY" || er.code === "ENOTEMPTY" || er.code === "EPERM") && + busyTries < options.maxBusyTries) { + busyTries ++ + var time = busyTries * 100 + // try again, with the same exact callback as this one. + return setTimeout(function () { + rimraf_(p, options, CB) + }, time) + } + + // this one won't happen if graceful-fs is used. + if (er.code === "EMFILE" && timeout < options.emfileWait) { + return setTimeout(function () { + rimraf_(p, options, CB) + }, timeout ++) + } + + // already gone + if (er.code === "ENOENT") er = null + } + + timeout = 0 + next(er) + }) + }) + } +} + +// Two possible strategies. +// 1. Assume it's a file. unlink it, then do the dir stuff on EPERM or EISDIR +// 2. Assume it's a directory. readdir, then do the file stuff on ENOTDIR +// +// Both result in an extra syscall when you guess wrong. However, there +// are likely far more normal files in the world than directories. This +// is based on the assumption that a the average number of files per +// directory is >= 1. +// +// If anyone ever complains about this, then I guess the strategy could +// be made configurable somehow. But until then, YAGNI. +function rimraf_ (p, options, cb) { + assert(p) + assert(options) + assert(typeof cb === 'function') + + // sunos lets the root user unlink directories, which is... weird. + // so we have to lstat here and make sure it's not a dir. + options.lstat(p, function (er, st) { + if (er && er.code === "ENOENT") + return cb(null) + + // Windows can EPERM on stat. Life is suffering. + if (er && er.code === "EPERM" && isWindows) + fixWinEPERM(p, options, er, cb) + + if (st && st.isDirectory()) + return rmdir(p, options, er, cb) + + options.unlink(p, function (er) { + if (er) { + if (er.code === "ENOENT") + return cb(null) + if (er.code === "EPERM") + return (isWindows) + ? fixWinEPERM(p, options, er, cb) + : rmdir(p, options, er, cb) + if (er.code === "EISDIR") + return rmdir(p, options, er, cb) + } + return cb(er) + }) + }) +} + +function fixWinEPERM (p, options, er, cb) { + assert(p) + assert(options) + assert(typeof cb === 'function') + if (er) + assert(er instanceof Error) + + options.chmod(p, 666, function (er2) { + if (er2) + cb(er2.code === "ENOENT" ? null : er) + else + options.stat(p, function(er3, stats) { + if (er3) + cb(er3.code === "ENOENT" ? null : er) + else if (stats.isDirectory()) + rmdir(p, options, er, cb) + else + options.unlink(p, cb) + }) + }) +} + +function fixWinEPERMSync (p, options, er) { + assert(p) + assert(options) + if (er) + assert(er instanceof Error) + + try { + options.chmodSync(p, 666) + } catch (er2) { + if (er2.code === "ENOENT") + return + else + throw er + } + + try { + var stats = options.statSync(p) + } catch (er3) { + if (er3.code === "ENOENT") + return + else + throw er + } + + if (stats.isDirectory()) + rmdirSync(p, options, er) + else + options.unlinkSync(p) +} + +function rmdir (p, options, originalEr, cb) { + assert(p) + assert(options) + if (originalEr) + assert(originalEr instanceof Error) + assert(typeof cb === 'function') + + // try to rmdir first, and only readdir on ENOTEMPTY or EEXIST (SunOS) + // if we guessed wrong, and it's not a directory, then + // raise the original error. + options.rmdir(p, function (er) { + if (er && (er.code === "ENOTEMPTY" || er.code === "EEXIST" || er.code === "EPERM")) + rmkids(p, options, cb) + else if (er && er.code === "ENOTDIR") + cb(originalEr) + else + cb(er) + }) +} + +function rmkids(p, options, cb) { + assert(p) + assert(options) + assert(typeof cb === 'function') + + options.readdir(p, function (er, files) { + if (er) + return cb(er) + var n = files.length + if (n === 0) + return options.rmdir(p, cb) + var errState + files.forEach(function (f) { + rimraf(path.join(p, f), options, function (er) { + if (errState) + return + if (er) + return cb(errState = er) + if (--n === 0) + options.rmdir(p, cb) + }) + }) + }) +} + +// this looks simpler, and is strictly *faster*, but will +// tie up the JavaScript thread and fail on excessively +// deep directory trees. +function rimrafSync (p, options) { + options = options || {} + defaults(options) + + assert(p, 'rimraf: missing path') + assert.equal(typeof p, 'string', 'rimraf: path should be a string') + assert(options, 'rimraf: missing options') + assert.equal(typeof options, 'object', 'rimraf: options should be object') + + var results + + if (options.disableGlob || !glob.hasMagic(p)) { + results = [p] + } else { + try { + options.lstatSync(p) + results = [p] + } catch (er) { + results = glob.sync(p, options.glob) + } + } + + if (!results.length) + return + + for (var i = 0; i < results.length; i++) { + var p = results[i] + + try { + var st = options.lstatSync(p) + } catch (er) { + if (er.code === "ENOENT") + return + + // Windows can EPERM on stat. Life is suffering. + if (er.code === "EPERM" && isWindows) + fixWinEPERMSync(p, options, er) + } + + try { + // sunos lets the root user unlink directories, which is... weird. + if (st && st.isDirectory()) + rmdirSync(p, options, null) + else + options.unlinkSync(p) + } catch (er) { + if (er.code === "ENOENT") + return + if (er.code === "EPERM") + return isWindows ? fixWinEPERMSync(p, options, er) : rmdirSync(p, options, er) + if (er.code !== "EISDIR") + throw er + rmdirSync(p, options, er) + } + } +} + +function rmdirSync (p, options, originalEr) { + assert(p) + assert(options) + if (originalEr) + assert(originalEr instanceof Error) + + try { + options.rmdirSync(p) + } catch (er) { + if (er.code === "ENOENT") + return + if (er.code === "ENOTDIR") + throw originalEr + if (er.code === "ENOTEMPTY" || er.code === "EEXIST" || er.code === "EPERM") + rmkidsSync(p, options) + } +} + +function rmkidsSync (p, options) { + assert(p) + assert(options) + options.readdirSync(p).forEach(function (f) { + rimrafSync(path.join(p, f), options) + }) + options.rmdirSync(p, options) +} diff --git a/node_modules/fs-extra/package.json b/node_modules/fs-extra/package.json new file mode 100644 index 0000000..ed35a43 --- /dev/null +++ b/node_modules/fs-extra/package.json @@ -0,0 +1,94 @@ +{ + "name": "fs-extra", + "version": "0.30.0", + "description": "fs-extra contains methods that aren't included in the vanilla Node.js fs package. Such as mkdir -p, cp -r, and rm -rf.", + "homepage": "https://github.com/jprichardson/node-fs-extra", + "repository": { + "type": "git", + "url": "git+https://github.com/jprichardson/node-fs-extra.git" + }, + "keywords": [ + "fs", + "file", + "file system", + "copy", + "directory", + "extra", + "mkdirp", + "mkdir", + "mkdirs", + "recursive", + "json", + "read", + "write", + "extra", + "delete", + "remove", + "touch", + "create", + "text", + "output", + "move" + ], + "author": { + "name": "JP Richardson", + "email": "jprichardson@gmail.com" + }, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^2.1.0", + "klaw": "^1.0.0", + "path-is-absolute": "^1.0.0", + "rimraf": "^2.2.8" + }, + "devDependencies": { + "coveralls": "^2.11.2", + "istanbul": "^0.3.5", + "minimist": "^1.1.1", + "mocha": "^2.1.0", + "read-dir-files": "^0.1.1", + "secure-random": "^1.1.1", + "semver": "^4.3.6", + "standard": "^7.0.0-beta.0" + }, + "main": "./lib/index", + "scripts": { + "coverage": "istanbul cover test.js", + "coveralls": "npm run coverage && coveralls < coverage/lcov.info", + "lint": "standard", + "test-find": "find ./lib/**/__tests__ -name *.test.js | xargs mocha", + "test": "npm run lint && npm run unit", + "unit": "node test.js" + }, + "gitHead": "08a8d432ca508e86414a6cabfb4d5a139e2fb0ff", + "bugs": { + "url": "https://github.com/jprichardson/node-fs-extra/issues" + }, + "_id": "fs-extra@0.30.0", + "_shasum": "f233ffcc08d4da7d432daa449776989db1df93f0", + "_from": "fs-extra@latest", + "_npmVersion": "3.8.2", + "_nodeVersion": "5.3.0", + "_npmUser": { + "name": "jprichardson", + "email": "jprichardson@gmail.com" + }, + "maintainers": [ + { + "name": "jprichardson", + "email": "jprichardson@gmail.com" + } + ], + "dist": { + "shasum": "f233ffcc08d4da7d432daa449776989db1df93f0", + "tarball": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz" + }, + "_npmOperationalInternal": { + "host": "packages-12-west.internal.npmjs.com", + "tmp": "tmp/fs-extra-0.30.0.tgz_1461855285893_0.6937591265887022" + }, + "directories": {}, + "_resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", + "readme": "ERROR: No README data found!" +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..73b9a0c --- /dev/null +++ b/package.json @@ -0,0 +1 @@ +{"name":"tyranoscript","main":"app://./index.html","window":{"title":"setting tyrano","icon":"link.png","toolbar":false,"frame":true,"width":1280,"height":800,"position":"mouse","min_width":1280,"min_height":800},"webkit":{"plugin":true}} \ No newline at end of file diff --git a/tyrano/lang.js b/tyrano/lang.js new file mode 100644 index 0000000..58965e8 --- /dev/null +++ b/tyrano/lang.js @@ -0,0 +1,33 @@ +window.tyrano_lang = { + + word : { + + "go_title":"タイトルに戻ります。よろしいですね?", + "exit_game":"ウィンドウを閉じて終了します。よろしいですね?", + "not_saved":"まだ、保存されているデータがありません", + "tag":"タグ", + "not_exists":"は存在しません", + "error":"エラーが発生しました。スクリプトを確認して下さい", + "label":"ラベル", + "label_double":"は同一シナリオファイル内に重複しています", + "error_occurred":"エラーが発生しました" + }, + + novel : { + "file_menu_button_save":"menu_button_save.gif", + "file_menu_button_load":"menu_button_load.gif", + "file_menu_button_message_close":"menu_message_close.gif", + "file_menu_button_skip":"menu_button_skip.gif", + "file_menu_button_title":"menu_button_title.gif", + "file_menu_button_close":"menu_button_close.png", + "file_menu_bg":"menu_bg.jpg", + "file_save_bg":"menu_save_bg.jpg", + "file_load_bg":"menu_load_bg.jpg", + "file_button_menu":"button_menu.png", + "error_occurred":"error occurred" + + + } + +}; + diff --git a/tyrano/libs.js b/tyrano/libs.js new file mode 100644 index 0000000..c90b611 --- /dev/null +++ b/tyrano/libs.js @@ -0,0 +1,1329 @@ +(function($) { + + //jquery 拡張 + + //アニメーション開始。未実装 キーフレアニメは投入したい + $.fn.a2d = function() { + + return this.each(function(i) { + + $(this).css("-webkit-animation-play-state", str); + + }); + }; + + $.getBaseURL = function() { + + var str = location.pathname; + var i = str.lastIndexOf('/'); + return str.substring(0, i + 1); + + }; + + $.getDirPath = function(str){ + + var i = str.lastIndexOf('/'); + return str.substring(0, i + 1); + + }; + + $.isHTTP = function(str) { + if (str.substring(0, 4) === "http") { + return true; + } else { + return false; + } + }; + + $.play_audio = function(audio_obj) { + + audio_obj.play(); + + }; + + $.localFilePath = function(){ + + var path = ""; + //Mac os Sierra 対応 + if(process.execPath.indexOf("var/folders")!=-1){ + path = process.env.HOME+"/_TyranoGameData"; + }else{ + path = $.getProcessPath(); + } + + return path; + + }; + + $.getViewPort = function() { + var width, heiht; + + if (self.innerHeight) { + // all except Explorer + width = self.innerWidth; + height = self.innerHeight; + } else if (document.documentElement && document.documentElement.clientHeight) { + // Explorer 6 Strict Mode + width = document.documentElement.clientWidth; + height = document.documentElement.clientHeight; + } else if (document.body) { + // other Explorers + width = document.body.clientWidth; + height = document.body.clientHeight; + } + + return { + width : width, + height : height + }; + }; + + $.escapeHTML = function(val, replace_str) { + val = val || ""; + var t = $("
").text(val).html(); + + if (replace_str) { + if (t === "") { + t = replace_str; + } + } + return t; + }; + + $.br = function(txtVal) { + + txtVal = txtVal.replace(/\r\n/g, "
"); + txtVal = txtVal.replace(/(\n|\r)/g, "
"); + return txtVal; + + }; + + //現在時刻を取得 + //現在の日 + $.getNowDate = function() { + + var nowdate = new Date(); + var year = nowdate.getFullYear(); + // 年 + var mon = nowdate.getMonth() + 1; + // 月 + var date = nowdate.getDate(); + // 日 + + return year + "/" + mon + "/" + date; + + }; + + //現在の時刻 + $.getNowTime = function() { + + var nowdate = new Date(); + + var h = nowdate.getHours(); + var m = nowdate.getMinutes(); + var s = nowdate.getSeconds(); + + return h + ":" + m + ":" + s; + + }; + + $.convertSecToString = function(val) { + if (val == 0) { + return '-'; + } + var day = Math.floor(val / (24 * 60 * 60)); + var hour = Math.floor((val % (24 * 60 * 60) / (60 * 60))); + var minute = Math.floor(val % (24 * 60 * 60) % (60 * 60) / 60); + var second = Math.floor(val % (24 * 60 * 60) % (60 * 60) % 60); + + var str = ""; + if (day !== 0) { + str += day + "日"; + } + if (hour !== 0) { + str += hour + "時間"; + } + if (minute !== 0) { + str += minute + "分"; + } + if (second !== 0) { + str += second + "秒"; + } + + return str; + }; + + $.secToMinute = function(val) { + if (val === 0) { + return "-"; + } + + var m = Math.floor(val / 60); + var s = Math.floor(val % 60); + var str = ""; + + if (m !== 0) { + str += m + "分"; + } + str += s + "秒"; + + return str; + }; + + $.trim = function(str) { + if (str) { + + } else { + return ""; + } + + return str.replace(/^\s+|\s+$/g, ""); + }; + + $.rmspace = function(str) { + + str = str.replace(/ /g, ""); + str = str.replace(/ /g, ""); + str = str.replace(/\r\n?/g, ""); + + return str; + + }; + + $.replaceAll = function(text, searchString, replacement) { + + return text.replace(new RegExp(searchString, "g"), replacement); + + }; + + //指定した拡張子を付ける。拡張子がなければ + $.setExt = function(name, ext_str) { + + var tmp = name.split("."); + if (tmp.length == 1) { + name = name + "." + ext_str; + } + + return name; + + }; + + //要素をクローンします + $.cloneObject = function(source) { + + return $.extend(true, {}, source); + + }; + + //透明度を適切な値に変更 + $.convertOpacity = function(val) { + //255をマックスとして計算する + + var p = val / 255; + + return p; + + }; + + //パスにfgimage bgimage image が含まれていた場合、それを適応する + $.convertStorage = function(path) { + + }; + + $.convertColor = function(val) { + + if (val.indexOf("0x") != -1) { + return val.replace("0x", "#"); + } + + return val; + + }; + + $.convertBold = function(flag) { + + if (flag == "true") { + return "bold"; + } + + return ""; + + }; + + $.convertItalic = function(flag) { + + if (flag == "true") { + return "italic"; + } + + return ""; + + }; + + $.send = function(url, obj, call_back) { + //game.current_story_file = story_file; + $.ajax({ + type : "POST", + url : url, + data : obj, + dataType : 'json', + complete : function() { + //通信終了時の処理 + $.hideLoading(); + }, + success : function(data, status) { + $.hideLoading(); + + var data_obj = data; + if (call_back) { + call_back(data_obj); + } + } + }); + }; + + $.loadText = function(file_path, callback) { + + /* + var httpObj = jQuery.get(file_path + "?" + Math.floor(Math.random() * 1000000), null, function(obj) { + + var order_str = ""; + + if (httpObj) { + if (httpObj.responseText) { + order_str = httpObj.responseText; + } else { + + order_str = obj; + + } + } else { + + order_str = obj; + + } + + callback(order_str); + // createOrder + }); + + */ + + $.ajax({ + url: file_path + "?" + Math.floor(Math.random() * 1000000), + cache: false, + success: function(text){ + order_str = text; + callback(order_str); + }, + error:function(){ + alert("file not found:"+file_path); + callback(""); + } + }); + + + + }; + + //クッキーを取得 + $.getCookie = function(key) { + var tmp = document.cookie + ";"; + var index1 = tmp.indexOf(key, 0); + if (index1 != -1) { + tmp = tmp.substring(index1, tmp.length); + var index2 = tmp.indexOf("=", 0) + 1; + var index3 = tmp.indexOf(";", index2); + return tmp.substring(index2, index3); + } + return null; + }; + + $.isNull = function(str) { + if (str == null) { + return ""; + } else { + + } + + return str; + }; + + $.dstop = function() { + + console.log("dstop"); + + }; + + //ユーザ環境を取得 + $.userenv = function() { + + var ua = navigator.userAgent; + if (ua.indexOf('iPhone') > -1) { + return 'iphone'; + } else if (ua.indexOf('iPad') > -1) { + return 'iphone'; + } else if (ua.indexOf('Android') > -1) { + return 'android'; + } else if(ua.indexOf('Chrome') > -1 && navigator.platform.indexOf('Linux') > -1) { + return 'android'; + }else { + return "pc"; + } + + }; + + $.isTyranoPlayer = function(){ + if(typeof _tyrano_player != "undefined"){ + return true; + }else{ + return false; + } + }; + + $.lang = function(key) { + + if (tyrano_lang["word"][key]) { + return tyrano_lang["word"][key]; + } else { + return "NOT_DEFINED"; + } + + }; + + $.novel = function(key) { + + if (tyrano_lang["novel"][key]) { + return tyrano_lang["novel"][key]; + } else { + return "NOT_DEFINED"; + } + + }; + + //ユーザのブラウザ情報を取得 + $.getBrowser = function() { + + var userAgent = window.navigator.userAgent.toLowerCase(); + + if (userAgent.indexOf('msie') >= 0 || userAgent.indexOf('trident') >= 0) { + return "msie"; + }else if (userAgent.indexOf("edge") > -1) { + return "edge"; + }else if (userAgent.indexOf("firefox") > -1) { + return "firefox"; + } else if (userAgent.indexOf("opera") > -1) { + return "opera"; + } else if (userAgent.indexOf("chrome") > -1) { + return "chrome"; + } else if (userAgent.indexOf("safari") > -1) { + return "safari"; + }else if (userAgent.indexOf("applewebkit") > -1) { + return "safari"; + }else { + return "unknown"; + } + + }; + + $.isNWJS = function(){ + // Node.js で動作しているか + var isNode = (typeof process !== "undefined" && typeof require !== "undefined"); + // ブラウザ上(非Node.js)で動作しているか + var isBrowser = !isNode + // node-webkitで動作しているか + var isNodeWebkit; + try { + isNodeWebkit = isNode ? (typeof require('nw.gui') !== "undefined") : false; + } catch(e) { + isNodeWebkit = false; + } + + if (isNodeWebkit) { + // node-webkitで動作 + return true; + } else if ( isNode) { + // Node.js上で動作している + return true; + } else { + // 通常のWebページとして動作している + return false; + } + }, + + //オブジェクトを引き継ぐ。 + $.extendParam = function(pm,target){ + + var tmp = target; + + for(key in target){ + + if(pm[key]){ + if(pm[key]!=""){ + target[key] = pm[key]; + } + } + + } + + return target; + + }; + + + $.insertRule = function(css_str){ + + var sheet = (function() { + var style = document.createElement("style"); + document.getElementsByTagName("head")[0].appendChild(style); + return style.sheet; + })(); + sheet.insertRule(css_str,0); + + }, + + $.swfName = function(str) { + if (navigator.appName.indexOf("Microsoft") != -1) { + return window[str]; + } else { + return document[str]; + } + }; + +//古いトランス。 + $.trans_old = function(method, j_obj, time, mode, callback) { + + if (method == "crossfade" || mode == "show") { + + if (time == 0) { + if (mode == "show") { + j_obj.show(); + } else { + j_obj.hide(); + } + if (callback) { + callback(); + } + } else { + var ta = {}; + + if (mode == "show") { + ta = { + "opacity" : "show" + }; + } else { + ta = { + "opacity" : "hide" + }; + } + + j_obj.animate(ta, { + duration : time, + easing : "linear", + complete : function() { + if (callback) { + callback(); + } + }//end complerte + }); + } + + return false; + + } else { + + if (mode == "hide") { + j_obj.hide(method, time, function() { + if (callback) + callback(); + }); + } else if (mode == "show") { + j_obj.show(method, time, function() { + if (callback) + callback(); + }); + } + + } + + }; + + //コンバート v450rc5以前 + var _map_conv_method = { + "corssfade":"fadeIn", + "explode":"zoomIn", + "slide":"slideInLeft", + "blind":"bounceIn", + "bounce":"bounceIn", + "clip":"flipInX", + "drop":"slideInLeft", + "fold":"fadeIn", + "puff":"fadeIn", + "scale":"zoomIn", + "shake":"fadeIn", + "size":"zoomIn" + } + + $.trans = function(method, j_obj, time, mode, callback) { + + if(method=="crossfade") { + method = "fadeIn"; + }else if(_map_conv_method[method]){ + method = _map_conv_method[method]; + } + + j_obj.css("animation-duration",parseInt(time)+"ms"); + + if (mode == "hide") { + j_obj.show(); + method = $.replaceAll(method,"In","Out"); + var animationEnd = 'webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend'; + j_obj.addClass('animated ' + method).one(animationEnd, function() { + j_obj.off(animationEnd); + j_obj.css("animation-duration",""); + $(this).remove(); + if (callback) { + //callback(); + } + }); + + } else if (mode == "show") { + j_obj.show(); + var animationEnd = 'webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend'; + j_obj.addClass('animated ' + method).one(animationEnd, function() { + j_obj.off(animationEnd); + j_obj.css("animation-duration",""); + $(this).removeClass('animated ' + method); + if (callback) { + callback(); + } + }); + } + + + + }; + + //要素から空白のオブジェクトを削除して返却する + $.minifyObject = function(obj) { + + for (key in obj) { + if (obj[key] == null || obj[key] == "") { + delete obj[key]; + } + } + + return obj; + + }; + + $.preloadImgCallback = function(j_menu,cb,that){ + + var img_storage = []; + + j_menu.find("img").each(function() { + img_storage.push($(this).attr("src")); + }); + + //ロードが全て完了したら、ふわっと出す + var sum = 0; + for (var i = 0; i < img_storage.length; i++) { + that.kag.preload(img_storage[i], function() { + sum++; + if (img_storage.length == sum) { + + cb(); + + } + }); + } + + if(img_storage.length==0){ + cb(); + } + + }; + + $.setStorage = function(key, val ,type) { + + if(type=="webstorage_compress"){ + + $.setStorageCompress(key,val); + + }else if(type=="file"){ + + $.setStorageFile(key,val); + + }else{ + $.setStorageWeb(key,val); + } + + }; + + //PC版のみ。実行フォルダを取得 + $.getProcessPath = function(){ + var path = process.execPath; + var tmp_index = path.indexOf(".app"); + var os = "mac"; + if(tmp_index == -1){ +    tmp_index = path.indexOf(".exe"); + os="win"; +    } + var tmp_path =  path.substr(0,tmp_index); +    var path_index =0; + if(os=="mac"){ + path_index = tmp_path.lastIndexOf("/"); + }else{ + path_index = tmp_path.lastIndexOf("\\"); + } + + var out_path = path.substr(0,path_index); + return out_path; + + }; + + $.getOS = function(){ + + if($.isNWJS()){ + + var path = process.execPath; + var tmp_index = path.indexOf(".app"); + var os = "mac"; + if(tmp_index == -1){ +     tmp_index = path.indexOf(".exe"); + os="win"; +     } + + return os; + + }else{ + return ""; + } + }; + + $.getStorage = function(key,type) { + + var gv = "null"; + + if(type=="webstorage_compress"){ + + gv = $.getStorageCompress(key); + + }else if(type=="file"){ + gv = $.getStorageFile(key); + }else{ + gv = $.getStorageWeb(key); + } + + return gv; + + }; + + $.setStorageWeb = function(key, val) { + val = JSON.stringify(val); + //localStorage.setItem(key, LZString.compress(escape(val))); + localStorage.setItem(key, escape(val)); + }; + + $.getStorageWeb = function(key) { + + try { + + var gv = "null"; + + if (localStorage.getItem(key)) { + //gv = unescape(LZString.decompress(localStorage.getItem(key))); + gv = unescape(localStorage.getItem(key)); + } + + if (gv == "null") + return null; + + } catch(e) { + alert("この環境はセーブ機能を利用できません。ローカルで実行している場合などに発生します"); + $.confirmSaveClear(); + } + + return gv; + + }; + + $.playerHtmlPath = function(html){ + + if ("appJsInterface" in window) { + //Android + } else { + + if(typeof TyranoPlayer == "function"){ + + //playerの場合HTMLを修正する必要がある + var result_html =""; + while(1){ + var index = html.indexOf("file:///"); + if(index==-1){ + result_html += html; + break; + }else{ + + result_html += html.substring(0,index); + html = html.substring(index,html.length); + + var replace_index = html.indexOf("/game/data"); + tmp_html = html.substring(replace_index + "/game/data".length,html.length); + html = "./data"+tmp_html; + + + } + + } + + if(result_html !=""){ + html = result_html; + } + + } + + + } + + return html; + + }; + + + $.confirmSaveClear = function(){ + if(confirm('セーブデータが壊れている可能性があります。セーブデータを初期化しますか?')){ + alert("初期化"); + localStorage.clear(); + } + }; + + $.setStorageCompress = function(key, val) { + val = JSON.stringify(val); + localStorage.setItem(key, LZString.compress(escape(val))); + //localStorage.setItem(key, escape(val)); + }; + + $.getStorageCompress = function(key) { + + try { + + var gv = "null"; + + if (localStorage.getItem(key)) { + gv = unescape(LZString.decompress(localStorage.getItem(key))); + + if (gv == "null") { + gv = unescape(localStorage.getItem(key)); + } + } + + if (gv == "null") + return null; + + } catch(e) { + alert("この環境はセーブ機能を利用できません。ローカルで実行している場合などに発生します"); + $.confirmSaveClear(); + } + + return gv; + + }; + + $.setStorageFile = function(key, val) { + val = JSON.stringify(val); + var fs = require('fs'); + + var out_path = ""; + + //mac os Sierra 対応 + if(process.execPath.indexOf("var/folders")!=-1){ + out_path = process.env.HOME+"/_TyranoGameData"; + if(!fs.existsSync(out_path)){ + fs.mkdirSync(out_path); + } + }else{ + out_path = $.getProcessPath(); + } + + + fs.writeFileSync(out_path + "/" + key + ".sav", escape(val)); + + }; + + $.getStorageFile = function(key) { + + try { + + var gv = "null"; + var fs = require('fs'); + var out_path = ""; + + //Mac os Sierra 対応 + if(process.execPath.indexOf("var/folders")!=-1){ + out_path = process.env.HOME+"/_TyranoGameData"; + if(!fs.existsSync(out_path)){ + fs.mkdirSync(out_path); + } + }else{ + out_path = $.getProcessPath(); + } + + if (fs.existsSync(out_path+"/" + key + ".sav")) { + var str = fs.readFileSync(out_path+"/" + key + ".sav"); + gv = unescape(str); + } else { + //Fileが存在しない場合にローカルストレージから読み取る使用は破棄。 + //gv = unescape(localStorage.getItem(key)); + } + + if (gv == "null") + return null; + + } catch(e) { + alert("この環境はセーブ機能を利用できません。ローカルで実行している場合などに発生します"); + $.confirmSaveClear(); + } + + return gv; + + }; + + /* + $.setStorage = function(key,val){ + val = JSON.stringify(val); + localStorage.setItem(key, LZString.compress(escape(val))); + //localStorage.setItem(key, escape(val)); + }; + + $.getStorage = function(key){ + + try{ + + var gv = "null"; + + if(localStorage.getItem(key)){ + gv = unescape(LZString.decompress(localStorage.getItem(key))); + + if(gv=="null"){ + gv = unescape(localStorage.getItem(key)); + } + } + + if(gv =="null") return null; + + }catch(e){ + alert("この環境はセーブ機能を利用できません。ローカルで実行している場合などに発生します"); + } + + return gv; + + }; + */ + + $.alert = function(str,cb) { + + $(".remodal_title").html(str); + + $(".remodal").find(".remodal-cancel").hide(); + $(".remodal").find(".remodal-confirm").show(); + + var inst = $('[data-remodal-id=modal]').remodal(); + inst.open(); + + $(document).off('closed', '.remodal'); + $(document).on('closed', '.remodal', function (e) { + + if(typeof cb == "function"){ + cb(); + } + + }); + + + /* + if ($.userenv() != "pc") { + alert(str); + if(typeof cb == "function"){ + cb(); + } + + }else{ + alertify.alert(str,function(){; + if(typeof cb == "function"){ + cb(); + } + }); + } + */ + + }; + + $.inform =function(str,type){ + alertify.log(str,type); + }; + + $.confirm = function (str,cb_ok,cb_cancel){ + + $(".remodal_title").html(str); + + $(".remodal").find(".remodal-cancel").show(); + $(".remodal").find(".remodal-confirm").show(); + + var inst = $('[data-remodal-id=modal]').remodal(); + inst.open(); + + /////////OK ///////////// + + $(document).off('closed', '.remodal'); + + $(document).off('confirmation', '.remodal'); + $(document).on('confirmation', '.remodal', function (e) { + + $(document).off('confirmation', '.remodal'); + $(document).off('cancellation', '.remodal'); + + if(typeof cb_ok == "function"){ + cb_ok(); + } + + }); + + ///////キャンセル////////////// + $(document).off('cancellation', '.remodal'); + $(document).on('cancellation', '.remodal', function (e) { + + $(document).off('confirmation', '.remodal'); + $(document).off('cancellation', '.remodal'); + + if(typeof cb_cancel == "function"){ + cb_cancel(); + } + + }); + + /* + if ($.userenv() != "pc") { + + if(window.confirm(str)){ + cb_ok(); + }else{ + cb_cancel(); + } + + }else{ + alertify.confirm(str,function(e){ + if (e) { + // user clicked "ok" + cb_ok(); + } else { + // user clicked "cancel" + cb_cancel(); + } + }); + } + */ + + }; + + //オブジェクトの個数をもってきます。1 + $.countObj = function(obj) { + + var num = 0; + for (key in obj ) { + num++; + } + return num; + }; + + //渡されたJqueryオブジェクトにクラスをセットします + $.setName = function(jobj, str) { + + str = $.trim(str); + + if (str == "") + return; + + var array = str.split(","); + for (var i = 0; i < array.length; i++) { + jobj.addClass(array[i]); + + } + + }; + + //フラッシュのインストール判定 + $.isFlashInstalled = function() { + if (navigator.plugins['Shockwave Flash']) { + return true; + } + try { + new ActiveXObject('ShockwaveFlash.ShockwaveFlash'); + return true; + } catch (e) { + return false; + } + }; + + /*スマホの場合は、タッチでクリックを置き換える*/ + /*タッチ系、一応出来たけど、動作確認よくしなければならなk,問題なければR9にも適応*/ + if ($.userenv() != "pc") { + $.event.tap = function(o) { + + o.bind('touchstart', onTouchStart_); + function onTouchStart_(e) { + e.preventDefault(); + o.data('event.tap.moved', false).one('touchmove', onTouchMove_).one('touchend', onTouchEnd_); + e.stopPropagation(); + } + + function onTouchMove_(e) { + //o.data('event.tap.moved', true); + e.stopPropagation(); + } + + function onTouchEnd_(e) { + if (!o.data('event.tap.moved')) { + o.unbind('touchmove', onTouchMove_); + o.trigger('click').click(); + e.stopPropagation(); + } + } + + }; + + if ('ontouchend' in document) { + $.fn.tap = function(data, fn) { + + //alert("tap!"); + + if (fn == null) { + fn = data; + data = null; + } + + if (arguments.length > 0) { + this.bind('tap', data, fn); + $.event.tap(this); + } else { + this.trigger('tap'); + } + return this; + }; + + if ($.attrFn) { + $.attrFn['tap'] = true; + } + + //クリック上書き + $.fn.click = $.fn.tap; + + } else { + //$.fn.tap = $.fn.click; + } + } + + ////////////////////////////// + + $.error_message = function(str) { + alert(str); + }; + + //クッキー設定 + $.setCookie = function(key, val) { + document.cookie = key + "=" + escape(val) + ";expires=Fri, 31-Dec-2030 23:59:59;path=/;"; + } +})(jQuery); + +jQuery.fn.outerHTML = function(s) { + if (s) { + this.before(s); + this.remove(); + return this; + } else { + var dummy = jQuery("

"); + var elem = this.eq(0); + dummy.append(elem.clone()); + return dummy.html(); + } +}; + +// t: current time, b: begInnIng value, c: change In value, d: duration +jQuery.easing['jswing'] = jQuery.easing['swing']; + +jQuery.extend(jQuery.easing, { + def : 'easeOutQuad', + swing : function(x, t, b, c, d) { + //alert(jQuery.easing.default); + return jQuery.easing[jQuery.easing.def](x, t, b, c, d); + }, + easeInQuad : function(x, t, b, c, d) { + return c * (t /= d) * t + b; + }, + easeOutQuad : function(x, t, b, c, d) { + return -c * (t /= d) * (t - 2) + b; + }, + easeInOutQuad : function(x, t, b, c, d) { + if ((t /= d / 2) < 1) + return c / 2 * t * t + b; + return -c / 2 * ((--t) * (t - 2) - 1) + b; + }, + easeInCubic : function(x, t, b, c, d) { + return c * (t /= d) * t * t + b; + }, + easeOutCubic : function(x, t, b, c, d) { + return c * (( t = t / d - 1) * t * t + 1) + b; + }, + easeInOutCubic : function(x, t, b, c, d) { + if ((t /= d / 2) < 1) + return c / 2 * t * t * t + b; + return c / 2 * ((t -= 2) * t * t + 2) + b; + }, + easeInQuart : function(x, t, b, c, d) { + return c * (t /= d) * t * t * t + b; + }, + easeOutQuart : function(x, t, b, c, d) { + return -c * (( t = t / d - 1) * t * t * t - 1) + b; + }, + easeInOutQuart : function(x, t, b, c, d) { + if ((t /= d / 2) < 1) + return c / 2 * t * t * t * t + b; + return -c / 2 * ((t -= 2) * t * t * t - 2) + b; + }, + easeInQuint : function(x, t, b, c, d) { + return c * (t /= d) * t * t * t * t + b; + }, + easeOutQuint : function(x, t, b, c, d) { + return c * (( t = t / d - 1) * t * t * t * t + 1) + b; + }, + easeInOutQuint : function(x, t, b, c, d) { + if ((t /= d / 2) < 1) + return c / 2 * t * t * t * t * t + b; + return c / 2 * ((t -= 2) * t * t * t * t + 2) + b; + }, + easeInSine : function(x, t, b, c, d) { + return -c * Math.cos(t / d * (Math.PI / 2)) + c + b; + }, + easeOutSine : function(x, t, b, c, d) { + return c * Math.sin(t / d * (Math.PI / 2)) + b; + }, + easeInOutSine : function(x, t, b, c, d) { + return -c / 2 * (Math.cos(Math.PI * t / d) - 1) + b; + }, + easeInExpo : function(x, t, b, c, d) { + return (t == 0) ? b : c * Math.pow(2, 10 * (t / d - 1)) + b; + }, + easeOutExpo : function(x, t, b, c, d) { + return (t == d) ? b + c : c * (-Math.pow(2, -10 * t / d) + 1) + b; + }, + easeInOutExpo : function(x, t, b, c, d) { + if (t == 0) + return b; + if (t == d) + return b + c; + if ((t /= d / 2) < 1) + return c / 2 * Math.pow(2, 10 * (t - 1)) + b; + return c / 2 * (-Math.pow(2, -10 * --t) + 2) + b; + }, + easeInCirc : function(x, t, b, c, d) { + return -c * (Math.sqrt(1 - (t /= d) * t) - 1) + b; + }, + easeOutCirc : function(x, t, b, c, d) { + return c * Math.sqrt(1 - ( t = t / d - 1) * t) + b; + }, + easeInOutCirc : function(x, t, b, c, d) { + if ((t /= d / 2) < 1) + return -c / 2 * (Math.sqrt(1 - t * t) - 1) + b; + return c / 2 * (Math.sqrt(1 - (t -= 2) * t) + 1) + b; + }, + easeInElastic : function(x, t, b, c, d) { + var s = 1.70158; + var p = 0; + var a = c; + if (t == 0) + return b; + if ((t /= d) == 1) + return b + c; + if (!p) + p = d * .3; + if (a < Math.abs(c)) { + a = c; + var s = p / 4; + } else + var s = p / (2 * Math.PI) * Math.asin(c / a); + return -(a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t * d - s) * (2 * Math.PI) / p)) + b; + }, + easeOutElastic : function(x, t, b, c, d) { + var s = 1.70158; + var p = 0; + var a = c; + if (t == 0) + return b; + if ((t /= d) == 1) + return b + c; + if (!p) + p = d * .3; + if (a < Math.abs(c)) { + a = c; + var s = p / 4; + } else + var s = p / (2 * Math.PI) * Math.asin(c / a); + return a * Math.pow(2, -10 * t) * Math.sin((t * d - s) * (2 * Math.PI) / p) + c + b; + }, + easeInOutElastic : function(x, t, b, c, d) { + var s = 1.70158; + var p = 0; + var a = c; + if (t == 0) + return b; + if ((t /= d / 2) == 2) + return b + c; + if (!p) + p = d * (.3 * 1.5); + if (a < Math.abs(c)) { + a = c; + var s = p / 4; + } else + var s = p / (2 * Math.PI) * Math.asin(c / a); + if (t < 1) + return -.5 * (a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t * d - s) * (2 * Math.PI) / p)) + b; + return a * Math.pow(2, -10 * (t -= 1)) * Math.sin((t * d - s) * (2 * Math.PI) / p) * .5 + c + b; + }, + easeInBack : function(x, t, b, c, d, s) { + if (s == undefined) + s = 1.70158; + return c * (t /= d) * t * ((s + 1) * t - s) + b; + }, + easeOutBack : function(x, t, b, c, d, s) { + if (s == undefined) + s = 1.70158; + return c * (( t = t / d - 1) * t * ((s + 1) * t + s) + 1) + b; + }, + easeInOutBack : function(x, t, b, c, d, s) { + if (s == undefined) + s = 1.70158; + if ((t /= d / 2) < 1) + return c / 2 * (t * t * (((s *= (1.525)) + 1) * t - s)) + b; + return c / 2 * ((t -= 2) * t * (((s *= (1.525)) + 1) * t + s) + 2) + b; + }, + easeInBounce : function(x, t, b, c, d) { + return c - jQuery.easing.easeOutBounce(x, d - t, 0, c, d) + b; + }, + easeOutBounce : function(x, t, b, c, d) { + if ((t /= d) < (1 / 2.75)) { + return c * (7.5625 * t * t) + b; + } else if (t < (2 / 2.75)) { + return c * (7.5625 * (t -= (1.5 / 2.75)) * t + .75) + b; + } else if (t < (2.5 / 2.75)) { + return c * (7.5625 * (t -= (2.25 / 2.75)) * t + .9375) + b; + } else { + return c * (7.5625 * (t -= (2.625 / 2.75)) * t + .984375) + b; + } + }, + easeInOutBounce : function(x, t, b, c, d) { + if (t < d / 2) + return jQuery.easing.easeInBounce(x, t * 2, 0, c, d) * .5 + b; + return jQuery.easing.easeOutBounce(x, t * 2 - d, 0, c, d) * .5 + c * .5 + b; + } +}); + diff --git a/tyrano/libs/alertify/alertify.min.js b/tyrano/libs/alertify/alertify.min.js new file mode 100644 index 0000000..c4b6cc8 --- /dev/null +++ b/tyrano/libs/alertify/alertify.min.js @@ -0,0 +1,2 @@ +/*! alertify - v0.3.11 - 2013-10-08 */ +!function(a,b){"use strict";var c,d=a.document;c=function(){var c,e,f,g,h,i,j,k,l,m,n,o,p,q={},r={},s=!1,t={ENTER:13,ESC:27,SPACE:32},u=[];return r={buttons:{holder:'

',submit:'',ok:'',cancel:''},input:'
',message:'

{{message}}

',log:'
{{message}}
'},p=function(){var a,c,e=!1,f=d.createElement("fakeelement"),g={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"otransitionend",transition:"transitionend"};for(a in g)if(f.style[a]!==b){c=g[a],e=!0;break}return{type:c,supported:e}},c=function(a){return d.getElementById(a)},q={labels:{ok:"OK",cancel:"Cancel"},delay:5e3,buttonReverse:!1,buttonFocus:"ok",transition:b,addListeners:function(a){var b,c,i,j,k,l="undefined"!=typeof f,m="undefined"!=typeof e,n="undefined"!=typeof o,p="",q=this;b=function(b){return"undefined"!=typeof b.preventDefault&&b.preventDefault(),i(b),"undefined"!=typeof o&&(p=o.value),"function"==typeof a&&("undefined"!=typeof o?a(!0,p):a(!0)),!1},c=function(b){return"undefined"!=typeof b.preventDefault&&b.preventDefault(),i(b),"function"==typeof a&&a(!1),!1},i=function(){q.hide(),q.unbind(d.body,"keyup",j),q.unbind(g,"focus",k),l&&q.unbind(f,"click",b),m&&q.unbind(e,"click",c)},j=function(a){var d=a.keyCode;(d===t.SPACE&&!n||n&&d===t.ENTER)&&b(a),d===t.ESC&&m&&c(a)},k=function(){n?o.focus():!m||q.buttonReverse?f.focus():e.focus()},this.bind(g,"focus",k),this.bind(h,"focus",k),l&&this.bind(f,"click",b),m&&this.bind(e,"click",c),this.bind(d.body,"keyup",j),this.transition.supported||this.setFocus()},bind:function(a,b,c){"function"==typeof a.addEventListener?a.addEventListener(b,c,!1):a.attachEvent&&a.attachEvent("on"+b,c)},handleErrors:function(){if("undefined"!=typeof a.onerror){var b=this;return a.onerror=function(a,c,d){b.error("["+a+" on line "+d+" of "+c+"]",0)},!0}return!1},appendButtons:function(a,b){return this.buttonReverse?b+a:a+b},build:function(a){var b="",c=a.type,d=a.message,e=a.cssClass||"";switch(b+='
',b+='Reset Focus',"none"===q.buttonFocus&&(b+=''),"prompt"===c&&(b+='
'),b+='
',b+=r.message.replace("{{message}}",d),"prompt"===c&&(b+=r.input),b+=r.buttons.holder,b+="
","prompt"===c&&(b+="
"),b+='Reset Focus',b+="
",c){case"confirm":b=b.replace("{{buttons}}",this.appendButtons(r.buttons.cancel,r.buttons.ok)),b=b.replace("{{ok}}",this.labels.ok).replace("{{cancel}}",this.labels.cancel);break;case"prompt":b=b.replace("{{buttons}}",this.appendButtons(r.buttons.cancel,r.buttons.submit)),b=b.replace("{{ok}}",this.labels.ok).replace("{{cancel}}",this.labels.cancel);break;case"alert":b=b.replace("{{buttons}}",r.buttons.ok),b=b.replace("{{ok}}",this.labels.ok)}return l.className="alertify alertify-"+c+" "+e,k.className="alertify-cover",b},close:function(a,b){var c,d,e=b&&!isNaN(b)?+b:this.delay,f=this;this.bind(a,"click",function(){c(a)}),d=function(a){a.stopPropagation(),f.unbind(this,f.transition.type,d),m.removeChild(this),m.hasChildNodes()||(m.className+=" alertify-logs-hidden")},c=function(a){"undefined"!=typeof a&&a.parentNode===m&&(f.transition.supported?(f.bind(a,f.transition.type,d),a.className+=" alertify-log-hide"):(m.removeChild(a),m.hasChildNodes()||(m.className+=" alertify-logs-hidden")))},0!==b&&setTimeout(function(){c(a)},e)},dialog:function(a,b,c,e,f){j=d.activeElement;var g=function(){m&&null!==m.scrollTop&&k&&null!==k.scrollTop||g()};if("string"!=typeof a)throw new Error("message must be a string");if("string"!=typeof b)throw new Error("type must be a string");if("undefined"!=typeof c&&"function"!=typeof c)throw new Error("fn must be a function");return this.init(),g(),u.push({type:b,message:a,callback:c,placeholder:e,cssClass:f}),s||this.setup(),this},extend:function(a){if("string"!=typeof a)throw new Error("extend method must have exactly one paramter");return function(b,c){return this.log(b,a,c),this}},hide:function(){var a,b=this;u.splice(0,1),u.length>0?this.setup(!0):(s=!1,a=function(c){c.stopPropagation(),b.unbind(l,b.transition.type,a)},this.transition.supported?(this.bind(l,this.transition.type,a),l.className="alertify alertify-hide alertify-hidden"):l.className="alertify alertify-hide alertify-hidden alertify-isHidden",k.className="alertify-cover alertify-cover-hidden",j.focus())},init:function(){d.createElement("nav"),d.createElement("article"),d.createElement("section"),null==c("alertify-cover")&&(k=d.createElement("div"),k.setAttribute("id","alertify-cover"),k.className="alertify-cover alertify-cover-hidden",d.body.appendChild(k)),null==c("alertify")&&(s=!1,u=[],l=d.createElement("section"),l.setAttribute("id","alertify"),l.className="alertify alertify-hidden",d.body.appendChild(l)),null==c("alertify-logs")&&(m=d.createElement("section"),m.setAttribute("id","alertify-logs"),m.className="alertify-logs alertify-logs-hidden",d.body.appendChild(m)),d.body.setAttribute("tabindex","0"),this.transition=p()},log:function(a,b,c){var d=function(){m&&null!==m.scrollTop||d()};return this.init(),d(),m.className="alertify-logs",this.notify(a,b,c),this},notify:function(a,b,c){var e=d.createElement("article");e.className="alertify-log"+("string"==typeof b&&""!==b?" alertify-log-"+b:""),e.innerHTML=a,m.appendChild(e),setTimeout(function(){e.className=e.className+" alertify-log-show"},50),this.close(e,c)},set:function(a){var b;if("object"!=typeof a&&a instanceof Array)throw new Error("args must be an object");for(b in a)a.hasOwnProperty(b)&&(this[b]=a[b])},setFocus:function(){o?(o.focus(),o.select()):i.focus()},setup:function(a){var d,j=u[0],k=this;s=!0,d=function(a){a.stopPropagation(),k.setFocus(),k.unbind(l,k.transition.type,d)},this.transition.supported&&!a&&this.bind(l,this.transition.type,d),l.innerHTML=this.build(j),g=c("alertify-resetFocus"),h=c("alertify-resetFocusBack"),f=c("alertify-ok")||b,e=c("alertify-cancel")||b,i="cancel"===q.buttonFocus?e:"none"===q.buttonFocus?c("alertify-noneFocus"):f,o=c("alertify-text")||b,n=c("alertify-form")||b,"string"==typeof j.placeholder&&""!==j.placeholder&&(o.value=j.placeholder),a&&this.setFocus(),this.addListeners(j.callback)},unbind:function(a,b,c){"function"==typeof a.removeEventListener?a.removeEventListener(b,c,!1):a.detachEvent&&a.detachEvent("on"+b,c)}},{alert:function(a,b,c){return q.dialog(a,"alert",b,"",c),this},confirm:function(a,b,c){return q.dialog(a,"confirm",b,"",c),this},extend:q.extend,init:q.init,log:function(a,b,c){return q.log(a,b,c),this},prompt:function(a,b,c,d){return q.dialog(a,"prompt",b,c,d),this},success:function(a,b){return q.log(a,"success",b),this},error:function(a,b){return q.log(a,"error",b),this},set:function(a){q.set(a)},labels:q.labels,debug:q.handleErrors}},"function"==typeof define?define([],function(){return new c}):"undefined"==typeof a.alertify&&(a.alertify=new c)}(this); \ No newline at end of file diff --git a/tyrano/libs/html2canvas.js b/tyrano/libs/html2canvas.js new file mode 100644 index 0000000..2af700e --- /dev/null +++ b/tyrano/libs/html2canvas.js @@ -0,0 +1,3376 @@ +/* + html2canvas 0.5.0-alpha1 + Copyright (c) 2015 Niklas von Hertzen + + Released under MIT License +*/ + +(function(window, document, exports, global, define, undefined){ + +/*! + * @overview es6-promise - a tiny implementation of Promises/A+. + * @copyright Copyright (c) 2014 Yehuda Katz, Tom Dale, Stefan Penner and contributors (Conversion to ES6 API by Jake Archibald) + * @license Licensed under MIT license + * See https://raw.githubusercontent.com/jakearchibald/es6-promise/master/LICENSE + * @version 2.0.1 + */ + +(function(){function r(a,b){n[l]=a;n[l+1]=b;l+=2;2===l&&A()}function s(a){return"function"===typeof a}function F(){return function(){process.nextTick(t)}}function G(){var a=0,b=new B(t),c=document.createTextNode("");b.observe(c,{characterData:!0});return function(){c.data=a=++a%2}}function H(){var a=new MessageChannel;a.port1.onmessage=t;return function(){a.port2.postMessage(0)}}function I(){return function(){setTimeout(t,1)}}function t(){for(var a=0;a= 0x80 (not a basic code point)', + 'invalid-input': 'Invalid input' + }, + + /** Convenience shortcuts */ + baseMinusTMin = base - tMin, + floor = Math.floor, + stringFromCharCode = String.fromCharCode, + + /** Temporary variable */ + key; + + /*--------------------------------------------------------------------------*/ + + /** + * A generic error utility function. + * @private + * @param {String} type The error type. + * @returns {Error} Throws a `RangeError` with the applicable error message. + */ + function error(type) { + throw RangeError(errors[type]); + } + + /** + * A generic `Array#map` utility function. + * @private + * @param {Array} array The array to iterate over. + * @param {Function} callback The function that gets called for every array + * item. + * @returns {Array} A new array of values returned by the callback function. + */ + function map(array, fn) { + var length = array.length; + var result = []; + while (length--) { + result[length] = fn(array[length]); + } + return result; + } + + /** + * A simple `Array#map`-like wrapper to work with domain name strings or email + * addresses. + * @private + * @param {String} domain The domain name or email address. + * @param {Function} callback The function that gets called for every + * character. + * @returns {Array} A new string of characters returned by the callback + * function. + */ + function mapDomain(string, fn) { + var parts = string.split('@'); + var result = ''; + if (parts.length > 1) { + // In email addresses, only the domain name should be punycoded. Leave + // the local part (i.e. everything up to `@`) intact. + result = parts[0] + '@'; + string = parts[1]; + } + var labels = string.split(regexSeparators); + var encoded = map(labels, fn).join('.'); + return result + encoded; + } + + /** + * Creates an array containing the numeric code points of each Unicode + * character in the string. While JavaScript uses UCS-2 internally, + * this function will convert a pair of surrogate halves (each of which + * UCS-2 exposes as separate characters) into a single code point, + * matching UTF-16. + * @see `punycode.ucs2.encode` + * @see + * @memberOf punycode.ucs2 + * @name decode + * @param {String} string The Unicode input string (UCS-2). + * @returns {Array} The new array of code points. + */ + function ucs2decode(string) { + var output = [], + counter = 0, + length = string.length, + value, + extra; + while (counter < length) { + value = string.charCodeAt(counter++); + if (value >= 0xD800 && value <= 0xDBFF && counter < length) { + // high surrogate, and there is a next character + extra = string.charCodeAt(counter++); + if ((extra & 0xFC00) == 0xDC00) { // low surrogate + output.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000); + } else { + // unmatched surrogate; only append this code unit, in case the next + // code unit is the high surrogate of a surrogate pair + output.push(value); + counter--; + } + } else { + output.push(value); + } + } + return output; + } + + /** + * Creates a string based on an array of numeric code points. + * @see `punycode.ucs2.decode` + * @memberOf punycode.ucs2 + * @name encode + * @param {Array} codePoints The array of numeric code points. + * @returns {String} The new Unicode string (UCS-2). + */ + function ucs2encode(array) { + return map(array, function(value) { + var output = ''; + if (value > 0xFFFF) { + value -= 0x10000; + output += stringFromCharCode(value >>> 10 & 0x3FF | 0xD800); + value = 0xDC00 | value & 0x3FF; + } + output += stringFromCharCode(value); + return output; + }).join(''); + } + + /** + * Converts a basic code point into a digit/integer. + * @see `digitToBasic()` + * @private + * @param {Number} codePoint The basic numeric code point value. + * @returns {Number} The numeric value of a basic code point (for use in + * representing integers) in the range `0` to `base - 1`, or `base` if + * the code point does not represent a value. + */ + function basicToDigit(codePoint) { + if (codePoint - 48 < 10) { + return codePoint - 22; + } + if (codePoint - 65 < 26) { + return codePoint - 65; + } + if (codePoint - 97 < 26) { + return codePoint - 97; + } + return base; + } + + /** + * Converts a digit/integer into a basic code point. + * @see `basicToDigit()` + * @private + * @param {Number} digit The numeric value of a basic code point. + * @returns {Number} The basic code point whose value (when used for + * representing integers) is `digit`, which needs to be in the range + * `0` to `base - 1`. If `flag` is non-zero, the uppercase form is + * used; else, the lowercase form is used. The behavior is undefined + * if `flag` is non-zero and `digit` has no uppercase form. + */ + function digitToBasic(digit, flag) { + // 0..25 map to ASCII a..z or A..Z + // 26..35 map to ASCII 0..9 + return digit + 22 + 75 * (digit < 26) - ((flag != 0) << 5); + } + + /** + * Bias adaptation function as per section 3.4 of RFC 3492. + * http://tools.ietf.org/html/rfc3492#section-3.4 + * @private + */ + function adapt(delta, numPoints, firstTime) { + var k = 0; + delta = firstTime ? floor(delta / damp) : delta >> 1; + delta += floor(delta / numPoints); + for (/* no initialization */; delta > baseMinusTMin * tMax >> 1; k += base) { + delta = floor(delta / baseMinusTMin); + } + return floor(k + (baseMinusTMin + 1) * delta / (delta + skew)); + } + + /** + * Converts a Punycode string of ASCII-only symbols to a string of Unicode + * symbols. + * @memberOf punycode + * @param {String} input The Punycode string of ASCII-only symbols. + * @returns {String} The resulting string of Unicode symbols. + */ + function decode(input) { + // Don't use UCS-2 + var output = [], + inputLength = input.length, + out, + i = 0, + n = initialN, + bias = initialBias, + basic, + j, + index, + oldi, + w, + k, + digit, + t, + /** Cached calculation results */ + baseMinusT; + + // Handle the basic code points: let `basic` be the number of input code + // points before the last delimiter, or `0` if there is none, then copy + // the first basic code points to the output. + + basic = input.lastIndexOf(delimiter); + if (basic < 0) { + basic = 0; + } + + for (j = 0; j < basic; ++j) { + // if it's not a basic code point + if (input.charCodeAt(j) >= 0x80) { + error('not-basic'); + } + output.push(input.charCodeAt(j)); + } + + // Main decoding loop: start just after the last delimiter if any basic code + // points were copied; start at the beginning otherwise. + + for (index = basic > 0 ? basic + 1 : 0; index < inputLength; /* no final expression */) { + + // `index` is the index of the next character to be consumed. + // Decode a generalized variable-length integer into `delta`, + // which gets added to `i`. The overflow checking is easier + // if we increase `i` as we go, then subtract off its starting + // value at the end to obtain `delta`. + for (oldi = i, w = 1, k = base; /* no condition */; k += base) { + + if (index >= inputLength) { + error('invalid-input'); + } + + digit = basicToDigit(input.charCodeAt(index++)); + + if (digit >= base || digit > floor((maxInt - i) / w)) { + error('overflow'); + } + + i += digit * w; + t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias); + + if (digit < t) { + break; + } + + baseMinusT = base - t; + if (w > floor(maxInt / baseMinusT)) { + error('overflow'); + } + + w *= baseMinusT; + + } + + out = output.length + 1; + bias = adapt(i - oldi, out, oldi == 0); + + // `i` was supposed to wrap around from `out` to `0`, + // incrementing `n` each time, so we'll fix that now: + if (floor(i / out) > maxInt - n) { + error('overflow'); + } + + n += floor(i / out); + i %= out; + + // Insert `n` at position `i` of the output + output.splice(i++, 0, n); + + } + + return ucs2encode(output); + } + + /** + * Converts a string of Unicode symbols (e.g. a domain name label) to a + * Punycode string of ASCII-only symbols. + * @memberOf punycode + * @param {String} input The string of Unicode symbols. + * @returns {String} The resulting Punycode string of ASCII-only symbols. + */ + function encode(input) { + var n, + delta, + handledCPCount, + basicLength, + bias, + j, + m, + q, + k, + t, + currentValue, + output = [], + /** `inputLength` will hold the number of code points in `input`. */ + inputLength, + /** Cached calculation results */ + handledCPCountPlusOne, + baseMinusT, + qMinusT; + + // Convert the input in UCS-2 to Unicode + input = ucs2decode(input); + + // Cache the length + inputLength = input.length; + + // Initialize the state + n = initialN; + delta = 0; + bias = initialBias; + + // Handle the basic code points + for (j = 0; j < inputLength; ++j) { + currentValue = input[j]; + if (currentValue < 0x80) { + output.push(stringFromCharCode(currentValue)); + } + } + + handledCPCount = basicLength = output.length; + + // `handledCPCount` is the number of code points that have been handled; + // `basicLength` is the number of basic code points. + + // Finish the basic string - if it is not empty - with a delimiter + if (basicLength) { + output.push(delimiter); + } + + // Main encoding loop: + while (handledCPCount < inputLength) { + + // All non-basic code points < n have been handled already. Find the next + // larger one: + for (m = maxInt, j = 0; j < inputLength; ++j) { + currentValue = input[j]; + if (currentValue >= n && currentValue < m) { + m = currentValue; + } + } + + // Increase `delta` enough to advance the decoder's state to , + // but guard against overflow + handledCPCountPlusOne = handledCPCount + 1; + if (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) { + error('overflow'); + } + + delta += (m - n) * handledCPCountPlusOne; + n = m; + + for (j = 0; j < inputLength; ++j) { + currentValue = input[j]; + + if (currentValue < n && ++delta > maxInt) { + error('overflow'); + } + + if (currentValue == n) { + // Represent delta as a generalized variable-length integer + for (q = delta, k = base; /* no condition */; k += base) { + t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias); + if (q < t) { + break; + } + qMinusT = q - t; + baseMinusT = base - t; + output.push( + stringFromCharCode(digitToBasic(t + qMinusT % baseMinusT, 0)) + ); + q = floor(qMinusT / baseMinusT); + } + + output.push(stringFromCharCode(digitToBasic(q, 0))); + bias = adapt(delta, handledCPCountPlusOne, handledCPCount == basicLength); + delta = 0; + ++handledCPCount; + } + } + + ++delta; + ++n; + + } + return output.join(''); + } + + /** + * Converts a Punycode string representing a domain name or an email address + * to Unicode. Only the Punycoded parts of the input will be converted, i.e. + * it doesn't matter if you call it on a string that has already been + * converted to Unicode. + * @memberOf punycode + * @param {String} input The Punycoded domain name or email address to + * convert to Unicode. + * @returns {String} The Unicode representation of the given Punycode + * string. + */ + function toUnicode(input) { + return mapDomain(input, function(string) { + return regexPunycode.test(string) + ? decode(string.slice(4).toLowerCase()) + : string; + }); + } + + /** + * Converts a Unicode string representing a domain name or an email address to + * Punycode. Only the non-ASCII parts of the domain name will be converted, + * i.e. it doesn't matter if you call it with a domain that's already in + * ASCII. + * @memberOf punycode + * @param {String} input The domain name or email address to convert, as a + * Unicode string. + * @returns {String} The Punycode representation of the given domain name or + * email address. + */ + function toASCII(input) { + return mapDomain(input, function(string) { + return regexNonASCII.test(string) + ? 'xn--' + encode(string) + : string; + }); + } + + /*--------------------------------------------------------------------------*/ + + /** Define the public API */ + punycode = { + /** + * A string representing the current Punycode.js version number. + * @memberOf punycode + * @type String + */ + 'version': '1.3.1', + /** + * An object of methods to convert from JavaScript's internal character + * representation (UCS-2) to Unicode code points, and back. + * @see + * @memberOf punycode + * @type Object + */ + 'ucs2': { + 'decode': ucs2decode, + 'encode': ucs2encode + }, + 'decode': decode, + 'encode': encode, + 'toASCII': toASCII, + 'toUnicode': toUnicode + }; + + /** Expose `punycode` */ + // Some AMD build optimizers, like r.js, check for specific condition patterns + // like the following: + if ( + typeof define == 'function' && + typeof define.amd == 'object' && + define.amd + ) { + define('punycode', function() { + return punycode; + }); + } else if (freeExports && freeModule) { + if (module.exports == freeExports) { // in Node.js or RingoJS v0.8.0+ + freeModule.exports = punycode; + } else { // in Narwhal or RingoJS v0.7.0- + for (key in punycode) { + punycode.hasOwnProperty(key) && (freeExports[key] = punycode[key]); + } + } + } else { // in Rhino or a web browser + root.punycode = punycode; + } + +}(this)); + +var html2canvasNodeAttribute = "data-html2canvas-node"; +var html2canvasCanvasCloneAttribute = "data-html2canvas-canvas-clone"; +var html2canvasCanvasCloneIndex = 0; +var html2canvasCloneIndex = 0; + +window.html2canvas = function(nodeList, options) { + var index = html2canvasCloneIndex++; + options = options || {}; + if (options.logging) { + window.html2canvas.logging = true; + window.html2canvas.start = Date.now(); + } + + options.async = typeof(options.async) === "undefined" ? true : options.async; + options.allowTaint = typeof(options.allowTaint) === "undefined" ? false : options.allowTaint; + options.removeContainer = typeof(options.removeContainer) === "undefined" ? true : options.removeContainer; + options.javascriptEnabled = typeof(options.javascriptEnabled) === "undefined" ? false : options.javascriptEnabled; + options.imageTimeout = typeof(options.imageTimeout) === "undefined" ? 10000 : options.imageTimeout; + options.renderer = typeof(options.renderer) === "function" ? options.renderer : CanvasRenderer; + options.strict = !!options.strict; + + if (typeof(nodeList) === "string") { + if (typeof(options.proxy) !== "string") { + return Promise.reject("Proxy must be used when rendering url"); + } + var width = options.width != null ? options.width : window.innerWidth; + var height = options.height != null ? options.height : window.innerHeight; + return loadUrlDocument(absoluteUrl(nodeList), options.proxy, document, width, height, options).then(function(container) { + return renderWindow(container.contentWindow.document.documentElement, container, options, width, height); + }); + } + + var node = ((nodeList === undefined) ? [document.documentElement] : ((nodeList.length) ? nodeList : [nodeList]))[0]; + node.setAttribute(html2canvasNodeAttribute + index, index); + return renderDocument(node.ownerDocument, options, node.ownerDocument.defaultView.innerWidth, node.ownerDocument.defaultView.innerHeight, index).then(function(canvas) { + if (typeof(options.onrendered) === "function") { + log("options.onrendered is deprecated, html2canvas returns a Promise containing the canvas"); + options.onrendered(canvas); + } + return canvas; + }); +}; + +window.html2canvas.punycode = this.punycode; +window.html2canvas.proxy = {}; + +function renderDocument(document, options, windowWidth, windowHeight, html2canvasIndex) { + return createWindowClone(document, document, windowWidth, windowHeight, options, document.defaultView.pageXOffset, document.defaultView.pageYOffset).then(function(container) { + log("Document cloned"); + var attributeName = html2canvasNodeAttribute + html2canvasIndex; + var selector = "[" + attributeName + "='" + html2canvasIndex + "']"; + document.querySelector(selector).removeAttribute(attributeName); + var clonedWindow = container.contentWindow; + var node = clonedWindow.document.querySelector(selector); + var oncloneHandler = (typeof(options.onclone) === "function") ? Promise.resolve(options.onclone(clonedWindow.document)) : Promise.resolve(true); + return oncloneHandler.then(function() { + return renderWindow(node, container, options, windowWidth, windowHeight); + }); + }); +} + +function renderWindow(node, container, options, windowWidth, windowHeight) { + var clonedWindow = container.contentWindow; + var support = new Support(clonedWindow.document); + var imageLoader = new ImageLoader(options, support); + var bounds = getBounds(node); + var width = options.type === "view" ? windowWidth : documentWidth(clonedWindow.document); + var height = options.type === "view" ? windowHeight : documentHeight(clonedWindow.document); + var renderer = new options.renderer(width, height, imageLoader, options, document); + var parser = new NodeParser(node, renderer, support, imageLoader, options); + return parser.ready.then(function() { + log("Finished rendering"); + var canvas; + + if (options.type === "view") { + canvas = crop(renderer.canvas, {width: renderer.canvas.width, height: renderer.canvas.height, top: 0, left: 0, x: 0, y: 0}); + } else if (node === clonedWindow.document.body || node === clonedWindow.document.documentElement || options.canvas != null) { + canvas = renderer.canvas; + } else { + canvas = crop(renderer.canvas, {width: options.width != null ? options.width : bounds.width, height: options.height != null ? options.height : bounds.height, top: bounds.top, left: bounds.left, x: clonedWindow.pageXOffset, y: clonedWindow.pageYOffset}); + } + + cleanupContainer(container, options); + return canvas; + }); +} + +function cleanupContainer(container, options) { + if (options.removeContainer) { + container.parentNode.removeChild(container); + log("Cleaned up container"); + } +} + +function crop(canvas, bounds) { + var croppedCanvas = document.createElement("canvas"); + var x1 = Math.min(canvas.width - 1, Math.max(0, bounds.left)); + var x2 = Math.min(canvas.width, Math.max(1, bounds.left + bounds.width)); + var y1 = Math.min(canvas.height - 1, Math.max(0, bounds.top)); + var y2 = Math.min(canvas.height, Math.max(1, bounds.top + bounds.height)); + croppedCanvas.width = bounds.width; + croppedCanvas.height = bounds.height; + log("Cropping canvas at:", "left:", bounds.left, "top:", bounds.top, "width:", (x2-x1), "height:", (y2-y1)); + log("Resulting crop with width", bounds.width, "and height", bounds.height, " with x", x1, "and y", y1); + croppedCanvas.getContext("2d").drawImage(canvas, x1, y1, x2-x1, y2-y1, bounds.x, bounds.y, x2-x1, y2-y1); + return croppedCanvas; +} + +function documentWidth (doc) { + return Math.max( + Math.max(doc.body.scrollWidth, doc.documentElement.scrollWidth), + Math.max(doc.body.offsetWidth, doc.documentElement.offsetWidth), + Math.max(doc.body.clientWidth, doc.documentElement.clientWidth) + ); +} + +function documentHeight (doc) { + return Math.max( + Math.max(doc.body.scrollHeight, doc.documentElement.scrollHeight), + Math.max(doc.body.offsetHeight, doc.documentElement.offsetHeight), + Math.max(doc.body.clientHeight, doc.documentElement.clientHeight) + ); +} + +function smallImage() { + return "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7"; +} + +function isIE9() { + return document.documentMode && document.documentMode <= 9; +} + +// https://github.com/niklasvh/html2canvas/issues/503 +function cloneNodeIE9(node, javascriptEnabled) { + var clone = node.nodeType === 3 ? document.createTextNode(node.nodeValue) : node.cloneNode(false); + + var child = node.firstChild; + while(child) { + if (javascriptEnabled === true || child.nodeType !== 1 || child.nodeName !== 'SCRIPT') { + clone.appendChild(cloneNodeIE9(child, javascriptEnabled)); + } + child = child.nextSibling; + } + + return clone; +} + +function createWindowClone(ownerDocument, containerDocument, width, height, options, x ,y) { + labelCanvasElements(ownerDocument); + var documentElement = isIE9() ? cloneNodeIE9(ownerDocument.documentElement, options.javascriptEnabled) : ownerDocument.documentElement.cloneNode(true); + var container = containerDocument.createElement("iframe"); + + container.className = "html2canvas-container"; + container.style.visibility = "hidden"; + container.style.position = "fixed"; + container.style.left = "-10000px"; + container.style.top = "0px"; + container.style.border = "0"; + container.width = width; + container.height = height; + container.scrolling = "no"; // ios won't scroll without it + containerDocument.body.appendChild(container); + + return new Promise(function(resolve) { + var documentClone = container.contentWindow.document; + + cloneNodeValues(ownerDocument.documentElement, documentElement, "textarea"); + cloneNodeValues(ownerDocument.documentElement, documentElement, "select"); + + /* Chrome doesn't detect relative background-images assigned in inline ").appendTo(o)),a.opacity&&(this.helper.css("opacity")&&(this._storedOpacity=this.helper.css("opacity")),this.helper.css("opacity",a.opacity)),a.zIndex&&(this.helper.css("zIndex")&&(this._storedZIndex=this.helper.css("zIndex")),this.helper.css("zIndex",a.zIndex)),this.scrollParent[0]!==document&&"HTML"!==this.scrollParent[0].tagName&&(this.overflowOffset=this.scrollParent.offset()),this._trigger("start",e,this._uiHash()),this._preserveHelperProportions||this._cacheHelperProportions(),!s)for(n=this.containers.length-1;n>=0;n--)this.containers[n]._trigger("activate",e,this._uiHash(this));return t.ui.ddmanager&&(t.ui.ddmanager.current=this),t.ui.ddmanager&&!a.dropBehaviour&&t.ui.ddmanager.prepareOffsets(this,e),this.dragging=!0,this.helper.addClass("ui-sortable-helper"),this._mouseDrag(e),!0},_mouseDrag:function(e){var i,s,n,o,a=this.options,r=!1;for(this.position=this._generatePosition(e),this.positionAbs=this._convertPositionTo("absolute"),this.lastPositionAbs||(this.lastPositionAbs=this.positionAbs),this.options.scroll&&(this.scrollParent[0]!==document&&"HTML"!==this.scrollParent[0].tagName?(this.overflowOffset.top+this.scrollParent[0].offsetHeight-e.pageY=0;i--)if(s=this.items[i],n=s.item[0],o=this._intersectsWithPointer(s),o&&s.instance===this.currentContainer&&n!==this.currentItem[0]&&this.placeholder[1===o?"next":"prev"]()[0]!==n&&!t.contains(this.placeholder[0],n)&&("semi-dynamic"===this.options.type?!t.contains(this.element[0],n):!0)){if(this.direction=1===o?"down":"up","pointer"!==this.options.tolerance&&!this._intersectsWithSides(s))break; +this._rearrange(e,s),this._trigger("change",e,this._uiHash());break}return this._contactContainers(e),t.ui.ddmanager&&t.ui.ddmanager.drag(this,e),this._trigger("sort",e,this._uiHash()),this.lastPositionAbs=this.positionAbs,!1},_mouseStop:function(e,i){if(e){if(t.ui.ddmanager&&!this.options.dropBehaviour&&t.ui.ddmanager.drop(this,e),this.options.revert){var s=this,n=this.placeholder.offset(),o=this.options.axis,a={};o&&"x"!==o||(a.left=n.left-this.offset.parent.left-this.margins.left+(this.offsetParent[0]===document.body?0:this.offsetParent[0].scrollLeft)),o&&"y"!==o||(a.top=n.top-this.offset.parent.top-this.margins.top+(this.offsetParent[0]===document.body?0:this.offsetParent[0].scrollTop)),this.reverting=!0,t(this.helper).animate(a,parseInt(this.options.revert,10)||500,function(){s._clear(e)})}else this._clear(e,i);return!1}},cancel:function(){if(this.dragging){this._mouseUp({target:null}),"original"===this.options.helper?this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper"):this.currentItem.show();for(var e=this.containers.length-1;e>=0;e--)this.containers[e]._trigger("deactivate",null,this._uiHash(this)),this.containers[e].containerCache.over&&(this.containers[e]._trigger("out",null,this._uiHash(this)),this.containers[e].containerCache.over=0)}return this.placeholder&&(this.placeholder[0].parentNode&&this.placeholder[0].parentNode.removeChild(this.placeholder[0]),"original"!==this.options.helper&&this.helper&&this.helper[0].parentNode&&this.helper.remove(),t.extend(this,{helper:null,dragging:!1,reverting:!1,_noFinalSort:null}),this.domPosition.prev?t(this.domPosition.prev).after(this.currentItem):t(this.domPosition.parent).prepend(this.currentItem)),this},serialize:function(e){var i=this._getItemsAsjQuery(e&&e.connected),s=[];return e=e||{},t(i).each(function(){var i=(t(e.item||this).attr(e.attribute||"id")||"").match(e.expression||/(.+)[\-=_](.+)/);i&&s.push((e.key||i[1]+"[]")+"="+(e.key&&e.expression?i[1]:i[2]))}),!s.length&&e.key&&s.push(e.key+"="),s.join("&")},toArray:function(e){var i=this._getItemsAsjQuery(e&&e.connected),s=[];return e=e||{},i.each(function(){s.push(t(e.item||this).attr(e.attribute||"id")||"")}),s},_intersectsWith:function(t){var e=this.positionAbs.left,i=e+this.helperProportions.width,s=this.positionAbs.top,n=s+this.helperProportions.height,o=t.left,a=o+t.width,r=t.top,h=r+t.height,l=this.offset.click.top,c=this.offset.click.left,u="x"===this.options.axis||s+l>r&&h>s+l,d="y"===this.options.axis||e+c>o&&a>e+c,p=u&&d;return"pointer"===this.options.tolerance||this.options.forcePointerForContainers||"pointer"!==this.options.tolerance&&this.helperProportions[this.floating?"width":"height"]>t[this.floating?"width":"height"]?p:e+this.helperProportions.width/2>o&&a>i-this.helperProportions.width/2&&s+this.helperProportions.height/2>r&&h>n-this.helperProportions.height/2},_intersectsWithPointer:function(t){var i="x"===this.options.axis||e(this.positionAbs.top+this.offset.click.top,t.top,t.height),s="y"===this.options.axis||e(this.positionAbs.left+this.offset.click.left,t.left,t.width),n=i&&s,o=this._getDragVerticalDirection(),a=this._getDragHorizontalDirection();return n?this.floating?a&&"right"===a||"down"===o?2:1:o&&("down"===o?2:1):!1},_intersectsWithSides:function(t){var i=e(this.positionAbs.top+this.offset.click.top,t.top+t.height/2,t.height),s=e(this.positionAbs.left+this.offset.click.left,t.left+t.width/2,t.width),n=this._getDragVerticalDirection(),o=this._getDragHorizontalDirection();return this.floating&&o?"right"===o&&s||"left"===o&&!s:n&&("down"===n&&i||"up"===n&&!i)},_getDragVerticalDirection:function(){var t=this.positionAbs.top-this.lastPositionAbs.top;return 0!==t&&(t>0?"down":"up")},_getDragHorizontalDirection:function(){var t=this.positionAbs.left-this.lastPositionAbs.left;return 0!==t&&(t>0?"right":"left")},refresh:function(t){return this._refreshItems(t),this.refreshPositions(),this},_connectWith:function(){var t=this.options;return t.connectWith.constructor===String?[t.connectWith]:t.connectWith},_getItemsAsjQuery:function(e){var i,s,n,o,a=[],r=[],h=this._connectWith();if(h&&e)for(i=h.length-1;i>=0;i--)for(n=t(h[i]),s=n.length-1;s>=0;s--)o=t.data(n[s],this.widgetFullName),o&&o!==this&&!o.options.disabled&&r.push([t.isFunction(o.options.items)?o.options.items.call(o.element):t(o.options.items,o.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),o]);for(r.push([t.isFunction(this.options.items)?this.options.items.call(this.element,null,{options:this.options,item:this.currentItem}):t(this.options.items,this.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),this]),i=r.length-1;i>=0;i--)r[i][0].each(function(){a.push(this)});return t(a)},_removeCurrentsFromItems:function(){var e=this.currentItem.find(":data("+this.widgetName+"-item)");this.items=t.grep(this.items,function(t){for(var i=0;e.length>i;i++)if(e[i]===t.item[0])return!1;return!0})},_refreshItems:function(e){this.items=[],this.containers=[this];var i,s,n,o,a,r,h,l,c=this.items,u=[[t.isFunction(this.options.items)?this.options.items.call(this.element[0],e,{item:this.currentItem}):t(this.options.items,this.element),this]],d=this._connectWith();if(d&&this.ready)for(i=d.length-1;i>=0;i--)for(n=t(d[i]),s=n.length-1;s>=0;s--)o=t.data(n[s],this.widgetFullName),o&&o!==this&&!o.options.disabled&&(u.push([t.isFunction(o.options.items)?o.options.items.call(o.element[0],e,{item:this.currentItem}):t(o.options.items,o.element),o]),this.containers.push(o));for(i=u.length-1;i>=0;i--)for(a=u[i][1],r=u[i][0],s=0,l=r.length;l>s;s++)h=t(r[s]),h.data(this.widgetName+"-item",a),c.push({item:h,instance:a,width:0,height:0,left:0,top:0})},refreshPositions:function(e){this.offsetParent&&this.helper&&(this.offset.parent=this._getParentOffset());var i,s,n,o;for(i=this.items.length-1;i>=0;i--)s=this.items[i],s.instance!==this.currentContainer&&this.currentContainer&&s.item[0]!==this.currentItem[0]||(n=this.options.toleranceElement?t(this.options.toleranceElement,s.item):s.item,e||(s.width=n.outerWidth(),s.height=n.outerHeight()),o=n.offset(),s.left=o.left,s.top=o.top);if(this.options.custom&&this.options.custom.refreshContainers)this.options.custom.refreshContainers.call(this);else for(i=this.containers.length-1;i>=0;i--)o=this.containers[i].element.offset(),this.containers[i].containerCache.left=o.left,this.containers[i].containerCache.top=o.top,this.containers[i].containerCache.width=this.containers[i].element.outerWidth(),this.containers[i].containerCache.height=this.containers[i].element.outerHeight();return this},_createPlaceholder:function(e){e=e||this;var i,s=e.options;s.placeholder&&s.placeholder.constructor!==String||(i=s.placeholder,s.placeholder={element:function(){var s=e.currentItem[0].nodeName.toLowerCase(),n=t("<"+s+">",e.document[0]).addClass(i||e.currentItem[0].className+" ui-sortable-placeholder").removeClass("ui-sortable-helper");return"tr"===s?e.currentItem.children().each(function(){t(" ",e.document[0]).attr("colspan",t(this).attr("colspan")||1).appendTo(n)}):"img"===s&&n.attr("src",e.currentItem.attr("src")),i||n.css("visibility","hidden"),n},update:function(t,n){(!i||s.forcePlaceholderSize)&&(n.height()||n.height(e.currentItem.innerHeight()-parseInt(e.currentItem.css("paddingTop")||0,10)-parseInt(e.currentItem.css("paddingBottom")||0,10)),n.width()||n.width(e.currentItem.innerWidth()-parseInt(e.currentItem.css("paddingLeft")||0,10)-parseInt(e.currentItem.css("paddingRight")||0,10)))}}),e.placeholder=t(s.placeholder.element.call(e.element,e.currentItem)),e.currentItem.after(e.placeholder),s.placeholder.update(e,e.placeholder)},_contactContainers:function(s){var n,o,a,r,h,l,c,u,d,p,f=null,g=null;for(n=this.containers.length-1;n>=0;n--)if(!t.contains(this.currentItem[0],this.containers[n].element[0]))if(this._intersectsWith(this.containers[n].containerCache)){if(f&&t.contains(this.containers[n].element[0],f.element[0]))continue;f=this.containers[n],g=n}else this.containers[n].containerCache.over&&(this.containers[n]._trigger("out",s,this._uiHash(this)),this.containers[n].containerCache.over=0);if(f)if(1===this.containers.length)this.containers[g].containerCache.over||(this.containers[g]._trigger("over",s,this._uiHash(this)),this.containers[g].containerCache.over=1);else{for(a=1e4,r=null,p=f.floating||i(this.currentItem),h=p?"left":"top",l=p?"width":"height",c=this.positionAbs[h]+this.offset.click[h],o=this.items.length-1;o>=0;o--)t.contains(this.containers[g].element[0],this.items[o].item[0])&&this.items[o].item[0]!==this.currentItem[0]&&(!p||e(this.positionAbs.top+this.offset.click.top,this.items[o].top,this.items[o].height))&&(u=this.items[o].item.offset()[h],d=!1,Math.abs(u-c)>Math.abs(u+this.items[o][l]-c)&&(d=!0,u+=this.items[o][l]),a>Math.abs(u-c)&&(a=Math.abs(u-c),r=this.items[o],this.direction=d?"up":"down"));if(!r&&!this.options.dropOnEmpty)return;if(this.currentContainer===this.containers[g])return;r?this._rearrange(s,r,null,!0):this._rearrange(s,null,this.containers[g].element,!0),this._trigger("change",s,this._uiHash()),this.containers[g]._trigger("change",s,this._uiHash(this)),this.currentContainer=this.containers[g],this.options.placeholder.update(this.currentContainer,this.placeholder),this.containers[g]._trigger("over",s,this._uiHash(this)),this.containers[g].containerCache.over=1}},_createHelper:function(e){var i=this.options,s=t.isFunction(i.helper)?t(i.helper.apply(this.element[0],[e,this.currentItem])):"clone"===i.helper?this.currentItem.clone():this.currentItem;return s.parents("body").length||t("parent"!==i.appendTo?i.appendTo:this.currentItem[0].parentNode)[0].appendChild(s[0]),s[0]===this.currentItem[0]&&(this._storedCSS={width:this.currentItem[0].style.width,height:this.currentItem[0].style.height,position:this.currentItem.css("position"),top:this.currentItem.css("top"),left:this.currentItem.css("left")}),(!s[0].style.width||i.forceHelperSize)&&s.width(this.currentItem.width()),(!s[0].style.height||i.forceHelperSize)&&s.height(this.currentItem.height()),s},_adjustOffsetFromHelper:function(e){"string"==typeof e&&(e=e.split(" ")),t.isArray(e)&&(e={left:+e[0],top:+e[1]||0}),"left"in e&&(this.offset.click.left=e.left+this.margins.left),"right"in e&&(this.offset.click.left=this.helperProportions.width-e.right+this.margins.left),"top"in e&&(this.offset.click.top=e.top+this.margins.top),"bottom"in e&&(this.offset.click.top=this.helperProportions.height-e.bottom+this.margins.top)},_getParentOffset:function(){this.offsetParent=this.helper.offsetParent();var e=this.offsetParent.offset();return"absolute"===this.cssPosition&&this.scrollParent[0]!==document&&t.contains(this.scrollParent[0],this.offsetParent[0])&&(e.left+=this.scrollParent.scrollLeft(),e.top+=this.scrollParent.scrollTop()),(this.offsetParent[0]===document.body||this.offsetParent[0].tagName&&"html"===this.offsetParent[0].tagName.toLowerCase()&&t.ui.ie)&&(e={top:0,left:0}),{top:e.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:e.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if("relative"===this.cssPosition){var t=this.currentItem.position();return{top:t.top-(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:t.left-(parseInt(this.helper.css("left"),10)||0)+this.scrollParent.scrollLeft()}}return{top:0,left:0}},_cacheMargins:function(){this.margins={left:parseInt(this.currentItem.css("marginLeft"),10)||0,top:parseInt(this.currentItem.css("marginTop"),10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var e,i,s,n=this.options;"parent"===n.containment&&(n.containment=this.helper[0].parentNode),("document"===n.containment||"window"===n.containment)&&(this.containment=[0-this.offset.relative.left-this.offset.parent.left,0-this.offset.relative.top-this.offset.parent.top,t("document"===n.containment?document:window).width()-this.helperProportions.width-this.margins.left,(t("document"===n.containment?document:window).height()||document.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top]),/^(document|window|parent)$/.test(n.containment)||(e=t(n.containment)[0],i=t(n.containment).offset(),s="hidden"!==t(e).css("overflow"),this.containment=[i.left+(parseInt(t(e).css("borderLeftWidth"),10)||0)+(parseInt(t(e).css("paddingLeft"),10)||0)-this.margins.left,i.top+(parseInt(t(e).css("borderTopWidth"),10)||0)+(parseInt(t(e).css("paddingTop"),10)||0)-this.margins.top,i.left+(s?Math.max(e.scrollWidth,e.offsetWidth):e.offsetWidth)-(parseInt(t(e).css("borderLeftWidth"),10)||0)-(parseInt(t(e).css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left,i.top+(s?Math.max(e.scrollHeight,e.offsetHeight):e.offsetHeight)-(parseInt(t(e).css("borderTopWidth"),10)||0)-(parseInt(t(e).css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top])},_convertPositionTo:function(e,i){i||(i=this.position);var s="absolute"===e?1:-1,n="absolute"!==this.cssPosition||this.scrollParent[0]!==document&&t.contains(this.scrollParent[0],this.offsetParent[0])?this.scrollParent:this.offsetParent,o=/(html|body)/i.test(n[0].tagName);return{top:i.top+this.offset.relative.top*s+this.offset.parent.top*s-("fixed"===this.cssPosition?-this.scrollParent.scrollTop():o?0:n.scrollTop())*s,left:i.left+this.offset.relative.left*s+this.offset.parent.left*s-("fixed"===this.cssPosition?-this.scrollParent.scrollLeft():o?0:n.scrollLeft())*s}},_generatePosition:function(e){var i,s,n=this.options,o=e.pageX,a=e.pageY,r="absolute"!==this.cssPosition||this.scrollParent[0]!==document&&t.contains(this.scrollParent[0],this.offsetParent[0])?this.scrollParent:this.offsetParent,h=/(html|body)/i.test(r[0].tagName);return"relative"!==this.cssPosition||this.scrollParent[0]!==document&&this.scrollParent[0]!==this.offsetParent[0]||(this.offset.relative=this._getRelativeOffset()),this.originalPosition&&(this.containment&&(e.pageX-this.offset.click.leftthis.containment[2]&&(o=this.containment[2]+this.offset.click.left),e.pageY-this.offset.click.top>this.containment[3]&&(a=this.containment[3]+this.offset.click.top)),n.grid&&(i=this.originalPageY+Math.round((a-this.originalPageY)/n.grid[1])*n.grid[1],a=this.containment?i-this.offset.click.top>=this.containment[1]&&i-this.offset.click.top<=this.containment[3]?i:i-this.offset.click.top>=this.containment[1]?i-n.grid[1]:i+n.grid[1]:i,s=this.originalPageX+Math.round((o-this.originalPageX)/n.grid[0])*n.grid[0],o=this.containment?s-this.offset.click.left>=this.containment[0]&&s-this.offset.click.left<=this.containment[2]?s:s-this.offset.click.left>=this.containment[0]?s-n.grid[0]:s+n.grid[0]:s)),{top:a-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+("fixed"===this.cssPosition?-this.scrollParent.scrollTop():h?0:r.scrollTop()),left:o-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+("fixed"===this.cssPosition?-this.scrollParent.scrollLeft():h?0:r.scrollLeft())}},_rearrange:function(t,e,i,s){i?i[0].appendChild(this.placeholder[0]):e.item[0].parentNode.insertBefore(this.placeholder[0],"down"===this.direction?e.item[0]:e.item[0].nextSibling),this.counter=this.counter?++this.counter:1;var n=this.counter;this._delay(function(){n===this.counter&&this.refreshPositions(!s)})},_clear:function(t,e){this.reverting=!1;var i,s=[];if(!this._noFinalSort&&this.currentItem.parent().length&&this.placeholder.before(this.currentItem),this._noFinalSort=null,this.helper[0]===this.currentItem[0]){for(i in this._storedCSS)("auto"===this._storedCSS[i]||"static"===this._storedCSS[i])&&(this._storedCSS[i]="");this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper")}else this.currentItem.show();for(this.fromOutside&&!e&&s.push(function(t){this._trigger("receive",t,this._uiHash(this.fromOutside))}),!this.fromOutside&&this.domPosition.prev===this.currentItem.prev().not(".ui-sortable-helper")[0]&&this.domPosition.parent===this.currentItem.parent()[0]||e||s.push(function(t){this._trigger("update",t,this._uiHash())}),this!==this.currentContainer&&(e||(s.push(function(t){this._trigger("remove",t,this._uiHash())}),s.push(function(t){return function(e){t._trigger("receive",e,this._uiHash(this))}}.call(this,this.currentContainer)),s.push(function(t){return function(e){t._trigger("update",e,this._uiHash(this))}}.call(this,this.currentContainer)))),i=this.containers.length-1;i>=0;i--)e||s.push(function(t){return function(e){t._trigger("deactivate",e,this._uiHash(this))}}.call(this,this.containers[i])),this.containers[i].containerCache.over&&(s.push(function(t){return function(e){t._trigger("out",e,this._uiHash(this))}}.call(this,this.containers[i])),this.containers[i].containerCache.over=0);if(this.storedCursor&&(this.document.find("body").css("cursor",this.storedCursor),this.storedStylesheet.remove()),this._storedOpacity&&this.helper.css("opacity",this._storedOpacity),this._storedZIndex&&this.helper.css("zIndex","auto"===this._storedZIndex?"":this._storedZIndex),this.dragging=!1,this.cancelHelperRemoval){if(!e){for(this._trigger("beforeStop",t,this._uiHash()),i=0;s.length>i;i++)s[i].call(this,t);this._trigger("stop",t,this._uiHash())}return this.fromOutside=!1,!1}if(e||this._trigger("beforeStop",t,this._uiHash()),this.placeholder[0].parentNode.removeChild(this.placeholder[0]),this.helper[0]!==this.currentItem[0]&&this.helper.remove(),this.helper=null,!e){for(i=0;s.length>i;i++)s[i].call(this,t);this._trigger("stop",t,this._uiHash())}return this.fromOutside=!1,!0},_trigger:function(){t.Widget.prototype._trigger.apply(this,arguments)===!1&&this.cancel()},_uiHash:function(e){var i=e||this;return{helper:i.helper,placeholder:i.placeholder||t([]),position:i.position,originalPosition:i.originalPosition,offset:i.positionAbs,item:i.currentItem,sender:e?e.element:null}}})}(jQuery),function(t,e){var i="ui-effects-";t.effects={effect:{}},function(t,e){function i(t,e,i){var s=u[e.type]||{};return null==t?i||!e.def?null:e.def:(t=s.floor?~~t:parseFloat(t),isNaN(t)?e.def:s.mod?(t+s.mod)%s.mod:0>t?0:t>s.max?s.max:t)}function s(i){var s=l(),n=s._rgba=[];return i=i.toLowerCase(),f(h,function(t,o){var a,r=o.re.exec(i),h=r&&o.parse(r),l=o.space||"rgba";return h?(a=s[l](h),s[c[l].cache]=a[c[l].cache],n=s._rgba=a._rgba,!1):e}),n.length?("0,0,0,0"===n.join()&&t.extend(n,o.transparent),s):o[i]}function n(t,e,i){return i=(i+1)%1,1>6*i?t+6*(e-t)*i:1>2*i?e:2>3*i?t+6*(e-t)*(2/3-i):t}var o,a="backgroundColor borderBottomColor borderLeftColor borderRightColor borderTopColor color columnRuleColor outlineColor textDecorationColor textEmphasisColor",r=/^([\-+])=\s*(\d+\.?\d*)/,h=[{re:/rgba?\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,parse:function(t){return[t[1],t[2],t[3],t[4]]}},{re:/rgba?\(\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,parse:function(t){return[2.55*t[1],2.55*t[2],2.55*t[3],t[4]]}},{re:/#([a-f0-9]{2})([a-f0-9]{2})([a-f0-9]{2})/,parse:function(t){return[parseInt(t[1],16),parseInt(t[2],16),parseInt(t[3],16)]}},{re:/#([a-f0-9])([a-f0-9])([a-f0-9])/,parse:function(t){return[parseInt(t[1]+t[1],16),parseInt(t[2]+t[2],16),parseInt(t[3]+t[3],16)]}},{re:/hsla?\(\s*(\d+(?:\.\d+)?)\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,space:"hsla",parse:function(t){return[t[1],t[2]/100,t[3]/100,t[4]]}}],l=t.Color=function(e,i,s,n){return new t.Color.fn.parse(e,i,s,n)},c={rgba:{props:{red:{idx:0,type:"byte"},green:{idx:1,type:"byte"},blue:{idx:2,type:"byte"}}},hsla:{props:{hue:{idx:0,type:"degrees"},saturation:{idx:1,type:"percent"},lightness:{idx:2,type:"percent"}}}},u={"byte":{floor:!0,max:255},percent:{max:1},degrees:{mod:360,floor:!0}},d=l.support={},p=t("

")[0],f=t.each;p.style.cssText="background-color:rgba(1,1,1,.5)",d.rgba=p.style.backgroundColor.indexOf("rgba")>-1,f(c,function(t,e){e.cache="_"+t,e.props.alpha={idx:3,type:"percent",def:1}}),l.fn=t.extend(l.prototype,{parse:function(n,a,r,h){if(n===e)return this._rgba=[null,null,null,null],this;(n.jquery||n.nodeType)&&(n=t(n).css(a),a=e);var u=this,d=t.type(n),p=this._rgba=[];return a!==e&&(n=[n,a,r,h],d="array"),"string"===d?this.parse(s(n)||o._default):"array"===d?(f(c.rgba.props,function(t,e){p[e.idx]=i(n[e.idx],e)}),this):"object"===d?(n instanceof l?f(c,function(t,e){n[e.cache]&&(u[e.cache]=n[e.cache].slice())}):f(c,function(e,s){var o=s.cache;f(s.props,function(t,e){if(!u[o]&&s.to){if("alpha"===t||null==n[t])return;u[o]=s.to(u._rgba)}u[o][e.idx]=i(n[t],e,!0)}),u[o]&&0>t.inArray(null,u[o].slice(0,3))&&(u[o][3]=1,s.from&&(u._rgba=s.from(u[o])))}),this):e},is:function(t){var i=l(t),s=!0,n=this;return f(c,function(t,o){var a,r=i[o.cache];return r&&(a=n[o.cache]||o.to&&o.to(n._rgba)||[],f(o.props,function(t,i){return null!=r[i.idx]?s=r[i.idx]===a[i.idx]:e})),s}),s},_space:function(){var t=[],e=this;return f(c,function(i,s){e[s.cache]&&t.push(i)}),t.pop()},transition:function(t,e){var s=l(t),n=s._space(),o=c[n],a=0===this.alpha()?l("transparent"):this,r=a[o.cache]||o.to(a._rgba),h=r.slice();return s=s[o.cache],f(o.props,function(t,n){var o=n.idx,a=r[o],l=s[o],c=u[n.type]||{};null!==l&&(null===a?h[o]=l:(c.mod&&(l-a>c.mod/2?a+=c.mod:a-l>c.mod/2&&(a-=c.mod)),h[o]=i((l-a)*e+a,n)))}),this[n](h)},blend:function(e){if(1===this._rgba[3])return this;var i=this._rgba.slice(),s=i.pop(),n=l(e)._rgba;return l(t.map(i,function(t,e){return(1-s)*n[e]+s*t}))},toRgbaString:function(){var e="rgba(",i=t.map(this._rgba,function(t,e){return null==t?e>2?1:0:t});return 1===i[3]&&(i.pop(),e="rgb("),e+i.join()+")"},toHslaString:function(){var e="hsla(",i=t.map(this.hsla(),function(t,e){return null==t&&(t=e>2?1:0),e&&3>e&&(t=Math.round(100*t)+"%"),t});return 1===i[3]&&(i.pop(),e="hsl("),e+i.join()+")"},toHexString:function(e){var i=this._rgba.slice(),s=i.pop();return e&&i.push(~~(255*s)),"#"+t.map(i,function(t){return t=(t||0).toString(16),1===t.length?"0"+t:t}).join("")},toString:function(){return 0===this._rgba[3]?"transparent":this.toRgbaString()}}),l.fn.parse.prototype=l.fn,c.hsla.to=function(t){if(null==t[0]||null==t[1]||null==t[2])return[null,null,null,t[3]];var e,i,s=t[0]/255,n=t[1]/255,o=t[2]/255,a=t[3],r=Math.max(s,n,o),h=Math.min(s,n,o),l=r-h,c=r+h,u=.5*c;return e=h===r?0:s===r?60*(n-o)/l+360:n===r?60*(o-s)/l+120:60*(s-n)/l+240,i=0===l?0:.5>=u?l/c:l/(2-c),[Math.round(e)%360,i,u,null==a?1:a]},c.hsla.from=function(t){if(null==t[0]||null==t[1]||null==t[2])return[null,null,null,t[3]];var e=t[0]/360,i=t[1],s=t[2],o=t[3],a=.5>=s?s*(1+i):s+i-s*i,r=2*s-a;return[Math.round(255*n(r,a,e+1/3)),Math.round(255*n(r,a,e)),Math.round(255*n(r,a,e-1/3)),o]},f(c,function(s,n){var o=n.props,a=n.cache,h=n.to,c=n.from;l.fn[s]=function(s){if(h&&!this[a]&&(this[a]=h(this._rgba)),s===e)return this[a].slice();var n,r=t.type(s),u="array"===r||"object"===r?s:arguments,d=this[a].slice();return f(o,function(t,e){var s=u["object"===r?t:e.idx];null==s&&(s=d[e.idx]),d[e.idx]=i(s,e)}),c?(n=l(c(d)),n[a]=d,n):l(d)},f(o,function(e,i){l.fn[e]||(l.fn[e]=function(n){var o,a=t.type(n),h="alpha"===e?this._hsla?"hsla":"rgba":s,l=this[h](),c=l[i.idx];return"undefined"===a?c:("function"===a&&(n=n.call(this,c),a=t.type(n)),null==n&&i.empty?this:("string"===a&&(o=r.exec(n),o&&(n=c+parseFloat(o[2])*("+"===o[1]?1:-1))),l[i.idx]=n,this[h](l)))})})}),l.hook=function(e){var i=e.split(" ");f(i,function(e,i){t.cssHooks[i]={set:function(e,n){var o,a,r="";if("transparent"!==n&&("string"!==t.type(n)||(o=s(n)))){if(n=l(o||n),!d.rgba&&1!==n._rgba[3]){for(a="backgroundColor"===i?e.parentNode:e;(""===r||"transparent"===r)&&a&&a.style;)try{r=t.css(a,"backgroundColor"),a=a.parentNode}catch(h){}n=n.blend(r&&"transparent"!==r?r:"_default")}n=n.toRgbaString()}try{e.style[i]=n}catch(h){}}},t.fx.step[i]=function(e){e.colorInit||(e.start=l(e.elem,i),e.end=l(e.end),e.colorInit=!0),t.cssHooks[i].set(e.elem,e.start.transition(e.end,e.pos))}})},l.hook(a),t.cssHooks.borderColor={expand:function(t){var e={};return f(["Top","Right","Bottom","Left"],function(i,s){e["border"+s+"Color"]=t}),e}},o=t.Color.names={aqua:"#00ffff",black:"#000000",blue:"#0000ff",fuchsia:"#ff00ff",gray:"#808080",green:"#008000",lime:"#00ff00",maroon:"#800000",navy:"#000080",olive:"#808000",purple:"#800080",red:"#ff0000",silver:"#c0c0c0",teal:"#008080",white:"#ffffff",yellow:"#ffff00",transparent:[null,null,null,0],_default:"#ffffff"}}(jQuery),function(){function i(e){var i,s,n=e.ownerDocument.defaultView?e.ownerDocument.defaultView.getComputedStyle(e,null):e.currentStyle,o={};if(n&&n.length&&n[0]&&n[n[0]])for(s=n.length;s--;)i=n[s],"string"==typeof n[i]&&(o[t.camelCase(i)]=n[i]);else for(i in n)"string"==typeof n[i]&&(o[i]=n[i]);return o}function s(e,i){var s,n,a={};for(s in i)n=i[s],e[s]!==n&&(o[s]||(t.fx.step[s]||!isNaN(parseFloat(n)))&&(a[s]=n));return a}var n=["add","remove","toggle"],o={border:1,borderBottom:1,borderColor:1,borderLeft:1,borderRight:1,borderTop:1,borderWidth:1,margin:1,padding:1};t.each(["borderLeftStyle","borderRightStyle","borderBottomStyle","borderTopStyle"],function(e,i){t.fx.step[i]=function(t){("none"!==t.end&&!t.setAttr||1===t.pos&&!t.setAttr)&&(jQuery.style(t.elem,i,t.end),t.setAttr=!0)}}),t.fn.addBack||(t.fn.addBack=function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}),t.effects.animateClass=function(e,o,a,r){var h=t.speed(o,a,r);return this.queue(function(){var o,a=t(this),r=a.attr("class")||"",l=h.children?a.find("*").addBack():a;l=l.map(function(){var e=t(this);return{el:e,start:i(this)}}),o=function(){t.each(n,function(t,i){e[i]&&a[i+"Class"](e[i])})},o(),l=l.map(function(){return this.end=i(this.el[0]),this.diff=s(this.start,this.end),this}),a.attr("class",r),l=l.map(function(){var e=this,i=t.Deferred(),s=t.extend({},h,{queue:!1,complete:function(){i.resolve(e)}});return this.el.animate(this.diff,s),i.promise()}),t.when.apply(t,l.get()).done(function(){o(),t.each(arguments,function(){var e=this.el;t.each(this.diff,function(t){e.css(t,"")})}),h.complete.call(a[0])})})},t.fn.extend({addClass:function(e){return function(i,s,n,o){return s?t.effects.animateClass.call(this,{add:i},s,n,o):e.apply(this,arguments)}}(t.fn.addClass),removeClass:function(e){return function(i,s,n,o){return arguments.length>1?t.effects.animateClass.call(this,{remove:i},s,n,o):e.apply(this,arguments)}}(t.fn.removeClass),toggleClass:function(i){return function(s,n,o,a,r){return"boolean"==typeof n||n===e?o?t.effects.animateClass.call(this,n?{add:s}:{remove:s},o,a,r):i.apply(this,arguments):t.effects.animateClass.call(this,{toggle:s},n,o,a)}}(t.fn.toggleClass),switchClass:function(e,i,s,n,o){return t.effects.animateClass.call(this,{add:i,remove:e},s,n,o)}})}(),function(){function s(e,i,s,n){return t.isPlainObject(e)&&(i=e,e=e.effect),e={effect:e},null==i&&(i={}),t.isFunction(i)&&(n=i,s=null,i={}),("number"==typeof i||t.fx.speeds[i])&&(n=s,s=i,i={}),t.isFunction(s)&&(n=s,s=null),i&&t.extend(e,i),s=s||i.duration,e.duration=t.fx.off?0:"number"==typeof s?s:s in t.fx.speeds?t.fx.speeds[s]:t.fx.speeds._default,e.complete=n||i.complete,e}function n(e){return!e||"number"==typeof e||t.fx.speeds[e]?!0:"string"!=typeof e||t.effects.effect[e]?t.isFunction(e)?!0:"object"!=typeof e||e.effect?!1:!0:!0}t.extend(t.effects,{version:"1.10.3",save:function(t,e){for(var s=0;e.length>s;s++)null!==e[s]&&t.data(i+e[s],t[0].style[e[s]])},restore:function(t,s){var n,o;for(o=0;s.length>o;o++)null!==s[o]&&(n=t.data(i+s[o]),n===e&&(n=""),t.css(s[o],n))},setMode:function(t,e){return"toggle"===e&&(e=t.is(":hidden")?"show":"hide"),e},getBaseline:function(t,e){var i,s;switch(t[0]){case"top":i=0;break;case"middle":i=.5;break;case"bottom":i=1;break;default:i=t[0]/e.height}switch(t[1]){case"left":s=0;break;case"center":s=.5;break;case"right":s=1;break;default:s=t[1]/e.width}return{x:s,y:i}},createWrapper:function(e){if(e.parent().is(".ui-effects-wrapper"))return e.parent();var i={width:e.outerWidth(!0),height:e.outerHeight(!0),"float":e.css("float")},s=t("

").addClass("ui-effects-wrapper").css({fontSize:"100%",background:"transparent",border:"none",margin:0,padding:0}),n={width:e.width(),height:e.height()},o=document.activeElement;try{o.id}catch(a){o=document.body}return e.wrap(s),(e[0]===o||t.contains(e[0],o))&&t(o).focus(),s=e.parent(),"static"===e.css("position")?(s.css({position:"relative"}),e.css({position:"relative"})):(t.extend(i,{position:e.css("position"),zIndex:e.css("z-index")}),t.each(["top","left","bottom","right"],function(t,s){i[s]=e.css(s),isNaN(parseInt(i[s],10))&&(i[s]="auto")}),e.css({position:"relative",top:0,left:0,right:"auto",bottom:"auto"})),e.css(n),s.css(i).show()},removeWrapper:function(e){var i=document.activeElement;return e.parent().is(".ui-effects-wrapper")&&(e.parent().replaceWith(e),(e[0]===i||t.contains(e[0],i))&&t(i).focus()),e},setTransition:function(e,i,s,n){return n=n||{},t.each(i,function(t,i){var o=e.cssUnit(i);o[0]>0&&(n[i]=o[0]*s+o[1])}),n}}),t.fn.extend({effect:function(){function e(e){function s(){t.isFunction(o)&&o.call(n[0]),t.isFunction(e)&&e()}var n=t(this),o=i.complete,r=i.mode;(n.is(":hidden")?"hide"===r:"show"===r)?(n[r](),s()):a.call(n[0],i,s)}var i=s.apply(this,arguments),n=i.mode,o=i.queue,a=t.effects.effect[i.effect];return t.fx.off||!a?n?this[n](i.duration,i.complete):this.each(function(){i.complete&&i.complete.call(this)}):o===!1?this.each(e):this.queue(o||"fx",e)},show:function(t){return function(e){if(n(e))return t.apply(this,arguments);var i=s.apply(this,arguments);return i.mode="show",this.effect.call(this,i)}}(t.fn.show),hide:function(t){return function(e){if(n(e))return t.apply(this,arguments);var i=s.apply(this,arguments);return i.mode="hide",this.effect.call(this,i)}}(t.fn.hide),toggle:function(t){return function(e){if(n(e)||"boolean"==typeof e)return t.apply(this,arguments);var i=s.apply(this,arguments);return i.mode="toggle",this.effect.call(this,i)}}(t.fn.toggle),cssUnit:function(e){var i=this.css(e),s=[];return t.each(["em","px","%","pt"],function(t,e){i.indexOf(e)>0&&(s=[parseFloat(i),e])}),s}})}(),function(){var e={};t.each(["Quad","Cubic","Quart","Quint","Expo"],function(t,i){e[i]=function(e){return Math.pow(e,t+2)}}),t.extend(e,{Sine:function(t){return 1-Math.cos(t*Math.PI/2)},Circ:function(t){return 1-Math.sqrt(1-t*t)},Elastic:function(t){return 0===t||1===t?t:-Math.pow(2,8*(t-1))*Math.sin((80*(t-1)-7.5)*Math.PI/15)},Back:function(t){return t*t*(3*t-2)},Bounce:function(t){for(var e,i=4;((e=Math.pow(2,--i))-1)/11>t;);return 1/Math.pow(4,3-i)-7.5625*Math.pow((3*e-2)/22-t,2)}}),t.each(e,function(e,i){t.easing["easeIn"+e]=i,t.easing["easeOut"+e]=function(t){return 1-i(1-t)},t.easing["easeInOut"+e]=function(t){return.5>t?i(2*t)/2:1-i(-2*t+2)/2}})}()}(jQuery),function(t){var e=0,i={},s={};i.height=i.paddingTop=i.paddingBottom=i.borderTopWidth=i.borderBottomWidth="hide",s.height=s.paddingTop=s.paddingBottom=s.borderTopWidth=s.borderBottomWidth="show",t.widget("ui.accordion",{version:"1.10.3",options:{active:0,animate:{},collapsible:!1,event:"click",header:"> li > :first-child,> :not(li):even",heightStyle:"auto",icons:{activeHeader:"ui-icon-triangle-1-s",header:"ui-icon-triangle-1-e"},activate:null,beforeActivate:null},_create:function(){var e=this.options;this.prevShow=this.prevHide=t(),this.element.addClass("ui-accordion ui-widget ui-helper-reset").attr("role","tablist"),e.collapsible||e.active!==!1&&null!=e.active||(e.active=0),this._processPanels(),0>e.active&&(e.active+=this.headers.length),this._refresh()},_getCreateEventData:function(){return{header:this.active,panel:this.active.length?this.active.next():t(),content:this.active.length?this.active.next():t()}},_createIcons:function(){var e=this.options.icons;e&&(t("").addClass("ui-accordion-header-icon ui-icon "+e.header).prependTo(this.headers),this.active.children(".ui-accordion-header-icon").removeClass(e.header).addClass(e.activeHeader),this.headers.addClass("ui-accordion-icons")) +},_destroyIcons:function(){this.headers.removeClass("ui-accordion-icons").children(".ui-accordion-header-icon").remove()},_destroy:function(){var t;this.element.removeClass("ui-accordion ui-widget ui-helper-reset").removeAttr("role"),this.headers.removeClass("ui-accordion-header ui-accordion-header-active ui-helper-reset ui-state-default ui-corner-all ui-state-active ui-state-disabled ui-corner-top").removeAttr("role").removeAttr("aria-selected").removeAttr("aria-controls").removeAttr("tabIndex").each(function(){/^ui-accordion/.test(this.id)&&this.removeAttribute("id")}),this._destroyIcons(),t=this.headers.next().css("display","").removeAttr("role").removeAttr("aria-expanded").removeAttr("aria-hidden").removeAttr("aria-labelledby").removeClass("ui-helper-reset ui-widget-content ui-corner-bottom ui-accordion-content ui-accordion-content-active ui-state-disabled").each(function(){/^ui-accordion/.test(this.id)&&this.removeAttribute("id")}),"content"!==this.options.heightStyle&&t.css("height","")},_setOption:function(t,e){return"active"===t?(this._activate(e),undefined):("event"===t&&(this.options.event&&this._off(this.headers,this.options.event),this._setupEvents(e)),this._super(t,e),"collapsible"!==t||e||this.options.active!==!1||this._activate(0),"icons"===t&&(this._destroyIcons(),e&&this._createIcons()),"disabled"===t&&this.headers.add(this.headers.next()).toggleClass("ui-state-disabled",!!e),undefined)},_keydown:function(e){if(!e.altKey&&!e.ctrlKey){var i=t.ui.keyCode,s=this.headers.length,n=this.headers.index(e.target),o=!1;switch(e.keyCode){case i.RIGHT:case i.DOWN:o=this.headers[(n+1)%s];break;case i.LEFT:case i.UP:o=this.headers[(n-1+s)%s];break;case i.SPACE:case i.ENTER:this._eventHandler(e);break;case i.HOME:o=this.headers[0];break;case i.END:o=this.headers[s-1]}o&&(t(e.target).attr("tabIndex",-1),t(o).attr("tabIndex",0),o.focus(),e.preventDefault())}},_panelKeyDown:function(e){e.keyCode===t.ui.keyCode.UP&&e.ctrlKey&&t(e.currentTarget).prev().focus()},refresh:function(){var e=this.options;this._processPanels(),e.active===!1&&e.collapsible===!0||!this.headers.length?(e.active=!1,this.active=t()):e.active===!1?this._activate(0):this.active.length&&!t.contains(this.element[0],this.active[0])?this.headers.length===this.headers.find(".ui-state-disabled").length?(e.active=!1,this.active=t()):this._activate(Math.max(0,e.active-1)):e.active=this.headers.index(this.active),this._destroyIcons(),this._refresh()},_processPanels:function(){this.headers=this.element.find(this.options.header).addClass("ui-accordion-header ui-helper-reset ui-state-default ui-corner-all"),this.headers.next().addClass("ui-accordion-content ui-helper-reset ui-widget-content ui-corner-bottom").filter(":not(.ui-accordion-content-active)").hide()},_refresh:function(){var i,s=this.options,n=s.heightStyle,o=this.element.parent(),a=this.accordionId="ui-accordion-"+(this.element.attr("id")||++e);this.active=this._findActive(s.active).addClass("ui-accordion-header-active ui-state-active ui-corner-top").removeClass("ui-corner-all"),this.active.next().addClass("ui-accordion-content-active").show(),this.headers.attr("role","tab").each(function(e){var i=t(this),s=i.attr("id"),n=i.next(),o=n.attr("id");s||(s=a+"-header-"+e,i.attr("id",s)),o||(o=a+"-panel-"+e,n.attr("id",o)),i.attr("aria-controls",o),n.attr("aria-labelledby",s)}).next().attr("role","tabpanel"),this.headers.not(this.active).attr({"aria-selected":"false",tabIndex:-1}).next().attr({"aria-expanded":"false","aria-hidden":"true"}).hide(),this.active.length?this.active.attr({"aria-selected":"true",tabIndex:0}).next().attr({"aria-expanded":"true","aria-hidden":"false"}):this.headers.eq(0).attr("tabIndex",0),this._createIcons(),this._setupEvents(s.event),"fill"===n?(i=o.height(),this.element.siblings(":visible").each(function(){var e=t(this),s=e.css("position");"absolute"!==s&&"fixed"!==s&&(i-=e.outerHeight(!0))}),this.headers.each(function(){i-=t(this).outerHeight(!0)}),this.headers.next().each(function(){t(this).height(Math.max(0,i-t(this).innerHeight()+t(this).height()))}).css("overflow","auto")):"auto"===n&&(i=0,this.headers.next().each(function(){i=Math.max(i,t(this).css("height","").height())}).height(i))},_activate:function(e){var i=this._findActive(e)[0];i!==this.active[0]&&(i=i||this.active[0],this._eventHandler({target:i,currentTarget:i,preventDefault:t.noop}))},_findActive:function(e){return"number"==typeof e?this.headers.eq(e):t()},_setupEvents:function(e){var i={keydown:"_keydown"};e&&t.each(e.split(" "),function(t,e){i[e]="_eventHandler"}),this._off(this.headers.add(this.headers.next())),this._on(this.headers,i),this._on(this.headers.next(),{keydown:"_panelKeyDown"}),this._hoverable(this.headers),this._focusable(this.headers)},_eventHandler:function(e){var i=this.options,s=this.active,n=t(e.currentTarget),o=n[0]===s[0],a=o&&i.collapsible,r=a?t():n.next(),h=s.next(),l={oldHeader:s,oldPanel:h,newHeader:a?t():n,newPanel:r};e.preventDefault(),o&&!i.collapsible||this._trigger("beforeActivate",e,l)===!1||(i.active=a?!1:this.headers.index(n),this.active=o?t():n,this._toggle(l),s.removeClass("ui-accordion-header-active ui-state-active"),i.icons&&s.children(".ui-accordion-header-icon").removeClass(i.icons.activeHeader).addClass(i.icons.header),o||(n.removeClass("ui-corner-all").addClass("ui-accordion-header-active ui-state-active ui-corner-top"),i.icons&&n.children(".ui-accordion-header-icon").removeClass(i.icons.header).addClass(i.icons.activeHeader),n.next().addClass("ui-accordion-content-active")))},_toggle:function(e){var i=e.newPanel,s=this.prevShow.length?this.prevShow:e.oldPanel;this.prevShow.add(this.prevHide).stop(!0,!0),this.prevShow=i,this.prevHide=s,this.options.animate?this._animate(i,s,e):(s.hide(),i.show(),this._toggleComplete(e)),s.attr({"aria-expanded":"false","aria-hidden":"true"}),s.prev().attr("aria-selected","false"),i.length&&s.length?s.prev().attr("tabIndex",-1):i.length&&this.headers.filter(function(){return 0===t(this).attr("tabIndex")}).attr("tabIndex",-1),i.attr({"aria-expanded":"true","aria-hidden":"false"}).prev().attr({"aria-selected":"true",tabIndex:0})},_animate:function(t,e,n){var o,a,r,h=this,l=0,c=t.length&&(!e.length||t.index()",options:{appendTo:null,autoFocus:!1,delay:300,minLength:1,position:{my:"left top",at:"left bottom",collision:"none"},source:null,change:null,close:null,focus:null,open:null,response:null,search:null,select:null},pending:0,_create:function(){var e,i,s,n=this.element[0].nodeName.toLowerCase(),o="textarea"===n,a="input"===n;this.isMultiLine=o?!0:a?!1:this.element.prop("isContentEditable"),this.valueMethod=this.element[o||a?"val":"text"],this.isNewMenu=!0,this.element.addClass("ui-autocomplete-input").attr("autocomplete","off"),this._on(this.element,{keydown:function(n){if(this.element.prop("readOnly"))return e=!0,s=!0,i=!0,undefined;e=!1,s=!1,i=!1;var o=t.ui.keyCode;switch(n.keyCode){case o.PAGE_UP:e=!0,this._move("previousPage",n);break;case o.PAGE_DOWN:e=!0,this._move("nextPage",n);break;case o.UP:e=!0,this._keyEvent("previous",n);break;case o.DOWN:e=!0,this._keyEvent("next",n);break;case o.ENTER:case o.NUMPAD_ENTER:this.menu.active&&(e=!0,n.preventDefault(),this.menu.select(n));break;case o.TAB:this.menu.active&&this.menu.select(n);break;case o.ESCAPE:this.menu.element.is(":visible")&&(this._value(this.term),this.close(n),n.preventDefault());break;default:i=!0,this._searchTimeout(n)}},keypress:function(s){if(e)return e=!1,(!this.isMultiLine||this.menu.element.is(":visible"))&&s.preventDefault(),undefined;if(!i){var n=t.ui.keyCode;switch(s.keyCode){case n.PAGE_UP:this._move("previousPage",s);break;case n.PAGE_DOWN:this._move("nextPage",s);break;case n.UP:this._keyEvent("previous",s);break;case n.DOWN:this._keyEvent("next",s)}}},input:function(t){return s?(s=!1,t.preventDefault(),undefined):(this._searchTimeout(t),undefined)},focus:function(){this.selectedItem=null,this.previous=this._value()},blur:function(t){return this.cancelBlur?(delete this.cancelBlur,undefined):(clearTimeout(this.searching),this.close(t),this._change(t),undefined)}}),this._initSource(),this.menu=t("