OSDN Git Service

文字化け対策
[lcs-jp/lcs-jp.git] / src / monthly / lcsmonthly.cpp
1 /*
2
3 Copyright (c) 2002,2003,2004 by Tarn Adams                                            //
4                                                                                       //
5 This file is part of Liberal Crime Squad.                                             //
6                                                                                     //
7     Liberal Crime Squad is free software; you can redistribute it and/or modify     //
8     it under the terms of the GNU General Public License as published by            //
9     the Free Software Foundation; either version 2 of the License, or               //
10     (at your option) any later version.                                             //
11                                                                                     //
12     Liberal Crime Squad is distributed in the hope that it will be useful,          //
13     but WITHOUT ANY WARRANTY; without even the implied warranty of                  //
14     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.   See the                  //
15     GNU General Public License for more details.                                    //
16                                                                                     //
17     You should have received a copy of the GNU General Public License               //
18     along with Liberal Crime Squad; if not, write to the Free Software              //
19     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA   02111-1307   USA     //
20 */
21
22 /*
23         This file was created by Chris Johnson (grundee@users.sourceforge.net)
24         by copying code from game.cpp.
25         To see descriptions of files and functions, see the list at
26         the bottom of includes.h in the top src folder.
27 */
28
29 #include <externs.h>
30
31 //TODO: Log the monthly report? --Addictgamer
32
33 /* monthly - reports the guardian's power to the player */
34 void guardianupdate(char size, int power)
35 {
36    music.play(MUSIC_NEWSPAPER);
37    clear();
38
39    set_color(COLOR_WHITE,COLOR_BLACK,0);
40    move(5,2);
41    if(size)
42    {
43       addstr("The monthly Liberal Guardian newspaper", gamelog);
44    }
45    else
46    {
47       addstr("The monthly Liberal Guardian online newsletter", gamelog);
48    }
49
50    addstr(" is published.", gamelog);
51    gamelog.newline();
52
53    move(7,2);
54    if(power<0)
55    {
56       addstr("The only readers are Conservatives, who seem to think it's funny.", gamelog);
57    }
58    else if(power==0)
59    {
60       addstr("Unfortunately, nobody seems interested.", gamelog);
61    }
62    else if(power<5)
63    {
64       addstr("Very few people seem to be interested.", gamelog);
65    }
66    else if(power<50)
67    {
68       addstr("A fair number of people are reading it.", gamelog);
69    }
70    else if(power<100)
71    {
72       addstr("Many people are reading it.", gamelog);
73    }
74    else if(power<250)
75    {
76       addstr("The response is very strong. People are changing their minds.", gamelog);
77    }
78    else
79    {
80       addstr("The response is electric. Everyone is talking about this month's ", gamelog);
81       move(8,2);
82       addstr("Liberal Guardian.",  gamelog);
83    }
84    gamelog.nextMessage();
85
86    getkey();
87
88    return;
89 }
90
91
92
93 /* monthly - lets the player choose a special edition for the guardian */
94 int choosespecialedition(char &clearformess)
95 {
96    //Temporary, maybe put special edition definition into an xml file. -XML
97         static const string document_types[] =
98         {  // This list MUST be in alphabetical order for binary_search() to work right
99       "LOOT_AMRADIOFILES",
100       "LOOT_CABLENEWSFILES",
101       "LOOT_CCS_BACKERLIST",
102       "LOOT_CEOLOVELETTERS",
103       "LOOT_CEOPHOTOS",
104       "LOOT_CEOTAXPAPERS",
105       "LOOT_CORPFILES",
106       "LOOT_INTHQDISK",
107       "LOOT_JUDGEFILES",
108       "LOOT_POLICERECORDS",
109       "LOOT_PRISONFILES",
110       "LOOT_RESEARCHFILES",
111       "LOOT_SECRETDOCUMENTS"
112         };
113         static const vector<string> dox(document_types,document_types+len(document_types));
114
115    int page=0;
116
117    //char havetype[LOOTNUM];
118    //for(int l=0;l<LOOTNUM;l++)havetype[l]=0;
119    vector<bool> havetype(len(loottype),false);
120    vector<int> loottypeindex;
121
122    //FIND ALL LOOT TYPES
123    for(int loc=0;loc<len(location);loc++)
124    {
125       if(location[loc]->renting==RENTING_NOCONTROL) continue;
126
127       consolidateloot(location[loc]->loot);
128       for(int l=0;l<len(location[loc]->loot);l++)
129       {
130          if(!location[loc]->loot[l]->is_loot()) continue;
131          if(!binary_search(dox.begin(),dox.end(),location[loc]->loot[l]->get_itemtypename())) continue;
132
133          if(!havetype[getloottype(location[loc]->loot[l]->get_itemtypename())])
134          {
135             loottypeindex.push_back(getloottype(location[loc]->loot[l]->get_itemtypename()));
136             havetype[getloottype(location[loc]->loot[l]->get_itemtypename())]=true;
137          }
138       }
139    }
140    for(int sq=0;sq<len(squad);sq++)
141    {
142       consolidateloot(squad[sq]->loot);
143       for(int l=0;l<len(squad[sq]->loot);l++)
144       {
145          if(!squad[sq]->loot[l]->is_loot()) continue;
146          if(!binary_search(dox.begin(),dox.end(),squad[sq]->loot[l]->get_itemtypename())) continue;
147
148          if(!havetype[getloottype(squad[sq]->loot[l]->get_itemtypename())])
149          {
150             loottypeindex.push_back(getloottype(squad[sq]->loot[l]->get_itemtypename()));
151             havetype[getloottype(squad[sq]->loot[l]->get_itemtypename())]=true;
152          }
153       }
154    }
155
156    if(!len(loottypeindex)) return -1;
157
158    clearformess=1;
159
160    //PICK ONE
161    while(true)
162    {
163       music.play(MUSIC_NEWSPAPER);
164       clear();
165
166       set_color(COLOR_WHITE,COLOR_BLACK,0);
167       move(0,0);
168       addstr("リベラルガーディアンに特別記事を掲載するか?");
169
170       int x=1,y=10;
171       char str[200];
172
173       for(int l=page*18;l<len(loottypeindex)&&l<page*18+18;l++)
174       {
175          str[0]=l-page*18+'A';
176          str[1]='\x0';
177          strcat(str," - ");
178          strcat(str,loottype[loottypeindex[l]]->get_name());
179
180          move(y,x);
181          addstr(str);
182
183          x+=26;
184          if(x>53) x=1,y++;
185       }
186
187       //PAGE UP
188       if(page>0)
189       {
190          move(17,1);
191          addprevpagestr();
192       }
193       //PAGE DOWN
194       if((page+1)*18<len(loottype))
195       {
196          move(17,53);
197          addnextpagestr();
198       }
199
200       move(24,1);
201       addstr("Enter - 今月は掲載しない");
202
203       int c=getkey();
204
205       if(c>='a'&&c<='r')
206       {
207          int slot=c-'a'+page*18;
208
209          if(slot>=0&&slot<len(loottypeindex))
210          {
211             //DELETE THE ITEM
212             for(int loc=0;loc<len(location);loc++)
213             {
214                if(location[loc]->renting==RENTING_NOCONTROL) continue;
215
216                for(int l=0;l<len(location[loc]->loot);l++)
217                {
218                   if(!location[loc]->loot[l]->is_loot()) continue;
219
220                   if(getloottype(location[loc]->loot[l]->get_itemtypename())==loottypeindex[slot])
221                   {
222                      location[loc]->loot[l]->decrease_number(1);
223                      if(location[loc]->loot[l]->empty())
224                         delete_and_remove(location[loc]->loot,l);
225                      return loottypeindex[slot];
226                   }
227                }
228             }
229             for(int sq=0;sq<len(squad);sq++)
230             {
231                for(int l=0;l<len(squad[sq]->loot);l++)
232                {
233                   if(!squad[sq]->loot[l]->is_loot()) continue;
234
235                   if(getloottype(squad[sq]->loot[l]->get_itemtypename())==loottypeindex[slot])
236                   {
237                      squad[sq]->loot[l]->decrease_number(1);
238                      if(squad[sq]->loot[l]->empty())
239                         delete_and_remove(squad[sq]->loot,l);
240                      return loottypeindex[slot];
241                   }
242                }
243             }
244
245             //WHOOPS!
246             return loottypeindex[slot];
247          }
248       }
249
250       if(c=='x'||c==ENTER||c==ESC||c==SPACEBAR) return -1;
251
252       //PAGE UP
253       if((c==interface_pgup||c==KEY_UP||c==KEY_LEFT)&&page>0) page--;
254       //PAGE DOWN
255       if((c==interface_pgdn||c==KEY_DOWN||c==KEY_RIGHT)&&(page+1)*18<len(loottype)) page++;
256
257    }
258
259    return -1;
260 }
261
262
263
264 /* monthly - guardian - prints liberal guardian special editions */
265 void printnews(short li,short newspaper)
266 {
267    music.play(MUSIC_NEWSPAPER);
268    if(law[LAW_FREESPEECH]==-2)offended_firemen=1;
269    clear();
270    set_color(COLOR_WHITE,COLOR_BLACK,1);
271
272    if(loottype[li]->get_idname()=="LOOT_CEOPHOTOS") // Tmp -XML
273    {
274       move(6,1);
275       addstr("リベラルガーディアンに有名なCEOが", gamelog);
276       move(7,1);
277       change_public_opinion(VIEW_LIBERALCRIMESQUAD,10);
278       change_public_opinion(VIEW_LIBERALCRIMESQUADPOS,10);
279       switch(LCSrandom(10))
280       {
281          case 0:
282             addstr("動物と猥褻な行為を行っている", gamelog);
283             change_public_opinion(VIEW_ANIMALRESEARCH,15);
284             break;
285          case 1:addstr("墓から掘り起こした死体と寝ている", gamelog);break;
286          case 2:
287             addstr("人殺しに加わっている", gamelog);
288             change_public_opinion(VIEW_POLICEBEHAVIOR,15);
289             change_public_opinion(VIEW_JUSTICES,10);
290             break;
291          case 3:addstr("ボンデージを着てキュウリを何本も挿している", gamelog);break;
292          case 4:addstr("評判の悪い政治家とディープキスをしている", gamelog);break;
293          case 5:
294             addstr("CEOの製品を検査するFDAの職員とよろしくしている", gamelog);
295             change_public_opinion(VIEW_GENETICS,10);
296             change_public_opinion(VIEW_POLLUTION,10);
297             break;
298          case 6:addstr("自分自身を去勢している", gamelog);break;
299          case 7:addstr("白人至上主義者の集会でナチの旗を振っている", gamelog);break;
300          case 8:
301             addstr("従業員をアイロンで拷問している", gamelog);
302             change_public_opinion(VIEW_SWEATSHOPS,10);
303             break;
304          case 9:addstr("排泄物プレイをしている", gamelog);break;
305       }
306       addstr("写真の特別記事を掲載した。", gamelog);
307       gamelog.newline();
308       move(9,1);
309       addstr("主要なネットワークと新聞社は、数週間に渡りこの話題を取り上げた。", gamelog);
310       gamelog.newline();
311       move(10,1);
312       addstr("このことには企業も神経を尖らせている。", gamelog);
313       gamelog.nextMessage();
314
315       change_public_opinion(VIEW_CEOSALARY,50);
316       change_public_opinion(VIEW_CORPORATECULTURE,50);
317       offended_corps=1;
318    }
319    else if(loottype[li]->get_idname()=="LOOT_CEOLOVELETTERS")
320    {
321       move(6,1);
322       addstr("リベラルガーディアンに有名なCEOの", gamelog);
323       move(7,1);
324       change_public_opinion(VIEW_LIBERALCRIMESQUAD,10);
325       change_public_opinion(VIEW_LIBERALCRIMESQUADPOS,10);
326       switch(LCSrandom(8))
327       {
328          case 0:
329             addstr("自分の犬宛ての", gamelog);
330             change_public_opinion(VIEW_ANIMALRESEARCH,15);
331             break;
332          case 1:
333             addstr("汚職で無罪を言い渡した判事への", gamelog);
334             change_public_opinion(VIEW_JUSTICES,15);
335             break;
336          case 2:
337             addstr("不倫相手のゲイの愛人への", gamelog);
338             change_public_opinion(VIEW_GAY,15);
339             break;
340          case 3:addstr("自分自身への情熱的な", gamelog);break;
341          case 4:
342             addstr("恐らく奴隷状態にある自分の使用人への", gamelog);
343             change_public_opinion(VIEW_SWEATSHOPS,10);
344             break;
345          case 5:
346             addstr("CEOの製品を検査するFDAの職員への", gamelog);
347             change_public_opinion(VIEW_GENETICS,10);
348             change_public_opinion(VIEW_POLLUTION,10);
349             break;
350          case 6:addstr("よく知られたフェチ男への", gamelog);break;
351          case 7:addstr("性的な行為と引き換えに便宜を図ることを約束する", gamelog);break;
352       }
353       addstr("ラブレターの特別記事を掲載した。", gamelog);
354       gamelog.newline();
355       move(9,1);
356       addstr("主要なネットワークと新聞社は、数週間に渡りこの話題を取り上げた。", gamelog);
357       gamelog.newline();
358       move(10,1);
359       addstr("このことには企業も神経を尖らせている。", gamelog);
360       gamelog.nextMessage();
361
362       change_public_opinion(VIEW_CEOSALARY,50);
363       change_public_opinion(VIEW_CORPORATECULTURE,50);
364       offended_corps=1;
365    }
366    else if(loottype[li]->get_idname()=="LOOT_CEOTAXPAPERS")
367    {
368       move(6,1);
369       addstr("リベラルガーディアンに", gamelog);
370       move(7,1);
371       change_public_opinion(VIEW_LIBERALCRIMESQUAD,10);
372       change_public_opinion(VIEW_LIBERALCRIMESQUADPOS,10);
373       switch(LCSrandom(1))
374       {
375          default:
376             addstr("脱税を繰り返していることを示す", gamelog);
377             change_public_opinion(VIEW_TAXES,25);
378             break;
379       }
380       addstr("CEOの納税告知書に関する特別記事を掲載した。", gamelog);
381       gamelog.newline();
382       move(9,1);
383       addstr("主要なネットワークと新聞社は、数週間に渡りこの話題を取り上げた。", gamelog);
384       gamelog.newline();
385       move(10,1);
386       addstr("このことには企業も神経を尖らせている。", gamelog);
387       gamelog.nextMessage();
388
389       change_public_opinion(VIEW_CEOSALARY,50);
390       change_public_opinion(VIEW_CORPORATECULTURE,50);
391       offended_corps=1;
392    }
393    else if(loottype[li]->get_idname()=="LOOT_CORPFILES")
394    {
395       move(6,1);
396       addstr("リベラルガーディアンに", gamelog);
397       move(7,1);
398
399       change_public_opinion(VIEW_LIBERALCRIMESQUAD,newspaper*10);
400       change_public_opinion(VIEW_LIBERALCRIMESQUADPOS,newspaper*10);
401       switch(LCSrandom(5))
402       {
403          case 0:
404             addstr("研究所で生み出された遺伝子操作モンスターの文書", gamelog);
405             change_public_opinion(VIEW_GENETICS,50);
406             break;
407          case 1:
408             addstr("「ホモ作業員」というタイトルのゲイの従業員のリスト", gamelog);
409             change_public_opinion(VIEW_GAY,50);
410             break;
411          case 2:
412             addstr("「妊婦を始末しろ。私が始末する。」と書かれたメモ", gamelog);
413             change_public_opinion(VIEW_WOMEN,50);
414             break;
415          case 3:
416             addstr("海外の搾取工場について楽しげに書かれた文書", gamelog);
417             change_public_opinion(VIEW_SWEATSHOPS,50);
418             break;
419          case 4:
420             addstr("複雑な税金逃れの手法が書かれた文書", gamelog);
421             change_public_opinion(VIEW_TAXES,50);
422             break;
423       }
424       addstr("に関する特別記事を掲載した。", gamelog);
425       gamelog.newline();
426       move(9,1);
427       addstr("主要なネットワークと新聞社は、数週間に渡りこの話題を取り上げた。", gamelog);
428       gamelog.newline();
429       move(10,1);
430       addstr("このことには企業も神経を尖らせている。", gamelog);
431       gamelog.nextMessage();
432
433       change_public_opinion(VIEW_CEOSALARY,50);
434       change_public_opinion(VIEW_CORPORATECULTURE,50);
435       offended_corps=1;
436    }
437    else if(loottype[li]->get_idname()=="LOOT_CCS_BACKERLIST")
438    {
439       move(5,1);
440       addstr("リベラルガーディアンに千ページを超えるCCSに関する文書を掲載した。そこには政府", gamelog);
441       gamelog.newline();
442       move(6,1);
443       addstr("内のコンサバ・クライム・スコードの支持者や支援者の氏名や役職の極めて詳細な情", gamelog);
444       gamelog.newline();
445       move(7,1);
446       addstr("報も含まれている。", gamelog);
447       gamelog.newline();
448       move(8,1);
449       addstr("複数のセクションで、司法管轄外の死の部隊の創設に関する広範囲な計画を明らかに", gamelog);
450       gamelog.newline();
451       move(9,1);
452       addstr("した。死の部隊は警察の上位に位置し、法を破っていないリベラルさえも捕らえ、そ", gamelog);
453       gamelog.newline();
454       move(10,1);
455       addstr("して敵が存在しないときは市民のエネルギーを押さえ込むために働くだろう。", gamelog);
456       gamelog.newline();
457
458       move(12,1);
459       addstr("スキャンダルはこの国の保守の中心にまで達した。この発見の影響は数ヶ月間では感", gamelog);
460       gamelog.newline();
461       move(13,1);
462       addstr("じられないかもしれない。", gamelog);
463       gamelog.newline();
464       move(14,1);
465       addstr("だが、1つだけ明らかなのは、この発見に大衆はすぐに反応し、AMラジオやケーブルニ", gamelog);
466       gamelog.newline();
467       move(15,1);
468       addstr("ュースさえもすぐさまCCSを非難し始めたということだ。", gamelog);
469       gamelog.newline();
470
471       move(17,1);
472       addstr("これはコンサバ・クライム・スコードの終わりの始まりとなるだろう。", gamelog);
473       gamelog.nextMessage();
474
475       change_public_opinion(VIEW_INTELLIGENCE,50);
476       change_public_opinion(VIEW_CONSERVATIVECRIMESQUAD,100);
477       ccsexposure = CCSEXPOSURE_EXPOSED;
478    }
479    else if(loottype[li]->get_idname()=="LOOT_INTHQDISK"
480            || loottype[li]->get_idname()=="LOOT_SECRETDOCUMENTS")
481    {
482       move(6,1);
483       addstr("リベラルガーディアンにCIAや他の情報機関による", gamelog);
484       move(7,1);
485
486       change_public_opinion(VIEW_LIBERALCRIMESQUAD,10);
487       change_public_opinion(VIEW_LIBERALCRIMESQUADPOS,10);
488       switch(LCSrandom(6))
489       {
490          case 0:addstr("政府転覆計画", gamelog);break;
491          case 1:
492             addstr("リベラル連邦主義者判事の暗殺計画", gamelog);
493             change_public_opinion(VIEW_JUSTICES,50);
494             break;
495          case 2:addstr("無実の市民の個人情報", gamelog);break;
496          case 3:
497             addstr("無実の市民による「有害な言論」の記録", gamelog);
498             change_public_opinion(VIEW_FREESPEECH,50);
499             break;
500          case 4:
501             addstr("同性愛者の市民の監視記録", gamelog);
502             change_public_opinion(VIEW_GAY,50);
503             break;
504          case 5:
505             addstr("中絶賛成派グループの行動記録", gamelog);
506             change_public_opinion(VIEW_WOMEN,50);
507             break;
508               }
509       addstr("が記述されたファイルに関する特別記事を掲載した。", gamelog);
510       gamelog.newline();
511       move(9,1);
512       addstr("主要なネットワークと新聞社は、数週間に渡りこの話題を取り上げた。", gamelog);
513       gamelog.newline();
514       move(10,1);
515       addstr("このことには政府関係者も神経を尖らせている。", gamelog);
516       gamelog.nextMessage();
517
518       change_public_opinion(VIEW_INTELLIGENCE,50);
519       offended_cia=1;
520    }
521    else if(loottype[li]->get_idname()=="LOOT_POLICERECORDS")
522    {
523       move(6,1);
524       addstr("リベラルガーディアンに警察による", gamelog);
525       move(7,1);
526
527       change_public_opinion(VIEW_LIBERALCRIMESQUAD,10);
528       change_public_opinion(VIEW_LIBERALCRIMESQUADPOS,10);
529       switch(LCSrandom(6))
530       {
531          case 0:
532             addstr("人権侵害", gamelog);
533             change_public_opinion(VIEW_TORTURE,15);
534             break;
535          case 1:
536             addstr("取り調べにおける拷問", gamelog);
537             change_public_opinion(VIEW_TORTURE,50);
538             break;
539          case 2:
540             addstr("組織的なプライバシーの侵害", gamelog);
541             change_public_opinion(VIEW_INTELLIGENCE,15);
542             break;
543          case 3:
544             addstr("自白の強要", gamelog);
545             break;
546          case 4:
547             addstr("広範囲に及ぶ汚職", gamelog);
548             break;
549          case 5:
550             addstr("看守が主催した囚人同士の剣闘士のような戦い", gamelog);
551             change_public_opinion(VIEW_DEATHPENALTY,50);
552             change_public_opinion(VIEW_PRISONS,20);
553             break;
554       }
555       addstr("を示す文書に関する特別記事を掲載した。", gamelog);
556       move(9,1);
557       gamelog.newline();
558       addstr("主要なネットワークと新聞社は、数週間に渡りこの話題を取り上げた。", gamelog);
559       gamelog.nextMessage();
560
561       change_public_opinion(VIEW_POLICEBEHAVIOR,50);
562    }
563    else if(loottype[li]->get_idname()=="LOOT_JUDGEFILES")
564    {
565       move(6,1);
566       addstr("リベラルガーディアンに、保守派判事の", gamelog);
567       move(7,1);
568
569       change_public_opinion(VIEW_LIBERALCRIMESQUAD,10);
570       change_public_opinion(VIEW_LIBERALCRIMESQUADPOS,10);
571       switch(LCSrandom(2))
572       {
573          case 0:addstr("殺人事件を無罪にする賄賂の", gamelog);break;
574          case 1:addstr("地位と引き換えに保守的な判決を約束した", gamelog);break;
575       }
576       gamelog.newline();
577       addstr("証拠を示す特別記事を掲載した。", gamelog);
578       move(8,1);
579       addstr("主要なネットワークと新聞社は、数週間に渡りこの話題を取り上げた。", gamelog);
580       gamelog.nextMessage();
581
582       change_public_opinion(VIEW_JUSTICES,50);
583    }
584    else if(loottype[li]->get_idname()=="LOOT_RESEARCHFILES")
585    {
586       move(6,1);
587       addstr("リベラルガーディアンに", gamelog);
588       move(7,1);
589
590       change_public_opinion(VIEW_LIBERALCRIMESQUAD,10);
591       change_public_opinion(VIEW_LIBERALCRIMESQUADPOS,10);
592       switch(LCSrandom(4))
593       {
594          case 0:addstr("恐るべき動物虐待が行われたことを示す", gamelog);
595             change_public_opinion(VIEW_ANIMALRESEARCH,50);break;
596          case 1:addstr("拷問が猫に与える効果の", gamelog);
597             change_public_opinion(VIEW_ANIMALRESEARCH,50);break;
598          case 2:addstr("事故で生み出した遺伝子操作モンスターの隠蔽を示す", gamelog);
599             change_public_opinion(VIEW_GENETICS,50);break;
600          case 3:addstr("遺伝子研究の被験者が死亡した", gamelog);
601             change_public_opinion(VIEW_GENETICS,50);break;
602       }
603       addstr("論文に関する特別記事を掲載した。", gamelog);
604       gamelog.newline();
605       move(9,1);
606       addstr("主要なネットワークと新聞社は、数週間に渡りこの話題を取り上げた。", gamelog);
607       gamelog.nextMessage();
608    }
609    else if(loottype[li]->get_idname()=="LOOT_PRISONFILES")
610    {
611       move(6,1);
612       addstr("リベラルガーディアンに刑務所内での", gamelog);
613       move(7,1);
614
615       change_public_opinion(VIEW_LIBERALCRIMESQUAD,10);
616       change_public_opinion(VIEW_LIBERALCRIMESQUADPOS,10);
617       change_public_opinion(VIEW_PRISONS,50);
618       switch(LCSrandom(4))
619       {
620          case 0:addstr("看守による人権侵害", gamelog);break;
621          case 1:
622             addstr("囚人への拷問", gamelog);
623             change_public_opinion(VIEW_TORTURE,50);
624             break;
625          case 2:addstr("職員の間の広範囲に及ぶ汚職", gamelog);break;
626          case 3:
627             addstr("看守が主催した囚人同士の剣闘士のような戦い", gamelog);
628       }
629       addstr("を示す文書に関する特別記事を掲載した。", gamelog);
630       gamelog.newline();
631       move(9,1);
632       addstr("主要なネットワークと新聞社は、数週間に渡りこの話題を取り上げた。", gamelog);
633       gamelog.nextMessage();
634
635       change_public_opinion(VIEW_DEATHPENALTY,50);
636    }
637    else if(loottype[li]->get_idname()=="LOOT_CABLENEWSFILES")
638    {
639       move(6,1);
640       addstr("リベラルガーディアンにケーブルニュース局の", gamelog);
641       move(7,1);
642
643       change_public_opinion(VIEW_LIBERALCRIMESQUAD,10);
644       change_public_opinion(VIEW_LIBERALCRIMESQUADPOS,10);
645       switch(LCSrandom(4))
646       {
647          case 0:addstr("自身のニュースを「保守思想の先陣」と呼ぶ", gamelog);break;
648          case 1:addstr("リベラル政治家の否定的な放送を命令する", gamelog);break;
649          case 2:addstr("リベラル派の人物の嘘のスキャンダルをでっち上げる", gamelog);break;
650          case 3:addstr("女優に「よりセクシーになるか、それとも辞めるか」を迫る", gamelog);
651             break;
652       }
653       addstr("メモの特別記事を掲載した。", gamelog);
654       gamelog.newline();
655       move(9,1);
656       addstr("主要なネットワークと新聞社は、数週間に渡りこの話題を取り上げた。", gamelog);
657       gamelog.newline();
658       move(10,1);
659       addstr("このことには保守派も神経を尖らせている。", gamelog);
660       gamelog.nextMessage();
661
662       change_public_opinion(VIEW_CABLENEWS,50);
663       offended_cablenews=1;
664    }
665    else if(loottype[li]->get_idname()=="LOOT_AMRADIOFILES")
666    {
667       move(6,1);
668       addstr("リベラルガーディアンにAMラジオ局の   The Liberal Guardian runs a story featuring AM radio plans ", gamelog);
669       move(7,1);
670
671       change_public_opinion(VIEW_LIBERALCRIMESQUAD,10);
672       change_public_opinion(VIEW_LIBERALCRIMESQUADPOS,10);
673       switch(LCSrandom(3))
674       {
675          case 0:addstr("視聴者を「何を考えるか命令される羊」と呼ぶ", gamelog);break;
676          case 1:addstr("「嘘でもよい。本当のことなど必要ない」と書かれた", gamelog);break;
677          case 2:addstr("リベラル派の人物の嘘のスキャンダルをでっち上げる", gamelog);break;
678       }
679       addstr("原稿の特別記事を掲載した。", gamelog);
680       gamelog.newline();
681       move(9,1);
682       addstr("主要なネットワークと新聞社は、数週間に渡りこの話題を取り上げた。", gamelog);
683       gamelog.newline();
684       move(10,1);
685       addstr("このことには保守派も神経を尖らせている。", gamelog);
686       gamelog.nextMessage();
687
688       change_public_opinion(VIEW_AMRADIO,50);
689       offended_cablenews=1;
690    }
691
692    getkey();
693 }
694
695
696 /* monthly - LCS finances report */
697 void fundreport(char &clearformess)
698 {
699    if(disbanding) return;
700    music.play(MUSIC_FINANCES);
701
702    clearformess=true;
703
704    int page=0;
705    bool showledger=false;
706    std::string num;
707    static const char dotdotdot[]=". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ";
708
709    int expenselines = 0;
710    for(int i=0;i<EXPENSETYPENUM;i++)
711       if (ledger.expense[i])
712          expenselines++;
713
714    while(true)
715    {
716       clear();
717
718       int y=2,totalmoney=0,dailymoney=0,numpages=1;
719
720       set_color(COLOR_WHITE,COLOR_BLACK,1);
721       mvaddstr(0,0,"リベラル・クライム・スコード: 収支報告");
722
723       for(int i=0;i<INCOMETYPENUM;i++)
724       {
725          if(ledger.income[i])
726          {
727             showledger=true;
728             if(page==numpages-1)
729             {
730                set_color(COLOR_WHITE,COLOR_BLACK,0);
731                mvaddstr(y,0,dotdotdot);
732                set_color(COLOR_GREEN,COLOR_BLACK,0);
733                num="+$"+tostring(ledger.income[i]);
734                mvaddstr(y,60-len(num),num);
735                if(ledger.dailyIncome[i])
736                   num=" (+$"+tostring(ledger.dailyIncome[i])+")";
737                else
738                {
739                   set_color(COLOR_WHITE,COLOR_BLACK,0);
740                   num=" ($0)";
741                }
742                mvaddstr(y,73-len(num),num);
743                set_color(COLOR_WHITE,COLOR_BLACK,0);
744                switch(i)
745                {
746                case INCOME_BROWNIES: mvaddstr(y,0,"ケーキの販売"); break;
747                case INCOME_CARS: mvaddstr(y,0,"自動車の売却"); break;
748                case INCOME_CCFRAUD: mvaddstr(y,0,"カード番号取得"); break;
749                case INCOME_DONATIONS: mvaddstr(y,0,"寄付"); break;
750                case INCOME_SKETCHES: mvaddstr(y,0,"絵の販売"); break;
751                case INCOME_EMBEZZLEMENT: mvaddstr(y,0,"横領"); break;
752                case INCOME_EXTORTION: mvaddstr(y,0,"恐喝"); break;
753                case INCOME_HUSTLING: mvaddstr(y,0,"窃盗"); break;
754                case INCOME_PAWN: mvaddstr(y,0,"備品の売却"); break;
755                case INCOME_PROSTITUTION: mvaddstr(y,0,"売春"); break;
756                case INCOME_BUSKING: mvaddstr(y,0,"ストリートミュージック"); break;
757                case INCOME_THIEVERY: mvaddstr(y,0,"盗品"); break;
758                case INCOME_TSHIRTS: mvaddstr(y,0,"Tシャツの販売"); break;
759                default: mvaddstr(y,0,"その他の収入"); break;
760                }
761             }
762             totalmoney+=ledger.income[i];
763             dailymoney+=ledger.dailyIncome[i];
764
765             if(++y>=23) y=2,numpages++;
766          }
767       }
768
769       // If expenses are too long to fit on this page, start them on the next page so it isn't broken in half unnecessarily
770       if(y+expenselines>=23 && y>2) y=2,numpages++;
771
772       for(int i=0;i<EXPENSETYPENUM;i++)
773       {
774          if(ledger.expense[i])
775          {
776             showledger=true;
777             if(page==numpages-1)
778             {
779                set_color(COLOR_WHITE,COLOR_BLACK,0);
780                mvaddstr(y,0,dotdotdot);
781                set_color(COLOR_RED,COLOR_BLACK,0);
782                num="-$"+tostring(ledger.expense[i]);
783                mvaddstr(y,60-len(num),num);
784                if(ledger.dailyExpense[i])
785                   num=" (-$"+tostring(ledger.dailyExpense[i])+")";
786                else
787                {
788                   set_color(COLOR_WHITE,COLOR_BLACK,0);
789                   num=" ($0)";
790                }
791                mvaddstr(y,73-len(num),num);
792                set_color(COLOR_WHITE,COLOR_BLACK,0);
793                switch(i)
794                {
795                case EXPENSE_TROUBLEMAKING: mvaddstr(y,0,"活動"); break;
796                case EXPENSE_CONFISCATED: mvaddstr(y,0,"押収"); break;
797                case EXPENSE_DATING: mvaddstr(y,0,"デート"); break;
798                case EXPENSE_SKETCHES: mvaddstr(y,0,"絵の販売"); break;
799                case EXPENSE_FOOD: mvaddstr(y,0,"食料品"); break;
800                case EXPENSE_HOSTAGE: mvaddstr(y,0,"捕虜の尋問"); break;
801                case EXPENSE_LEGAL: mvaddstr(y,0,"訴訟費用"); break;
802                case EXPENSE_MANUFACTURE: mvaddstr(y,0,"内製"); break;
803                case EXPENSE_CARS: mvaddstr(y,0,"自動車の購入"); break;
804                case EXPENSE_SHOPPING: mvaddstr(y,0,"物品の購入"); break;
805                case EXPENSE_RECRUITMENT: mvaddstr(y,0,"スカウト"); break;
806                case EXPENSE_RENT: mvaddstr(y,0,"家賃"); break;
807                case EXPENSE_COMPOUND: mvaddstr(y,0,"アジトの改修"); break;
808                case EXPENSE_TRAINING: mvaddstr(y,0,"訓練"); break;
809                case EXPENSE_TRAVEL: mvaddstr(y,0,"旅行"); break;
810                case EXPENSE_TSHIRTS: mvaddstr(y,0,"Tシャツの販売"); break;
811                default: mvaddstr(y,0,"その他"); break;
812                }
813             }
814             totalmoney-=ledger.expense[i];
815             dailymoney-=ledger.dailyExpense[i];
816
817             if(++y>=23) y=2,numpages++;
818          }
819       }
820
821       if(showledger)
822       {
823          if(page==numpages-1) makedelimiter(y);
824
825          if(++y>=23) y=2,numpages++;
826
827          if(page==numpages-1)
828          {
829             set_color(COLOR_WHITE,COLOR_BLACK,1);
830             mvaddstr(y,0,"今月の収支 (本日):");
831             if(totalmoney>0) { set_color(COLOR_GREEN,COLOR_BLACK,1); num="+"; }
832             else if(totalmoney<0) { set_color(COLOR_RED,COLOR_BLACK,1); num="-"; }
833             else { set_color(COLOR_WHITE,COLOR_BLACK,1); num=""; }
834             num+="$"+tostring(abs(totalmoney));
835             mvaddstr(y,60-len(num),num);
836             if(dailymoney>0)
837             {
838                set_color(COLOR_GREEN,COLOR_BLACK,1);
839                num=" (+$"+tostring(abs(dailymoney))+")";
840             }
841             else if(dailymoney<0)
842             {
843                set_color(COLOR_RED,COLOR_BLACK,1);
844                num=" (-$"+tostring(abs(dailymoney))+")";
845             }
846             else
847             {
848                set_color(COLOR_WHITE,COLOR_BLACK,1);
849                num=" ($0)";
850             }
851             mvaddstr(y,73-len(num),num);
852          }
853
854          if(++y>=23) y=2,numpages++;
855       }
856
857       if (y>2) y++; // Blank line between income/expenses and assets if not starting a new page
858       if (y+7>=23) y=2, numpages++; //Start a new page if the liquid assets won't fit on the rest of the current page.
859       // tally up liquid assets
860       long weaponValue=0,armorValue=0,clipValue=0,lootValue=0;
861       for(int j=0;j<len(location);j++)
862          for(int i=0;i<len(location[j]->loot);i++)
863          {
864             Item* item=location[j]->loot[i];
865             if(item->is_weapon()) weaponValue+=item->get_fencevalue()*item->get_number();
866             if(item->is_armor()) armorValue+=item->get_fencevalue()*item->get_number();
867             if(item->is_clip()) clipValue+=item->get_fencevalue()*item->get_number();
868             if(item->is_loot()) lootValue+=item->get_fencevalue()*item->get_number();
869          }
870
871       if(page==numpages-1)
872       {
873          set_color(COLOR_WHITE,COLOR_BLACK,0);
874          mvaddstr(y,0,dotdotdot);
875          mvaddstr(y,0,"現金");
876          set_color(ledger.get_funds()?COLOR_GREEN:COLOR_WHITE,COLOR_BLACK,0);
877          num="$"+tostring(ledger.get_funds());
878          mvaddstr(y,60-len(num),num);
879       }
880
881       if(++y>=23) y=2,numpages++;
882
883       if(page==numpages-1)
884       {
885          set_color(COLOR_WHITE,COLOR_BLACK,0);
886          mvaddstr(y,0,dotdotdot);
887          mvaddstr(y,0,"道具と武器");
888          set_color(weaponValue?COLOR_GREEN:COLOR_WHITE,COLOR_BLACK,0);
889          num="$"+tostring(weaponValue);
890          mvaddstr(y,60-len(num),num);
891       }
892
893       if(++y>=23) y=2,numpages++;
894
895       if(page==numpages-1)
896       {
897          set_color(COLOR_WHITE,COLOR_BLACK,0);
898          mvaddstr(y,0,dotdotdot);
899          mvaddstr(y,0,"衣服と鎧");
900          set_color(armorValue?COLOR_GREEN:COLOR_WHITE,COLOR_BLACK,0);
901          num="$"+tostring(armorValue);
902          mvaddstr(y,60-len(num),num);
903       }
904
905       if(++y>=23) y=2,numpages++;
906
907       if(page==numpages-1)
908       {
909          set_color(COLOR_WHITE,COLOR_BLACK,0);
910          mvaddstr(y,0,dotdotdot);
911          mvaddstr(y,0,"弾薬");
912          set_color(clipValue?COLOR_GREEN:COLOR_WHITE,COLOR_BLACK,0);
913          num="$"+tostring(clipValue);
914          mvaddstr(y,60-len(num),num);
915       }
916
917       if(++y>=23) y=2,numpages++;
918
919       if(page==numpages-1)
920       {
921          set_color(COLOR_WHITE,COLOR_BLACK,0);
922          mvaddstr(y,0,dotdotdot);
923          mvaddstr(y,0,"その他の略奪品");
924          set_color(lootValue?COLOR_GREEN:COLOR_WHITE,COLOR_BLACK,0);
925          num="$"+tostring(lootValue);
926          mvaddstr(y,60-len(num),num);
927       }
928
929       if(++y>=23) y=2,numpages++;
930
931       if(page==numpages-1) makedelimiter(y);
932
933       if(++y>=23) y=2,numpages++;
934
935       if(page==numpages-1)
936       {
937          set_color(COLOR_WHITE,COLOR_BLACK,1);
938          mvaddstr(y,0,"全資産:");
939          long netWorth=ledger.get_funds()+weaponValue+armorValue+clipValue+lootValue;
940          set_color(netWorth?COLOR_GREEN:COLOR_WHITE,COLOR_BLACK,1);
941          num="$"+tostring(netWorth);
942          mvaddstr(y,60-len(num),num);
943       }
944
945       set_color(COLOR_WHITE,COLOR_BLACK,0);
946       if(numpages>1)
947       {
948          mvaddstr(24,0,"報告書をよく読んだならばEnterキーを押すこと。");
949          addpagestr();
950
951          while(true)
952          {
953             int c=getkey();
954
955             if(c=='x'||c==ENTER||c==ESC||c==SPACEBAR)
956             {
957                music.play(MUSIC_PREVIOUS);
958                return;
959             }
960
961             //PAGE UP
962             if(c==interface_pgup||c==KEY_UP||c==KEY_LEFT) { page--; if(page<0) page=numpages-1; break; }
963             //PAGE DOWN
964             if(c==interface_pgdn||c==KEY_DOWN||c==KEY_RIGHT) { page++; if(page>=numpages) page=0; break; }
965          }
966       }
967       else
968       {
969          mvaddstr(24,0,"報告書をよく読んだならば何かキーを押すこと。 ");
970
971          getkey();
972
973          music.play(MUSIC_PREVIOUS);
974          return;
975       }
976    }
977 }