Mercurial > otakunoraifu
comparison scn2k/scn2k_impl.cc @ 53:ddbcbd000206
* MuSys, AyuSysConfig, FileSearcher (former FILESEARCHER) and KeyHolder (former KEYHOLDER) are now singletons
* ParseMoji moved to TextStream
* Some cleaning (0 -> NULL when needed, removal of useless returns, ...)
author | thib |
---|---|
date | Sun, 19 Apr 2009 11:44:05 +0000 |
parents | 15a18fbe6f21 |
children | 6d9146f56ccf |
comparison
equal
deleted
inserted
replaced
52:15a18fbe6f21 | 53:ddbcbd000206 |
---|---|
43 void kconv(const unsigned char* src, unsigned char* dest); | 43 void kconv(const unsigned char* src, unsigned char* dest); |
44 void kconv_rev(const unsigned char* src, unsigned char* dest); | 44 void kconv_rev(const unsigned char* src, unsigned char* dest); |
45 string kconv(const string& s); | 45 string kconv(const string& s); |
46 string kconv_rev(const string& s); | 46 string kconv_rev(const string& s); |
47 | 47 |
48 Scn2k::Scn2k(Event::Container& _event, PicContainer& _parent, class MuSys& mu, AyuSysConfig& _config) : | 48 Scn2k::Scn2k(Event::Container& _event, PicContainer& _parent) : |
49 Event::Time(_event), | 49 Event::Time(_event), |
50 event(_event), | 50 event(_event), |
51 parent(_parent), | 51 parent(_parent), |
52 config(_config), | 52 text_exec(_event, _parent), |
53 text_exec(_event, _parent, config), | 53 grp_exec(_event, _parent, flag, flag.cgm_data) |
54 grp_exec(_event, _parent, flag, flag.cgm_data, mu, config) | |
55 { | 54 { |
55 config = AyuSysConfig::GetInstance(); | |
56 | |
56 system_version = 0; | 57 system_version = 0; |
57 skip_mode = SKIP_NO; | 58 skip_mode = SKIP_NO; |
58 | 59 |
59 script_start = NULL; | 60 script_start = NULL; |
60 script = NULL; | 61 script = NULL; |
81 mouse_pressed = 0; | 82 mouse_pressed = 0; |
82 ShowCursor(); | 83 ShowCursor(); |
83 | 84 |
84 LoadSys(); | 85 LoadSys(); |
85 text_exec.InitWindow(); | 86 text_exec.InitWindow(); |
86 grp_exec.InitSel(config); | 87 grp_exec.InitSel(); |
87 } | 88 } |
88 | 89 |
89 Scn2k::~Scn2k() { | 90 Scn2k::~Scn2k() { |
90 if (script_start) delete[] script_start; | 91 if (script_start) delete[] script_start; |
91 HideCursor(); | 92 HideCursor(); |
97 const char* data; | 98 const char* data; |
98 char* ret_data; | 99 char* ret_data; |
99 int offset = 0; | 100 int offset = 0; |
100 int scenario_magic; | 101 int scenario_magic; |
101 | 102 |
103 FileSearcher* file_searcher = FileSearcher::GetInstance(); | |
104 | |
102 sprintf(fname, "SEEN%04d.TXT", new_scn_number); | 105 sprintf(fname, "SEEN%04d.TXT", new_scn_number); |
103 ARCINFO* info = file_searcher.Find(FILESEARCH::SCN, fname, ""); | 106 ARCINFO* info = file_searcher->Find(FileSearcher::SCN, fname, ""); |
104 if (info == NULL) goto err; | 107 if (info == NULL) goto err; |
105 data = info->Read(); | 108 data = info->Read(); |
106 | 109 |
107 /* version 確認 */ | 110 /* version 確認 */ |
108 scenario_magic = read_little_endian_int(data + 4); | 111 scenario_magic = read_little_endian_int(data + 4); |
388 | 391 |
389 void Scn2k::ShowCursor(void) { | 392 void Scn2k::ShowCursor(void) { |
390 HideCursor(); | 393 HideCursor(); |
391 char key[1024]; | 394 char key[1024]; |
392 sprintf(key, "#MOUSE_CURSOR.%03d.NAME",mouse_type); | 395 sprintf(key, "#MOUSE_CURSOR.%03d.NAME",mouse_type); |
393 const char* name = config.GetParaStr(key); | 396 const char* name = config->GetParaStr(key); |
394 if (name == NULL || name[0] == 0) mouse_surface = DEFAULT_MOUSECURSOR; | 397 if (name == NULL || name[0] == 0) mouse_surface = DEFAULT_MOUSECURSOR; |
395 else { | 398 else { |
396 mouse_surface = parent.Root().NewSurface(name, COLOR_MASK); | 399 mouse_surface = parent.Root().NewSurface(name, COLOR_MASK); |
397 } | 400 } |
398 if (mouse_surface == NULL) mouse_surface = DEFAULT_MOUSECURSOR; | 401 if (mouse_surface == NULL) mouse_surface = DEFAULT_MOUSECURSOR; |
483 ShowCursor(); | 486 ShowCursor(); |
484 return; | 487 return; |
485 } | 488 } |
486 if (cmd.cmd_type == CMD_MENUREQ) { | 489 if (cmd.cmd_type == CMD_MENUREQ) { |
487 int scn=0, pt=0; | 490 int scn=0, pt=0; |
488 config.GetParam("#CANCELCALL", 2, &scn, &pt); | 491 config->GetParam("#CANCELCALL", 2, &scn, &pt); |
489 if (scn) { | 492 if (scn) { |
490 // 右クリックされたら global call を行う | 493 // 右クリックされたら global call を行う |
491 cmd.cmd_type = CMD_OTHER; | 494 cmd.cmd_type = CMD_OTHER; |
492 cmd.cmd1 = 0; | 495 cmd.cmd1 = 0; |
493 cmd.cmd2 = 1; | 496 cmd.cmd2 = 1; |
548 if (cmd.args.size() >= 2) { // subroutine number が付く | 551 if (cmd.args.size() >= 2) { // subroutine number が付く |
549 // 引数が付くのもあるらしい | 552 // 引数が付くのもあるらしい |
550 new_pt = cmd.args[1].value; | 553 new_pt = cmd.args[1].value; |
551 } | 554 } |
552 if (new_scn == SCN_INFO_MENU) { // menu call | 555 if (new_scn == SCN_INFO_MENU) { // menu call |
553 config.GetParam("#CANCELCALL", 2, &new_scn, &new_pt); | 556 config->GetParam("#CANCELCALL", 2, &new_scn, &new_pt); |
554 stack.push_back(StackItem(SCN_INFO, SCN_INFO_MENU)); // menu call を示す特殊な記号 | 557 stack.push_back(StackItem(SCN_INFO, SCN_INFO_MENU)); // menu call を示す特殊な記号 |
555 } else { | 558 } else { |
556 int i; | 559 int i; |
557 VarInfo var; | 560 VarInfo var; |
558 // ローカル変数を伴う subroutine call | 561 // ローカル変数を伴う subroutine call |
699 } | 702 } |
700 script = script_start + s.scn_pt; | 703 script = script_start + s.scn_pt; |
701 cmd.clear(); | 704 cmd.clear(); |
702 } | 705 } |
703 } else if (cmd.cmd1 == 2 && cmd.cmd2 == 1 && cmd.cmd3 == 12) { // DLL Call | 706 } else if (cmd.cmd1 == 2 && cmd.cmd2 == 1 && cmd.cmd3 == 12) { // DLL Call |
704 const char* regname = config.GetParaStr("#REGNAME"); | 707 const char* regname = config->GetParaStr("#REGNAME"); |
705 const char key_lb[] = "KEY\\LittleBusters";//FIXME: too specific to be here? | 708 const char key_lb[] = "KEY\\LittleBusters";//FIXME: too specific to be here? |
706 if (strcmp(regname, key_lb) == 0) { | 709 if (strcmp(regname, key_lb) == 0) { |
707 DllCall_LB(cmd, flag); | 710 DllCall_LB(cmd, flag); |
708 cmd.clear(); | 711 cmd.clear(); |
709 } | 712 } |
717 } else if (cmd.cmd1 == 1 && cmd.cmd2 == 0x04) { | 720 } else if (cmd.cmd1 == 1 && cmd.cmd2 == 0x04) { |
718 if (cmd.cmd3 == 0 && cmd.cmd4 == 0) { // タイトル名設定 | 721 if (cmd.cmd3 == 0 && cmd.cmd4 == 0) { // タイトル名設定 |
719 const char* name = cmd.Str(cmd.args[0]); | 722 const char* name = cmd.Str(cmd.args[0]); |
720 if (name == NULL) name = ""; | 723 if (name == NULL) name = ""; |
721 window_title = name; | 724 window_title = name; |
722 const char* config_name = config.GetParaStr("#CAPTION"); | 725 const char* config_name = config->GetParaStr("#CAPTION"); |
723 if (config_name == NULL) config_name = ""; | 726 if (config_name == NULL) config_name = ""; |
724 string setname = kconv(string(config_name) + " " + window_title); | 727 string setname = kconv(string(config_name) + " " + window_title); |
725 parent.Root().SetWindowCaption(setname.c_str()); | 728 parent.Root().SetWindowCaption(setname.c_str()); |
726 cmd.clear(); | 729 cmd.clear(); |
727 } else if (cmd.cmd3 == 0x82 && cmd.cmd4 == 0) { | 730 } else if (cmd.cmd3 == 0x82 && cmd.cmd4 == 0) { |
759 } else if (cmd.cmd3 == 0x4b4 || cmd.cmd3 == 0x4b5) { // 選択肢巻き戻し | 762 } else if (cmd.cmd3 == 0x4b4 || cmd.cmd3 == 0x4b5) { // 選択肢巻き戻し |
760 LoadRollback(cmd); | 763 LoadRollback(cmd); |
761 } else if (cmd.cmd3 == 0x58d) { | 764 } else if (cmd.cmd3 == 0x58d) { |
762 // 前にロード|セーブされた番号を返す。 | 765 // 前にロード|セーブされた番号を返す。 |
763 int lastsave; | 766 int lastsave; |
764 config.GetParam("#LASTSAVE", 1, &lastsave); | 767 config->GetParam("#LASTSAVE", 1, &lastsave); |
765 flag.SetSys(lastsave-1); | 768 flag.SetSys(lastsave-1); |
766 } else if (cmd.cmd3 == 0x585) { | 769 } else if (cmd.cmd3 == 0x585) { |
767 // 第一引数の記録された日付、タイトルなどが返される | 770 // 第一引数の記録された日付、タイトルなどが返される |
768 // データがないなら sys に 0が、あるなら 1 が返る | 771 // データがないなら sys に 0が、あるなら 1 が返る |
769 int y,m,d,wd,h,min,s,ms; | 772 int y,m,d,wd,h,min,s,ms; |
790 Save(cmd); | 793 Save(cmd); |
791 } else if (cmd.cmd3 == 0xc25) { // load | 794 } else if (cmd.cmd3 == 0xc25) { // load |
792 Load(cmd); | 795 Load(cmd); |
793 } else if (cmd.cmd3 == 0x4b1 || cmd.cmd3 == 0x4b3) { // menu へ戻る (4b3: バッドエンド) | 796 } else if (cmd.cmd3 == 0x4b1 || cmd.cmd3 == 0x4b3) { // menu へ戻る (4b3: バッドエンド) |
794 int scn_start; | 797 int scn_start; |
795 if (config.GetParam("#SEEN_MENU", 1, &scn_start) == 0) { | 798 if (config->GetParam("#SEEN_MENU", 1, &scn_start) == 0) { |
796 ChangeScript(scn_start, 0); | 799 ChangeScript(scn_start, 0); |
797 save_scn = 0; | 800 save_scn = 0; |
798 save_point = 0; | 801 save_point = 0; |
799 window_title = ""; | 802 window_title = ""; |
800 const char* window_title_config = config.GetParaStr("#CAPTION"); | 803 const char* window_title_config = config->GetParaStr("#CAPTION"); |
801 if (window_title_config) window_title = window_title_config; | 804 if (window_title_config) window_title = window_title_config; |
802 parent.Root().SetWindowCaption(kconv(window_title).c_str()); | 805 parent.Root().SetWindowCaption(kconv(window_title).c_str()); |
803 stack.clear(); | 806 stack.clear(); |
804 cmd_stack.clear(); | 807 cmd_stack.clear(); |
805 cmd_stack_str = cmd_stack_str_orig; | 808 cmd_stack_str = cmd_stack_str_orig; |
856 if ( (sstatus.st_mode & S_IFMT) == S_IFREG) { | 859 if ( (sstatus.st_mode & S_IFMT) == S_IFREG) { |
857 return dir; | 860 return dir; |
858 } | 861 } |
859 } | 862 } |
860 // ファイル名を作る | 863 // ファイル名を作る |
861 const char* regname = config.GetParaStr("#REGNAME"); | 864 const char* regname = config->GetParaStr("#REGNAME"); |
862 | 865 |
863 char* fname = new char[strlen(regname)+1]; | 866 char* fname = new char[strlen(regname)+1]; |
864 /* レジストリ名をファイル名として有効なものにする */ | 867 /* レジストリ名をファイル名として有効なものにする */ |
865 int i; for (i=0; regname[i]!=0; i++) { | 868 int i; for (i=0; regname[i]!=0; i++) { |
866 char c = regname[i]; | 869 char c = regname[i]; |
890 void Scn2k::SaveSys(void) { | 893 void Scn2k::SaveSys(void) { |
891 char buf[1024]; | 894 char buf[1024]; |
892 string save; | 895 string save; |
893 string path = MakeSaveFile(); | 896 string path = MakeSaveFile(); |
894 | 897 |
895 sprintf(buf, "KEY=%s\n", config.GetParaStr("#REGNAME")); | 898 sprintf(buf, "KEY=%s\n", config->GetParaStr("#REGNAME")); |
896 save += buf; | 899 save += buf; |
897 string save_config; | 900 string save_config; |
898 config.DiffOriginal(save_config); | 901 config->DiffOriginal(save_config); |
899 save += "CONFIG="; | 902 save += "CONFIG="; |
900 save += save_config; | 903 save += save_config; |
901 save += "\n"; | 904 save += "\n"; |
902 string save_flag; flag.SaveSys(save_flag); | 905 string save_flag; flag.SaveSys(save_flag); |
903 save += save_flag; | 906 save += save_flag; |
944 char* savedata = new char[sz+1]; | 947 char* savedata = new char[sz+1]; |
945 fread(savedata, sz, 1, f); | 948 fread(savedata, sz, 1, f); |
946 savedata[sz] = 0; | 949 savedata[sz] = 0; |
947 fclose(f); | 950 fclose(f); |
948 | 951 |
949 sprintf(buf, "KEY=%s\n", config.GetParaStr("#REGNAME")); | 952 sprintf(buf, "KEY=%s\n", config->GetParaStr("#REGNAME")); |
950 if (strncmp(savedata, buf, strlen(buf)) != 0) { | 953 if (strncmp(savedata, buf, strlen(buf)) != 0) { |
951 fprintf(stderr,"Invalid header in save file %s: it must be started with \"%s\"\n", path.c_str(), buf); | 954 fprintf(stderr,"Invalid header in save file %s: it must be started with \"%s\"\n", path.c_str(), buf); |
952 } else { | 955 } else { |
953 char* config_str = strstr(savedata, "\nCONFIG="); | 956 char* config_str = strstr(savedata, "\nCONFIG="); |
954 if (config_str) { | 957 if (config_str) { |
957 if (strend) { | 960 if (strend) { |
958 int l = strend - config_str; | 961 int l = strend - config_str; |
959 char* config_copy = new char[l+1]; | 962 char* config_copy = new char[l+1]; |
960 strncpy(config_copy, config_str, l); | 963 strncpy(config_copy, config_str, l); |
961 config_copy[l] = 0; | 964 config_copy[l] = 0; |
962 config.PatchOriginal(config_copy); | 965 config->PatchOriginal(config_copy); |
963 delete[] config_copy; | 966 delete[] config_copy; |
964 } | 967 } |
965 } | 968 } |
966 flag.LoadSys(savedata); | 969 flag.LoadSys(savedata); |
967 grp_exec.LoadSys(savedata); | 970 grp_exec.LoadSys(savedata); |
995 } | 998 } |
996 delete[] savedata; | 999 delete[] savedata; |
997 } | 1000 } |
998 | 1001 |
999 /* 初期化 */ | 1002 /* 初期化 */ |
1000 int scn_start; config.GetParam("#SEEN_START", 1, &scn_start); | 1003 int scn_start; config->GetParam("#SEEN_START", 1, &scn_start); |
1001 ChangeScript(scn_start, 0); | 1004 ChangeScript(scn_start, 0); |
1002 save_scn = 0; | 1005 save_scn = 0; |
1003 save_point = 0; | 1006 save_point = 0; |
1004 window_title = ""; | 1007 window_title = ""; |
1005 const char* window_title_config = config.GetParaStr("#CAPTION"); | 1008 const char* window_title_config = config->GetParaStr("#CAPTION"); |
1006 if (window_title_config) window_title = window_title_config; | 1009 if (window_title_config) window_title = window_title_config; |
1007 parent.Root().SetWindowCaption(kconv(window_title).c_str()); | 1010 parent.Root().SetWindowCaption(kconv(window_title).c_str()); |
1008 stack.clear(); | 1011 stack.clear(); |
1009 cmd_stack.clear(); | 1012 cmd_stack.clear(); |
1010 cmd_stack_str = cmd_stack_str_orig; | 1013 cmd_stack_str = cmd_stack_str_orig; |
1031 msec = 0; | 1034 msec = 0; |
1032 /* タイトルの取得 */ | 1035 /* タイトルの取得 */ |
1033 FILE* savefile = fopen(path.c_str(), "rb"); | 1036 FILE* savefile = fopen(path.c_str(), "rb"); |
1034 if (savefile == NULL) return false; | 1037 if (savefile == NULL) return false; |
1035 char regname[1024]; | 1038 char regname[1024]; |
1036 sprintf(regname, "KEY=%s\n", config.GetParaStr("#REGNAME")); | 1039 sprintf(regname, "KEY=%s\n", config->GetParaStr("#REGNAME")); |
1037 fgets(buf,1000,savefile); | 1040 fgets(buf,1000,savefile); |
1038 if (strncmp(regname, buf, strlen(regname)) != 0) { | 1041 if (strncmp(regname, buf, strlen(regname)) != 0) { |
1039 fprintf(stderr,"invalid save file %s (registory name is not %s)\n",path.c_str(),regname); | 1042 fprintf(stderr,"invalid save file %s (registory name is not %s)\n",path.c_str(),regname); |
1040 fclose(savefile); | 1043 fclose(savefile); |
1041 return false; | 1044 return false; |
1123 sprintf(buf, ".%d",file_number); | 1126 sprintf(buf, ".%d",file_number); |
1124 path += buf; | 1127 path += buf; |
1125 | 1128 |
1126 /* セーブファイル確認 */ | 1129 /* セーブファイル確認 */ |
1127 | 1130 |
1128 sprintf(buf, "KEY=%s\n", config.GetParaStr("#REGNAME")); save += buf; | 1131 sprintf(buf, "KEY=%s\n", config->GetParaStr("#REGNAME")); save += buf; |
1129 string save_sys; SaveImpl(save_sys); | 1132 string save_sys; SaveImpl(save_sys); |
1130 string save_flag; flag.Save(save_flag); | 1133 string save_flag; flag.Save(save_flag); |
1131 string save_text; text_exec.Save(save_text, false); | 1134 string save_text; text_exec.Save(save_text, false); |
1132 string save_grp; grp_exec.Save(save_grp); | 1135 string save_grp; grp_exec.Save(save_grp); |
1133 save += save_sys; | 1136 save += save_sys; |
1146 fprintf(stderr,"Cannot open save file %s\n",path.c_str()); | 1149 fprintf(stderr,"Cannot open save file %s\n",path.c_str()); |
1147 return; | 1150 return; |
1148 } | 1151 } |
1149 fwrite(save.c_str(), save.length(), 1, f); | 1152 fwrite(save.c_str(), save.length(), 1, f); |
1150 fclose(f); | 1153 fclose(f); |
1151 config.SetParam("#LASTSAVE", 1, file_number); | 1154 config->SetParam("#LASTSAVE", 1, file_number); |
1152 cmd.clear(); | 1155 cmd.clear(); |
1153 } | 1156 } |
1154 | 1157 |
1155 void Scn2k::Load(Cmd& cmd) { | 1158 void Scn2k::Load(Cmd& cmd) { |
1156 if (cmd.cmd_type == CMD_LOADREQ) { | 1159 if (cmd.cmd_type == CMD_LOADREQ) { |
1185 char* savedata = new char[sz+1]; | 1188 char* savedata = new char[sz+1]; |
1186 fread(savedata, sz, 1, f); | 1189 fread(savedata, sz, 1, f); |
1187 savedata[sz] = 0; | 1190 savedata[sz] = 0; |
1188 fclose(f); | 1191 fclose(f); |
1189 | 1192 |
1190 sprintf(buf, "KEY=%s\n", config.GetParaStr("#REGNAME")); | 1193 sprintf(buf, "KEY=%s\n", config->GetParaStr("#REGNAME")); |
1191 if (strncmp(savedata, buf, strlen(buf)) != 0) { | 1194 if (strncmp(savedata, buf, strlen(buf)) != 0) { |
1192 fprintf(stderr,"Invalid header in save file %s: it must be started with \"%s\"\n", path.c_str(), buf); | 1195 fprintf(stderr,"Invalid header in save file %s: it must be started with \"%s\"\n", path.c_str(), buf); |
1193 delete[] savedata; | 1196 delete[] savedata; |
1194 return; | 1197 return; |
1195 } | 1198 } |
1273 } else if (strncmp(save, "Title=", 6) == 0) { | 1276 } else if (strncmp(save, "Title=", 6) == 0) { |
1274 save += 6; | 1277 save += 6; |
1275 char* s = strchr(save, '\n'); | 1278 char* s = strchr(save, '\n'); |
1276 if (s == NULL) window_title = save; | 1279 if (s == NULL) window_title = save; |
1277 else window_title.assign(save, s-save); | 1280 else window_title.assign(save, s-save); |
1278 const char* config_name = config.GetParaStr("#CAPTION"); | 1281 const char* config_name = config->GetParaStr("#CAPTION"); |
1279 if (config_name == NULL) config_name = ""; | 1282 if (config_name == NULL) config_name = ""; |
1280 string setname = kconv(string(config_name)+" "+window_title); | 1283 string setname = kconv(string(config_name)+" "+window_title); |
1281 parent.Root().SetWindowCaption(setname.c_str()); | 1284 parent.Root().SetWindowCaption(setname.c_str()); |
1282 } else if (strncmp(save, "MouseType=", 10) == 0) { | 1285 } else if (strncmp(save, "MouseType=", 10) == 0) { |
1283 sscanf(save, "MouseType=%d", &mouse_type); | 1286 sscanf(save, "MouseType=%d", &mouse_type); |
1896 switch(type) { | 1899 switch(type) { |
1897 case MENU_LOAD: pimpl = new LoadMenu(*this); break; | 1900 case MENU_LOAD: pimpl = new LoadMenu(*this); break; |
1898 case MENU_SAVE: pimpl = new LoadMenu(*this); break; | 1901 case MENU_SAVE: pimpl = new LoadMenu(*this); break; |
1899 case MENU_BACKLOG: pimpl = new BacklogMenu(*this, scn_impl, text_exec); break; | 1902 case MENU_BACKLOG: pimpl = new BacklogMenu(*this, scn_impl, text_exec); break; |
1900 } | 1903 } |
1901 return; | 1904 } |
1902 } | 1905 |
1903 Scn2kMenu::~Scn2kMenu() { | 1906 Scn2kMenu::~Scn2kMenu() { |
1904 if (pimpl) delete pimpl; | 1907 if (pimpl) delete pimpl; |
1905 pimpl = NULL; | 1908 pimpl = NULL; |
1906 } | 1909 } |
1907 | 1910 |