diff -ru tss-27/tss/TypeKey.rb 9sss-20061030/tss/TypeKey.rb --- tss-27/tss/TypeKey.rb 2006-10-14 01:47:41.000000000 +0900 +++ 9sss-20061030/tss/TypeKey.rb 2005-09-01 17:33:55.076092800 +0900 @@ -1,4 +1,4 @@ -#!/bin/env ruby +#!/usr/local/bin/ruby # Copyright (C) 2005 jouno # License under GPL-2 # Only in 9sss-20061030/tss: action_default.rb diff -ru tss-27/tss/admin.cgi 9sss-20061030/tss/admin.cgi --- tss-27/tss/admin.cgi 2006-10-14 01:47:41.000000000 +0900 +++ 9sss-20061030/tss/admin.cgi 2006-10-12 05:09:43.230566400 +0900 @@ -1,4 +1,4 @@ -#!/usr/bin/env ruby +#!/usr/local/bin/ruby require 'config' require 'catalog' Only in 9sss-20061030/tss: announces.rb diff -ru tss-27/tss/broadcast.rb 9sss-20061030/tss/broadcast.rb --- tss-27/tss/broadcast.rb 2006-10-14 01:47:41.000000000 +0900 +++ 9sss-20061030/tss/broadcast.rb 2005-09-01 17:11:52.003608000 +0900 @@ -1,4 +1,4 @@ -#!/usr/bin/env ruby +#!/usr/local/bin/ruby require 'config' require 'tsslock' diff -ru tss-27/tss/catalog.rb 9sss-20061030/tss/catalog.rb --- tss-27/tss/catalog.rb 2006-10-14 01:47:41.000000000 +0900 +++ 9sss-20061030/tss/catalog.rb 2006-10-14 19:42:45.892352000 +0900 @@ -1,6 +1,50 @@ +require 'announces' require 'version' -SHOW_UPDATE = '%1月%2日 %3に更新されます。
更新までの残り時間は %4時間%5分%6秒です
それまでに投票や能力の対象を決定して下さい。' +EXT_SKILL = 'png' +EXT_TITLE = 'gif' +MES_ARY_SIZE = 20 + +SID_FOLK = 0 #0:村人 +SID_WOLF = 1 #1:人狼 +SID_SEER = 2 #2:占い師 +SID_MEDIUM = 3 #3:霊能者 +SID_LOONY = 4 #4:狂人 +SID_GUARD = 5 #5:狩人 +SID_FREE = 6 #6:共有者 +SID_YOKO = 7 #7:妖魔 +SID_LOONY_C = 8 #8:C狂人 +SID_FANATIC = 9 #9:狂信者 +SID_SAINT = 10 #10:聖痕者 +SID_GUT = 11 #11:中身占 +SID_SKILL = 12 #12:役職占 +SID_PRIEST = 13 #13:狂神官 +SID_SYMPA = 14 #14:共鳴者 +SID_DECIDE = 15 #15:決定者 +SID_SNATCH = 16 #16:狼憑き + +# 表示にのみ使用する役職名 +SKILLS_ORG = [ + '村人', #0:村人 + '人狼', #1:人狼 + '占い師', #2:占い師 + '霊能者', #3:霊能者 + '狂人', #4:狂人 + '狩人', #5:狩人 + '共有者', #6:共有者 + '妖魔', #7:妖魔 + 'C狂人', #8:C狂人 + '狂信者', #9:狂信者 + '聖痕者', #10:聖痕者 + '中身占', #11:中身占 + '役職占', #12:役職占 + '狂神官', #13:狂神官 + '共鳴者', #14:共鳴者 + '決定者', #15:決定者 + '狼憑き', #16:狼憑き +] + +SHOW_UPDATE = '%1に更新されます。
更新までの残り時間は %2
それまでに投票や能力の対象を決定して下さい。' SHOW_UPDATE_SCRIPT = %Q( ) @@ -44,75 +81,73 @@ VILS_HEAD = [ %Q( - - + - + ), %Q(
テスト村のリスト
+
テスト村のリスト
テスト村は発言テストや機能の実験などを行う村です。
更新間隔状態
更新間隔情報状態
- - + - + ), %Q(
完全内輪村のリスト
+
完全内輪村のリスト
参加を約束した人以外は入らないようにして下さい。
更新間隔状態
更新間隔情報状態
- - + - + ), %Q(
内輪気味村のリスト
+
内輪気味村のリスト
誰でも参加できますが、内輪話がある覚悟はして下さい。
更新間隔状態
更新間隔情報状態
- - + - + ), ] + INDEX_HEAD = < これは人狼BBSのクローンの四国です。 -人狼BBSについては - -こちらを参照してください。 +(人狼BBSについてはこちらを参照してください) 短期決戦専用、複数サーバを用いた負荷分散が可能、などを特徴としています。 - -現状、他で人狼をやったことがあることが前提となっているため、 -説明などが非常に乏しくなっています。 - - +また、#{COUNTRY_NAME}は、四国システムで長期戦をする事を目的としているため、四国の他の国とは異なる機能を装備しています。 +もちろん短期戦もプレイできます。 + +

