Wednesday, August 3, 2022

PyTorch checkpoint state dict

Sadly RobertaModel doesn't give you the full picture:

>>> from fairseq.models.roberta import RobertaModel

>>> roberta = RobertaModel.from_pretrained('./roberta.base/')

One has to load from the checkpoint themself:

>>> path = './roberta.base/model.pt'

>>> with open(path, 'rb') as f:

>>>   state = torch.load(f, map_location=torch.device("cpu"))

>>> state['args']

Namespace(no_progress_bar=False, log_interval=25, log_format='json', tbmf_wrapper=False, seed=1, cpu=False, fp16=True, memory_efficient_fp16=True, fp16_init_scale=4, fp16_scale_window=128, fp16_scale_tolerance=0.0, min_loss_scale=0.0001, threshold_loss_scale=1.0, user_dir=None, criterion='masked_lm', tokenizer=None, bpe=None, optimizer='adam', lr_scheduler='polynomial_decay', task='masked_lm', num_workers=2, skip_invalid_size_inputs_valid_test=True, max_tokens=999999, max_sentences=16, required_batch_size_multiple=1, dataset_impl='mmap', train_subset='train', valid_subset='valid', validate_interval=1, disable_validation=False, only_validate=False, max_sentences_valid=16, curriculum=0, distributed_world_size=512, distributed_rank=0, distributed_backend='nccl', distributed_port=19812, device_id=0, distributed_no_spawn=False, ddp_backend='c10d', bucket_cap_mb=200, fix_batches_to_gpus=False, find_unused_parameters=True, arch='roberta_base', max_epoch=0, max_update=500000, clip_norm=0.0, sentence_avg=False, update_freq=[1], lr=[0.0006], min_lr=-1, use_bmuf=False, global_sync_iter=10, restore_file='checkpoint_last.pt', reset_dataloader=True, reset_lr_scheduler=False, reset_meters=False, reset_optimizer=False, optimizer_overrides='{}', save_interval=1, save_interval_updates=2000, keep_interval_updates=-1, keep_last_epochs=-1, no_save=False, no_epoch_checkpoints=True, no_last_checkpoints=False, no_save_optimizer_state=False, best_checkpoint_metric='loss', maximize_best_checkpoint_metric=False, adam_betas='(0.9, 0.98)', adam_eps=1e-06, weight_decay=0.01, force_anneal=None, warmup_updates=24000, end_learning_rate=0.0, power=1.0, total_num_update=500000, sample_break_mode='complete', tokens_per_sample=512, mask_prob=0.15, leave_unmasked_prob=0.1, random_token_prob=0.1, activation_fn='gelu', dropout=0.1, attention_dropout=0.1, encoder_embed_dim=768, encoder_layers=12, encoder_attention_heads=12, encoder_ffn_embed_dim=3072, pooler_activation_fn='tanh', max_positions=512, activation_dropout=0.0)

Revisit roberta-large embeddings

def topk_similar_tokens(roberta, index, k, normalize=False, beta=100.):

  embed_tokens = roberta.get_parameter('model.encoder.sentence_encoder.embed_tokens.weight')

  if normalize:

    embed_tokens = embed_tokens / embed_tokens.norm(dim=1, keepdim=True)

  prob = (beta * embed_tokens[index] @ embed_tokens.T).softmax(dim=-1)

  values, indices = prob.topk(k)

  # Print the result

  print("\nTop predictions:\n")

  for value, index in zip(values, indices):

    print(f"{roberta.decode(index.unsqueeze(0)) if index.item() != roberta.task.source_dictionary.pad() else '<pad>'}: {100 * value.item():.2f}%")

>>> topk_similar_tokens(roberta, roberta.task.mask_idx, 10, normalize=True, beta=10.)


Top predictions:


<mask>: 0.54%

: 0.02%

 the: 0.01%

 and: 0.01%

,: 0.01%

 to: 0.01%

.: 0.01%

 that: 0.01%

 in: 0.01%

 GG: 0.01%

>>> topk_similar_tokens(roberta, roberta.task.source_dictionary.bos(), 10, normalize=True, beta=10.)


Top predictions:


: 2.59%

<mask>: 0.02%

: 0.01%

.: 0.01%

 the: 0.01%

,: 0.01%

 a: 0.01%

!: 0.01%

。: 0.01%

?: 0.01%

>>> topk_similar_tokens(roberta, roberta.task.source_dictionary.pad(), 10, normalize=True, beta=10.)


Top predictions:


<pad>: 74.20%

: 0.02%

channelAvailability: 0.02%

PsyNetMessage: 0.01%

 guiIcon: 0.01%

NetMessage: 0.01%

: 0.01%

?????-?????-: 0.01%

 0.01%

EStreamFrame: 0.01%

>>> topk_similar_tokens(roberta, roberta.task.source_dictionary.eos(), 10, normalize=True, beta=10.)


Top predictions:


: 0.79%

.: 0.03%

<mask>: 0.03%

