3 Copyright (c) 2002,2003,2004 by Tarn Adams //
5 This file is part of Liberal Crime Squad. //
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. //
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. //
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 //
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.
31 //TODO: Log the monthly report? --Addictgamer
33 /* monthly - reports the guardian's power to the player */
34 void guardianupdate(char size, int power)
36 music.play(MUSIC_NEWSPAPER);
39 set_color(COLOR_WHITE,COLOR_BLACK,0);
43 addstr("The monthly Liberal Guardian newspaper", gamelog);
47 addstr("The monthly Liberal Guardian online newsletter", gamelog);
50 addstr(" is published.", gamelog);
56 addstr("The only readers are Conservatives, who seem to think it's funny.", gamelog);
60 addstr("Unfortunately, nobody seems interested.", gamelog);
64 addstr("Very few people seem to be interested.", gamelog);
68 addstr("A fair number of people are reading it.", gamelog);
72 addstr("Many people are reading it.", gamelog);
76 addstr("The response is very strong. People are changing their minds.", gamelog);
80 addstr("The response is electric. Everyone is talking about this month's ", gamelog);
82 addstr("Liberal Guardian.", gamelog);
84 gamelog.nextMessage();
93 /* monthly - lets the player choose a special edition for the guardian */
94 int choosespecialedition(char &clearformess)
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
100 "LOOT_CABLENEWSFILES",
101 "LOOT_CCS_BACKERLIST",
102 "LOOT_CEOLOVELETTERS",
108 "LOOT_POLICERECORDS",
110 "LOOT_RESEARCHFILES",
111 "LOOT_SECRETDOCUMENTS"
113 static const vector<string> dox(document_types,document_types+len(document_types));
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;
122 //FIND ALL LOOT TYPES
123 for(int loc=0;loc<len(location);loc++)
125 if(location[loc]->renting==RENTING_NOCONTROL) continue;
127 consolidateloot(location[loc]->loot);
128 for(int l=0;l<len(location[loc]->loot);l++)
130 if(!location[loc]->loot[l]->is_loot()) continue;
131 if(!binary_search(dox.begin(),dox.end(),location[loc]->loot[l]->get_itemtypename())) continue;
133 if(!havetype[getloottype(location[loc]->loot[l]->get_itemtypename())])
135 loottypeindex.push_back(getloottype(location[loc]->loot[l]->get_itemtypename()));
136 havetype[getloottype(location[loc]->loot[l]->get_itemtypename())]=true;
140 for(int sq=0;sq<len(squad);sq++)
142 consolidateloot(squad[sq]->loot);
143 for(int l=0;l<len(squad[sq]->loot);l++)
145 if(!squad[sq]->loot[l]->is_loot()) continue;
146 if(!binary_search(dox.begin(),dox.end(),squad[sq]->loot[l]->get_itemtypename())) continue;
148 if(!havetype[getloottype(squad[sq]->loot[l]->get_itemtypename())])
150 loottypeindex.push_back(getloottype(squad[sq]->loot[l]->get_itemtypename()));
151 havetype[getloottype(squad[sq]->loot[l]->get_itemtypename())]=true;
156 if(!len(loottypeindex)) return -1;
163 music.play(MUSIC_NEWSPAPER);
166 set_color(COLOR_WHITE,COLOR_BLACK,0);
168 addstr("リベラルガーディアンに特別記事を掲載するか?");
173 for(int l=page*18;l<len(loottypeindex)&&l<page*18+18;l++)
175 str[0]=l-page*18+'A';
178 strcat(str,loottype[loottypeindex[l]]->get_name());
194 if((page+1)*18<len(loottype))
201 addstr("Enter - 今月は掲載しない");
207 int slot=c-'a'+page*18;
209 if(slot>=0&&slot<len(loottypeindex))
212 for(int loc=0;loc<len(location);loc++)
214 if(location[loc]->renting==RENTING_NOCONTROL) continue;
216 for(int l=0;l<len(location[loc]->loot);l++)
218 if(!location[loc]->loot[l]->is_loot()) continue;
220 if(getloottype(location[loc]->loot[l]->get_itemtypename())==loottypeindex[slot])
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];
229 for(int sq=0;sq<len(squad);sq++)
231 for(int l=0;l<len(squad[sq]->loot);l++)
233 if(!squad[sq]->loot[l]->is_loot()) continue;
235 if(getloottype(squad[sq]->loot[l]->get_itemtypename())==loottypeindex[slot])
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];
246 return loottypeindex[slot];
250 if(c=='x'||c==ENTER||c==ESC||c==SPACEBAR) return -1;
253 if((c==interface_pgup||c==KEY_UP||c==KEY_LEFT)&&page>0) page--;
255 if((c==interface_pgdn||c==KEY_DOWN||c==KEY_RIGHT)&&(page+1)*18<len(loottype)) page++;
264 /* monthly - guardian - prints liberal guardian special editions */
265 void printnews(short li,short newspaper)
267 music.play(MUSIC_NEWSPAPER);
268 if(law[LAW_FREESPEECH]==-2)offended_firemen=1;
270 set_color(COLOR_WHITE,COLOR_BLACK,1);
272 if(loottype[li]->get_idname()=="LOOT_CEOPHOTOS") // Tmp -XML
275 addstr("リベラルガーディアンに有名なCEOが", gamelog);
277 change_public_opinion(VIEW_LIBERALCRIMESQUAD,10);
278 change_public_opinion(VIEW_LIBERALCRIMESQUADPOS,10);
279 switch(LCSrandom(10))
282 addstr("動物と猥褻な行為を行っている", gamelog);
283 change_public_opinion(VIEW_ANIMALRESEARCH,15);
285 case 1:addstr("墓から掘り起こした死体と寝ている", gamelog);break;
287 addstr("人殺しに加わっている", gamelog);
288 change_public_opinion(VIEW_POLICEBEHAVIOR,15);
289 change_public_opinion(VIEW_JUSTICES,10);
291 case 3:addstr("ボンデージを着てキュウリを何本も挿している", gamelog);break;
292 case 4:addstr("評判の悪い政治家とディープキスをしている", gamelog);break;
294 addstr("CEOの製品を検査するFDAの職員とよろしくしている", gamelog);
295 change_public_opinion(VIEW_GENETICS,10);
296 change_public_opinion(VIEW_POLLUTION,10);
298 case 6:addstr("自分自身を去勢している", gamelog);break;
299 case 7:addstr("白人至上主義者の集会でナチの旗を振っている", gamelog);break;
301 addstr("従業員をアイロンで拷問している", gamelog);
302 change_public_opinion(VIEW_SWEATSHOPS,10);
304 case 9:addstr("排泄物プレイをしている", gamelog);break;
306 addstr("写真の特別記事を掲載した。", gamelog);
309 addstr("主要なネットワークと新聞社は、数週間に渡りこの話題を取り上げた。", gamelog);
312 addstr("このことには企業も神経を尖らせている。", gamelog);
313 gamelog.nextMessage();
315 change_public_opinion(VIEW_CEOSALARY,50);
316 change_public_opinion(VIEW_CORPORATECULTURE,50);
319 else if(loottype[li]->get_idname()=="LOOT_CEOLOVELETTERS")
322 addstr("リベラルガーディアンに有名なCEOの", gamelog);
324 change_public_opinion(VIEW_LIBERALCRIMESQUAD,10);
325 change_public_opinion(VIEW_LIBERALCRIMESQUADPOS,10);
329 addstr("自分の犬宛ての", gamelog);
330 change_public_opinion(VIEW_ANIMALRESEARCH,15);
333 addstr("汚職で無罪を言い渡した判事への", gamelog);
334 change_public_opinion(VIEW_JUSTICES,15);
337 addstr("不倫相手のゲイの愛人への", gamelog);
338 change_public_opinion(VIEW_GAY,15);
340 case 3:addstr("自分自身への情熱的な", gamelog);break;
342 addstr("恐らく奴隷状態にある自分の使用人への", gamelog);
343 change_public_opinion(VIEW_SWEATSHOPS,10);
346 addstr("CEOの製品を検査するFDAの職員への", gamelog);
347 change_public_opinion(VIEW_GENETICS,10);
348 change_public_opinion(VIEW_POLLUTION,10);
350 case 6:addstr("よく知られたフェチ男への", gamelog);break;
351 case 7:addstr("性的な行為と引き換えに便宜を図ることを約束する", gamelog);break;
353 addstr("ラブレターの特別記事を掲載した。", gamelog);
356 addstr("主要なネットワークと新聞社は、数週間に渡りこの話題を取り上げた。", gamelog);
359 addstr("このことには企業も神経を尖らせている。", gamelog);
360 gamelog.nextMessage();
362 change_public_opinion(VIEW_CEOSALARY,50);
363 change_public_opinion(VIEW_CORPORATECULTURE,50);
366 else if(loottype[li]->get_idname()=="LOOT_CEOTAXPAPERS")
369 addstr("リベラルガーディアンに", gamelog);
371 change_public_opinion(VIEW_LIBERALCRIMESQUAD,10);
372 change_public_opinion(VIEW_LIBERALCRIMESQUADPOS,10);
376 addstr("脱税を繰り返していることを示す", gamelog);
377 change_public_opinion(VIEW_TAXES,25);
380 addstr("CEOの納税告知書に関する特別記事を掲載した。", gamelog);
383 addstr("主要なネットワークと新聞社は、数週間に渡りこの話題を取り上げた。", gamelog);
386 addstr("このことには企業も神経を尖らせている。", gamelog);
387 gamelog.nextMessage();
389 change_public_opinion(VIEW_CEOSALARY,50);
390 change_public_opinion(VIEW_CORPORATECULTURE,50);
393 else if(loottype[li]->get_idname()=="LOOT_CORPFILES")
396 addstr("リベラルガーディアンに", gamelog);
399 change_public_opinion(VIEW_LIBERALCRIMESQUAD,newspaper*10);
400 change_public_opinion(VIEW_LIBERALCRIMESQUADPOS,newspaper*10);
404 addstr("研究所で生み出された遺伝子操作モンスターの文書", gamelog);
405 change_public_opinion(VIEW_GENETICS,50);
408 addstr("「ホモ作業員」というタイトルのゲイの従業員のリスト", gamelog);
409 change_public_opinion(VIEW_GAY,50);
412 addstr("「妊婦を始末しろ。私が始末する。」と書かれたメモ", gamelog);
413 change_public_opinion(VIEW_WOMEN,50);
416 addstr("海外の搾取工場について楽しげに書かれた文書", gamelog);
417 change_public_opinion(VIEW_SWEATSHOPS,50);
420 addstr("複雑な税金逃れの手法が書かれた文書", gamelog);
421 change_public_opinion(VIEW_TAXES,50);
424 addstr("に関する特別記事を掲載した。", gamelog);
427 addstr("主要なネットワークと新聞社は、数週間に渡りこの話題を取り上げた。", gamelog);
430 addstr("このことには企業も神経を尖らせている。", gamelog);
431 gamelog.nextMessage();
433 change_public_opinion(VIEW_CEOSALARY,50);
434 change_public_opinion(VIEW_CORPORATECULTURE,50);
437 else if(loottype[li]->get_idname()=="LOOT_CCS_BACKERLIST")
440 addstr("リベラルガーディアンに千ページを超えるCCSに関する文書を掲載した。そこには政府", gamelog);
443 addstr("内のコンサバ・クライム・スコードの支持者や支援者の氏名や役職の極めて詳細な情", gamelog);
446 addstr("報も含まれている。", gamelog);
449 addstr("複数のセクションで、司法管轄外の死の部隊の創設に関する広範囲な計画を明らかに", gamelog);
452 addstr("した。死の部隊は警察の上位に位置し、法を破っていないリベラルさえも捕らえ、そ", gamelog);
455 addstr("して敵が存在しないときは市民のエネルギーを押さえ込むために働くだろう。", gamelog);
459 addstr("スキャンダルはこの国の保守の中心にまで達した。この発見の影響は数ヶ月間では感", gamelog);
462 addstr("じられないかもしれない。", gamelog);
465 addstr("だが、1つだけ明らかなのは、この発見に大衆はすぐに反応し、AMラジオやケーブルニ", gamelog);
468 addstr("ュースさえもすぐさまCCSを非難し始めたということだ。", gamelog);
472 addstr("これはコンサバ・クライム・スコードの終わりの始まりとなるだろう。", gamelog);
473 gamelog.nextMessage();
475 change_public_opinion(VIEW_INTELLIGENCE,50);
476 change_public_opinion(VIEW_CONSERVATIVECRIMESQUAD,100);
477 ccsexposure = CCSEXPOSURE_EXPOSED;
479 else if(loottype[li]->get_idname()=="LOOT_INTHQDISK"
480 || loottype[li]->get_idname()=="LOOT_SECRETDOCUMENTS")
483 addstr("リベラルガーディアンにCIAや他の情報機関による", gamelog);
486 change_public_opinion(VIEW_LIBERALCRIMESQUAD,10);
487 change_public_opinion(VIEW_LIBERALCRIMESQUADPOS,10);
490 case 0:addstr("政府転覆計画", gamelog);break;
492 addstr("リベラル連邦主義者判事の暗殺計画", gamelog);
493 change_public_opinion(VIEW_JUSTICES,50);
495 case 2:addstr("無実の市民の個人情報", gamelog);break;
497 addstr("無実の市民による「有害な言論」の記録", gamelog);
498 change_public_opinion(VIEW_FREESPEECH,50);
501 addstr("同性愛者の市民の監視記録", gamelog);
502 change_public_opinion(VIEW_GAY,50);
505 addstr("中絶賛成派グループの行動記録", gamelog);
506 change_public_opinion(VIEW_WOMEN,50);
509 addstr("が記述されたファイルに関する特別記事を掲載した。", gamelog);
512 addstr("主要なネットワークと新聞社は、数週間に渡りこの話題を取り上げた。", gamelog);
515 addstr("このことには政府関係者も神経を尖らせている。", gamelog);
516 gamelog.nextMessage();
518 change_public_opinion(VIEW_INTELLIGENCE,50);
521 else if(loottype[li]->get_idname()=="LOOT_POLICERECORDS")
524 addstr("リベラルガーディアンに警察による", gamelog);
527 change_public_opinion(VIEW_LIBERALCRIMESQUAD,10);
528 change_public_opinion(VIEW_LIBERALCRIMESQUADPOS,10);
532 addstr("人権侵害", gamelog);
533 change_public_opinion(VIEW_TORTURE,15);
536 addstr("取り調べにおける拷問", gamelog);
537 change_public_opinion(VIEW_TORTURE,50);
540 addstr("組織的なプライバシーの侵害", gamelog);
541 change_public_opinion(VIEW_INTELLIGENCE,15);
544 addstr("自白の強要", gamelog);
547 addstr("広範囲に及ぶ汚職", gamelog);
550 addstr("看守が主催した囚人同士の剣闘士のような戦い", gamelog);
551 change_public_opinion(VIEW_DEATHPENALTY,50);
552 change_public_opinion(VIEW_PRISONS,20);
555 addstr("を示す文書に関する特別記事を掲載した。", gamelog);
558 addstr("主要なネットワークと新聞社は、数週間に渡りこの話題を取り上げた。", gamelog);
559 gamelog.nextMessage();
561 change_public_opinion(VIEW_POLICEBEHAVIOR,50);
563 else if(loottype[li]->get_idname()=="LOOT_JUDGEFILES")
566 addstr("リベラルガーディアンに、保守派判事の", gamelog);
569 change_public_opinion(VIEW_LIBERALCRIMESQUAD,10);
570 change_public_opinion(VIEW_LIBERALCRIMESQUADPOS,10);
573 case 0:addstr("殺人事件を無罪にする賄賂の", gamelog);break;
574 case 1:addstr("地位と引き換えに保守的な判決を約束した", gamelog);break;
577 addstr("証拠を示す特別記事を掲載した。", gamelog);
579 addstr("主要なネットワークと新聞社は、数週間に渡りこの話題を取り上げた。", gamelog);
580 gamelog.nextMessage();
582 change_public_opinion(VIEW_JUSTICES,50);
584 else if(loottype[li]->get_idname()=="LOOT_RESEARCHFILES")
587 addstr("リベラルガーディアンに", gamelog);
590 change_public_opinion(VIEW_LIBERALCRIMESQUAD,10);
591 change_public_opinion(VIEW_LIBERALCRIMESQUADPOS,10);
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;
603 addstr("論文に関する特別記事を掲載した。", gamelog);
606 addstr("主要なネットワークと新聞社は、数週間に渡りこの話題を取り上げた。", gamelog);
607 gamelog.nextMessage();
609 else if(loottype[li]->get_idname()=="LOOT_PRISONFILES")
612 addstr("リベラルガーディアンに刑務所内での", gamelog);
615 change_public_opinion(VIEW_LIBERALCRIMESQUAD,10);
616 change_public_opinion(VIEW_LIBERALCRIMESQUADPOS,10);
617 change_public_opinion(VIEW_PRISONS,50);
620 case 0:addstr("看守による人権侵害", gamelog);break;
622 addstr("囚人への拷問", gamelog);
623 change_public_opinion(VIEW_TORTURE,50);
625 case 2:addstr("職員の間の広範囲に及ぶ汚職", gamelog);break;
627 addstr("看守が主催した囚人同士の剣闘士のような戦い", gamelog);
629 addstr("を示す文書に関する特別記事を掲載した。", gamelog);
632 addstr("主要なネットワークと新聞社は、数週間に渡りこの話題を取り上げた。", gamelog);
633 gamelog.nextMessage();
635 change_public_opinion(VIEW_DEATHPENALTY,50);
637 else if(loottype[li]->get_idname()=="LOOT_CABLENEWSFILES")
640 addstr("リベラルガーディアンにケーブルニュース局の", gamelog);
643 change_public_opinion(VIEW_LIBERALCRIMESQUAD,10);
644 change_public_opinion(VIEW_LIBERALCRIMESQUADPOS,10);
647 case 0:addstr("自身のニュースを「保守思想の先陣」と呼ぶ", gamelog);break;
648 case 1:addstr("リベラル政治家の否定的な放送を命令する", gamelog);break;
649 case 2:addstr("リベラル派の人物の嘘のスキャンダルをでっち上げる", gamelog);break;
650 case 3:addstr("女優に「よりセクシーになるか、それとも辞めるか」を迫る", gamelog);
653 addstr("メモの特別記事を掲載した。", gamelog);
656 addstr("主要なネットワークと新聞社は、数週間に渡りこの話題を取り上げた。", gamelog);
659 addstr("このことには保守派も神経を尖らせている。", gamelog);
660 gamelog.nextMessage();
662 change_public_opinion(VIEW_CABLENEWS,50);
663 offended_cablenews=1;
665 else if(loottype[li]->get_idname()=="LOOT_AMRADIOFILES")
668 addstr("リベラルガーディアンにAMラジオ局の The Liberal Guardian runs a story featuring AM radio plans ", gamelog);
671 change_public_opinion(VIEW_LIBERALCRIMESQUAD,10);
672 change_public_opinion(VIEW_LIBERALCRIMESQUADPOS,10);
675 case 0:addstr("視聴者を「何を考えるか命令される羊」と呼ぶ", gamelog);break;
676 case 1:addstr("「嘘でもよい。本当のことなど必要ない」と書かれた", gamelog);break;
677 case 2:addstr("リベラル派の人物の嘘のスキャンダルをでっち上げる", gamelog);break;
679 addstr("原稿の特別記事を掲載した。", gamelog);
682 addstr("主要なネットワークと新聞社は、数週間に渡りこの話題を取り上げた。", gamelog);
685 addstr("このことには保守派も神経を尖らせている。", gamelog);
686 gamelog.nextMessage();
688 change_public_opinion(VIEW_AMRADIO,50);
689 offended_cablenews=1;
696 /* monthly - LCS finances report */
697 void fundreport(char &clearformess)
699 if(disbanding) return;
700 music.play(MUSIC_FINANCES);
705 bool showledger=false;
707 static const char dotdotdot[]=". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ";
709 int expenselines = 0;
710 for(int i=0;i<EXPENSETYPENUM;i++)
711 if (ledger.expense[i])
718 int y=2,totalmoney=0,dailymoney=0,numpages=1;
720 set_color(COLOR_WHITE,COLOR_BLACK,1);
721 mvaddstr(0,0,"リベラル・クライム・スコード: 収支報告");
723 for(int i=0;i<INCOMETYPENUM;i++)
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])+")";
739 set_color(COLOR_WHITE,COLOR_BLACK,0);
742 mvaddstr(y,73-len(num),num);
743 set_color(COLOR_WHITE,COLOR_BLACK,0);
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;
762 totalmoney+=ledger.income[i];
763 dailymoney+=ledger.dailyIncome[i];
765 if(++y>=23) y=2,numpages++;
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++;
772 for(int i=0;i<EXPENSETYPENUM;i++)
774 if(ledger.expense[i])
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])+")";
788 set_color(COLOR_WHITE,COLOR_BLACK,0);
791 mvaddstr(y,73-len(num),num);
792 set_color(COLOR_WHITE,COLOR_BLACK,0);
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;
814 totalmoney-=ledger.expense[i];
815 dailymoney-=ledger.dailyExpense[i];
817 if(++y>=23) y=2,numpages++;
823 if(page==numpages-1) makedelimiter(y);
825 if(++y>=23) y=2,numpages++;
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);
838 set_color(COLOR_GREEN,COLOR_BLACK,1);
839 num=" (+$"+tostring(abs(dailymoney))+")";
841 else if(dailymoney<0)
843 set_color(COLOR_RED,COLOR_BLACK,1);
844 num=" (-$"+tostring(abs(dailymoney))+")";
848 set_color(COLOR_WHITE,COLOR_BLACK,1);
851 mvaddstr(y,73-len(num),num);
854 if(++y>=23) y=2,numpages++;
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++)
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();
873 set_color(COLOR_WHITE,COLOR_BLACK,0);
874 mvaddstr(y,0,dotdotdot);
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);
881 if(++y>=23) y=2,numpages++;
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);
893 if(++y>=23) y=2,numpages++;
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);
905 if(++y>=23) y=2,numpages++;
909 set_color(COLOR_WHITE,COLOR_BLACK,0);
910 mvaddstr(y,0,dotdotdot);
912 set_color(clipValue?COLOR_GREEN:COLOR_WHITE,COLOR_BLACK,0);
913 num="$"+tostring(clipValue);
914 mvaddstr(y,60-len(num),num);
917 if(++y>=23) y=2,numpages++;
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);
929 if(++y>=23) y=2,numpages++;
931 if(page==numpages-1) makedelimiter(y);
933 if(++y>=23) y=2,numpages++;
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);
945 set_color(COLOR_WHITE,COLOR_BLACK,0);
948 mvaddstr(24,0,"報告書をよく読んだならばEnterキーを押すこと。");
955 if(c=='x'||c==ENTER||c==ESC||c==SPACEBAR)
957 music.play(MUSIC_PREVIOUS);
962 if(c==interface_pgup||c==KEY_UP||c==KEY_LEFT) { page--; if(page<0) page=numpages-1; break; }
964 if(c==interface_pgdn||c==KEY_DOWN||c==KEY_RIGHT) { page++; if(page>=numpages) page=0; break; }
969 mvaddstr(24,0,"報告書をよく読んだならば何かキーを押すこと。 ");
973 music.play(MUSIC_PREVIOUS);