-この国は she の管理下にあります。 -絵をなかなかできてこないため、 -試験を兼ねてにんじん国キャラ設定+萌え絵で試験運用しています。 -キャラ一覧。 - +この国 (#{COUNTRY_NAME}) は eruption の管理下にあります。 +

-ドキュメント。 -更新履歴。 -要望バグ報告掲示板。 -四国まとめサイト(by imo758さん)。 - +参加希望者は、ドキュメントを一通り最後まで読んでから参加して下さい。
+それぞれの村には、特定の決め事があることもあります。
+エントリーする前に村の情報に書いてあるコメントを確認して下さい。 +

+

+携帯 | +キャラ一覧 | +ドキュメント | +更新履歴 | +要望予定バグ報告掲示板(管理人:she) | +四国まとめサイト(管理人:imo758) +

END # 国独自の変更履歴を TSS_UPDATE と同じ記法で記載することもできます -ORIGINAL_UPDATE = [ +#ORIGINAL_UPDATE = [ # ['2005-08-20', 'にゅん'], -] +#] INDEX_FOOT = < -村作成 -

+#{'

村作成

' if COUNTRY_NAME == '9州us'}

終了した村の記録 @@ -126,11 +161,16 @@ 村生成通知

+

+#{COUNTRY_NAME} キャラ/表情一覧 +

+
一般村
+
一般村
誰でも気軽に参加できるよう、内輪話が禁止されています。
更新間隔状態
更新間隔情報状態
@@ -142,322 +182,18 @@ END -DOCUMENT = <四国ドキュメント - -

-このドキュメントのほとんどは eruption さんの手によるものです。感謝。 - -

-

-

- -

参加方法

- -

-User ID は TypeKey を利用しています。まずは TypeKey の User ID を取得して下さい。TypeKey についてはこちらを参照のこと。 TypeKey のニックネームが四国の ID として使用されます。 -

- -

-User ID を取得したら、右上の login ボタンを押してログインします。 -

- -

-次に、参加者を募集している村に入り、エントリーします。配役と希望する能力(役職)を選択してから発言をすればエントリーとなります。以降はシステムメッセージの指示に従ってください。希望能力はあくまで希望ですので、その能力を得られるかは運次第です。なお、それぞれの国のそれぞれの村には特定の決め事があることもあります。エントリーする前に必ず村の情報に書いてあるコメントを確認して下さい。 -

-

-エントリーは、村を出ると取消す事が出来ます。 -

- - -

日程

- -

-設定によっては人狼BBSと異なる部分があります。 -

- -

-全体の流れは、

-プロローグ→(中身公開)→1日目昼→(1日目夜)→占い、中占い、襲撃、(守護)→2日目昼→処刑→(2日目夜)→占い、中占い、襲撃、守護→3日目昼→・・・→最終日昼→処刑→(最終日夜)→占い、中占い、襲撃、守護→エピローグ

-となります。()は設定により出現しないイベントを表しています。 -

- -

-村が作成されると、プロローグが開始します。 -

-

-1日目は作成者 (またはmaster) がログインして「村を開始する」ボタンを押すと開始します。後は更新間隔に従って更新されます。 -

-

-1日目が開始されると、まず人狼役の「中身公開」が実行されます。また、1日目は、「占い」「中身占い」の能力が実行できます。なお、それぞれのイベントは村作成時に、それらが有効になっているか、それらの能力者がいる場合に限り実行されます。 -

-

-2日目以降は、「ゲルトあり」の設定なら本州とほぼ同じです。「ゲルトなし」設定の場合は、2日目朝の最初の襲撃から全ての村人が襲撃対象となります。 -

-

-夜フェーズが設定されている場合は、1日目から2日目への更新後から夜フェーズが開始します。夜フェーズが終ると2日目が開始されます。以降エピローグまで同様に推移します。また、夜フェーズが設定されている時はラストウルフを処刑しても即エピローグとはならず、夜フェーズは発生します。 -

-

-エピローグでは、「MVP投票」ができます。すばらしいプレーをしたと思う人に投票しましょう。 -

-

-村の終了は、村作成者 (またはmaster) が、手動で閉じます。村作成者は、閉じる前に「終了後コメント」に、その村のダイジェストや感想などを書いておきましょう。 -

- -

役職

- -

-見慣れない職業は、その他のクローン人狼(人狼審問、騎士、四国等)を参照してください。 -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
役職能力説明

村人
- 能力はありません。 -

人狼
- 毎夜、ひとりだけ村人を襲撃できます。
- 「人狼のささやき」は人狼とC狂人にしか聞こえません。
-

狼憑き
- 基本的には人狼と同じ能力ですが、 - 襲撃成功時に犠牲者の体を奪い取ります。
- ややこしい能力なので、使用する場合は詳しいルールを誰かに確認しておいて下さい。Wikiに仕様がまとめてあります。 -

占い師
- 毎夜、村人ひとりを占う事ができます。
- その村人が人狼か人間かがわかります。 -

中身占い師
- 毎夜、村人ひとりを占う事ができます。
- その村人の中の人のIDがわかります。 -

役職占い師
- 毎夜、村人ひとりを占う事ができます。
- その村人の役職がわかります。 -

霊能者
- 投票による処刑で死んだ者が、
- 人狼であったか人間であったかがわかります。 -

狂人
- 人狼側の人間です。
- 人狼の勝利が狂人の勝利となります。
- 狂人と人狼は、お互いに正体を知りません。 -

狂信者
- 人狼側の人間です。
- 人狼の勝利が狂信者の勝利となります。
- 人狼の正体を1日目から知っています。 -

C狂人
- 人狼側の人間です。
- 人狼の勝利がC狂人の勝利となります。
- 「C狂人のささやき」は人狼とC狂人にしか聞こえません。 -

狂神官
- 人狼側の人間です。
- 人狼の勝利が狂神官の勝利となります。
- 毎夜、村人ひとりを占う事ができます。
- その村人の役職がわかります。 -

狩人
- 毎夜、ひとりを人狼の襲撃から守ることができます。 -

共有者
- 2人以上いるとき他の共有者を知ることができます。
- 共有者がひとりしかいない時は聖痕者と同じです。 -

共鳴者
- 2人以上いるとき他の共鳴者の独り言を見ることができます。
- 共有者がひとりしかいない時は聖痕者と同じです。 -

聖痕者
- 聖痕者という肩書きを持つ人間です。
- 他の聖痕者を知ることはできません。
- 複数の聖痕者が居る時は、聖痕者1、2、3…と連番されます。 -

決定者
- 投票を2票持っています。追加票は棄権することが可能です。
-

妖魔
- 村人側にも人狼側にも属さない、第三勢力。
- 勝敗を決定する人数カウントではどちらの陣営にもカウントされません。
- 勝敗が確定したときに生き残っていることが妖魔の勝利となります。
- 占われると消え失せ死亡しますが、村人には襲撃されたように見えます。中身、役職占いでは死にません。
- 占い結果、霊能判定は人間と出ます。
- 人狼に襲撃されても襲撃失敗となり死にません。
-
- -

Q&A

- -
- -
-新しい村は何時できますか? -
-ユーザーIDを取れたら、ログインすれば誰でも「村作成」から村を作れます。自動では作られません。 - -
-村は誰が作るのですか? -
-誰でも作れます。あなたも作りましょう。 - -
-複数の村を作ってもよいですか? -
-OKです。作ったらちゃんと消費しましょう。 - -
-複数の村に参加してもよいですか? -
-OKです。あなたの限界までn股プレイしても構いません。 - -
-突然死はありますか? -
-ありません。ただ単に発言していない人として扱われます。が、入ったからにはきっちり参加しましょう。 - -
-中身公開とは何ですか? -
-中身公開とは、1日目開始時に人狼役の中の人を公開する事です。中の人を推理して人狼を探しましょう。 - -
-無記名とは何ですか? -
-無記名とは、各村人の投票結果を公開せずに、得票数のみが発表される事です。投票先が不明となることを利用した戦略が村側狼側共に考えられ、より混沌となります。 - -
-コミットは使えますか? -
-昼夜共に使えます。全員がコミットすると翌日へ日付が更新されます。なお、コミットによって翌日以降の更新時刻は、コミットした時刻を基点に前倒し進行します。 - -
-発言の確認ができませんが? -
-村作成時のオプションで、プレビューをオンにすると発言時に確認があります。オフの場合は発言投稿前にプレビューによる確認はありません。また、発言の取消しもできません。誤爆に注意してください。 - -
-発言数の制限はありますか? -
-全日程で発言数、発言文字数の制限はありません。独り言はいつでも誰でも言うことができます。 - -
-傍観者発言とは何ですか? -
-参加していない人でも、傍観者としてIDを出して発言することができます。 -プロローグでは参加していても傍観発言も可能です。 -役職のバランス調整などを話しあう時に便利です。 -プロローグ以降の進行中での傍観発言は墓下のうめき発言となります。(傍観者はエピローグまで自分自身の発言を確認できないことに注意) - -
-発言アンカーに書式はありますか? -
-下記の書式を使うと発言へのリンクが自動設定されます。 -
    -
  • 当日の発言へのアンカー:「>>」+「発言番号」(ex. >>5) -
  • 前の日の発言へのアンカー:「>>」+「日付」+「:」+「発言番号」(ex. >>1:7) -
  • ささやき:「>>」+「*」+「発言番号」(ex. >>*5、>>*2:5、>>2:*5) -
  • うめき:「>>」+「+」+「発言番号」(ex. >>+5、>>+2:5、>>2:+5) -
  • 独り言:「>>」+「-」+「発言番号」(ex. >>-5、>>-2:5、>>2:-5) -
- -
-村作成、村編集がわかりません -
-
    -
  • 村の名前は適当に考えて付けてください。 -
  • ゲルトは、チェックすると「あり」で、チェックしないと「なし」になります。「あり」は本州と同じでゲルトはNPC (ノン・プレイヤ・キャラクタ) となり、「なし」は、他のキャラと同じ扱いとなります。「なし」にした場合は、日程や能力者の行動にも変化があります。なお、「あり」とした場合はかならず役職構成にゲルト分の村人を最低1人確保しておかなければなりませんので注意してください。 -
  • 役職構成は基本的には何でもありです。占い師等の特殊能力者が二人居るような設定も可能です。勢力バランスに注意して決めましょう。 -
  • 最大参加人数は16人です。ゲルトあり時は設定した人数から村人1人を引いた人数が最大参加人数で、ゲルトを含めて16人が最大となります。ゲルトなし時は設定した人数までの参加が可能です。 -
  • 昼、夜の長さは分単位または時単位で設定できます。 -
  • 夜の長さを「0」以外に設定すると、夜フェーズが発生するようになります。 -
- -
-国ってなんですか -
-四国は複数のサーバで負荷分散できるようになっていて、それぞれの分散サーバを国と呼んでいます。サーバごとに絵やキャラ名やCSSやアナウンス内容を変えられるようになっていて、それによって国ごとの色が出たりしています。各サーバの村リストは共通で他の国で作った村も表示されるようになっています。トップページの分散サーバ一覧から各国を見ることができます。 - -
-黙ってソースコードを見せな -
-はい。 tss.tgz 。設置時にパスワードが必要になってますので、設置の際は she にご相談下さい。詳しくは中身の README.txt をどうぞ。 - -
- -END +#DOCUMENT +require 'document' HEAD = < + - - - + + + -四国 +四国/人狼BBQ:#{COUNTRY_NAME} @@ -469,22 +205,42 @@ \n" + print "\n" end print "
-title +title
END HEAD1 = < + + + + + + + + + +END + +HEAD1A = < +END + +HEAD1D = < END +HEAD1N = < + +END + HEAD2 = < @@ -495,7 +251,7 @@ + + + + + + + + + +
-title +title
END @@ -528,6 +284,39 @@ END +DISPLAY_TYPE_FILTER_FORM = < +
+END + +DISPLAY_FILTER_FORM = < + + + + + + + + + + + + + +
全て■●▼【】
【】
+END + STATES = [ '募集中', '開始待ち', @@ -535,17 +324,28 @@ '決着' ] -#CHARSETS = [ -# ['default', COUNTRY_NAME + '国標準'], -#] - -CHAR_MAX_NUM = 17 +CHAR_MAX_NUM = 70 CHARSETS = [ - ['default', COUNTRY_NAME + '国標準'], - ['fm', '顔文字'], + ['default', COUNTRY_NAME + '標準'], + ['qp', 'ヨガー'], + ['mikari', 'みかり審問'], + ['juna', '人狼審問'], + ['kuro', '黒い人。'], + ['610', 'もぐまぐ'], + ['dq','魔王城'], ] +CHARSETS_SURFACE = { + 'default' => true, + 'qp' => false, + 'mikari' => false, + 'juna' => false, + 'kuro' => false, + '610' => true, + 'dq' => true, +} + def c(msg, *a) msg = msg.clone for i in 1..9 Only in 9sss-20061030/tss: catalog_610.rb diff -ru tss-27/tss/catalog_default.rb 9sss-20061030/tss/catalog_default.rb --- tss-27/tss/catalog_default.rb 2006-10-14 01:47:41.000000000 +0900 +++ 9sss-20061030/tss/catalog_default.rb 2006-10-26 06:44:25.433780800 +0900 @@ -1,15 +1,86 @@ # true ならエントリー時発言が全身に、 false なら顔画像に FIRST_BODY = false -GERT = 'ゲルト' +GERT = 'パウンド' -GERT_ENTRY = '大げさ。' +GERT_ENTRY = [ +'村に人狼がいるらしいので調査してもらいたいという依頼を受けた。', +'人狼なんているわけないじゃん。みんな大げさだなあ



って、言うと思ったかい?
そんなこと言うわけないじゃん。みんな大げさだなあ (笑', +'俺

 

 

 

 
・ パ ウ ン ド だ。くそったれ!', +'彼らはいつも肝腎なことを見落す。', +'つぎ行こ、次。', +'じ......実は......ホントなんでチュー。ニコッ。', +'甘く危険な人狼のワナさ。', +'なれない場所や、気持ちの悪い所に行くと、
面白いことが起こる可能性が、高いのさ。', +'ハーーイ!!! ヨウこそいらシャイマシター', +'まこと
理想は限りなく遠く
青春は
限りなく病気に近い……

で、俺に何の用だ。', +'オーーー 客カト思エバ タダの冷やかしデスカ', +'アップダウン アップダウン チュッ! チュッ! チュッ!', +'発狂した猫を捨てに行った帰り道に錆付いた自転車を拾った。風の鋭い日の夕暮れ時の事だった……。', +'愛だろ、愛っ。', +'はっはっは。どんとこーい(棒読み', +'やっつぁっつぁぱれびっぱれらんらんびっぱりりんらんぴちたんるんらーりぴたりるんらーるっぱりるぴらんこれかんろっかやきりかんぐー。まっちゃっちゃーやりびだりりんらびりちたんりんらんでんらんどーあばりっかったーばりっぱりーばりびりびりびりすてんてんどんどんやばりんらすてんらんてんやろーわらぶどぅぶどぅぶどぅぶどぅぶどぅーやぶー、わでぃーだんりんらんせんらんどぶだけだげだげどぅーどぅーでーやどー。やっつぁっつぁぱれ・・・', +'時間ですよー!

時間ですよー!

人狼の時間ですよー!
', +'俺はパウンド。職業は探偵だ。依頼を受けてこの村に来ている。
まあ、仕事は大体片付いたし、腹もへったのでメシでも食っていくか。

「客人ハ、米飯ヲ食スベカラズ。但シ、ライスカレイハコノ限リニアラズ。」

メニューにはそう書かれてあった。
どうやら店主のおすすめはカレーのようだ。', +'いま言葉にできることのすべては、俺たちにとって意味をなさないものになった。', +] + +GERT_FIRST = [ +['f','今のところ人狼がいるという手掛りは何も見つかっていない……。'], +['f','そして夜は甦る…'], +['f','ふぁーあ……ねむいな……寝てていい?


(ぐーすかぴー)'], +['h','みすみす犬死なんかさせやしないぜ'], +['b','Σ な、なんだってーー!!!'], +['g','お前は本当に人狼を探しているのかと問いたい。問い詰めたい。小1時間問い詰めたい。
お前、汝は人狼って言いたいだけちゃうんかと。'], +['e','今日ハ イツモヨリ多く回しテおりマース!!'], +['c','ややこしいねんっ。'], +['b','あ、前方に人狼の気配がギュンギュンします!'], +['b','ヤバイ!バリヤバーイ!!'], +['d','な......なんてこったい.....'], +['d','きゅーーーん!!'], +['h','御前たちのやっていることは、するっとまるっと全部エブリシングお見とおしだぁ〜!'], +['g','わかっていますね?みなさん!ジンロウですよ?

いくぜっ!ロックンロールベイビー!!!'], +['','火急速やかに対処せよ。'], +['','いつまでもこのまま逃げていくわけにはいかないぜ。信じる者は俺について来い!'], +] -GERT_FIRST = 'ねもい。' +# 遠吠え +HOWL = '遠吠え' +HOWLS = [ +'わおーん', +'わんわん♪', +'ぐるるるぅぅぅ', +'きゅーーん', +'ハァハァ…', +'がうがう', +'わおーーん', +'あぉ〜ん', +'わんわんわんわんわんわん', +'かぷかぷ', +'ぺろぺろ', +'くんくん', +'・・・・', +'■●▼◆', +'CM#&’($_?>!', +'☆', +'わおーん!', +'うにゃーーーん', +'はにゃーん', +'わんわんわんわんわんわんわんわおーーーん', +'にゃおーん', +'にゃんにゃんにゃんにゃんにゃんにゃんにゃおーん', +'キャイーーン', +'グルルルゥゥ…', +'にゃーすかにゃーすかにゃーすか♪', +'ちゅーちゅー', +'わちょーんw', +] # 1日目構成公開 SHOW_DIST = 'どうやらこの中には、%1いるようだ' +SHOW_DIST_NUMS = '名' + # 投票 VOTING = '%1 は %2 に投票した。' @@ -17,27 +88,80 @@ ANON_VOTING = '%2 に、%1人が投票した。' # 処刑 -EXECUTION = '%1 は村人達に吊り殺された。' +EXECUTION = [ +'%1 は村人達にくすぐり殺された。', +'%1 は村人達に埋め殺された。', +'%1 は村人達に転がされた。(ごろごろごろごろ', +'%1 は村人達に串刺しにされた。(ざくざく', +'%1 は村人達に監禁された。', +'%1 は村人達にゲッチューされた。', +'%1 は村人達にお仕置された。', +'%1 は村人達に調教された。', +'%1 は村人達に処刑された。', +'%1 は村人達に改造された。', +'%1 は村人達に吊り殺された。', +] # 襲撃 -ATTACKING = '%1 、死んぢゃえ。' +ATTACKING = [ +'クックック。 %1 、今晩はオマエを嬲り、泣き叫ばせ、引きちぎって悲鳴を愉しんでやる!(ニヤぁ', +'泣き叫べ %1 よ。我らの胃の中でくやしめ!!', +'我思う ゆえに我あり ゆえに喰う!!(季語無し)
%1 よ、覚悟しな!!!', +] # 防衛 -GUARDING = '%1 は %2 を守るけんね。' +GUARDING = '%1 は %2 を守っている。' -KILLED = '次の日の朝、%1 が死んぢゃった。' +KILLED = [ +'夜が明けると、血に染まった %1 の衣服のみが発見された。', +'夜が明けると、%1 の手足の一部が発見された。', +'夜が明けると、%1 のヅラが発見された。', +'夜が明けると、%1 が悲惨な姿で発見された。', +'夜が明けると、まっぱの %1 が発見された。', +'夜が明けると、肉食獣に腹部を喰いあらされた %1 が発見された。', +'夜が明けると、%1 が一糸纏わぬ姿で発見された。', +'夜が明けると、%1 が(ピーー)で(ピーー)な姿で発見された。', +'夜が明けると、%1 がえっちな姿で発見された。', +'夜が明けると、%1 があられもない姿で死んでいるのが発見された。', +'夜が明けると、%1 が淫らな姿で死んでいるのが発見された。', +'夜が明けると、%1 がアレでソレな姿のまま発見された。', +'夜が明けると、%1 がバラバラ死体で発見された。', +'夜が明けると、%1 が哀れな姿で死んでいるのが発見された。', +'夜が明けると、%1 が箱詰めになって発見された。', +'夜が明けると、%1 がkhksな姿で発見された。', +'夜が明けると、%1 が鼻からうどんを出して死んでいるのが発見された。', +'夜が明けると、%1 がモザイクな姿で発見された。', +'夜が明けると、%1 がスキャンダラスな姿で発見された。', +'夜が明けると、%1 が白骨死体で発見された。', +'夜が明けると、%1 がいたはずの場所が黒く焼け焦げていた。', +'夜が明けると、%1 が腹上死しているのが発見された。', +'夜が明けると、%1 は風と共に去りぬ。', +'夜が明けると、%1 が体液をすべて抜き取られて死んでいるのが発見された。', +'夜が明けると、%1 が(ピーー)や(ピーー)を切り取られて死んでいるのが発見された。', +'夜が明けると、%1 があり得ない姿で死んでいるのが発見された。', +'夜が明けると、%1 が想像を絶する状態で死んでいるのが発見された。', +'夜が明けると、ゲル状の物体になった %1 が発見された。', +'夜が明けると、%1 のアレがなくなった姿で発見された。', +'夜が明けると、%1 がキャトル・ミューティレーションされていた。', +'夜が明けると、石化した %1 が発見された。', +'夜が明けると、%1 が無残な姿で発見された。', +] -KILLMISS = '犠牲者がいない。今日は休肝日だったのだろうか。' +KILLMISS = [ +'誰も喰われなかった。人狼は腹をすかせて気が立っているかもしれない。', +'犠牲者はいなかった。村人達は胸をなでおろし、生きていることを神に感謝した。', +'今日は犠牲者がいないようだ。人狼は襲撃に失敗したのだろうか。', +] -YOKO_WIN = '妖魔勝利ですからっ、残念っ!
' +YOKO_WIN = '妖魔勝利ですからっ、残念っ!' # 村勝利時妖魔勝利 YOKO_WIN_F = YOKO_WIN # 狼勝利時妖魔勝利 YOKO_WIN_W = YOKO_WIN -FOLK_WIN = '全ての人狼を退治しました……とさ。良かったね。
' +FOLK_WIN = '全ての人狼を退治した!∩(・ω・)∩バジャーイ' -WOLF_WIN = '村は滅びました……とさ。ちゃんちゃん。
' +WOLF_WIN = 'クックックッ… ヒャハハハハハっ!
人狼は血にまみれた爪をベロリと舐めた。そして、これ以上ないというぐらいの満足げな笑顔で村を立ち去った。' # 参加 JOINING = '%1人目、%2。' @@ -61,33 +185,52 @@ SEERING = '%1 は %2 を占った。' # 妖魔占い -VANISHING = '次の日の朝、%1 が死んぢゃった。' +VANISHING = KILLED #VANISHING = '%1 は消え失せた。' -GUTS_SEERING = '%1 は %2 を中身占いした。' +GUTS_SEERING = '%1 は %2 の中身を占った。' -SKILL_SEERING = '%1 は %2 を役職占いした。' +SKILL_SEERING = '%1 は %2 の役職を占った。' -GJ = '%1 を人狼の食事から守った。' +GJ = '%1 を人狼に喰われるのを防いだ。' -KILL = '%1 を食べた。' +KILL = '%1 を喰い殺した。' # 1=村娘パメラ 2=she 3=生存 4=村人 TRUTH = '%1 (%2)、%3。%4だった。' LIVES = '現在の生存者は、%1の %2名' -OPENING = <そして隣村で人狼がでるという噂が村人たちの間で囁かれるようになった。', +'山を越え谷を越え僕らの村にやってきた。人狼君がやってきた。', +'昼間は人間のふりをして、夜に正体を現すという人狼。
その人狼が、この村に紛れ込んでいるという噂が広がった。

村人達は半信半疑ながらも、村はずれの宿に集められることになった。' +] -MIRROR = <近づく夜明けの気配に、獣達は歩みを止め、寝床へ帰る。
昼は人の時間。夜は別のもの。
まだ暗い中、羊飼いは目を覚まし、一日を始める。
山の端が白み始め、夜明けの風が太陽に一足早く巡り、人の時間が来る。(werewolf著/クラーゲンフルトの狼より)', +'さあ、自らの姿を鏡に映してみよう。
そこに映るのはただの村人か、それとも血に飢えた人狼か。

例え人狼でも、多人数で立ち向かえば怖くはない。
問題は、だれが人狼なのかという事だ。
占い師の能力を持つ人間ならば、それを見破れるだろう。' +] -GERTDIE = <しかし、それを見分ける手段はない。

村人達は、疑わしい者を排除するため、投票を行う事にした。
無実の犠牲者が出るのもやむをえない。村が全滅するよりは……。

最後まで残るのは村人か、それとも人狼か。' +] # NAMES = [ # '???', @@ -98,56 +241,159 @@ # ] NAMES = [ - '???', - '楽天家 ゲ(略)', - '村長 ヴ(略)', - '老人 モ(略)', - '神父 ジ(略)', - '木こり ト(略)', - '旅人 ニ(略)', - 'ならず者 デ(略)', - '少年 ペ(略)', - '少女 リ(略)', - '行商人 ア(略)', - '羊飼い カ(略)', - 'パン屋 オ(略)', - '青年 ヨ(略)', - '村娘 パ(略)', - '農夫 ヤ(略)', - '宿(略) レ(略)', - 'シスター フ(略)', + '???', #0 + '探偵 パウンド', #1 + '組長 ペッパー', #2 + '老人 ヨーク', #3 + '教祖 ソルト', #4 + '番人 ドンブリ', #5 + 'ふうてん ヤツハシ', #6 + 'いれずみ者 サイダー', #7 + '少年 ライチ', #8 + '少女 モモ', #9 + '商人 ナン', #10 + '遊牧民 ミルミル', #11 + '店員 オニオン', #12 + '学生 ピッツァ', #13 + '乙女 アイス', #14 + '農夫 コッペ', #15 + '飲屋のママ スアマ', #16 + '配達人 タコス', #17 + '聖女 マリネ', #18 + '老婆 エルビー', #19 + '医者 ワッフル', #20 + '羊飼い カタリナ', #21 + '羊飼い カタリニ', #22 + '羊飼い カタリヌ', #23 + '羊飼い カタリネ', #24 + '羊飼い カタリノ', #25 + '牛飼い タカリナ', #26 + '山羊飼い カタナリ', #27 + '豚飼い リナカタ', #28 + '猛獣使い ナリタカ', #29 + '偽羊飼い カトリーナ', #30 + '偽羊飼い カトリーニ', #31 + '偽羊飼い カトリーヌ', #32 + '偽羊飼い カトリーネ', #33 + '偽羊飼い カトリーノ', #34 + '偽羊飼い キャサリン', #35 + '似非羊飼い カタりナ', #36 + '少女 ラーザ', #37 + '少女 リーザ', #38 + '少女 ルーザ', #39 + '少女 レーザ', #40 + '少女 ローザ', #41 + '少女 リリザ', #42 + '少女 リザ', #43 + '少女 リー', #44 + '妙 リ', #45 + '庶女 ラーザー', #46 + '小女 リーザー', #47 + '商女 ルーザー', #48 + '娼女 レーザー', #49 + '王女 ローザー', #50 + '淑女 リーゼ', #51 + '熟女 リヰザ', #52 + '幼女 ロリーザ', #53 + '楽天家 げると', #54 + '村長 ばるたー', #55 + '老人 もーりっつ', #56 + '神父 じむぞん', #57 + '木こり とーます', #58 + '旅人 にこらす', #59 + 'ならず者 でぃーたー', #60 + '少年 ぺーたー', #61 + '少女 りーざ', #62 + '行商人 あるびん', #63 + '羊飼い かたりな', #64 + 'ぱん屋 おっとー', #65 + '青年 よあひむ', #66 + '村娘 ぱめら', #67 + '農夫 やこぶ', #68 + '宿屋の女主人 れじーな',#69 + 'しすたー ふりーでる', #70 ] -SKILL_DESCS = [ - '

なにもできないゴクツブシです。

', - '

毎晩人を食べることができます。

', - '

占って人間か人狼を判別できます。

', - '

吊り殺された人が人間か人狼かわかります。

', - '

やや狂ってます。

', - '

人狼の食事の邪魔できます。

', - '

相方がわかります。

', - '

生きてりゃ勝ちです。占いで溶けます。

', - '

そうとうに狂ってます。

', - '

かなり狂ってます。

', - '

どこかに聖痕があります。

', - '

占って中身を暴くことができます。

', - '

占って能力を調べることができます。

', - '

どうしようもなく狂ってる上に、占って能力を調べることができます。

', - '

目と目で通じあっています。

', - '

2票持ってます。

', - '

人を食べつつ憑依することができます。

', +SKILLS = [ + '村人', #0:村人 + '人狼', #1:人狼 + '占い師', #2:占い師 + '霊能者', #3:霊能者 + '狂人', #4:狂人 + '狩人', #5:狩人 + '共有者', #6:共有者 + '妖魔', #7:妖魔 + 'C狂人', #8:C狂人 + '狂信者', #9:狂信者 + '聖痕者', #10:聖痕者 + '中身占い師', #11:中身占 + '役職占い師', #12:役職占 + '狂神官', #13:狂神官 + '共鳴者', #14:共鳴者 + '決定者', #15:決定者 + '狼憑き', #16:狼憑き ] -# 表示にのみ使用する役職名 -SKILLS = [ - '村人', '人狼', '占い師', '霊能者', '狂人', '狩人', '共有者', '妖魔', - 'C狂人', '狂信者', '聖痕者', '中身占', '役職占', '狂神官', '共鳴者', - '決定者', '狼憑き', +RESULTS = { + 'N' => '人間', + 'F' => '村人', + 'W' => '人狼', + 'Y' => '妖魔', + 'Q' => '恋人', +} + +SKILL_DESCS = [ + #0:村人 + "#{SKILLS[SID_WOLF]}を退治しなければ、あなたに未来はありません。そして、時々間違って#{SKILLS[SID_GUARD]}を吊り殺して落ちこんだりもします。推理と勘と情熱で#{SKILLS[SID_FOLK]}側を勝利に導いてください。", + #1:人狼 + "人間を喰いたい衝動を抑えることができません。共喰いが有効な時は仲間や自分すらも襲います。グルルルゥゥ…", + #2:占い師 + "占った#{SKILLS[SID_FOLK]}が#{SKILLS[SID_WOLF]}か人間か判ります。ただし、占い先のセットを忘れると翌日占いに失敗して結果を知る事ができません。ご注意あれ。", + #3:霊能者 + "死んだ#{SKILLS[SID_FOLK]}が#{SKILLS[SID_WOLF]}か人間か判ります。", + #4:狂人 + "#{SKILLS[SID_WOLF]}側の人間です。あなたの行動が#{SKILLS[SID_WOLF]}の運命を左右します。", + #5:狩人 + "護衛可能な日は誰かひとりを守れます。自分は守れません。守り先のセットを忘れると護衛に失敗します。ご注意あれ。", + #6:共有者 + "何を共有しているのかは知りませんが、相方が誰なのかは知っています。", + #7:妖魔 + "#{SKILLS[SID_YOKO]}がんばれ!超がんばれ!", + #8:C狂人 + "じつは#{SKILLS[SID_WOLF]}側の人間です。#{SKILLS[SID_WOLF]}とお話しもできます。でも、その事はみんな知っていますけどね。", + #9:狂信者 + "じつは#{SKILLS[SID_WOLF]}側の人間です。最初から#{SKILLS[SID_WOLF]}が誰かを知っています。#{SKILLS[SID_WOLF]}とお話しはできません。", + #10:聖痕者 + "沢山いるときは#{SKILLS[SID_SAINT]}1、2、3…と連番されます。", + #11:中身占 + "占った#{SKILLS[SID_FOLK]}の中の人のIDを知ることが出来ます。ただし、占い先のセットを忘れると翌日占いに失敗して結果を知る事ができません。ご注意あれ。", + #12:役職占 + "占った#{SKILLS[SID_FOLK]}の役職を知ることが出来ます。ただし、占い先のセットを忘れると翌日占いに失敗して結果を知る事ができません。ご注意あれ。", + #13:狂神官 + "じつは#{SKILLS[SID_WOLF]}側の人間です。#{SKILLS[SID_SKILL]}と完全コンパチで役職占いができます。ただし、占い先のセットを忘れると翌日占いに失敗して結果を知る事ができません。ご注意あれ。", + #14:共鳴者 + "独り言がお互いに見えます。", + #15:決定者 + "2票持っています。", + #16:狼憑き + "人を食べつつ憑依することができます。", ] -ACTIONS = - [ - 'をハリセンで略', - 'を小一時間略', - 'に話の続き略', - ] +# ACTIONS +require 'action_default' + +SURFACE = < +
#{v['vid']} #{v['name']}#{Vil.update_str(v['period'], v['night_period'])}#{STATES[v['state']]}#{v['country']}
#{v['vid']} #{v['name']}#{Vil.update_str(v['period'], v['night_period'])}情報#{STATES[v['state']]}#{v['country']}
" end @@ -629,15 +698,33 @@ def handle_chars print "

キャラ一覧 @#{COUNTRY_NAME}

\n" - CHARSETS.each do |k, v| - print "

#{v} キャラセット

\n" - CharsetDump.clear_const - cd = CharsetDump.new - File.open("catalog_#{k}.rb") do |ifile| - CharsetDump.class_eval(ifile.read) + if @cgi.key?('twop') + k = @cgi['twop'] + v = CHARSETS.assoc(k)[1] + surface = CHARSETS_SURFACE[k] + if v + print "

#{v} キャラセット

\n" + CharsetDump.clear_const + cd = CharsetDump.new + File.open("catalog_#{k}.rb") do |ifile| + CharsetDump.class_eval(ifile.read) + end + k = (k == 'default') ? nil : "_#{k}" + cd.dump(k, surface) + else + print "

指定されたキャラセットはありません。

\n" + end + else + CHARSETS.each do |k, v| + print "

#{v} キャラセット

\n" + CharsetDump.clear_const + cd = CharsetDump.new + File.open("catalog_#{k}.rb") do |ifile| + CharsetDump.class_eval(ifile.read) + end + k = (k == 'default') ? nil : "_#{k}" + cd.dump(k) end - k = (k == 'default') ? nil : "_#{k}" - cd.dump(k) end end @@ -714,6 +801,11 @@ mode = @cgi['mode'].to_i + print '通常村
' if mode != 0 + print '廃村になった村
' if mode != 1 + print '配分ごとの勝敗集計
' if mode != 3 + print "
" + rev = vldb['root'].reverse.select do |v| v['state'] == 4 && (cr_dist == '' || cr_dist == v['dist']) && @@ -796,7 +888,7 @@ end print "
" - print '通常村
' if mode != 0 + print '通常村
' if mode != 0 print '廃村になった村
' if mode != 1 print '配分ごとの勝敗集計
' if mode != 3 end @@ -828,8 +920,24 @@ @vil.date end + datestr = + if (date == 0) + " : プロローグ" + elsif (date == -1) + " : 情報" + elsif (@vil.state == 3 && date == @vil.date) + " : エピローグ" + else + if (@vil.night && date == @vil.date) + " : #{date}日目夜" + else + " : #{date}日目" + end + end + # erbrun('skel/head.html') - print_head("#{@vil.vid} #{@vil.name}") + print_head("#{@vil.vid} #{@vil.name}#{datestr}", @vil.night, @vil.moe) + datestr = '' @login.form(@vid) print "#{@vil.vid} #{@vil.name}(#{@vil.update_str})\n" @@ -867,6 +975,20 @@ @player = @vil.player(@login) print %Q(
\n) File.open("db/vil/#{@vid}_#{date}.html") do |ifile| + ary = [] + if @vil.date == date && @cgi['mes'] == 'all' + print '' + print "
" + print " " + print " " + print " " + print " 【】" + print '
' + print "" + print '' + print '
' + puts '
' + end ifile.each do |line| if (line =~ /^
/ || line =~ /
/) @@ -876,15 +998,19 @@ next if (@player == nil) if (pid != @player.pid) if (!($1 == 'think' && @vil.state == 2 && - @player.sid == 14 && - (tp = @vil.player_p(pid)) && tp.sid == 14 && + @player.sid == SID_SYMPA && + (tp = @vil.player_p(pid)) && tp.sid == SID_SYMPA && @player.dead == 0 && tp.dead == 0)) next end end elsif ($1 == 'whisper') if (@player == nil || !@player.can_whisper) - next + if (@vil.night && @vil.date == date) # 遠吠え + line = message(@vil.say_impl('howl', nil, 0, HOWL, '00', rand_msg(HOWLS))) + else + next + end end elsif ($1 == 'groan') if (@player == nil || @player.dead == 0) @@ -893,7 +1019,69 @@ end end end - print line + if @vil.date != date || @cgi['mes'] == 'all' + print line + else + ary << line if line != '' + end + end + + if @vil.date == date + if @cgi.key?('reg') + puts 'reg' + case @cgi['reg'].to_s + when '0' + s = '■' + when '1' + s = '●' + when '2' + s = '▼' + when '3' + s = '★' + when '4' + s = '【.*?】' + when '5' + s = @cgi['regstr'].to_s + s = NKF::nkf('-ex', s) if NKF.guess(s) == NKF::SJIS + end + if s != '' + ary = ary.collect{|line| + if /#{s}/ =~ line +# line = line.gsub(/(#{s})/, '\1') + line + else + line = nil + end + } + end + ary = ary.compact + end + + if @cgi.key?('reg') || ary.size > MES_ARY_SIZE + print '' + print "
全て表示" + elsif @cgi['mes'] != 'all' + print '' + end + + if @cgi['mes'] != 'all' + print "
" + print " " + print " " + print " " + print " 【】" + print '
' + print "" + print '' + print '
' + puts '
' + end + + if @cgi.key?('reg') || ary.size <= MES_ARY_SIZE + puts ary + else + puts ary[-MES_ARY_SIZE..-1] + end end end @@ -901,7 +1089,7 @@ t = Time.at(@vil.update_time) dt = Time.at(t - Time.now) hour = dt.to_i / 3600 - s = c(SHOW_UPDATE, t.month, t.day, timestr(t), hour, dt.min, dt.sec) + s = c(SHOW_UPDATE, t.strftime("%Y年%m月%d日 %H時%M分%S秒"), hour.to_s + '時間' + dt.strftime("%M").to_i.to_s + '分' + dt.strftime("%S").to_i.to_s + '秒' + 'です') s += SHOW_UPDATE_SCRIPT if (@vil.commit) s += c(SHOW_COMMITS, @vil.pids.select { |p| p.commit }.size) @@ -960,7 +1148,9 @@ end if (date != @vil.date) + puts '' end @vil.print_footer(STDOUT, date, @login.filter) diff -ru tss-27/tss/locksrv.cgi 9sss-20061030/tss/locksrv.cgi --- tss-27/tss/locksrv.cgi 2006-10-14 01:47:41.000000000 +0900 +++ 9sss-20061030/tss/locksrv.cgi 2006-08-12 18:52:40.804598400 +0900 @@ -1,4 +1,4 @@ -#!/usr/bin/env ruby +#!/usr/local/bin/ruby require 'cgi' require 'pstore' diff -ru tss-27/tss/login.rb 9sss-20061030/tss/login.rb --- tss-27/tss/login.rb 2006-10-14 01:47:41.000000000 +0900 +++ 9sss-20061030/tss/login.rb 2006-10-14 11:16:26.559016000 +0900 @@ -118,7 +118,7 @@ #