,: 0.02%

 (: 0.02%

 ": 0.02%

 and: 0.02%

 the: 0.02%

 The: 0.02%

-: 0.01%


Nothing shocking here. Other than <pad> it needs to get quite cold in terms of beta for the aligned embeddings to stand out though.

Tuesday, August 2, 2022

validate roberta.base with wikitext-103

$ python3 fairseq_cli/validate.py examples/language_model/data-bin/wikitext-103 --path ~/Downloads/roberta.base/model.pt --task masked_lm --max-tokens 512

2022-08-02 14:16:30 | INFO | fairseq.data.data_utils | loaded 3,760 examples from: examples/language_model/data-bin/wikitext-103/valid

2022-08-02 14:16:30 | INFO | fairseq.tasks.masked_lm | loaded 580 blocks from: examples/language_model/data-bin/wikitext-103/valid

2022-08-02 14:43:30 | INFO | valid | valid on 'valid' subset | loss 2.055 | ppl 4.16 | wps 0 | wpb 246983 | bsz 580


$ python3 fairseq_cli/validate.py examples/language_model/data-bin/wikitext-103 --path ~/Downloads/roberta.base/model.pt --task masked_lm --max-tokens 1024


2022-08-02 15:04:04 | INFO | fairseq.data.data_utils | loaded 3,760 examples from: examples/language_model/data-bin/wikitext-103/valid

2022-08-02 15:04:04 | INFO | fairseq.tasks.masked_lm | loaded 580 blocks from: examples/language_model/data-bin/wikitext-103/valid

2022-08-02 15:31:16 | INFO | valid | valid on 'valid' subset | loss 2.055 | ppl 4.16 | wps 0 | wpb 246983 | bsz 580


$ python3 fairseq_cli/validate.py examples/language_model/data-bin/wikitext-103 --path ~/Downloads/roberta.base/model.pt --task masked_lm --max-tokens 256


2022-08-02 15:33:29 | INFO | fairseq.data.data_utils | loaded 3,760 examples from: examples/language_model/data-bin/wikitext-103/valid

2022-08-02 15:33:29 | INFO | fairseq.tasks.masked_lm | loaded 580 blocks from: examples/language_model/data-bin/wikitext-103/valid

Traceback (most recent call last):

  File "/Users/jason_chou/Documents/GitHub/fairseq/fairseq_cli/validate.py", line 153, in <module>

    cli_main()

  File "/Users/jason_chou/Documents/GitHub/fairseq/fairseq_cli/validate.py", line 147, in cli_main

    distributed_utils.call_main(

  File "/Users/jason_chou/Documents/GitHub/fairseq/fairseq/distributed/utils.py", line 369, in call_main

    main(cfg, **kwargs)

  File "/Users/jason_chou/Documents/GitHub/fairseq/fairseq_cli/validate.py", line 93, in main

    itr = task.get_batch_iterator(

  File "/Users/jason_chou/Documents/GitHub/fairseq/fairseq/tasks/fairseq_task.py", line 295, in get_batch_iterator

    batch_sampler = dataset.batch_by_size(

  File "/Users/jason_chou/Documents/GitHub/fairseq/fairseq/data/base_wrapper_dataset.py", line 61, in batch_by_size

    return self.dataset.batch_by_size(

  File "/Users/jason_chou/Documents/GitHub/fairseq/fairseq/data/fairseq_dataset.py", line 145, in batch_by_size

    return data_utils.batch_by_size(

  File "/Users/jason_chou/Documents/GitHub/fairseq/fairseq/data/data_utils.py", line 340, in batch_by_size

    return batch_by_size_fn(

  File "fairseq/data/data_utils_fast.pyx", line 108, in fairseq.data.data_utils_fast.batch_by_size_fn

    cpdef list batch_by_size_fn(

  File "fairseq/data/data_utils_fast.pyx", line 123, in fairseq.data.data_utils_fast.batch_by_size_fn

    return batch_by_size_vec(indices, num_tokens_vec, max_tokens,

  File "fairseq/data/data_utils_fast.pyx", line 30, in fairseq.data.data_utils_fast.batch_by_size_vec

    assert max_tokens <= 0 or np.max(num_tokens_vec) <= max_tokens, (

AssertionError: Sentences lengths should not exceed max_tokens=256


The first two runs are probably equivalent. I need to figure out how to actually change the context length. Exact same with max_tokens=2048 and 4096 as well:

$ python3 fairseq_cli/validate.py examples/language_model/data-bin/wikitext-103 --path ~/Downloads/roberta.base/model.pt --task masked_lm --max-tokens 2048


2022-08-02 15:48:54 | INFO | fairseq.data.data_utils | loaded 3,760 examples from: examples/language_model/data-bin/wikitext-103/valid

2022-08-02 15:48:55 | INFO | fairseq.tasks.masked_lm | loaded 580 blocks from: examples/language_model/data-bin/wikitext-103/valid

2022-08-02 16:16:02 | INFO | valid | valid on 'valid' subset | loss 2.055 | ppl 4.16 | wps 0 | wpb 246983 | bsz 580  


$ python3 fairseq_cli/validate.py examples/language_model/data-bin/wikitext-103 --path ~/Downloads/roberta.base/model.pt --task masked_lm --max-tokens 4096


2022-08-02 16:18:01 | INFO | fairseq.data.data_utils | loaded 3,760 examples from: examples/language_model/data-bin/wikitext-103/valid

2022-08-02 16:18:01 | INFO | fairseq.tasks.masked_lm | loaded 580 blocks from: examples/language_model/data-bin/wikitext-103/valid

2022-08-02 16:45:08 | INFO | valid | valid on 'valid' subset | loss 2.055 | ppl 4.16 | wps 0 | wpb 246983 | bsz 580  

Monday, August 1, 2022

What tokens are most similar to , , , and in roberta-large?

>>> import torch

>>> roberta = torch.hub.load('pytorch/fairseq', 'roberta.large')

>>> def topk_similar_tokens(roberta, index, k, normalize=False):

...   embed_tokens = roberta.get_parameter('model.encoder.sentence_encoder.embed_tokens.weight')

...   if normalize:

...     embed_tokens = embed_tokens / embed_tokens.norm(dim=1, keepdim=True)

...   _, indices = (embed_tokens[index] @ embed_tokens.T).topk(k)

...   return indices

... 

>>> roberta.decode(topk_similar_tokens(roberta, roberta.task.mask_idx, 10))

' TM JC CSI Zeus Karma CG BG GG MM Harmony'

>>> roberta.decode(topk_similar_tokens(roberta, roberta.task.source_dictionary.bos(), 10))

'.?*.,. *.!.,,.*+.-.'

>>> roberta.decode(topk_similar_tokens(roberta, roberta.task.source_dictionary.pad(), 10))

Traceback (most recent call last):

  File "<stdin>", line 1, in <module>

  File "/Users/jason_chou/.cache/torch/hub/pytorch_fairseq_main/fairseq/models/roberta/hub_interface.py", line 75, in decode

    sentences = [

  File "/Users/jason_chou/.cache/torch/hub/pytorch_fairseq_main/fairseq/models/roberta/hub_interface.py", line 76, in <listcomp>

    self.bpe.decode(self.task.source_dictionary.string(s)) for s in sentences

  File "/Users/jason_chou/.cache/torch/hub/pytorch_fairseq_main/fairseq/data/encoders/gpt2_bpe.py", line 41, in decode

    [int(tok) if tok not in {"<unk>", "<mask>"} else tok for tok in x.split()]

  File "/Users/jason_chou/.cache/torch/hub/pytorch_fairseq_main/fairseq/data/encoders/gpt2_bpe.py", line 41, in <listcomp>

    [int(tok) if tok not in {"<unk>", "<mask>"} else tok for tok in x.split()]

ValueError: invalid literal for int() with base 10: '<pad>'

>>> roberta.decode(topk_similar_tokens(roberta, roberta.task.source_dictionary.pad(), 10)[1:])

'channelAvailability\x05EngineDebug<|endoftext|>PsyNetMessage 裏覚醒'

>>> roberta.decode(topk_similar_tokens(roberta, roberta.task.source_dictionary.eos(), 10))

' \u200b,, .... TM ..….. \u200e…… MM'

>>> roberta.decode(topk_similar_tokens(roberta, roberta.task.mask_idx, 10, normalize=True))

'<mask> the and, to. that in GG'

>>> roberta.decode(topk_similar_tokens(roberta, roberta.task.source_dictionary.bos(), 10, normalize=True))

'<mask>. the, a!。?'

>>> roberta.decode(topk_similar_tokens(roberta, roberta.task.source_dictionary.pad(), 10, normalize=True))

Traceback (most recent call last):

  File "<stdin>", line 1, in <module>

  File "/Users/jason_chou/.cache/torch/hub/pytorch_fairseq_main/fairseq/models/roberta/hub_interface.py", line 75, in decode

    sentences = [

  File "/Users/jason_chou/.cache/torch/hub/pytorch_fairseq_main/fairseq/models/roberta/hub_interface.py", line 76, in <listcomp>

    self.bpe.decode(self.task.source_dictionary.string(s)) for s in sentences

  File "/Users/jason_chou/.cache/torch/hub/pytorch_fairseq_main/fairseq/data/encoders/gpt2_bpe.py", line 41, in decode

    [int(tok) if tok not in {"<unk>", "<mask>"} else tok for tok in x.split()]

  File "/Users/jason_chou/.cache/torch/hub/pytorch_fairseq_main/fairseq/data/encoders/gpt2_bpe.py", line 41, in <listcomp>

    [int(tok) if tok not in {"<unk>", "<mask>"} else tok for tok in x.split()]

ValueError: invalid literal for int() with base 10: '<pad>'

>>> roberta.decode(topk_similar_tokens(roberta, roberta.task.source_dictionary.pad(), 10, normalize=True)[1:])

'channelAvailabilityPsyNetMessage guiIconNetMessage\x05?????-?????-\x1bEStreamFrame'

>>> roberta.decode(topk_similar_tokens(roberta, roberta.task.source_dictionary.eos(), 10, normalize=True))

'.<mask>, ( " and the The-'


Conclusion: in terms of their embeddings, they are most similar to meaningless tokens.
(Unnormalized inner product is informative here since 
untie_weights_roberta=False)

Friday, July 31, 2020

Summer Pockets SS《Sequela》

Summer Pockets RB グランドエンドに思うところがあって、自己完結の為に書いたようなSS。ネタバレしまくっているから、グランドエンドを見る上に読むのはお勧めです。











夕食後。

「最近観光客が増えて、食堂の客も増えてきた。在庫はまだ余裕があるけど、やっぱり人手も増えておいた方がいいと思う」
「……?ああ、そうね。私はまだ平気だと思うが……」

おかーさんと私2人で片付けた後、おかーさんとおとーさんはお茶を飲みながら食堂の運営とか島の行事とか色々話している。私も付いていけるが、会話に入れるところが少ないから、結局最近入手したゲームをする。おかーさんも、どこか心ここにあらずって感じ。疲れている……というより、多分心配事。もしそうだったら、その対象も多分私だと思う。

正直、おかーさんの実家のお陰で経済面では何の不安もない。食堂の運営も、おかーさんの思い出の所で、自分が続けたいからやっているだけ。ひーじーじがまだ漁師を続けているのも、多分同じだと思う。

その代わり、おかーさんは最近私に対してやや過保護だと思う。自分が私に教えられるのはもちろん、蒼さんに改めて「七影蝶から自分の身を守る術を、羽未ちゃんに出来るだけ教えてください」とお願いして、私を空門家に通わせるのも吝かではなかった。そして、おかーさんと私のことだから、教えられるのは空門家の役目に直結すること以外の全てになってしまう。役に立つと分かって、大変だと思いつつも勉強してきた。でも、どうして?

おとーさんはおかーさんを娶った形で結婚したから、私の名前は「鷹原羽未」になっている。つまり、鳴瀬家の後を継ぐ人はいなくなってしまった。島の年寄り達は大慌てて、ひーじーじも一応分家に連絡を取っているけど、おかーさんの血を引いているから私は何の形で継ぐべきだと主張する人も少なくはない。それでも、今そんな話をするのは早すぎると思う。例え私は鳴瀬家の後を継ぐとしても、今一番勉強しなければならないのも自分を守る術ではないと思う。

……空門家に通うお陰で楽しいことも一杯あるから、良いけどね。

最近入手したゲームというのは、何と島モンファイトのスマートフォンアプリβ版で、私もテスターの一人になっている。藍さんの夢でしかなかった島モンは、今はすっかり地域限定のゲームとして鳥白島の観光事業の一環になっている。私には馴染みすぎたゲームなので、今もかなりの上位ランキングファイター。もうありえない過去の中で夢見た経験なんて、もはや訳がわからないけど、島モンは島モンだから。

島モンのデッキ編成しようとしたが、考え事がオーバーフロー気味でどうしても集中できない。……七影蝶に触ると記憶が混ざって、脳に負担がかかるとしているけど、それじゃないよね……?

「……羽未ちゃん」

不意に、声を掛けられた。

「何〜おかーさん?」
「……七海の事、覚えている?」
「……え?」

簡単な質問なのに、意味が分かるまで、数秒かかった。

そういうことか……
おかーさん、もう気づいていた。

「……もちろん、覚えているよ」

認めたくないが、また嘘をつくのはもっと嫌なので、そうとしか答えられなかった。

すると、おかーさんは相変わらずの優しい顔で、複雑の表情をしている。
嬉しそうに。
心配そうに。
そして、悲しそうに……

「羽依里、ごめんなさい。どうしても、羽未ちゃんと話したい事があって……」
「とても大事な話しなんだろう。俺は聞いちゃダメか?」
「……私はいいけど、羽未ちゃんの意思にもよるから……」
「……分かった」

おとーさんが席を立って、私の頭を撫でながら「お母さんの言う事ちゃんと聞いてね」とだけ言っておいて、自分の部屋に戻った。

おかーさんは言葉を選びながら、何とか言い始めた。

「最近、どこか変……と思う。特に、夏休み最後の日に言っていたのは、どうしても気になっているから。あの日、羽未ちゃんが確かに『言いたかったの。ずっと……2人に……おはようって』と」

私が戻ったのは、今年の夏。
永い永い旅の終わりにまたおかーさんとおとーさんに会えて、思わず泣きそうになって、訳がわからない言葉を言っちゃった……

「あの日を境に、羽未ちゃんは前よりも泣き虫で大人しくなって、よく甘えにきたし。そして何より……」
「うん?」
「あの日のチャーハンは、初めての100点だった。もしかしたらと思って……やっぱり今の羽未ちゃんは、私の小さい頃に会った羽未ちゃん?」

経験を重ねるだけで、人が変わるというのは、本当なのね。

「……」

もう何か月も過ぎても、おかーさんとおとーさんに「おはよう」って言う時、どうしても抱きしめたい衝動を堪えながら、泣きそうになって……

「羽未ちゃん、大丈夫?羽未ちゃんは……この未来に背中を押してくれた恩人で、たった一人の娘。例え入れ替わっても、受け入れるつもり……でも、羽未ちゃんが無理矢理我慢するのは、あまりにも辛いから」

「……あの日までの最高点は、確かに83点だったね」

「え?」

予想外の返事で、おかーさんが目を丸くした。

「私も……よくわかんない。気づいたら、もう夏の日差しで、昼寝をしていた。あの日までの私は……あまりにも違和感がないから、自覚すらできないの。私、もうしかしたら、また無意識に赤ちゃんの頃に戻って……」

「多分、違うと思うよ」
「うん?」
「夏まで、そんなことはなかったし」

何のこと?

「過去に戻れるというのは、未来も視られるということ……って、あっている?」
「……うん」
「今年の夏まで、一度もなかったから。未来を見られるような事」

……何?

「……今朝までの天気予報は、今日一日中ずっと晴れの筈。なのに、羽未ちゃんはお父さんに傘を持たせて、午後は突然、土砂降りの雨が……」
「……っ!」

……あぁ。しまった。
傘を持たずにそんな雨に降られながら帰るのは、あまりにも可哀想だから……
最近は一時間ごとの天気予報まであるし、よく当たるし、遂にうっかりした。
そうか。今日は朝まで、一日中ずっと晴れの予報になっていたのか。

絶対にダメと思いつつ、バレてしまった。

「…もう……おかーさんはおしまい」
「……近づかないで……」

今度もこんな私に怯えて、ここから逃げるだろうか。

「……もう、おかーさんじゃない……」
「……私は…呪われているから……」

今度はおとーさんがおかーさんを見つけて、連れ戻してくれるだろうか。

「……ごめんなさい……」
「……ごめんなさい……」
「……ごめんなさい……」

今度は駄目なら、またおとーさんと2人で島を出て、あそこに戻って……

「……羽未ちゃん、怖くない、怖くない、大丈夫だから……!」
「……えっ?」

いつの間にか、おかーさんは私の隣に、恐怖に震えている私を強く抱き締めている。

「おかーさんは、怖くないの?」
「羽未ちゃんが?どうして?」
「どうしてって……」

ああ、今のおかーさんは同じ力を発現していなくて、いきなり分からないのか。

「……過去に戻れるというのは、未来も視られるということ。でも、同じ力を発現していたおかーさんは、ずっと思い込んでいた……嫌な未来を視てしまったら、その未来へと歩まされるって。そして、私も未来予知ができると分かって、一度私に怯えて、拒絶したから……」

「っ……」

おかーさんはかなりのショックを受けた。
覚えている限り、私を受け入れた上に拒絶したのは、その一回しかなかったから。
あの時の私は、もうぼろぼろだった。だから何も考えずに、正直に言っちゃった。
責任は私にもあるけど。

「……教えてくれればいいのに。そしたら、ちゃっと謝るのに」
「そんな余裕は無かったの。出来るだけ、おかーさんの楽しみを作らなくちゃ」

幼いおかーさんに嫌な記憶を与えてしまったら、すべて無駄になる。
ズルをしなくちゃいけないのは、私だったから。

「……分かった。もうあの記憶を見られないけど、本当に……ごめんなさい。お父さんもお母さんも……羽未ちゃんが隠し事をする必要がないようにするから……もう我慢しなくていい。泣きたい時、思い切り泣いていいの。抱きしめたい時、痛いほど抱きしめてもいい。いったい何年も……無理してきたの?」

あぁ、そんなこと言っちゃ駄目。
覚えていないの、そんなの。

「うう……あぁ……」

でも、せっかく言ってくれたから、そうさせて貰おうか。

「うわわああああああぁぁぁぁっ…………!」

* * *

どれだけ取り乱したのか。
無くはなっていないけど、ちょっとだけ軽くなった。
おとーさんもきっと気づいた。降りてきたかわからないが……
だからどうなの!おかーさんが許したから!

「……一つだけ、約束してくれる?」
「何?」

顔を上げて、まだちょっとぼやけた視界の中でも、おかーさんの目はちょっと赤い。
……痛くないよね?

「もう絶っ対に、過去に戻る力を使っちゃ駄目。お父さんの為にも、お母さんの為にも。今度こそ、羽未ちゃんは名前通り、未来に羽ばたくの。」
「……」

ああ、やっぱりか。
全部ぶっちゃけたから、それは多分おかーさんが一番欲しい約束。

もうしない。
どうなっても。

約束できたら、どれ程おかーさんが喜ぶだろうか。
一度は命を賭けても、出来なかった事だから。
でも……

「……ごめんなさい。嘘をつくのも、約束を破るのも、嫌なの」
「……っ」
「まだ、足りない。まだ全っっ然、足りない。おかーさんとおとーさんに何があったら、私はおかーさんとおとーさんを取り戻す為にどんな力だって使う。おかーさんは違う?」

「……るいよ」
「え?」
「ずるいよ……私に、駄目だと言っておいて……!」

おかーさんは強く唇を噛みながら、やっとの事でそんな言葉をできた。

そう。ズルをしたのは、私なの。
よく考えたら、過去を縋った者、過去を縋るなと言っても説得力ゼロなのね。
でも、これからの事、もう誰も分からない。
未来の記憶を届ける人も、もういない。あんな奇跡、二度と起こらない。
今はただ、おかーさんとおとーさんに一杯一杯してもらいたい……

私はおかーさんの目から逃げるように、また顔をおかーさんのお腹に埋める事にする。

余計に心配させるから、言わないけど……実は今の私、前よりも思い通りに戻れる気がする。

まるで上達してしまったように。

経験を重ねて、人が変わる。もう人の身では、あり得ないほど過去に繰り返してきたから……

「……今は駄目でも、いつかは絶対に羽未ちゃんに満たさせてもらって、約束させる。それは、私の役目。もう私には、それしか出来ないから……」

やっと、おかーさんがため息をついて、許してくれた。

「うん……ありがとう、おかーさん。そして……ごめんなさい……」

それしか、応えられなかった。

もう夜は遅いし、おかーさんに撫でられたまま、うとうとし始めた。
夏じゃないし、いいか。

欲を言えば……子守歌、歌ってくれるかな?
眠りに落ちたら、どんな夢を見るだろう?
せめて今だけ、嫌な未来を視ないように、心から願う。










ちょっとした後書き

サマポケRBの終わり方だって、すべてめでたしめでたしのわけではないと思う。

元々羽未の時空のおとーさんは、一人置いて行かれたまま。
帰って来たあの夏の日までの羽未は、どうなっているの?
羽未自身が言い出すまで、自分の存在は隠し事になる。
PocketのしろははAlkaのしろはではない。あくまで七海としての羽未と出会って、ある程度の記憶と感情が七影蝶を介して共有するだけ。Alkaの「あのシーン」もあるし、受け入れるかどうか……
羽未がまだ力を持っている場合、それは相変わらず諸刃の剣になる。
このまま鳴瀬家が途絶えるが、それは最早ささやかな事。
個人的にはこういう落としどころもあると思いますが、皆さんはどうでしょうか?

Sequela:【名】後遺症

Saturday, December 13, 2014

遊戲人生BD第四卷特典小說「單人模式・多人模式」自翻

——來說個故事吧。
這是某月某日的事。
就在我全神貫注,沙沙沙地寫著登在DVD跟BD第三卷上的大戰期間吉普莉兒討伐龍精種的故事的時候,編輯打來的電話響了。
「外傳用掉太多頁數了。由於動畫的設定圖跟資料放不下的關係,請在二十頁以內收尾。」
劈頭就是這種消息,不自覺地用母語(葡萄牙語)回了一聲「O que?(什麼?)」
「啊,OK啊~幫大忙了~!」
——等等、可以等一下嗎。
「坦白說,榎宮在外傳上用太多心力了。也該是集中精神在本篇的時候了,買的人也想要動畫那邊的設定資料跟設定圖吧?」
不、等等。所以說等一下、對了。
——這是交稿五天前說的事情嗎!?
「之前不是有預定刊在第五卷上的小伊的故事劇情嗎?就用那個吧。你說過東部連合是用對台灣的印象寫的,剛好後天要去台灣出差不是嗎?」
等等、就是因為要出差所以別說五天了,能用的時間只有兩天而已——
「那就拜託啦~對了,別忘了要去台灣的行前準備喔♩」
——就這樣,臨時更改預定為您獻上初瀬伊綱篇。
吉普莉兒的後篇只好等到下一卷……(翻白眼)

『幕間』[Ⅳ]單人模式・多人模式

【文中的獸人語全部都換成了人類語撥出♪ by 方便行事的唯一神】

獸人種的國家——東部連合・首都巫鴈。
被稱作月光之都、不夜城、極東的珍珠,具有高度文明的島國。
現在正跟人類種的國家——艾爾奇亞急步改制為聯邦的都市。
在天上高掛的紅月與沿著路邊的朱紅街燈的照耀下——
「……那個、是初瀬伊綱大人……沒有錯吧。」
「……? 什麼事、得斯?」
獸人種的幼女——東部連合駐艾爾奇亞大使・初瀬伊綱莫名其妙地抬頭望向戰戰兢兢地跑來問話的獸人種的男性。
耳廓狐般的耳朵跟妹妹頭的黑髮輕晃著。
獸人種的男性吞吞吐吐地繼續問著。
「這、這實在是很難開口,不過初瀬伊綱大人身為外交官……」
穿好了和服般的衣服,跪坐在地的伊綱,卻是有聽沒懂,歪著頭把大尾巴彎成『?』型。
「……? 不懂,得斯。有話就直說,得斯。」
「是、是……那我就直說了。——為什麼身份那麼高貴的閣下,要在遊戲發售的前一天徹夜排隊?」
聽到這段話,旁邊的人全都望向了伊綱這邊。
他們似乎也全都想問一樣的問題。
——首都巫鴈、又是在那之中的市中心、點著篝火的街道旁。
在被稱為遊戲街的街道旁,伊綱正在成為話題的遊戲新作發售日的隊伍排隊。
從各方面來看“沒有必要也沒有理由在這裡”的伊綱。
「……不行嗎、得斯?」
只是眨著眼睛,好像做了什麼壞事一樣不安地問著。
看到伊綱這樣子,獸人種的男性更是狼狽、
「不不不不不不!沒沒沒沒那回事!可、可是、那、那個……讓外交大使在這邊排隊的事要是給次席大使大人——初瀬伊野知道的話我的腦袋會……
貨、貨已經到了、現、現在馬上——」
「作弊不對、得斯。伊綱要好好遵守規則、得斯」
——已經不想再作弊了。
如果是遊戲為了勝利也就算了——不想再玩那種無聊的手段了。
伊綱是這麼想,不過店員提出了另一個伊綱沒有必要在這裡的理由。
「可、可是、作弊什麼的——話說回來,本來就是照伊綱大人的要求做的遊戲,您應該已經有了不是……?」
就是這樣,也沒什麼好隱瞞的。這一天要發售的話題遊戲正是——

『生死格鬥系列番外篇 Love or Loved 2 ~將戀愛的子彈傳達給她~』

講白了,就是對艾爾奇亞戰時用的那個遊戲——的販售版。
可是……。
「伊綱、想要特典碟片所以在這邊排隊。特典碟片的樣本來得太慢了、得斯!」
給一臉認真回答的伊綱的氣勢壓倒的店員後退了幾步。就在這個時候……
『——發售日也是遊戲的樂趣之一,這店員真的是不懂啊~』
活像是「受不了這店員」的嘟囔聲,是從伊綱的身邊一個有點髒的帳篷發出來的。
店員這下更是摸不著頭腦,跟伊綱問道:
「那……那個、這個帳篷到底是……話說回來,他在說什麼……?」
「……哥哥、獸人語……」
「啊、好吧。那麼……」
輕咳了一聲後,生澀的獸人語從帳篷中傳了出來。
「遊戲、發售、樂趣之一、不讓人、妨礙。——這樣應該能懂吧白」
『……哥哥、能讀獸人語……卻不會說……好遜……』
『才約半個月就要人能說得流利太強人所難了吧!? 我已經能讀能聽了就不能誇個幾句嗎!?』
好像是要幫忙翻譯這段對話似的,伊綱開口了。
「……空跟白在說、遊戲的發售日也是一種樂趣吧、這店員真的是不懂、得斯」

聽到這翻譯,店員的臉都白了。
——空跟、白?她說空跟白!?
那兩位艾爾奇亞王——在這小帳篷裡!?
店員被嚇得冷汗直冒,全身發抖。
……要是說錯話了只怕真會掉腦袋——最糟的狀況是物理上的意義。
就在店員啞口無言的時候,從帳篷中伸出了幾隻手。
「不過啊伊綱也太顯眼了吧。給人知道我們讓外交官排隊也不是件好事,過來吧」
「……小伊、進來這邊……」
「……? 雖然不是很懂,同意、得斯」
就這樣,伊綱照著招手的兩個人的意思鑽進了帳篷裡。
一開始帳篷好像很擠的樣子晃了一會,不過後來似乎是找到了位子,靜了下來。
只留下靜靜地排著隊的帳篷跟四周的視線。
……還是當做什麼都沒看見吧。
店員暗自下了決心,有氣沒力地離開。



——回溯到半個月前。
就在艾爾奇亞跟東部連合的爭戰結束,開始進行合併的時候。
一臉倦容地處理著大量文書作業的史蒂芙抱怨了一句。
「空……每天都有三位數的人來信希望對東部連合戰的遊戲能上市販賣。」
——不愧是人類,真是可愛的笨蛋。
居然想要那個賭上種族棋、幾乎要讓人類種滅絕的遊戲。
真是讓人佩服的韌性。這才是人類種。
——老實說,空自己也想再玩一次。
就這樣,空白又跑去東部連合,直接找東部連合的全權代理者——『巫女』談判。
「喂巫女啊,『Love or Loved 2』能不能上市販賣?然後出口到艾爾奇亞?」
聽到這段話的巫女用手托腮,一副受不了的樣子。
「你沒問題吧? 那是國家機密,怎麼可能就這樣交給你們?」
這是當然的。在虛擬實境進行的遊戲——其他種族無法用魔法干涉。
也就是說,那是東部連合的王牌。不過……。
「不是那個意思,只要不是完全浸入型的就沒關係吧? 話說回來,這國家的一般市民玩的電子遊戲,跟在伊綱家看到的一樣都是用手把操作的吧?」
就是這樣,東部連合的遊戲之所以是必勝,並不是因為那是電子遊戲。
——重要的是那是『完全浸入型』的遊戲。
如果是用手把操作的遊戲,應該就能用魔法對玩家進行干涉。所以即使之前那一戰已經讓全體人類種知道了全貌——也不成問題。
即使空跟白、史蒂芙、吉普莉兒四人勉強戰勝了,只要在虛擬實境內依然無法用魔法干涉,那依然是『無限接近必勝的遊戲』。
問題是——要是那落入旁人之手,原理被人解析的話。
因此,東部連合一般普及的電動遊戲依然是操作型。
完全浸入型在嚴格的管制之下被視為國家機密,巫女即使是對『 』也沒有解釋那是根據什麼原理。
不過,反過來說——。
「那個遊戲不管對人類種還是獸人種都很有宣傳效果吧? 移植到不涉及機密的硬體上市的話應該能大賣吧? 艾爾奇亞沒有驅動那個遊戲的動力跟原理,順便趁機會高價賣給我們也能為聯邦的構築鋪路,不是嗎?」
面對微笑的空,巫女不禁扶額。
「……你們兩個,不只是遊戲玩家,還有商業頭腦啊?」
「疑? 不是啦,純粹只是——」
「……想玩、而已……」
——就這樣,這一天成了加了大幅限制的『Love or Loved 2』一般販售版的發售日。



帳篷裡面,是黑髮的青年跟白色的少女——空跟白。
光兩個人就有點擠的帳篷,伊綱卻又磨磨蹭蹭地爬了進來。
——對著利用情境開始撫摸的空白,伊綱問道:
「為什麼……要做這種事、得斯?」
「嗯。問得好。我們就回答吧——這是害怕人群與眾人的視線的我們,少有的能到外面去的機會——那就是!」
「……遊戲發售的前一天晚上的隊伍……在這裡頭,不會害怕……」
「雖然不是很懂,好帥—、得斯!」
伊綱咕嚕咕嚕地出聲回應硬是把本來是有夠難為情的事情氣勢十足地向周圍宣告的兩人——
空一邊摸著伊綱那顆頭,一邊說著。
「話說回來,伊綱是第一次排發售日的徹夜隊伍啊。」
從社會的角度來看,伊綱對那引人注目的行動毫無自覺,想來也是理所當然的……
「得斯」
空一邊摸著不出所料地點頭承認的伊綱,一邊繼續問著。
「這樣啊……說到這,伊綱平時都在玩什麼遊戲?果然還是以第一人稱射擊遊戲為主?」
「……? 就是跟空與白玩的那個遊戲、得斯」
「咦? 不是啦,除了那個以外——」
「……沒在玩、得斯」
低下頭的伊綱,表情有點複雜。
「……其他人都跟我說,遊戲不是在玩的、得斯……」
……遊戲不是在玩的,這樣。
又是個大矛盾啊。不禁苦笑的空,想起了那時候問伊綱的問題。

——上一次覺得遊戲好玩,是什麼時候?

「以前跟爺爺有玩過其他的遊戲、得斯……不過如果說遊戲是要覺得好玩的話……伊綱從來都沒玩過什麼遊戲、得斯」
敏銳地察覺到了無言以對的兩個人的氣息,伊綱繼續說著。
空跟白在覺得她的表情有點不對勁的同時,還注意到了一件事。
「那個—伊綱,抱歉話說到一半」
「……? 怎麼了、得斯?」
雖然心裡有數,臉色發青的空跟白還是出聲問著。
「這個帳篷四周」
「……聚滿了……人?」
不用等伊綱回答,已經能聽清楚四周的對話了——。

——聽得到人類語喔?
——我認得這個聲音。是把我妹妹一遍又一遍摸到神情恍惚的傢伙們!
——他們就是艾爾奇亞的國王跟女王沒錯吧?
——什麼什麼什麼!?【心神蕩漾的金手指】那兩人!?
——那、那麼! 把整理卷拿給它們做為交換……!

「——伊綱,拜託快去把剛才的店員叫來,我們遊戲買了就走」
「抖抖抖抖」
伊綱氣呼呼地反駁著好像變成灰色的兩個人:
「作弊不對、得——」
「這不是作弊是在救命求求你快點——!」
聽到那全心全力悲痛的叫聲,伊綱連忙衝出帳篷。
——連那個初瀬伊綱都會鳴叫出聲的撫摸技巧。
在東部連合簡直已是人盡皆知的撫摸技巧超過了對遊戲的關心,讓四周的獸人種們開始亢奮起來。
在帳篷裡也能感受到的那種興奮的眼神,讓空跟白靠在一起發抖。
把錢付給伊綱叫來的店員、拿了遊戲跟初回特典之後,三個人就這樣滾著帳篷迅速地離開現場……。



「那麼、就—馬上開始吧~!」

才剛巧妙地滾著帳篷回到伊綱家,空馬上說道。
伊綱開心地搖著尾巴,從盒子裡取出卡帶,插進遊戲機的插槽裡。
遊戲機響起了啟動聲,螢幕也開始顯示遊戲畫面。
看著這些的空,不禁小聲問道:
「……不過啊,怎麼看都很神奇……這到底是怎麼動起來的?」
不管是遊戲機還是螢幕,都沒有插著像電源線的東西,而且也不像是有充過電,所以也不是用電池。
再說吉普莉兒也說了,不只是沒有用電力,也沒有感到有在使用精靈。
問巫女的時候她用「那是秘密♥」唐塞過去,所以到現在還是不知道是怎麼動起來的。
雖然說,外觀看起來跟原來的世界的遊戲機沒有多大差別……。
看著畫面的商標跟迷幻的音效,空不禁想著。
——別再拐彎抹角了,要是能用什麼辦法找出完全浸入型的原理的話,虛擬實境,也就是完全浸入型的成人遊戲也能做得出——肚子上的一記拐子硬是中斷了思考。
「……哥哥,那是十八禁」
「妹妹啊,能不能不要把年齡限制用在內心的自由上?」
對著冷眼宣告著十八禁的妹妹,空只能泛著淚水申訴著。
「否決……別管這些了、哥哥、特典……」
「唔、說的也是。伊綱、這要怎麼安裝?」
「插進這邊的碟片插槽、得斯!」
照著伊綱的指示,空把光碟般的特典碟片插進遊戲機裡。白則是趁這段時間興高采烈地準備了三人份的零食跟飲料。
看著隨之顯示的遊戲畫面的空說道:
「——原來如此。所以說改成第三人稱射擊遊戲了呢。」
雖然說本來以為會是第一人稱視點,空馬上就理解了更改的理由。
「……角色可以設定為自己的替身……啊。原來如此——連種族都可以設定,是巫女、或是幕僚的意思……不管如何,想得很透徹嘛。」
「在說些什麼、得斯?」
「嗯~? 沒什麼、自說自話而已。」
在表現出獸人種的強大的同時,也能設定為人類種提高難易度。
獸人種的玩家也能把種族設定設為人類種把高難易度徹底精通。
結果就是——這也會成為“種族交流”的一環。
只是個遊戲,未來的商業機會,不過在改制為聯邦之前或許也能稍微和緩些氣氛:二重、三重的佈局。不得不說聲佩服呢。
「那麼、特典是——」
說著說著空操作著手把,打開了特典資料的軟體包。
螢幕隨之顯示了「種族設定已更新」的訊息。
就在確認更新了什麼設定的時候——。
「……唔。這是在找我們的喳嗎?」
「……哥哥、白的臉……是長這樣……的嗎?」
泛著淚水的白嘟囔著,空也是鄙視著螢幕怒哼。
特典追加的是艾爾奇亞對東部連合戰時的參加者。
確認的時候,遊戲的『種族設定』追加了『空』『白』『史蒂芬妮・多拉』『吉普莉兒』『初瀬伊綱』的角色資料。
——這沒有關係。嗯,這本身沒有關係。本來就是為了這個去排隊的。
『空』跟『白』的能力值比『人類種』的能力值還低,低到讓人難以置信——這也沒有關係。要說是忠於現實也能說是忠於現實。如果說用『人類種』來玩是『高難度模式』的話——這大概就在那之上的『地獄模式』。
問題是要是選這些來用的話替身的外觀就固定不能更改,說到這替身的造型——
「不、這是在找喳吧。不會有錯」
空這樣一口咬定。
角色設定畫面上顯示的是長得像個大壞蛋的『空』跟『白』,一邊迴轉著還一邊邪惡地『噗哈哈哈——』地笑著。
「……史蒂公相當強呢、得斯」
在2P畫面設定角色的伊綱輕聲說道。
這個『史蒂芙』的角色能力值遠在『空』跟『白』之上——雖然說這毫無疑問也是事實,實在讓人喪氣……。
除此之外,除了『空』與『白』以外的替身造型都是依照原型。這樣就可以確定是在找喳了。不過嘛,先不管這些——
「那麼、就照他們的意思把種族設定為『空』吧」
「……白的臉……才不是……長這樣、的……」
蠻不在乎的空跟心懷不滿的白各自選擇了自己『種族』的替身。不過,
「……? 伊、伊綱要怎麼選才好、得斯?」
剩下來的伊綱不知如何是好地問著。
望向遊戲畫面——『初瀬伊綱』的替身所顯示的是破格的雷達圖。
六角形所顯示的能力值,絕大半都超出欄外。
相對於『空』跟『白』的替身,別說不到空欄的一半了,差不多只是一個『點』而已。
——『初瀬伊綱』再怎麼看都像是官方作弊用的最強角色。
伊綱在猶豫「只有我用這個的話」的時候,毫不在乎的空說了。
「那麼、這就開始那一天的再戰吧、伊綱?」
「……可以、認真嗎……?」
沒有阻止。也沒有責怪。面對確信著伊綱會選用自己的替身的兩人,伊綱同樣也——
「……當然、得斯——認真地放馬過來吧、得斯!!」
選擇種族『初瀬伊綱』,開始遊戲——。



「本來是跑來看孫女的,不知為何家門前卻有快死了的猴子呢。」
——這種時候自己該怎麼做呢。
初瀬伊野用笑容說出答案。
「該聯絡健康中心呢」
「老、老爺爺……拜託、聽我說……」
空用著聽起來像是快乾掉的聲音細聲說著——可是。
「否決。看這樣子是從家裡被趕出來了——伊綱會做到這樣,可以判斷是你們做了很過分的事——」
「不是……聽我說……我們只是在玩遊戲而已……」
確實應該是在玩遊戲呢,伊野這麼想。
伊綱跟兩位艾爾奇亞王也在販售版『Love or Loved 2』的購買隊伍裡排隊——伊野就是聽到風聲才跑來孫女家的。
「如此這般,我們問能不能認真,她回說認真地放馬過來……」
「嗯……然後呢?」
「——認真地全力以赴的結果,就是這樣」
在眩目的朝陽的照射下,空跟白平趴在地,化成了灰。
活似被關起來的貓一樣,獸爪在家門口留下了滿滿的抓痕。
「被丟到太陽底下又人生地不熟……要是避難的時候被獸人種的小孩們看到——」
「……白、跟空……會死於視線……短暫的、人生……」
「也太短了吧……不過……」
——原來如此,伊野理解了大約的經過了。
遊戲一面倒地慘敗,伊綱再也受不了了把兩人趕出來了吧,這樣。
不過,真的是只因為這樣伊綱就做到這種程度嗎? 不會只是兩個人一面倒的勝利而已——
伊野用視線問著,白則是用像是在呻吟的聲音說道:
「……哥哥……挑釁、過頭……」
回應泛著淚光責怪著哥哥的聲音,空像是絞盡最後的力氣叫道:
「本來就是伊綱說要認真的啊! 挑釁讓對手失去冷靜不是基本中的基本嗎! 而且只是用最弱的角色、又是用單手、無傷累計五十三勝後說句『啊哈哈這樣用腳也能贏呢』就遭到這種待遇——太經不起挑釁了吧!?」
伊野馬上轉過身去。
「永別了空殿下、白殿下,艾爾奇亞的事就交給史蒂芬妮殿下,兩位請安息吧」
「老爺爺爺!!不,初瀬伊野爺爺! 都、都是我的不對! 的確是我做得太過火了! 不過白沒有錯、救救白就好——」
「……白、要跟伊綱……道歉……」
回頭望向抓著不放拖在地上求饒的兩隻禿毛猴,伊野想了想。
……空也就算了,白不是詐騙家。再加上就這麼把小孩子丟著不管也有點——
就在伊野這麼想的時候,白一臉認真、充滿力道地訴說著:
「——用腳、不行……必須要說……“用一隻手指是極限了”……」
「完全沒有反省的意思呢。兩位請保重。」
就在伊野笑著要放下兩個人不管的時候,空卻說了——
「老爺爺爺在求人幫忙的時候不想用這種最後手段——不過要是你放著我妹妹不管的話我就把你下半身的事情詳細地叫出來讓伊綱聽到去你的——」
「在要組成聯邦的時候怎麼可能會放著兩位艾爾奇亞王不管呢。請,請進吧糞猴子們」
用簡直會捲起旋風的速度改變態度的伊野,拿出了他的共用鑰匙——。



發現三人進了客廳的伊綱,氣沖沖地鼓起了面頰。
「……小伊……對不、起……」
對著伊綱的背後,白畏畏縮縮地道歉。
也沒有轉過身來,伊綱用呻吟般的聲音回答。
「………………、空跟白、沒有錯、得斯……都要怪伊綱太雜魚的錯、得斯……」
看到伊綱這樣子,空總覺得不太對勁。
……太雜魚的錯?
伊綱因為遊戲慘敗覺得沮喪。這沒有問題。不過原因——跟沒轉過身來的原因一樣,看起來似乎不是因為生氣,而是因為羞恥。
確實是——堅強可嘉,雖然要說是像伊綱也沒有錯——。
心中的疑問先放一邊,空說道:
「伊綱啊。沒有人是一開始就技術高超的啦。我來教你進步的訣竅吧。」
「……?」
「訣竅之一,輸了也不要覺得羞恥。覺得不服氣也沒關係,要是五十三連敗的話,只要接下來五十三連勝就好。五百三十敗的話只要五百三十勝就好——白?」
「……嗯」
「我不參加,你做伊綱的對手吧」
「——! 那、那再多、多加些限制、得——」
「限制? 別開玩笑了,我不參加光靠白也能壓勝伊綱喔?」
空帶著一開始不在乎,隨即變得溫柔的笑容,繼續說道。
「說過了吧? 進步的訣竅之二——與其一個人玩,兩個人一起比較好玩。就是覺得好玩才會進步。我變得跟白可以勢均力敵為止到底輸了多少次——先說了,可不只是二位數三位數而已喔?」
「……………………了解、得斯」
似乎還有點沮喪,伊綱有點勉強地點頭答應,重新跟白開始遊戲。
空望著伊綱的背影,向帶著複雜的表情低著頭的伊野問道。
「……喂老爺爺。伊綱對勝利的執著是沒關係。不過——」
隔了片刻。

「伊綱對於敗北所帶有的羞恥感,總覺得不太對勁——你知道些什麼嗎?」

伊野知道。
這不是疑問。空知道大半的答案——不。
不如說空是在責備。就算不用獸人種的五感,伊野也能明白。
——噗、
伊野這麼嘲笑著,一邊回答著問題。
「你知道我有三十位妻子吧?」
「好啊老爺爺,我們也來玩遊戲吧。以你要是輸了就要爆發為條件向盟約宣——?」
一邊笑著一邊拿出撲克牌的空,話只說到一半。
他似乎發現了,伊野的笑容是在嘲笑自己。
「我有很多小孩,孫子當然更多。不過『血壞個體』——只有我跟伊綱而已」
伊野帶著複雜的笑容看著跟白在玩遊戲的伊綱,繼續說道。
「巫女大人徹底地執行教育政策。在學校當然有教其他種族的語言,還有不可輕易進行向盟約宣誓的遊戲,在家裡也儘可能地讓小孩花時間在遊戲上。身為前外交官大使的我當然也是一樣」
「……」
「已經懂了吧。血壞個體的獸人種只有從血壞個體的血統才生的出來。也有不少隔世遺傳的例子。所以,我盡可能多生小孩——」
伊野這麼說,不過——
「吹牛!」
完全不信的空鄙視著伊野,小聲叫道。
「別騙人了老爺爺! 看你色瞇瞇的樣子怎麼說都沒有說服力! 即使說政策是真的——小孩很多是你的興趣吧!」
伊野聽了,用著好像看著可憐蟲般,充滿慈悲的笑容說道:
「那是顧慮到完全沒有經驗的人的謊話,覺得不舒服嗎?」
「別帶著微笑說那種話! 爆發吧現在馬上開始遊戲——」
「——伊綱是特別的」
空馬上打斷了自己。
伊野固定著視線,淡然地說著。
「我們所進行的遊戲——你已經懂了吧,“需要”血壞個體……」
果然——空輕蔑地點頭。
那個虛擬實境——完全浸入型的遊戲之所以是必勝——是因為所有玩家一律“公平地”不能使用魔法。即使遊戲的內容曝光了,不能作弊也不能出千,在不能使用魔法的條件下沒有任何種族能夠打敗血壞個體——就是因為這毫無疑問的“公平”——這不構成作弊。
就是因為這樣,血壞個體是最後最後的保險——作為王牌,把『必勝遊戲』真正變為必勝的必需條件。
「現在東部連合已經統一,也有了之前說的虛擬實境——不過不用說,完全浸入型的遊戲不是一開始就有……我跟巫女大人為了統一獸人種,用了不知道多少次血壞。再用個幾次,恐怕就會沒命。在虛擬實境的負荷比較低——不過大概也不到十次吧。」
「…………」
對著無言的空,伊野忽然帶著笑容繼續說道。
「伊綱出生的時候、沒錯……我還記得。跟其他孫子的時候一樣,毫無顧慮地,開心地抱起來祝福呢」
浮現的笑容,隨即轉為陰沉的表情。
「還有每天開心地玩遊戲的事——直到發現伊綱是血壞個體為止」
————。
兩人再度沈默。
彼此之間只響著專注於遊戲的伊綱與白的操作聲,以及畫面傳出的聲音。
打破沈默的,也不是其他人,而是伊野。
「——空殿下,讓我用問題回答問題吧」
伊野轉過身來。
白色的長眉遮掩著閃著銳利眼神的瞳孔。
「你這傢伙,還以為你知道些我們的什麼啊,小屁孩」
——不是禿毛猴,也不是糞猴子。
這是什麼意思呢。跟獸人種還是人類種沒有關係,空靜靜地承受著一個老人帶著殺意的眼神。
「現在的東部連合——所有的『血壞個體』——扣掉我跟巫女大人只有四人。我們絕對不能失去巫女大人,不過我的話怎樣都無所謂——我是打算進行遊戲到死的那一刻為止,不過巫女大人說了,」

「——把那孩子,作為我們的兵器」

對於完全不帶任何表情,沈默無言的空,伊野這麼回答。
「你問你知道些什麼? 當然,我全部都知道的清清楚楚」
他的聲音所帶著的,不是怒意,也不是自我厭惡。
而是更為冷峻乾燥,漂白過的感情。
「我。把我愛的孫女。從雙親身邊帶走。削減她的壽命。讓她去掠奪他人。把她作為兵器。沒有後悔的資格,也沒有辯解的理由。」

從這國家的作法來看大概就是這樣,空這麼想著。
實際上——伊綱真的很強。

就算扣掉血壞個體的能力,也絕對是東部連合前幾名的遊戲玩家。
雖然看起來是充滿餘裕地壓勝,實際上那是跟白兩人一起才有的成果。
瞥向白的戰況。
分數上不分勝負——不過,為了這樣白已是全神專注於她有如神般的演算能力。
只怕巫女——看中的不只是血壞個體,還有伊綱本身的才能。
——於是,伊野他……
「於是,你讓她當艾爾奇亞大使」
對於輕聲地這麼說的空,伊野嘆了口氣點頭承認。
「沒錯……誰會想到現在人類種還會跑來挑戰?」
——你以為我把孫女當箭靶嗎?他的視線這麼說道。
也就是說,伊野把伊綱放在對人類種的大使——等於是半個閒職,對血壞個體來說最安全的位置。
如果是以人類種為對手的話……根本用不到什麼血壞就能戰勝吧。
深深地嘆了一口氣,伊野繼續說道。
「……好了。 知道了這些,空殿下。——你以為我不知道我對我所愛的孫女做了什麼嗎?」
雖然像是在威脅的聲音,不過完全沒有力道。
直望著開心地跟白享受遊戲的孫女的視線中,似乎遺落了憤怒與憎恨的感情——對著這樣的伊野,空卻是如此斷言。
「沒錯,你似乎是不知道。還有對不起——我比你還清楚」
——伊野頓時沒了力氣。
他這時才發現——自己一時衝動要揍這個男人,行動被盟約取消了。

自己是以什麼樣的心情把孫女作為兵器的呢。
內心是忍著怎麼樣的糾葛,把她從父母身邊帶走的呢。
這些傢伙輕蔑地來挑戰的時候,我是有多麼的憤怒呢。
那腦袋完全無法理解嗎。
就在伊野要把衝動脫口而出的時候,
空這麼說道。
不帶輕蔑,也沒有無奈——就只是——用清澈的眼神

「你——沒能把她作成兵器。結果只是……伊綱的沉重的責任與糾葛而已。」

——心臟有如被抓住後,捏爆了一般。
這就是對自己的弱小覺得羞恥的理由。從小到大不允許落敗的扭曲的反動。
避開了沈默的伊野的視線,空望向繼續遊戲的伊綱跟白。
「在排隊購買遊戲的時候,我問伊綱平時在玩什麼遊戲」
「……」
「她說如果說遊戲是要覺得好玩的話,從來都沒玩過」
伊野咬緊了牙關。
沒有後悔,也沒有辯解。他沒有那麼無恥。不過……要是——。
有如打斷他的思考一般,空這麼說。
「——她說小時候有跟你玩過遊戲——用笑容這麼說,喔」
伊野大口喘著氣。
思考像凍結了一般。
沒錯,伊綱那時自己也沒發現吧。空一邊苦笑一邊回想著。
自己說的話——完全自相矛盾。
沒玩過遊戲。小時候跟伊野玩過遊戲——用笑容這麼說著。
「你知道吧? 那孩子——最後覺得遊戲好玩,是什麼時候」
空這麼想。
伊綱是天生的遊戲玩家。
跟伊野一起玩,還沒有什麼重責的時候。
打贏的時候,大概是開心地蹦蹦跳跳的吧。那樣的景象,簡直是鮮明地浮現在眼前。
那麼小的小孩——無意識地把這些——從記憶中消除。
連沒辦法消除的自覺都沒有,心中帶著糾葛痛苦著。
從來都沒覺得好玩過,壓抑自己的情感直到這樣欺騙自己。
接下來空——用著伊野難以置信的——沒看過也沒想像過的溫柔的笑容問道。
「——喂老爺爺……你、對現在的伊綱——以為自己知道些什麼?」
「…………」
伊野沒有回答,只是跟空一起望著享受遊戲的伊綱與白。
「……又是、白贏了……遵守約定、讓我、摸」
「為、什麼! 為什麼贏不了、得斯!」
雖然掙扎著,伊綱浮現著恍惚的表情。
不甘心、還有點火——還有遠在那之上的快樂。
伊野只是——低著頭。
上次看到這樣的伊綱是什麼時候呢。原來如此,他這麼想。自己還以為知道孫女的什麼呢。自己明明沒有權利去說關於伊綱的任何事……
不過,看伊野這樣子空卻是嘆了口氣,
「……唉,你又往別地方看了。別再低頭了,好好看著伊綱」
「——你這是,在指什麼……?」
「裝作沒在聽,卻在說到小時候跟你一起玩的事的時候轉向這邊,那對可愛的耳朵喔」
回應著空溫柔的聲音,白跟伊綱馬上停了下來。
伊綱轉過身來。
伊野抬起頭,承受著孫女的視線。
空接著說道:
「那—麼老爺爺!? 這樣還不懂的話只能當優秀的五感什麼的失靈了喔!?」
「最後的問題! 伊綱到底是想跟誰玩——應該知道了吧?」
「————」
伊野沒有回答。
「只是步向靜靜地望向自己的伊綱,告訴她。」
「……伊綱。可以讓爺爺加入嗎?」
「……唔! 真是沒辦法、得斯。伊綱不會手下留情喔、得斯!」
閃著燦爛的目光,伊綱笑道。
就這樣,白來到望著開始遊戲的伊綱跟伊野的空的身邊,說道:
「……哥哥、真不、坦率……」
「完全不知道你在說什麼。我只是在欺負該死的現充爺爺而已」
就這樣空抱著白,坐在自己的膝蓋上。
——一邊苦笑一邊想著,不管是哪一個,都太鑽牛角尖了吧。
伊野就這樣背對著說道:
「……空殿下。雖然說我果然還是不相信你——」
不過空不在乎地笑著,搖著雙手,
「喂—老爺爺,我什麼時候叫你相信我啦? 別再胡說了——」
隔了些時間,如此宣告著。
「——好好享受吧。兩個人一起」
——因為,已經成為這樣的國家了。
接下來——會讓你看到變成這樣的世界。
伊野對極度傲慢的男人略微收了收下巴,表達了些微的謝意後——
「那麼~爺爺也該認真了吧~」
「放馬過來、得斯——」
伊野挽起袖子,使出久違的全力跟孫女開始遊戲——



一個小時後。
「……爺爺、弱的不可思議、得斯。有夠雜魚、得斯。難以置信、得斯」
對著沒有絲毫惡意、真的只是在驚嘆的伊綱,
的確是輸得難以置信,一面倒地慘敗的老人的眼淚沾濕了榻榻米。
對於只不過一個小時就連敗了六十二次——對上伊綱連一分鐘都撐不了的伊野,
「啊哈哈~果然是變成這樣~♪」
空只管笑著——沒錯。
用讓伊野感到恐怖,那個惡魔般的笑容——這麼說道。
「就只是對我們——對『 』惡搞的下場而已——那麼」
「……小伊……要不要跟白與空……玩?把不愉快的經驗洗掉……」
「放馬過來吧、得斯! 跟爺爺玩太沒意思了、得斯!」
伊野挨了孫女用沒有半點惡意的笑容說出來的最後一擊,平趴在地上。
對馬上開始遊戲的三人——不對。就只是針對空,用有如從地獄響起的咒罵聲說道:
「……空殿下——不禿毛猴——你這傢伙是算計我到這一步的吧,啊!?」
對那血般的呼叫,空蠻不在乎的笑著答道。
「咦—你在說什麼啊~娶了三十個妻子的男子漢中的男子漢,怎麼可能弱小到這種地步~一定是故意放水讓伊綱贏的吧。伊綱~? 爺爺故意讓伊綱覺得自己很強,是個很溫柔的爺爺喔~」
就這樣,對像是在唸台詞的空——伊野——下了決心。



東部連合・首都巫鴈——巫社。
紅月照耀著兩個人影。
「——初瀬伊野? 眼睛怎麼紅腫了起來……該不會是用了血壞了吧?」
那是長著金色的雙尾的狐狸——獸人種的全權代理者——『巫女』、以及垂著頭的伊野。
「讓我用的話我是想用、而已。巫女大人,能不能重新考慮跟那位叫做空的男人共組艾爾奇亞聯邦的事?不、我對巫女大人的意思當然沒有異議。只不過那個叫做空的男人——這麼說吧、有一些、這樣——」
因激動而顫抖的肌肉,忠實地傳達著低著頭的表情。
「啊~啊~我知道啦、不用說得那麼委婉……簡單的說就是這個意思對吧?」
而且,巫女當然也是一樣意思。
不管是誰,敗給空跟白——敗給『 』的人,一定都是這麼想的。被弄得這麼想。也就是說。

「想要算計那兩人獲得勝利,讓他們哭叫,沒錯吧?」
——就只是一直輸,任他們擺布,誰咽得下這口氣呢。
「放心吧。我也是沒有一天不在夢想一樣的事喔?」
就這樣,只剩下浮現著兇狠的笑容的兩個獸人種的聲音,在庭園中迴盪——。

[完]

Monday, August 29, 2011

成惠的世界 Critique

(違う言語で書くと考え方が微妙に変わったかもしれませんが、内容は後々書きとほぼ同じ……はず)

今天有人要把地球改造成沒有兵器、沒有戰爭、沒有飢餓、沒有絕症的樂園,你要不要?
相信會說「不要」的人不多,那為什麼故事裡幾乎所有人都拼命要阻止第四御柱?

合星國要抓黑蛇是為了利益(戰力或科技),銀連順著密約出兵是為了權力
(維持對地球的控制,扼殺剛甦醒的黑蛇)
其他人可能是反射性地想「保護地球」,尤其是狀況不明的時候:
黑御柱沒有泰特菈的高度機能,只是本能地復述她的使命而已。

但這些不該是唯一考量,尤其是見到了甦醒的第四御柱的成惠跟和人。
更何況,要拯救全人類是不是非拆地球不可也許還能商量。
和人跟成惠聽到「異文明接觸必起衝突」後的抗議同樣也只是反射:
是不知道有沒有到100%,但成惠的世界的確是個戰爭衝突不斷的世界,
連成惠都是因為異文明之間戰爭不斷才出生的:不然的話名越大佐不會跟成惠爸離婚,成惠爸也不會到地球來。
當然,要不是因為捕蛇作戰,第四御柱也不會完全蘇醒,成惠跟和人也不會在那邊跟陌生的養女哈啦。

哈啦的結果是第四御柱想起了她身為「泰特菈」的一切,
在成惠跟成美的背景與「不會再讓這種事發生」的說明下出現系統錯誤…
「不會再讓這種事發生」是優蘭跟托薩克道別時說的話,不知道為什麼和人也知道。
但優蘭、托薩克、和人,都是底下的人的視點,
只看到了御柱動手排除了舊Avalon的軍隊啓程,沒看到Avalon入侵御柱中心,明顯以御柱為敵,
「不會放棄能居住的星球」即使是香奈花的歷史圖鑒,想來也是人類的觀點,未必會為御柱說話。

「不對!要實現的話應該化為星球,沒有悲傷的樂園…」

第四御柱再度陷入了混亂,這次一方面是因為人類那半的泰特菈醒了,一方面是因為成惠跟成美媽媽的事。
而成惠的反應…。說真的,看到女兒精神錯亂,身在開始崩壞的星船,一般來說不會先從長篇論述開始吧?
光就一句話「只是一個個體的悲劇」就猜到是媽媽的事,這自我意識過剩還是邏輯跳躍也未免過頭了些…

接受已發生的事基本上沒有錯,但對泰特菈來說其實也是有限度的。
「即使能自由選擇世界,強到沒有人會死(能保護所有人),悲傷的事也絕對不會減少/消失…」
則只能說是悲觀消極的病態,而且成惠根本沒有立場對泰特菈說這樣的話:
泰特菈曾用御柱的力量對付貝魯卡,算起來成惠也是被御柱保護過。
更糟的是這一否定御柱的raison d'être(存在的意義),連成惠熟識的泰特菈都一併否定了:
成為「保護大家的星船」本來就是泰特菈的心願與初衷,成惠有注意的話聲稱
「生命的救贖就是御柱的幸福」的第四御柱其實也沒那麼陌生。
就成惠視點來看,她提到了選擇世界的能力代表她不是狀況外,多少有問過泰特菈的事,
很可能也知道11卷泰特菈完全把自己當「被製造的機械」的自我認同。
而對機族來說精神上的問題跟物理的破壞同樣致命,成惠不可能預知御柱會不會完全壞掉,
也不可能預知人類跟機族的泰特菈能不能分開。她看到的後果剛好相反,
御柱的部份被破壞的泰特菈是成惠親自照顧的。除非她真的是一家子全犧牲了也要確保地球維持原狀,
不然她的舉動完全不合理,而成惠又不是那種個性的人,11卷還說過完全相反的「名言」
(地球什麼的宇宙戰爭一開打只是粒灰塵沒什麼喜歡還是討厭的啦~!?)

成惠該做的不是否定御柱,把「她」推下懸崖,而是肯定她熟識的女兒,用力拉她一把:
要來個什麼嘴對嘴法式深吻震撼教育也沒關係,成惠應該相信泰特菈能善用御柱的力量救助或保護人類。
說真的,機械的第四御柱的手段雖然激烈了些,從全體人類的角度來看應該算是好事。
第四御柱會因為成惠的事而故障或崩壞,相信也能為了成惠強行修復。即使沒那麼順利舊版的黑船垮掉也沒關係,
剛好給銀連艦隊一個下台階...

原作本篇的結果是御柱失去了(記憶結晶的對蛇)結界,遭到白蛇入侵。
白蛇的正職是深次元資料庫其實從人類視點來說不代表什麼,重點是白蛇的舉動是否有利於人類。
異文明接觸至少是經常帶來衝突,沒有抑止力下盲目地連接眾星的文明未必是好事,
至少需要像御柱的黑蛇這樣的存在協助維和與平衡。白蛇用綠日エミヤ的外表說
「妳的力量已經變得太強只會為世界帶來恐怖…」簡直就是對綠日青日全體御柱的侮辱,
不管是人類還是機械的泰特菈都該用力巴下去才對:除了後來叛變的青日三賢者,
綠日人青日人一直都敬重著她們的御柱大人,綠日的御柱甚至已經盡可能地保護一切生命,
把地面上的Avalon人也一併載走了。即使只有半艘,黑御柱一樣沒忘記她是保護生命的星船,
拆了美軍基地卻沒殺半個人。相較之下,當年在墨西哥拿槍威脅跟御柱的碎片玩的孩童們的美軍又如何呢?

在劣勢之下為了拯救人類幾乎什麼王牌都出盡了,最後只落得眾叛親離內外交迫,
要是我是第四御柱也會覺得「不知道為了什麼」而離開這世界。泰特菈人類那半知道是怎麼回事後其實並不反對,
說真的也盡力了。沒那麼幸運受銀連保護,不是日本人也不是美國人,
包括黑御柱在地球的故鄉墨西哥等第三世界國家的人,只能繼續餓死病死,死在毒梟的槍口下,
或美軍獵食者無人機的地獄火飛彈。他們,連見到甦醒的御柱的機會都沒有。

乘客們,青日人的靈魂呢?他們未必能,也未必想成為白蛇的一部份。
泰特菈呢?人類那半已經吞下了很多御柱的意志、本能、記憶,
成惠也很清楚,她一輩子都要帶著這些不相稱的包袱。

大局上掌權者像往常一樣為了利益與權力開戰,底下的人則消極悲觀,充滿無力感地拒絕了就在懷裡的救贖,
這才是アルマゲスト篇的真實。說起來,其實現實世界有時候也是這樣,但認同這樣的現實未免也太悲哀了些。