annotate scn2k/scn2k_impl.cc @ 58:0aaa5bb3dde5

Moved all opcodes from scn2k_text.cc to scn2k_textimpl.cc
author Thibaut GIRKA <thib@sitedethib.com>
date Fri, 18 Dec 2009 14:25:56 +0100
parents 6d9146f56ccf
children bdd8a5ff8f46
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
223b71206888 Initial import
thib
parents:
diff changeset
1 /*
223b71206888 Initial import
thib
parents:
diff changeset
2 * Copyright (c) 2004-2006 Kazunori "jagarl" Ueno
223b71206888 Initial import
thib
parents:
diff changeset
3 * All rights reserved.
223b71206888 Initial import
thib
parents:
diff changeset
4 *
223b71206888 Initial import
thib
parents:
diff changeset
5 * Redistribution and use in source and binary forms, with or without
223b71206888 Initial import
thib
parents:
diff changeset
6 * modification, are permitted provided that the following conditions
223b71206888 Initial import
thib
parents:
diff changeset
7 * are met:
223b71206888 Initial import
thib
parents:
diff changeset
8 * 1. Redistributions of source code must retain the above copyright
223b71206888 Initial import
thib
parents:
diff changeset
9 * notice, this list of conditions and the following disclaimer.
223b71206888 Initial import
thib
parents:
diff changeset
10 * 2. Redistributions in binary form must reproduce the above copyright
223b71206888 Initial import
thib
parents:
diff changeset
11 * notice, this list of conditions and the following disclaimer in the
223b71206888 Initial import
thib
parents:
diff changeset
12 * documentation and/or other materials provided with the distribution.
223b71206888 Initial import
thib
parents:
diff changeset
13 * 3. The name of the author may not be used to endorse or promote products
223b71206888 Initial import
thib
parents:
diff changeset
14 * derived from this software without specific prior written permission.
223b71206888 Initial import
thib
parents:
diff changeset
15 *
223b71206888 Initial import
thib
parents:
diff changeset
16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
223b71206888 Initial import
thib
parents:
diff changeset
17 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
223b71206888 Initial import
thib
parents:
diff changeset
18 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
223b71206888 Initial import
thib
parents:
diff changeset
19 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
223b71206888 Initial import
thib
parents:
diff changeset
20 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
223b71206888 Initial import
thib
parents:
diff changeset
21 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
223b71206888 Initial import
thib
parents:
diff changeset
22 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
223b71206888 Initial import
thib
parents:
diff changeset
23 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
223b71206888 Initial import
thib
parents:
diff changeset
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
223b71206888 Initial import
thib
parents:
diff changeset
25 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
223b71206888 Initial import
thib
parents:
diff changeset
26 */
223b71206888 Initial import
thib
parents:
diff changeset
27
223b71206888 Initial import
thib
parents:
diff changeset
28 #include <stdexcept>
52
15a18fbe6f21 * Known bugs added to the README
thib
parents: 50
diff changeset
29 #include "scn2k_impl.h"
15a18fbe6f21 * Known bugs added to the README
thib
parents: 50
diff changeset
30 #include "system/file.h"
15a18fbe6f21 * Known bugs added to the README
thib
parents: 50
diff changeset
31 #include "system/system_config.h"
15a18fbe6f21 * Known bugs added to the README
thib
parents: 50
diff changeset
32 #include "window/picture.h"
15a18fbe6f21 * Known bugs added to the README
thib
parents: 50
diff changeset
33 #include "window/system.h"
0
223b71206888 Initial import
thib
parents:
diff changeset
34
223b71206888 Initial import
thib
parents:
diff changeset
35 // #define DEBUG 1
223b71206888 Initial import
thib
parents:
diff changeset
36
223b71206888 Initial import
thib
parents:
diff changeset
37 using namespace std;
223b71206888 Initial import
thib
parents:
diff changeset
38
223b71206888 Initial import
thib
parents:
diff changeset
39 /**********************************************
223b71206888 Initial import
thib
parents:
diff changeset
40 ** Scn2k
223b71206888 Initial import
thib
parents:
diff changeset
41 */
223b71206888 Initial import
thib
parents:
diff changeset
42
223b71206888 Initial import
thib
parents:
diff changeset
43 void kconv(const unsigned char* src, unsigned char* dest);
223b71206888 Initial import
thib
parents:
diff changeset
44 void kconv_rev(const unsigned char* src, unsigned char* dest);
223b71206888 Initial import
thib
parents:
diff changeset
45 string kconv(const string& s);
223b71206888 Initial import
thib
parents:
diff changeset
46 string kconv_rev(const string& s);
223b71206888 Initial import
thib
parents:
diff changeset
47
53
ddbcbd000206 * MuSys, AyuSysConfig, FileSearcher (former FILESEARCHER) and KeyHolder (former KEYHOLDER) are now singletons
thib
parents: 52
diff changeset
48 Scn2k::Scn2k(Event::Container& _event, PicContainer& _parent) :
0
223b71206888 Initial import
thib
parents:
diff changeset
49 Event::Time(_event),
223b71206888 Initial import
thib
parents:
diff changeset
50 event(_event),
223b71206888 Initial import
thib
parents:
diff changeset
51 parent(_parent),
53
ddbcbd000206 * MuSys, AyuSysConfig, FileSearcher (former FILESEARCHER) and KeyHolder (former KEYHOLDER) are now singletons
thib
parents: 52
diff changeset
52 text_exec(_event, _parent),
ddbcbd000206 * MuSys, AyuSysConfig, FileSearcher (former FILESEARCHER) and KeyHolder (former KEYHOLDER) are now singletons
thib
parents: 52
diff changeset
53 grp_exec(_event, _parent, flag, flag.cgm_data)
0
223b71206888 Initial import
thib
parents:
diff changeset
54 {
53
ddbcbd000206 * MuSys, AyuSysConfig, FileSearcher (former FILESEARCHER) and KeyHolder (former KEYHOLDER) are now singletons
thib
parents: 52
diff changeset
55 config = AyuSysConfig::GetInstance();
ddbcbd000206 * MuSys, AyuSysConfig, FileSearcher (former FILESEARCHER) and KeyHolder (former KEYHOLDER) are now singletons
thib
parents: 52
diff changeset
56
0
223b71206888 Initial import
thib
parents:
diff changeset
57 system_version = 0;
223b71206888 Initial import
thib
parents:
diff changeset
58 skip_mode = SKIP_NO;
223b71206888 Initial import
thib
parents:
diff changeset
59
52
15a18fbe6f21 * Known bugs added to the README
thib
parents: 50
diff changeset
60 script_start = NULL;
15a18fbe6f21 * Known bugs added to the README
thib
parents: 50
diff changeset
61 script = NULL;
15a18fbe6f21 * Known bugs added to the README
thib
parents: 50
diff changeset
62 script_end = NULL;
0
223b71206888 Initial import
thib
parents:
diff changeset
63
223b71206888 Initial import
thib
parents:
diff changeset
64 backlog_script_scn = -1;
52
15a18fbe6f21 * Known bugs added to the README
thib
parents: 50
diff changeset
65 backlog_script_start = NULL;
15a18fbe6f21 * Known bugs added to the README
thib
parents: 50
diff changeset
66 backlog_script_end = NULL;
0
223b71206888 Initial import
thib
parents:
diff changeset
67
223b71206888 Initial import
thib
parents:
diff changeset
68 save_scn = 0;
223b71206888 Initial import
thib
parents:
diff changeset
69 save_point = 0;
223b71206888 Initial import
thib
parents:
diff changeset
70 scn_number = 0;
223b71206888 Initial import
thib
parents:
diff changeset
71 scn_point = 0;
223b71206888 Initial import
thib
parents:
diff changeset
72 cmd_stack_str = cmd_stack_str_orig;
223b71206888 Initial import
thib
parents:
diff changeset
73
52
15a18fbe6f21 * Known bugs added to the README
thib
parents: 50
diff changeset
74 dialog = NULL;
0
223b71206888 Initial import
thib
parents:
diff changeset
75 dialog_type = CMD_NOP;
52
15a18fbe6f21 * Known bugs added to the README
thib
parents: 50
diff changeset
76 menu = NULL;
0
223b71206888 Initial import
thib
parents:
diff changeset
77 menu_mouseshown = false;
223b71206888 Initial import
thib
parents:
diff changeset
78
223b71206888 Initial import
thib
parents:
diff changeset
79 /* マウスカーソルを作成 */
223b71206888 Initial import
thib
parents:
diff changeset
80 mouse_type = 0;
52
15a18fbe6f21 * Known bugs added to the README
thib
parents: 50
diff changeset
81 mouse_surface = NULL;
0
223b71206888 Initial import
thib
parents:
diff changeset
82 mouse_pressed = 0;
223b71206888 Initial import
thib
parents:
diff changeset
83 ShowCursor();
223b71206888 Initial import
thib
parents:
diff changeset
84
223b71206888 Initial import
thib
parents:
diff changeset
85 LoadSys();
223b71206888 Initial import
thib
parents:
diff changeset
86 text_exec.InitWindow();
53
ddbcbd000206 * MuSys, AyuSysConfig, FileSearcher (former FILESEARCHER) and KeyHolder (former KEYHOLDER) are now singletons
thib
parents: 52
diff changeset
87 grp_exec.InitSel();
0
223b71206888 Initial import
thib
parents:
diff changeset
88 }
223b71206888 Initial import
thib
parents:
diff changeset
89
223b71206888 Initial import
thib
parents:
diff changeset
90 Scn2k::~Scn2k() {
50
35ce1a30f3f9 * Added va_end where there is a va_start
thib
parents: 43
diff changeset
91 if (script_start) delete[] script_start;
0
223b71206888 Initial import
thib
parents:
diff changeset
92 HideCursor();
223b71206888 Initial import
thib
parents:
diff changeset
93 SaveSys();
223b71206888 Initial import
thib
parents:
diff changeset
94 }
223b71206888 Initial import
thib
parents:
diff changeset
95
223b71206888 Initial import
thib
parents:
diff changeset
96 char* Scn2k::OpenScript(int new_scn_number, char*& end, int* call_vec, int& system_version) {
223b71206888 Initial import
thib
parents:
diff changeset
97 char fname[1024];
223b71206888 Initial import
thib
parents:
diff changeset
98 const char* data;
223b71206888 Initial import
thib
parents:
diff changeset
99 char* ret_data;
223b71206888 Initial import
thib
parents:
diff changeset
100 int offset = 0;
223b71206888 Initial import
thib
parents:
diff changeset
101 int scenario_magic;
223b71206888 Initial import
thib
parents:
diff changeset
102
53
ddbcbd000206 * MuSys, AyuSysConfig, FileSearcher (former FILESEARCHER) and KeyHolder (former KEYHOLDER) are now singletons
thib
parents: 52
diff changeset
103 FileSearcher* file_searcher = FileSearcher::GetInstance();
ddbcbd000206 * MuSys, AyuSysConfig, FileSearcher (former FILESEARCHER) and KeyHolder (former KEYHOLDER) are now singletons
thib
parents: 52
diff changeset
104
0
223b71206888 Initial import
thib
parents:
diff changeset
105 sprintf(fname, "SEEN%04d.TXT", new_scn_number);
53
ddbcbd000206 * MuSys, AyuSysConfig, FileSearcher (former FILESEARCHER) and KeyHolder (former KEYHOLDER) are now singletons
thib
parents: 52
diff changeset
106 ARCINFO* info = file_searcher->Find(FileSearcher::SCN, fname, "");
52
15a18fbe6f21 * Known bugs added to the README
thib
parents: 50
diff changeset
107 if (info == NULL) goto err;
0
223b71206888 Initial import
thib
parents:
diff changeset
108 data = info->Read();
223b71206888 Initial import
thib
parents:
diff changeset
109
223b71206888 Initial import
thib
parents:
diff changeset
110 /* version 確認 */
223b71206888 Initial import
thib
parents:
diff changeset
111 scenario_magic = read_little_endian_int(data + 4);
223b71206888 Initial import
thib
parents:
diff changeset
112 if (scenario_magic != 0x2712 && scenario_magic != 0x1adb2) {
223b71206888 Initial import
thib
parents:
diff changeset
113 fprintf(stderr,"Invalid scenario header : scenario number %d\n",new_scn_number);
223b71206888 Initial import
thib
parents:
diff changeset
114 goto err;
223b71206888 Initial import
thib
parents:
diff changeset
115 }
223b71206888 Initial import
thib
parents:
diff changeset
116 if (read_little_endian_int(data) == 0x1cc) {
223b71206888 Initial import
thib
parents:
diff changeset
117 system_version = 0;
223b71206888 Initial import
thib
parents:
diff changeset
118 offset = 0x1cc + read_little_endian_int(data+0x20) + 4;
223b71206888 Initial import
thib
parents:
diff changeset
119 } else if (read_little_endian_int(data) == 0x1d0) {
223b71206888 Initial import
thib
parents:
diff changeset
120 system_version = 1;
223b71206888 Initial import
thib
parents:
diff changeset
121 offset = read_little_endian_int(data + 0x20);
223b71206888 Initial import
thib
parents:
diff changeset
122 } else {
223b71206888 Initial import
thib
parents:
diff changeset
123 fprintf(stderr,"Invalid scenario header : scenario number %d\n",new_scn_number);
223b71206888 Initial import
thib
parents:
diff changeset
124 goto err;
223b71206888 Initial import
thib
parents:
diff changeset
125 }
223b71206888 Initial import
thib
parents:
diff changeset
126 /* header から subroutine number とりだし */
223b71206888 Initial import
thib
parents:
diff changeset
127 if (call_vec) {
223b71206888 Initial import
thib
parents:
diff changeset
128 int i;
223b71206888 Initial import
thib
parents:
diff changeset
129 for (i=0; i<100; i++) {
223b71206888 Initial import
thib
parents:
diff changeset
130 call_vec[i] = read_little_endian_int(data + 0x34 + i * 4);
223b71206888 Initial import
thib
parents:
diff changeset
131 }
223b71206888 Initial import
thib
parents:
diff changeset
132 }
223b71206888 Initial import
thib
parents:
diff changeset
133 ret_data = new char[info->Size() - offset + 1024];
223b71206888 Initial import
thib
parents:
diff changeset
134 memcpy(ret_data, data+offset, info->Size()-offset);
223b71206888 Initial import
thib
parents:
diff changeset
135 memset(ret_data+info->Size()-offset, 0, 1024);
223b71206888 Initial import
thib
parents:
diff changeset
136 end = ret_data + info->Size() - offset;
223b71206888 Initial import
thib
parents:
diff changeset
137 delete info;
223b71206888 Initial import
thib
parents:
diff changeset
138 return ret_data;
223b71206888 Initial import
thib
parents:
diff changeset
139
223b71206888 Initial import
thib
parents:
diff changeset
140 err:
223b71206888 Initial import
thib
parents:
diff changeset
141 delete info;
223b71206888 Initial import
thib
parents:
diff changeset
142 fprintf(stderr,"Cannot open scenario number %d\n",new_scn_number);
223b71206888 Initial import
thib
parents:
diff changeset
143 throw std::invalid_argument("Scn2k::OpenScript");
223b71206888 Initial import
thib
parents:
diff changeset
144
223b71206888 Initial import
thib
parents:
diff changeset
145 return false;
223b71206888 Initial import
thib
parents:
diff changeset
146 }
52
15a18fbe6f21 * Known bugs added to the README
thib
parents: 50
diff changeset
147
0
223b71206888 Initial import
thib
parents:
diff changeset
148 bool Scn2k::ChangeScript(int new_scn_number, int call_no) {
223b71206888 Initial import
thib
parents:
diff changeset
149 int old_scn_number = scn_number;
223b71206888 Initial import
thib
parents:
diff changeset
150 int old_scn_pt = script - script_start;
223b71206888 Initial import
thib
parents:
diff changeset
151 int scn_pt = 0;
223b71206888 Initial import
thib
parents:
diff changeset
152
223b71206888 Initial import
thib
parents:
diff changeset
153 if (script_start) delete[] script_start;
52
15a18fbe6f21 * Known bugs added to the README
thib
parents: 50
diff changeset
154 script_start = NULL;
15a18fbe6f21 * Known bugs added to the README
thib
parents: 50
diff changeset
155 script = NULL;
15a18fbe6f21 * Known bugs added to the README
thib
parents: 50
diff changeset
156 script_end = NULL;
0
223b71206888 Initial import
thib
parents:
diff changeset
157
223b71206888 Initial import
thib
parents:
diff changeset
158 int call_vec[100];
223b71206888 Initial import
thib
parents:
diff changeset
159
223b71206888 Initial import
thib
parents:
diff changeset
160 try {
223b71206888 Initial import
thib
parents:
diff changeset
161 script_start = OpenScript(new_scn_number, script_end, call_vec, system_version);
223b71206888 Initial import
thib
parents:
diff changeset
162 } catch(...) {
223b71206888 Initial import
thib
parents:
diff changeset
163 fprintf(stderr,"\tFrom script %d pt %d\n",old_scn_number, old_scn_pt);
223b71206888 Initial import
thib
parents:
diff changeset
164 throw;
223b71206888 Initial import
thib
parents:
diff changeset
165 }
223b71206888 Initial import
thib
parents:
diff changeset
166 if (call_no > 0 && call_no < 100) {
223b71206888 Initial import
thib
parents:
diff changeset
167 scn_pt = call_vec[call_no];
223b71206888 Initial import
thib
parents:
diff changeset
168 if (scn_pt == 0) {
223b71206888 Initial import
thib
parents:
diff changeset
169 fprintf(stderr,"Invalid subroutine number: scn %d sub %d\n",new_scn_number, call_no);
223b71206888 Initial import
thib
parents:
diff changeset
170 scn_pt = 0;
223b71206888 Initial import
thib
parents:
diff changeset
171 }
223b71206888 Initial import
thib
parents:
diff changeset
172 } else if (call_no < 0) {
223b71206888 Initial import
thib
parents:
diff changeset
173 scn_pt = -call_no; // デバッグ用
223b71206888 Initial import
thib
parents:
diff changeset
174 }
223b71206888 Initial import
thib
parents:
diff changeset
175
223b71206888 Initial import
thib
parents:
diff changeset
176 scn_number = new_scn_number;
223b71206888 Initial import
thib
parents:
diff changeset
177 scn_point = scn_pt;
223b71206888 Initial import
thib
parents:
diff changeset
178 script = script_start + scn_pt;
223b71206888 Initial import
thib
parents:
diff changeset
179 if (script < script_start || script >= script_end)
223b71206888 Initial import
thib
parents:
diff changeset
180 fprintf(stderr,"scn %d pt %d: Cannot jump to %d:%d; fall back to the top\n",old_scn_number, old_scn_pt, scn_number, scn_pt);
223b71206888 Initial import
thib
parents:
diff changeset
181 return true;
223b71206888 Initial import
thib
parents:
diff changeset
182 }
52
15a18fbe6f21 * Known bugs added to the README
thib
parents: 50
diff changeset
183
0
223b71206888 Initial import
thib
parents:
diff changeset
184 bool Scn2k::ReadCmdAt(Cmd& cmd, int scn, int pt) {
223b71206888 Initial import
thib
parents:
diff changeset
185 const char* d;
52
15a18fbe6f21 * Known bugs added to the README
thib
parents: 50
diff changeset
186 if (scn == scn_number) {
0
223b71206888 Initial import
thib
parents:
diff changeset
187 d = script_start + pt;
223b71206888 Initial import
thib
parents:
diff changeset
188 if (d < script_start || d >= script_end) {
223b71206888 Initial import
thib
parents:
diff changeset
189 fprintf(stderr,"Cannot read script at current scn %d pt %d\n", scn, pt);
223b71206888 Initial import
thib
parents:
diff changeset
190 return false;
223b71206888 Initial import
thib
parents:
diff changeset
191 }
223b71206888 Initial import
thib
parents:
diff changeset
192 } else {
223b71206888 Initial import
thib
parents:
diff changeset
193 if (backlog_script_scn != scn) {
223b71206888 Initial import
thib
parents:
diff changeset
194 if (backlog_script_start) delete[] backlog_script_start;
223b71206888 Initial import
thib
parents:
diff changeset
195 backlog_script_start = OpenScript(scn, backlog_script_end, 0, system_version);
223b71206888 Initial import
thib
parents:
diff changeset
196 }
223b71206888 Initial import
thib
parents:
diff changeset
197 d = backlog_script_start + pt;
223b71206888 Initial import
thib
parents:
diff changeset
198 if (d < backlog_script_start || d >= backlog_script_end) {
223b71206888 Initial import
thib
parents:
diff changeset
199 fprintf(stderr,"Cannot read script at scn %d pt %d\n", scn, pt);
223b71206888 Initial import
thib
parents:
diff changeset
200 return false;
223b71206888 Initial import
thib
parents:
diff changeset
201 }
223b71206888 Initial import
thib
parents:
diff changeset
202 }
223b71206888 Initial import
thib
parents:
diff changeset
203
223b71206888 Initial import
thib
parents:
diff changeset
204 cmd.GetCmd(flag, d);
223b71206888 Initial import
thib
parents:
diff changeset
205 return true;
223b71206888 Initial import
thib
parents:
diff changeset
206 }
223b71206888 Initial import
thib
parents:
diff changeset
207
223b71206888 Initial import
thib
parents:
diff changeset
208 extern bool save_req, load_req; // キーボードからセーブ・ロードできるように
223b71206888 Initial import
thib
parents:
diff changeset
209 extern bool pressAreq;
223b71206888 Initial import
thib
parents:
diff changeset
210
223b71206888 Initial import
thib
parents:
diff changeset
211 void Scn2k::Elapsed(unsigned int current_time) {
223b71206888 Initial import
thib
parents:
diff changeset
212 SetWakeup(current_time + 10); // 10msに一回シナリオスクリプト解釈
52
15a18fbe6f21 * Known bugs added to the README
thib
parents: 50
diff changeset
213 if (script == NULL) return;
0
223b71206888 Initial import
thib
parents:
diff changeset
214 //VarInfo info; info.type = 6; info.number = 0; // PB の「一回ゲームを開始したことがある」フラグ
223b71206888 Initial import
thib
parents:
diff changeset
215 //flag.Set(info,1);
223b71206888 Initial import
thib
parents:
diff changeset
216 //info.type = 0; info.number = 604; // Princess Bride: クリア対象設定フラグ (聖)
223b71206888 Initial import
thib
parents:
diff changeset
217 //flag.Set(info, 1);
223b71206888 Initial import
thib
parents:
diff changeset
218
223b71206888 Initial import
thib
parents:
diff changeset
219
223b71206888 Initial import
thib
parents:
diff changeset
220 Cmd cmd(flag, system_version);
223b71206888 Initial import
thib
parents:
diff changeset
221 int cnt1;
223b71206888 Initial import
thib
parents:
diff changeset
222 int cnt2 = 1000; // flag / jump / flag 系コマンドの最大実行回数
223b71206888 Initial import
thib
parents:
diff changeset
223
223b71206888 Initial import
thib
parents:
diff changeset
224 /* XXX */
223b71206888 Initial import
thib
parents:
diff changeset
225 if (save_req) {
223b71206888 Initial import
thib
parents:
diff changeset
226 save_req = false;
223b71206888 Initial import
thib
parents:
diff changeset
227 load_req = false;
223b71206888 Initial import
thib
parents:
diff changeset
228 cmd.cmd_type = CMD_SAVEREQ;
223b71206888 Initial import
thib
parents:
diff changeset
229 } else if (load_req) {
223b71206888 Initial import
thib
parents:
diff changeset
230 load_req = false;
223b71206888 Initial import
thib
parents:
diff changeset
231 save_req = false;
223b71206888 Initial import
thib
parents:
diff changeset
232 cmd.cmd_type = CMD_LOADREQ;
223b71206888 Initial import
thib
parents:
diff changeset
233 }
223b71206888 Initial import
thib
parents:
diff changeset
234 if (pressAreq) {
223b71206888 Initial import
thib
parents:
diff changeset
235 pressAreq = false;
223b71206888 Initial import
thib
parents:
diff changeset
236 LoadRollback(cmd);
223b71206888 Initial import
thib
parents:
diff changeset
237 return;
223b71206888 Initial import
thib
parents:
diff changeset
238 }
223b71206888 Initial import
thib
parents:
diff changeset
239
223b71206888 Initial import
thib
parents:
diff changeset
240 /* キー入力などに対応 */
223b71206888 Initial import
thib
parents:
diff changeset
241 // メニュー内以外で shift キーが押されたらスキップ開始
223b71206888 Initial import
thib
parents:
diff changeset
242 if ( (skip_mode&SKIP_IN_MENU) == 0) {
223b71206888 Initial import
thib
parents:
diff changeset
243 if (event.pressed(KEY_SHIFT)) {
223b71206888 Initial import
thib
parents:
diff changeset
244 if (skip_mode & SKIP_TEXT) {
223b71206888 Initial import
thib
parents:
diff changeset
245 ; // スキップ中ならなにもしない
223b71206888 Initial import
thib
parents:
diff changeset
246 } else {
223b71206888 Initial import
thib
parents:
diff changeset
247 SetSkipMode(SkipMode(SKIP_TEXT | SKIP_GRP_NOEFFEC | SKIPEND_KEY));
223b71206888 Initial import
thib
parents:
diff changeset
248 }
223b71206888 Initial import
thib
parents:
diff changeset
249 } else {
223b71206888 Initial import
thib
parents:
diff changeset
250 if ( skip_mode & SKIPEND_KEY) {
223b71206888 Initial import
thib
parents:
diff changeset
251 if ( (skip_mode & SKIPEND_TEXT) && (skip_mode & SKIP_TEXT)) {
223b71206888 Initial import
thib
parents:
diff changeset
252 SkipMode new_skip_mode = SkipMode(skip_mode & (~SKIPEND_KEY));
223b71206888 Initial import
thib
parents:
diff changeset
253 if ( (new_skip_mode & SKIP_GRP_FAST) || (new_skip_mode & SKIP_GRP_NODRAW)) {
223b71206888 Initial import
thib
parents:
diff changeset
254 new_skip_mode = SkipMode(skip_mode & (~SKIP_GRP_NOEFFEC));
223b71206888 Initial import
thib
parents:
diff changeset
255 }
223b71206888 Initial import
thib
parents:
diff changeset
256 SetSkipMode(new_skip_mode);
223b71206888 Initial import
thib
parents:
diff changeset
257 } else {
223b71206888 Initial import
thib
parents:
diff changeset
258 SetSkipMode(SKIP_NO);
223b71206888 Initial import
thib
parents:
diff changeset
259 }
223b71206888 Initial import
thib
parents:
diff changeset
260 }
223b71206888 Initial import
thib
parents:
diff changeset
261 }
223b71206888 Initial import
thib
parents:
diff changeset
262 }
223b71206888 Initial import
thib
parents:
diff changeset
263
223b71206888 Initial import
thib
parents:
diff changeset
264 for (cnt1=0; cnt1<20; cnt1++) { // 一回につき 20 個のコマンド実行
223b71206888 Initial import
thib
parents:
diff changeset
265 // 他のコマンド実行中なら終了
223b71206888 Initial import
thib
parents:
diff changeset
266 if ( (cmd.cmd_type == CMD_NOP && SysWait(cmd)) ||
223b71206888 Initial import
thib
parents:
diff changeset
267 // (cmd.cmd_type == CMD_NOP && text_exec.Wait(current_time, cmd)) ||
223b71206888 Initial import
thib
parents:
diff changeset
268 // (cmd.cmd_type == CMD_NOP && grp_exec.Wait(current_time, cmd))) {
223b71206888 Initial import
thib
parents:
diff changeset
269 (cmd.cmd_type == CMD_NOP && grp_exec.Wait(current_time, cmd)) ||
223b71206888 Initial import
thib
parents:
diff changeset
270 (cmd.cmd_type == CMD_NOP && text_exec.Wait(current_time, cmd))) {
223b71206888 Initial import
thib
parents:
diff changeset
271 break;
223b71206888 Initial import
thib
parents:
diff changeset
272 }
223b71206888 Initial import
thib
parents:
diff changeset
273 // コマンド読み込み
223b71206888 Initial import
thib
parents:
diff changeset
274 for (; cnt2 > 0; cnt2--) {
223b71206888 Initial import
thib
parents:
diff changeset
275 scn_point = script - script_start;
223b71206888 Initial import
thib
parents:
diff changeset
276 eprintf("%d / %d :", script - script_start, script_end-script_start);
223b71206888 Initial import
thib
parents:
diff changeset
277 // fprintf(stderr,"%d: %d / %d :",scn_number, script - script_start, script_end-script_start);
223b71206888 Initial import
thib
parents:
diff changeset
278 cmd.GetCmd(flag, script);
223b71206888 Initial import
thib
parents:
diff changeset
279 // if (cmd.cmd_type != CMD_NOP) {
223b71206888 Initial import
thib
parents:
diff changeset
280 if (0) {
223b71206888 Initial import
thib
parents:
diff changeset
281 fprintf(stderr,"%d / %d : 0x23 - cmd %02x-%02x:%04x:%02x[%2d] \n",
223b71206888 Initial import
thib
parents:
diff changeset
282 scn_point, script_end-script_start,
223b71206888 Initial import
thib
parents:
diff changeset
283 cmd.cmd1,cmd.cmd2,cmd.cmd3,cmd.cmd4,cmd.argc);
52
15a18fbe6f21 * Known bugs added to the README
thib
parents: 50
diff changeset
284 int i;
15a18fbe6f21 * Known bugs added to the README
thib
parents: 50
diff changeset
285 for (i = 0; i<cmd.args.size(); i++) {
0
223b71206888 Initial import
thib
parents:
diff changeset
286 if (i == 0) fprintf(stderr,"\t");
223b71206888 Initial import
thib
parents:
diff changeset
287 VarInfo info = cmd.args[i];
223b71206888 Initial import
thib
parents:
diff changeset
288 if (info.type == TYPE_STR || info.type == TYPE_VARSTR)
223b71206888 Initial import
thib
parents:
diff changeset
289 fprintf(stderr,"\"%s\",", cmd.Str(info));
223b71206888 Initial import
thib
parents:
diff changeset
290 else
223b71206888 Initial import
thib
parents:
diff changeset
291 fprintf(stderr,"%d,",info.value);
223b71206888 Initial import
thib
parents:
diff changeset
292 }
223b71206888 Initial import
thib
parents:
diff changeset
293 fprintf(stderr,"\n");
223b71206888 Initial import
thib
parents:
diff changeset
294 }
223b71206888 Initial import
thib
parents:
diff changeset
295 cmd.scn = scn_number;
223b71206888 Initial import
thib
parents:
diff changeset
296 cmd.pos = scn_point;
223b71206888 Initial import
thib
parents:
diff changeset
297 if (cmd.IsError()) break;
223b71206888 Initial import
thib
parents:
diff changeset
298 if (cmd.cmd_type == CMD_NOP) continue;
223b71206888 Initial import
thib
parents:
diff changeset
299 if (cmd.cmd_type == CMD_JMP) {
223b71206888 Initial import
thib
parents:
diff changeset
300 // local jump
223b71206888 Initial import
thib
parents:
diff changeset
301 if (cmd.cmd1 == 0 && cmd.cmd2 == 1 && cmd.cmd3 == 16) {
223b71206888 Initial import
thib
parents:
diff changeset
302 int i;
223b71206888 Initial import
thib
parents:
diff changeset
303 for (i=0; i<cmd.args.size()-1; i++) {
223b71206888 Initial import
thib
parents:
diff changeset
304 VarInfo var;
223b71206888 Initial import
thib
parents:
diff changeset
305 var.type = 11;
223b71206888 Initial import
thib
parents:
diff changeset
306 var.number = i;
223b71206888 Initial import
thib
parents:
diff changeset
307 flag.Set(var, cmd.args[i].value);
223b71206888 Initial import
thib
parents:
diff changeset
308 }
223b71206888 Initial import
thib
parents:
diff changeset
309 cmd.args[0].value = cmd.args[i].value;
223b71206888 Initial import
thib
parents:
diff changeset
310 }
223b71206888 Initial import
thib
parents:
diff changeset
311 if ( cmd.cmd1 == 0 && cmd.cmd2 == 1 && (cmd.cmd3 == 5 || cmd.cmd3 == 8 || cmd.cmd3 == 16) ) { // local call / simple switch
223b71206888 Initial import
thib
parents:
diff changeset
312 int scn_pt = script - script_start;
223b71206888 Initial import
thib
parents:
diff changeset
313 // fprintf(stderr,"\nlocal call %d:%d from %d\n",scn_number,cmd.args[0].value,scn_pt);
223b71206888 Initial import
thib
parents:
diff changeset
314 stack.push_back(StackItem(-1, scn_pt));
223b71206888 Initial import
thib
parents:
diff changeset
315 }
52
15a18fbe6f21 * Known bugs added to the README
thib
parents: 50
diff changeset
316 if (cmd.cmd1 == 0 && cmd.cmd2 == 1 && cmd.cmd3 == 1) {//TODO
0
223b71206888 Initial import
thib
parents:
diff changeset
317 fprintf(stderr,"*** unsupported: cond 1\n");
223b71206888 Initial import
thib
parents:
diff changeset
318 }
223b71206888 Initial import
thib
parents:
diff changeset
319 script = script_start + cmd.args[0].value;
223b71206888 Initial import
thib
parents:
diff changeset
320 if (script < script_start || script >= script_end) {
43
01aa5ddf7dc8 A lot of very minor improvements (deleted some unused variables, and other things like that...)
thib
parents: 19
diff changeset
321 fprintf(stderr,"scn %d pt %d: Cannot jump to %d; fall back to the top\n", scn_number, scn_point, cmd.args[0].value);
0
223b71206888 Initial import
thib
parents:
diff changeset
322 script = script_start;
223b71206888 Initial import
thib
parents:
diff changeset
323 }
223b71206888 Initial import
thib
parents:
diff changeset
324 cmd.clear();
223b71206888 Initial import
thib
parents:
diff changeset
325 continue;
223b71206888 Initial import
thib
parents:
diff changeset
326 }
223b71206888 Initial import
thib
parents:
diff changeset
327 if (flag.Exec(cmd)) continue;
223b71206888 Initial import
thib
parents:
diff changeset
328 break;
223b71206888 Initial import
thib
parents:
diff changeset
329 }
223b71206888 Initial import
thib
parents:
diff changeset
330 if (cmd.IsError()) {
223b71206888 Initial import
thib
parents:
diff changeset
331 fprintf(stderr,"cmd error occured: scn %d pt %d / cur %d",scn_number,scn_point,script-script_start);
223b71206888 Initial import
thib
parents:
diff changeset
332 while(script < script_end) {
223b71206888 Initial import
thib
parents:
diff changeset
333 if (*script == 0x29 && script[1] == 0x0a) {script++;break;}
223b71206888 Initial import
thib
parents:
diff changeset
334 if (*script == 0 && script[1] == 0x0a) {script++;break;}
223b71206888 Initial import
thib
parents:
diff changeset
335 if (*script == 0 && script[1] == 0x23) {script++;break;}
223b71206888 Initial import
thib
parents:
diff changeset
336 script++;
223b71206888 Initial import
thib
parents:
diff changeset
337 fprintf(stderr," -> fall back to %d\n",script-script_start);
223b71206888 Initial import
thib
parents:
diff changeset
338 }
223b71206888 Initial import
thib
parents:
diff changeset
339 const char* dprev = script - 0x60;
223b71206888 Initial import
thib
parents:
diff changeset
340 if (dprev < script_start) dprev = script_start;
223b71206888 Initial import
thib
parents:
diff changeset
341 int ilen = (script-dprev+65)/16;
223b71206888 Initial import
thib
parents:
diff changeset
342 int i; for (i=0; i<ilen; i++) {
223b71206888 Initial import
thib
parents:
diff changeset
343 fprintf(stderr, "%6d: ",dprev-script_start);
223b71206888 Initial import
thib
parents:
diff changeset
344 int j; for (j=0; j<16; j++) {
223b71206888 Initial import
thib
parents:
diff changeset
345 if (dprev >= script_end) break;
223b71206888 Initial import
thib
parents:
diff changeset
346 fprintf(stderr, "%02x ",*(unsigned char*)(dprev));
223b71206888 Initial import
thib
parents:
diff changeset
347 dprev++;
223b71206888 Initial import
thib
parents:
diff changeset
348 }
223b71206888 Initial import
thib
parents:
diff changeset
349 fprintf(stderr, "\n");
223b71206888 Initial import
thib
parents:
diff changeset
350 }
223b71206888 Initial import
thib
parents:
diff changeset
351 break;
223b71206888 Initial import
thib
parents:
diff changeset
352 }
52
15a18fbe6f21 * Known bugs added to the README
thib
parents: 50
diff changeset
353
0
223b71206888 Initial import
thib
parents:
diff changeset
354 if (cmd.cmd_type == CMD_NOP) continue;
223b71206888 Initial import
thib
parents:
diff changeset
355
223b71206888 Initial import
thib
parents:
diff changeset
356 if (cmd.cmd_type == CMD_TEXT && cmd.pos != -1) {
223b71206888 Initial import
thib
parents:
diff changeset
357 set<int>& readflag = text_readflag[scn_number];
223b71206888 Initial import
thib
parents:
diff changeset
358 if (readflag.find(cmd.pos) == readflag.end()) { // 未読テキスト発見
223b71206888 Initial import
thib
parents:
diff changeset
359 readflag.insert(cmd.pos);
223b71206888 Initial import
thib
parents:
diff changeset
360 if (skip_mode & SKIPEND_TEXT) {
223b71206888 Initial import
thib
parents:
diff changeset
361 if (!(skip_mode & SKIPEND_KEY)) SetSkipMode(SKIP_NO);
223b71206888 Initial import
thib
parents:
diff changeset
362 }
223b71206888 Initial import
thib
parents:
diff changeset
363 }
223b71206888 Initial import
thib
parents:
diff changeset
364 }
223b71206888 Initial import
thib
parents:
diff changeset
365 text_exec.Exec(cmd);
223b71206888 Initial import
thib
parents:
diff changeset
366 grp_exec.Exec(cmd);
223b71206888 Initial import
thib
parents:
diff changeset
367 SysExec(cmd);
223b71206888 Initial import
thib
parents:
diff changeset
368 if (cmd.cmd_type == CMD_WAITFRAMEUPDATE) {
223b71206888 Initial import
thib
parents:
diff changeset
369 SetWakeup(Event::Time::FRAME_UPDATE);
223b71206888 Initial import
thib
parents:
diff changeset
370 break;
223b71206888 Initial import
thib
parents:
diff changeset
371 } else if (cmd.cmd_type != CMD_NOP) {
223b71206888 Initial import
thib
parents:
diff changeset
372 #if DEBUG
223b71206888 Initial import
thib
parents:
diff changeset
373 fprintf(stderr,"%d-%d / %d : unsupported command; 0x23 - cmd %02x-%02x:%04x:%02x[%2d] \n",
223b71206888 Initial import
thib
parents:
diff changeset
374 cmd.scn, script - script_start, script_end-script_start,
223b71206888 Initial import
thib
parents:
diff changeset
375 cmd.cmd1,cmd.cmd2,cmd.cmd3,cmd.cmd4,cmd.argc);
52
15a18fbe6f21 * Known bugs added to the README
thib
parents: 50
diff changeset
376 int i;
15a18fbe6f21 * Known bugs added to the README
thib
parents: 50
diff changeset
377 for (i = 0; i<cmd.args.size(); i++) {
0
223b71206888 Initial import
thib
parents:
diff changeset
378 if (i == 0) fprintf(stderr,"\t");
223b71206888 Initial import
thib
parents:
diff changeset
379 VarInfo info = cmd.args[i];
223b71206888 Initial import
thib
parents:
diff changeset
380 if (info.type == TYPE_STR || info.type == TYPE_VARSTR)
223b71206888 Initial import
thib
parents:
diff changeset
381 fprintf(stderr,"\"%s\",", cmd.Str(info));
223b71206888 Initial import
thib
parents:
diff changeset
382 else
223b71206888 Initial import
thib
parents:
diff changeset
383 fprintf(stderr,"%d,",info.value);
223b71206888 Initial import
thib
parents:
diff changeset
384 }
223b71206888 Initial import
thib
parents:
diff changeset
385 fprintf(stderr,"\n");
223b71206888 Initial import
thib
parents:
diff changeset
386 #endif
223b71206888 Initial import
thib
parents:
diff changeset
387 cmd.clear();
223b71206888 Initial import
thib
parents:
diff changeset
388 }
223b71206888 Initial import
thib
parents:
diff changeset
389 }
223b71206888 Initial import
thib
parents:
diff changeset
390 }
223b71206888 Initial import
thib
parents:
diff changeset
391
223b71206888 Initial import
thib
parents:
diff changeset
392 void Scn2k::ShowCursor(void) {
223b71206888 Initial import
thib
parents:
diff changeset
393 HideCursor();
223b71206888 Initial import
thib
parents:
diff changeset
394 char key[1024];
57
6d9146f56ccf * Move some opcodes
Thibaut GIRKA <thib@sitedethib.com>
parents: 53
diff changeset
395 sprintf(key, "#MOUSE_CURSOR.%03d.NAME", mouse_type);
53
ddbcbd000206 * MuSys, AyuSysConfig, FileSearcher (former FILESEARCHER) and KeyHolder (former KEYHOLDER) are now singletons
thib
parents: 52
diff changeset
396 const char* name = config->GetParaStr(key);
52
15a18fbe6f21 * Known bugs added to the README
thib
parents: 50
diff changeset
397 if (name == NULL || name[0] == 0) mouse_surface = DEFAULT_MOUSECURSOR;
57
6d9146f56ccf * Move some opcodes
Thibaut GIRKA <thib@sitedethib.com>
parents: 53
diff changeset
398 else
6d9146f56ccf * Move some opcodes
Thibaut GIRKA <thib@sitedethib.com>
parents: 53
diff changeset
399 mouse_surface = parent.Root().NewSurface("toto", COLOR_MASK);
6d9146f56ccf * Move some opcodes
Thibaut GIRKA <thib@sitedethib.com>
parents: 53
diff changeset
400 if (mouse_surface == NULL)
6d9146f56ccf * Move some opcodes
Thibaut GIRKA <thib@sitedethib.com>
parents: 53
diff changeset
401 mouse_surface = DEFAULT_MOUSECURSOR;
0
223b71206888 Initial import
thib
parents:
diff changeset
402 System::Main::SetCursor(mouse_surface, Rect(8, 8, 8+32, 8+32));
223b71206888 Initial import
thib
parents:
diff changeset
403 }
223b71206888 Initial import
thib
parents:
diff changeset
404
223b71206888 Initial import
thib
parents:
diff changeset
405 void Scn2k::HideCursor(void) {
223b71206888 Initial import
thib
parents:
diff changeset
406 if (mouse_surface) {
223b71206888 Initial import
thib
parents:
diff changeset
407 System::Main::SetCursor(0, Rect(0,0));
223b71206888 Initial import
thib
parents:
diff changeset
408 if (mouse_surface != DEFAULT_MOUSECURSOR)
223b71206888 Initial import
thib
parents:
diff changeset
409 parent.Root().DeleteSurface(mouse_surface);
52
15a18fbe6f21 * Known bugs added to the README
thib
parents: 50
diff changeset
410 mouse_surface = NULL;
0
223b71206888 Initial import
thib
parents:
diff changeset
411 }
223b71206888 Initial import
thib
parents:
diff changeset
412 }
223b71206888 Initial import
thib
parents:
diff changeset
413
223b71206888 Initial import
thib
parents:
diff changeset
414 bool Scn2k::SysWait(Cmd& cmd) {
223b71206888 Initial import
thib
parents:
diff changeset
415 if (menu) {
223b71206888 Initial import
thib
parents:
diff changeset
416 menu->Exec(cmd);
52
15a18fbe6f21 * Known bugs added to the README
thib
parents: 50
diff changeset
417 if (menu->status & Scn2kMenu::MENU_DELETE || menu->pimpl == NULL) {
0
223b71206888 Initial import
thib
parents:
diff changeset
418 delete menu;
52
15a18fbe6f21 * Known bugs added to the README
thib
parents: 50
diff changeset
419 menu = NULL;
0
223b71206888 Initial import
thib
parents:
diff changeset
420 if (! menu_mouseshown) HideCursor();
223b71206888 Initial import
thib
parents:
diff changeset
421 else ShowCursor();
223b71206888 Initial import
thib
parents:
diff changeset
422 SetSkipMode(SkipMode(skip_mode & (~SKIP_IN_MENU) ));
223b71206888 Initial import
thib
parents:
diff changeset
423 }
223b71206888 Initial import
thib
parents:
diff changeset
424 if (cmd.cmd_type == CMD_NOP) return true;
223b71206888 Initial import
thib
parents:
diff changeset
425 else return false; /* exec command */
223b71206888 Initial import
thib
parents:
diff changeset
426 }
223b71206888 Initial import
thib
parents:
diff changeset
427 return false;
223b71206888 Initial import
thib
parents:
diff changeset
428 }
223b71206888 Initial import
thib
parents:
diff changeset
429
223b71206888 Initial import
thib
parents:
diff changeset
430 void DllCall_LB(Cmd& cmd, Flags& flags);
223b71206888 Initial import
thib
parents:
diff changeset
431 void Scn2k::SysExec(Cmd& cmd) {
223b71206888 Initial import
thib
parents:
diff changeset
432 if (cmd.cmd_type == CMD_SYSVAR) {
223b71206888 Initial import
thib
parents:
diff changeset
433 int i;
223b71206888 Initial import
thib
parents:
diff changeset
434 for (i=0; i<cmd.args.size(); i++) {
223b71206888 Initial import
thib
parents:
diff changeset
435 if (cmd.args[i].type == TYPE_SYS) {
223b71206888 Initial import
thib
parents:
diff changeset
436 if (cmd.args[i].number == TYPE_SYS_SYS) {
223b71206888 Initial import
thib
parents:
diff changeset
437 flag.SetSys(cmd.args[i].value);
223b71206888 Initial import
thib
parents:
diff changeset
438 } else if (cmd.args[i].number == TYPE_SYS_SKIPMODE) {
223b71206888 Initial import
thib
parents:
diff changeset
439 SetSkipMode(SkipMode(cmd.args[i].value));
223b71206888 Initial import
thib
parents:
diff changeset
440 }
223b71206888 Initial import
thib
parents:
diff changeset
441 } else if (cmd.args[i].type == TYPE_VARSTR) {
223b71206888 Initial import
thib
parents:
diff changeset
442 flag.SetStr(cmd.args[i].number, cmd.Str(cmd.args[i]));
223b71206888 Initial import
thib
parents:
diff changeset
443 } else {
223b71206888 Initial import
thib
parents:
diff changeset
444 flag.Set(cmd.args[i], cmd.args[i].value);
223b71206888 Initial import
thib
parents:
diff changeset
445 }
223b71206888 Initial import
thib
parents:
diff changeset
446 }
223b71206888 Initial import
thib
parents:
diff changeset
447 cmd.clear();
223b71206888 Initial import
thib
parents:
diff changeset
448 }
223b71206888 Initial import
thib
parents:
diff changeset
449 if (cmd.cmd_type == CMD_SAVEPOINT || cmd.cmd_type == CMD_ROLLBACKPOINT) {
223b71206888 Initial import
thib
parents:
diff changeset
450 if (text_exec.backlog_item.scn != -1) {
223b71206888 Initial import
thib
parents:
diff changeset
451 text_exec.backlog.push_back(text_exec.backlog_item);
223b71206888 Initial import
thib
parents:
diff changeset
452 text_exec.backlog_item.Clear();
223b71206888 Initial import
thib
parents:
diff changeset
453 }
223b71206888 Initial import
thib
parents:
diff changeset
454 save_scn = scn_number;
223b71206888 Initial import
thib
parents:
diff changeset
455 save_point = scn_point;
223b71206888 Initial import
thib
parents:
diff changeset
456 if (!new_rollback_save.empty()) {
223b71206888 Initial import
thib
parents:
diff changeset
457 rollback_save.push_back(new_rollback_save);
223b71206888 Initial import
thib
parents:
diff changeset
458 new_rollback_save = "";
223b71206888 Initial import
thib
parents:
diff changeset
459 }
223b71206888 Initial import
thib
parents:
diff changeset
460 if (cmd.cmd_type == CMD_ROLLBACKPOINT) SaveRollback();
223b71206888 Initial import
thib
parents:
diff changeset
461 cmd.clear();
223b71206888 Initial import
thib
parents:
diff changeset
462 }
223b71206888 Initial import
thib
parents:
diff changeset
463 if (cmd.cmd_type == CMD_SAVEREQ || cmd.cmd_type == CMD_SAVE) {
223b71206888 Initial import
thib
parents:
diff changeset
464 Save(cmd);
223b71206888 Initial import
thib
parents:
diff changeset
465 return;
223b71206888 Initial import
thib
parents:
diff changeset
466 }
223b71206888 Initial import
thib
parents:
diff changeset
467 if (cmd.cmd_type == CMD_LOADREQ || cmd.cmd_type == CMD_LOAD) {
223b71206888 Initial import
thib
parents:
diff changeset
468 Load(cmd);
223b71206888 Initial import
thib
parents:
diff changeset
469 return;
223b71206888 Initial import
thib
parents:
diff changeset
470 }
223b71206888 Initial import
thib
parents:
diff changeset
471 if (cmd.cmd_type == CMD_BACKLOGREQ || cmd.cmd_type == CMD_BACKLOGREQ_FWD) {
223b71206888 Initial import
thib
parents:
diff changeset
472 if (menu) {
223b71206888 Initial import
thib
parents:
diff changeset
473 fprintf(stderr,"BACKLOG_REQ requested!!!\n");
223b71206888 Initial import
thib
parents:
diff changeset
474 return;
223b71206888 Initial import
thib
parents:
diff changeset
475 }
223b71206888 Initial import
thib
parents:
diff changeset
476 if (cmd.cmd_type == CMD_BACKLOGREQ_FWD) {
223b71206888 Initial import
thib
parents:
diff changeset
477 cmd.clear(); // backlog mode 以外で fwd を押されてもなにもしない
223b71206888 Initial import
thib
parents:
diff changeset
478 return;
223b71206888 Initial import
thib
parents:
diff changeset
479 }
223b71206888 Initial import
thib
parents:
diff changeset
480 SetSkipMode(SKIP_IN_MENU); // テキストスキップ等はここで中断
223b71206888 Initial import
thib
parents:
diff changeset
481 menu = new Scn2kMenu(Scn2kMenu::MENU_BACKLOG, *this, flag, text_exec, system_version);
223b71206888 Initial import
thib
parents:
diff changeset
482 menu->InitPanel(event, parent);
223b71206888 Initial import
thib
parents:
diff changeset
483 menu->InitTitle(Scn2kSaveTitle(*this));
223b71206888 Initial import
thib
parents:
diff changeset
484 if (mouse_surface) menu_mouseshown = true;
223b71206888 Initial import
thib
parents:
diff changeset
485 else menu_mouseshown = false;
223b71206888 Initial import
thib
parents:
diff changeset
486 ShowCursor();
223b71206888 Initial import
thib
parents:
diff changeset
487 return;
223b71206888 Initial import
thib
parents:
diff changeset
488 }
223b71206888 Initial import
thib
parents:
diff changeset
489 if (cmd.cmd_type == CMD_MENUREQ) {
223b71206888 Initial import
thib
parents:
diff changeset
490 int scn=0, pt=0;
53
ddbcbd000206 * MuSys, AyuSysConfig, FileSearcher (former FILESEARCHER) and KeyHolder (former KEYHOLDER) are now singletons
thib
parents: 52
diff changeset
491 config->GetParam("#CANCELCALL", 2, &scn, &pt);
0
223b71206888 Initial import
thib
parents:
diff changeset
492 if (scn) {
223b71206888 Initial import
thib
parents:
diff changeset
493 // 右クリックされたら global call を行う
223b71206888 Initial import
thib
parents:
diff changeset
494 cmd.cmd_type = CMD_OTHER;
223b71206888 Initial import
thib
parents:
diff changeset
495 cmd.cmd1 = 0;
223b71206888 Initial import
thib
parents:
diff changeset
496 cmd.cmd2 = 1;
223b71206888 Initial import
thib
parents:
diff changeset
497 cmd.cmd3 = 0x0c;
223b71206888 Initial import
thib
parents:
diff changeset
498 cmd.cmd4 = 1;
223b71206888 Initial import
thib
parents:
diff changeset
499 cmd.args.clear();
223b71206888 Initial import
thib
parents:
diff changeset
500 cmd.args.push_back(VarInfo(SCN_INFO_MENU));
223b71206888 Initial import
thib
parents:
diff changeset
501 cmd.args.push_back(0);
223b71206888 Initial import
thib
parents:
diff changeset
502 SetSkipMode(SKIP_IN_MENU); // テキストスキップ等はここで中断
223b71206888 Initial import
thib
parents:
diff changeset
503 }
223b71206888 Initial import
thib
parents:
diff changeset
504 }
223b71206888 Initial import
thib
parents:
diff changeset
505 if (cmd.cmd_type == CMD_SAVECMDGRP || cmd.cmd_type == CMD_SAVECMDGRP_START || cmd.cmd_type == CMD_SAVECMDGRP_ONCE || cmd.cmd_type == CMD_SAVECMD_ONCE) {
223b71206888 Initial import
thib
parents:
diff changeset
506 // 画像コマンド等はスタックに保存し、セーブ時に保存できるようにする
223b71206888 Initial import
thib
parents:
diff changeset
507 if (cmd.cmd_type == CMD_SAVECMDGRP_START) {
223b71206888 Initial import
thib
parents:
diff changeset
508 vector<CmdSimplified>::iterator it, cur;
223b71206888 Initial import
thib
parents:
diff changeset
509 cur = cmd_stack.begin();
223b71206888 Initial import
thib
parents:
diff changeset
510 cmd_stack_str = cmd_stack_str_orig;
223b71206888 Initial import
thib
parents:
diff changeset
511 /* 画像関連コマンド以外を別にする */
223b71206888 Initial import
thib
parents:
diff changeset
512 for (it=cmd_stack.begin(); it != cmd_stack.end(); it++) {
223b71206888 Initial import
thib
parents:
diff changeset
513 if (it->type != CMD_SAVECMDGRP && it->type != CMD_SAVECMDGRP_START && it->type != CMD_SAVECMDGRP_ONCE) {
223b71206888 Initial import
thib
parents:
diff changeset
514 cur->copy(*it, cmd_stack_str);
223b71206888 Initial import
thib
parents:
diff changeset
515 cur++;
223b71206888 Initial import
thib
parents:
diff changeset
516 }
223b71206888 Initial import
thib
parents:
diff changeset
517 }
223b71206888 Initial import
thib
parents:
diff changeset
518 cmd_stack.erase(cur, cmd_stack.end());
223b71206888 Initial import
thib
parents:
diff changeset
519 }
223b71206888 Initial import
thib
parents:
diff changeset
520 if (cmd.cmd_type == CMD_SAVECMD_ONCE || cmd.cmd_type == CMD_SAVECMDGRP_ONCE) { // 同じコマンドがあれば削除する
223b71206888 Initial import
thib
parents:
diff changeset
521 vector<CmdSimplified>::iterator it;
223b71206888 Initial import
thib
parents:
diff changeset
522 for (it = cmd_stack.end(); it != cmd_stack.begin(); ) {
223b71206888 Initial import
thib
parents:
diff changeset
523 --it;
223b71206888 Initial import
thib
parents:
diff changeset
524 if (it->cmd1 == cmd.cmd1 && it->cmd2 == cmd.cmd2 && it->cmd3 == cmd.cmd3 && it->cmd4 == cmd.cmd4) {
223b71206888 Initial import
thib
parents:
diff changeset
525 cmd_stack.erase(it);
223b71206888 Initial import
thib
parents:
diff changeset
526 break;
223b71206888 Initial import
thib
parents:
diff changeset
527 }
223b71206888 Initial import
thib
parents:
diff changeset
528 }
223b71206888 Initial import
thib
parents:
diff changeset
529 }
223b71206888 Initial import
thib
parents:
diff changeset
530 CmdSimplified cmd_item;
223b71206888 Initial import
thib
parents:
diff changeset
531 cmd.write(cmd_item, cmd_stack_str);
223b71206888 Initial import
thib
parents:
diff changeset
532 cmd_stack.push_back(cmd_item);
223b71206888 Initial import
thib
parents:
diff changeset
533 cmd.clear();
223b71206888 Initial import
thib
parents:
diff changeset
534 if (cmd_stack_str > cmd_stack_str_orig + 30000) { // char cmd_stack_str_orig[32768]
223b71206888 Initial import
thib
parents:
diff changeset
535 fprintf(stderr,"Error in Scn2k::SysExec: too long cmdstack (%d): stack string overflow\n",cmd_stack.size());
223b71206888 Initial import
thib
parents:
diff changeset
536 cmd_stack_str = cmd_stack_str_orig;
223b71206888 Initial import
thib
parents:
diff changeset
537 cmd_stack.clear();
223b71206888 Initial import
thib
parents:
diff changeset
538 }
223b71206888 Initial import
thib
parents:
diff changeset
539 }
223b71206888 Initial import
thib
parents:
diff changeset
540 if (cmd.cmd_type != CMD_OTHER) return;
223b71206888 Initial import
thib
parents:
diff changeset
541 if (cmd.cmd1 == 0 && cmd.cmd2 == 1) {
223b71206888 Initial import
thib
parents:
diff changeset
542 if (cmd.cmd3 == 0x0b) { // global jump
6
2c890434e30f Add call_no in global jumps
thib
parents: 0
diff changeset
543 int call_no = 0;
15
38226842bac8 Fixed new_pt in global calls
thib
parents: 12
diff changeset
544 if (cmd.args.size() >= 2) call_no = cmd.args[1].value;
0
223b71206888 Initial import
thib
parents:
diff changeset
545 eprintf("global jump to %d\n",cmd.args[0].value);
6
2c890434e30f Add call_no in global jumps
thib
parents: 0
diff changeset
546 if (! ChangeScript(cmd.args[0].value, call_no)) return; // 読み込めない; abort.
0
223b71206888 Initial import
thib
parents:
diff changeset
547 cmd.clear();
223b71206888 Initial import
thib
parents:
diff changeset
548 } else if (cmd.cmd3 == 0x0c || cmd.cmd3 == 0x12) { // call (0x12 の方は微妙)
223b71206888 Initial import
thib
parents:
diff changeset
549 int new_scn = cmd.args[0].value;
223b71206888 Initial import
thib
parents:
diff changeset
550 int new_pt = 0;
15
38226842bac8 Fixed new_pt in global calls
thib
parents: 12
diff changeset
551 if (cmd.args.size() >= 2) { // subroutine number が付く
0
223b71206888 Initial import
thib
parents:
diff changeset
552 // 引数が付くのもあるらしい
223b71206888 Initial import
thib
parents:
diff changeset
553 new_pt = cmd.args[1].value;
223b71206888 Initial import
thib
parents:
diff changeset
554 }
223b71206888 Initial import
thib
parents:
diff changeset
555 if (new_scn == SCN_INFO_MENU) { // menu call
53
ddbcbd000206 * MuSys, AyuSysConfig, FileSearcher (former FILESEARCHER) and KeyHolder (former KEYHOLDER) are now singletons
thib
parents: 52
diff changeset
556 config->GetParam("#CANCELCALL", 2, &new_scn, &new_pt);
0
223b71206888 Initial import
thib
parents:
diff changeset
557 stack.push_back(StackItem(SCN_INFO, SCN_INFO_MENU)); // menu call を示す特殊な記号
223b71206888 Initial import
thib
parents:
diff changeset
558 } else {
223b71206888 Initial import
thib
parents:
diff changeset
559 int i;
223b71206888 Initial import
thib
parents:
diff changeset
560 VarInfo var;
223b71206888 Initial import
thib
parents:
diff changeset
561 // ローカル変数を伴う subroutine call
223b71206888 Initial import
thib
parents:
diff changeset
562 var.type = 11;
223b71206888 Initial import
thib
parents:
diff changeset
563 var.number = 0;
223b71206888 Initial import
thib
parents:
diff changeset
564 int saved_vars = 0;
223b71206888 Initial import
thib
parents:
diff changeset
565 for (i=0; i<40; i++) {
223b71206888 Initial import
thib
parents:
diff changeset
566 int val = flag.Get(var.type, i);
223b71206888 Initial import
thib
parents:
diff changeset
567 if (val != 0) {
223b71206888 Initial import
thib
parents:
diff changeset
568 stack.push_back(StackItem(SCN_INFO_LOCALS + i, val));
223b71206888 Initial import
thib
parents:
diff changeset
569 saved_vars++;
223b71206888 Initial import
thib
parents:
diff changeset
570 }
223b71206888 Initial import
thib
parents:
diff changeset
571 }
223b71206888 Initial import
thib
parents:
diff changeset
572 var.type = TYPE_VARLOCSTR;
223b71206888 Initial import
thib
parents:
diff changeset
573 for (i=0; i<3; i++) {
223b71206888 Initial import
thib
parents:
diff changeset
574 string s = flag.Str(var.type, i);
223b71206888 Initial import
thib
parents:
diff changeset
575 if (s.size()) {
223b71206888 Initial import
thib
parents:
diff changeset
576 int sp = stack_strbuffer.size();
223b71206888 Initial import
thib
parents:
diff changeset
577 stack.push_back(StackItem(SCN_INFO_LOCALSTR+i, sp));
223b71206888 Initial import
thib
parents:
diff changeset
578 stack_strbuffer.push_back(s);
223b71206888 Initial import
thib
parents:
diff changeset
579 saved_vars++;
223b71206888 Initial import
thib
parents:
diff changeset
580 }
223b71206888 Initial import
thib
parents:
diff changeset
581 }
223b71206888 Initial import
thib
parents:
diff changeset
582 stack.push_back(StackItem(SCN_INFO, SCN_INFO_LOCALS + saved_vars));
223b71206888 Initial import
thib
parents:
diff changeset
583
223b71206888 Initial import
thib
parents:
diff changeset
584 var.type = 11;
223b71206888 Initial import
thib
parents:
diff changeset
585 var.number = 0;
223b71206888 Initial import
thib
parents:
diff changeset
586 // 特殊な subroutine call なので、余計な情報を引数に渡す
223b71206888 Initial import
thib
parents:
diff changeset
587 for (i=2; i<cmd.args.size(); i++) {
223b71206888 Initial import
thib
parents:
diff changeset
588 flag.Set(var, cmd.args[i].value);
223b71206888 Initial import
thib
parents:
diff changeset
589 // fprintf(stderr,"<%d:%d>=%d;",var.type,var.number,cmd.args[i].value);
223b71206888 Initial import
thib
parents:
diff changeset
590 var.number++;
223b71206888 Initial import
thib
parents:
diff changeset
591 }
223b71206888 Initial import
thib
parents:
diff changeset
592 // fprintf(stderr,"%d; ",stack.size());
223b71206888 Initial import
thib
parents:
diff changeset
593 }
223b71206888 Initial import
thib
parents:
diff changeset
594 int scn_pt = script - script_start;
223b71206888 Initial import
thib
parents:
diff changeset
595 stack.push_back(StackItem(scn_number, scn_pt));
223b71206888 Initial import
thib
parents:
diff changeset
596 // fprintf(stderr,"\nglobal call %d:%d from %d:%d\n",new_scn,new_pt,scn_number,scn_pt);
223b71206888 Initial import
thib
parents:
diff changeset
597 eprintf("global call to %d, %d\n",new_scn, new_pt);
223b71206888 Initial import
thib
parents:
diff changeset
598 if (! ChangeScript(new_scn, new_pt)) return; // 読み込めない; abort.
223b71206888 Initial import
thib
parents:
diff changeset
599 cmd.clear();
223b71206888 Initial import
thib
parents:
diff changeset
600 } else if (cmd.cmd3 == 0x65) { // 文字列の返り値をセットする
223b71206888 Initial import
thib
parents:
diff changeset
601 int arg1 = cmd.args[0].value;
223b71206888 Initial import
thib
parents:
diff changeset
602 string s = cmd.Str(cmd.args[1]);
223b71206888 Initial import
thib
parents:
diff changeset
603 int sp = stack_strbuffer.size();
223b71206888 Initial import
thib
parents:
diff changeset
604 stack.push_back(StackItem(SCN_INFO_RETSTR+arg1, sp));
223b71206888 Initial import
thib
parents:
diff changeset
605 stack_strbuffer.push_back(s);
223b71206888 Initial import
thib
parents:
diff changeset
606 cmd.clear();
223b71206888 Initial import
thib
parents:
diff changeset
607 } else if (cmd.cmd3 == 0x0d || cmd.cmd3 == 0x0a || cmd.cmd3 == 0x11 || cmd.cmd3 == 0x13) { // return (0a: local return) (0x13はよくわからない)
223b71206888 Initial import
thib
parents:
diff changeset
608 // fprintf(stderr,"global return : stack size %d\n",stack.size());
223b71206888 Initial import
thib
parents:
diff changeset
609 if (stack.empty()) {
223b71206888 Initial import
thib
parents:
diff changeset
610 cmd.clear();
223b71206888 Initial import
thib
parents:
diff changeset
611 return; // スタックがおかしい:abort
223b71206888 Initial import
thib
parents:
diff changeset
612 }
223b71206888 Initial import
thib
parents:
diff changeset
613 map<int, string> retstr;
223b71206888 Initial import
thib
parents:
diff changeset
614 while( (!stack.empty()) && stack.back().scn_number >= SCN_INFO_RETSTR) {
223b71206888 Initial import
thib
parents:
diff changeset
615 int ret_num = stack.back().scn_number - SCN_INFO_RETSTR;
223b71206888 Initial import
thib
parents:
diff changeset
616 // fprintf(stderr,"\nRetStr;");
223b71206888 Initial import
thib
parents:
diff changeset
617 string str = stack_strbuffer.back();
223b71206888 Initial import
thib
parents:
diff changeset
618 stack_strbuffer.pop_back();
223b71206888 Initial import
thib
parents:
diff changeset
619 retstr[ret_num] = str;
223b71206888 Initial import
thib
parents:
diff changeset
620 stack.pop_back();
223b71206888 Initial import
thib
parents:
diff changeset
621 }
223b71206888 Initial import
thib
parents:
diff changeset
622 if (stack.empty()) {
223b71206888 Initial import
thib
parents:
diff changeset
623 cmd.clear();
223b71206888 Initial import
thib
parents:
diff changeset
624 return; // スタックがおかしい:abort
223b71206888 Initial import
thib
parents:
diff changeset
625 }
223b71206888 Initial import
thib
parents:
diff changeset
626 StackItem s = stack.back();
223b71206888 Initial import
thib
parents:
diff changeset
627 stack.pop_back();
223b71206888 Initial import
thib
parents:
diff changeset
628 bool localvar_init = false;
223b71206888 Initial import
thib
parents:
diff changeset
629 while( (!stack.empty()) && stack.back().scn_number == SCN_INFO) {
223b71206888 Initial import
thib
parents:
diff changeset
630 int mode = stack.back().scn_pt;
223b71206888 Initial import
thib
parents:
diff changeset
631 stack.pop_back();
223b71206888 Initial import
thib
parents:
diff changeset
632 if (mode == SCN_INFO_MENU) {
223b71206888 Initial import
thib
parents:
diff changeset
633 // fprintf(stderr,"\nInfo Menu;");
223b71206888 Initial import
thib
parents:
diff changeset
634 // menu モード終了
223b71206888 Initial import
thib
parents:
diff changeset
635 SetSkipMode(SkipMode(skip_mode & (~SKIP_IN_MENU) ));
223b71206888 Initial import
thib
parents:
diff changeset
636 } else if (mode >= SCN_INFO_LOCALS && mode <= SCN_INFO_LOCALS+50) {
223b71206888 Initial import
thib
parents:
diff changeset
637 // fprintf(stderr,"\nInfo Local;");
223b71206888 Initial import
thib
parents:
diff changeset
638 int i;
223b71206888 Initial import
thib
parents:
diff changeset
639 // ローカル変数を元に戻す
223b71206888 Initial import
thib
parents:
diff changeset
640 VarInfo var;
223b71206888 Initial import
thib
parents:
diff changeset
641 var.type = 11;
223b71206888 Initial import
thib
parents:
diff changeset
642 var.number = 0;
223b71206888 Initial import
thib
parents:
diff changeset
643 for (i=0; i<40; i++) {
223b71206888 Initial import
thib
parents:
diff changeset
644 var.number = i;
223b71206888 Initial import
thib
parents:
diff changeset
645 flag.Set(var, 0);
223b71206888 Initial import
thib
parents:
diff changeset
646 }
223b71206888 Initial import
thib
parents:
diff changeset
647 var.type = TYPE_VARLOCSTR;
223b71206888 Initial import
thib
parents:
diff changeset
648 for (i=0; i<3; i++) {
223b71206888 Initial import
thib
parents:
diff changeset
649 var.number = i;
223b71206888 Initial import
thib
parents:
diff changeset
650 flag.SetStr(var, "");
223b71206888 Initial import
thib
parents:
diff changeset
651 }
223b71206888 Initial import
thib
parents:
diff changeset
652 int args = mode - SCN_INFO_LOCALS;
223b71206888 Initial import
thib
parents:
diff changeset
653 // fprintf(stderr," args = %d; ",args);
223b71206888 Initial import
thib
parents:
diff changeset
654 for (i=0; i<args; i++) {
223b71206888 Initial import
thib
parents:
diff changeset
655 if (stack.empty() || stack.back().scn_number < SCN_INFO) {
223b71206888 Initial import
thib
parents:
diff changeset
656 fprintf(stderr,"Fatal : Invalid stack found in preserved local variables!\n");
223b71206888 Initial import
thib
parents:
diff changeset
657 break;
223b71206888 Initial import
thib
parents:
diff changeset
658 }
223b71206888 Initial import
thib
parents:
diff changeset
659 var.number = stack.back().scn_number;
223b71206888 Initial import
thib
parents:
diff changeset
660 // fprintf(stderr,"%d:%d; ",stack.back().scn_number,stack.back().scn_pt);
223b71206888 Initial import
thib
parents:
diff changeset
661 if (var.number >= SCN_INFO_LOCALS && var.number < SCN_INFO_LOCALSTR) {
223b71206888 Initial import
thib
parents:
diff changeset
662 var.type = 11;
223b71206888 Initial import
thib
parents:
diff changeset
663 var.number -= SCN_INFO_LOCALS;
223b71206888 Initial import
thib
parents:
diff changeset
664 flag.Set(var, stack.back().scn_pt);
223b71206888 Initial import
thib
parents:
diff changeset
665 } else if (var.number >= SCN_INFO_LOCALSTR && var.number < SCN_INFO_RETSTR) {
223b71206888 Initial import
thib
parents:
diff changeset
666 var.type = TYPE_VARLOCSTR;
223b71206888 Initial import
thib
parents:
diff changeset
667 var.number -= SCN_INFO_LOCALSTR;
223b71206888 Initial import
thib
parents:
diff changeset
668 flag.SetStr(var, stack_strbuffer.back());
223b71206888 Initial import
thib
parents:
diff changeset
669 stack_strbuffer.pop_back();
223b71206888 Initial import
thib
parents:
diff changeset
670 }
223b71206888 Initial import
thib
parents:
diff changeset
671 stack.pop_back();
223b71206888 Initial import
thib
parents:
diff changeset
672 }
223b71206888 Initial import
thib
parents:
diff changeset
673 }
223b71206888 Initial import
thib
parents:
diff changeset
674 // fprintf(stderr,"stack size %d string size %d\n",stack.size(),stack_strbuffer.size());
223b71206888 Initial import
thib
parents:
diff changeset
675 }
223b71206888 Initial import
thib
parents:
diff changeset
676 if (cmd.cmd3 == 0x11 || cmd.cmd3 == 0x13) {
223b71206888 Initial import
thib
parents:
diff changeset
677 // fprintf(stderr,"\nSet RetLocal;");
223b71206888 Initial import
thib
parents:
diff changeset
678 // 返り値をセットする
223b71206888 Initial import
thib
parents:
diff changeset
679 map<int,string>::iterator it;
223b71206888 Initial import
thib
parents:
diff changeset
680 VarInfo var;
223b71206888 Initial import
thib
parents:
diff changeset
681 var.type = TYPE_VARLOCSTR;
223b71206888 Initial import
thib
parents:
diff changeset
682 for (it=retstr.begin(); it!=retstr.end(); it++) {
223b71206888 Initial import
thib
parents:
diff changeset
683 var.number = it->first;
223b71206888 Initial import
thib
parents:
diff changeset
684 flag.SetStr(var, it->second);
223b71206888 Initial import
thib
parents:
diff changeset
685 }
223b71206888 Initial import
thib
parents:
diff changeset
686 var.type = 11;
223b71206888 Initial import
thib
parents:
diff changeset
687 // fprintf(stderr,"return : cmd.cmd3 == 0x11; size %d\n",cmd.args.size());
223b71206888 Initial import
thib
parents:
diff changeset
688 if (cmd.args.size() == 1) {
223b71206888 Initial import
thib
parents:
diff changeset
689 // fprintf(stderr,"return value %d\n",cmd.args[0].value);
223b71206888 Initial import
thib
parents:
diff changeset
690 flag.SetSys(cmd.args[0].value);
223b71206888 Initial import
thib
parents:
diff changeset
691 } else {
223b71206888 Initial import
thib
parents:
diff changeset
692 int i;for (i=0; i<cmd.args.size(); i++) {
223b71206888 Initial import
thib
parents:
diff changeset
693 var.number = i;
223b71206888 Initial import
thib
parents:
diff changeset
694 flag.Set(var, cmd.args[i].value);
223b71206888 Initial import
thib
parents:
diff changeset
695 }
223b71206888 Initial import
thib
parents:
diff changeset
696 }
223b71206888 Initial import
thib
parents:
diff changeset
697 }
223b71206888 Initial import
thib
parents:
diff changeset
698 // fprintf(stderr,"global return : return to %d:%d\n",s.scn_number,s.scn_pt);
223b71206888 Initial import
thib
parents:
diff changeset
699 // fprintf(stderr,"\nglobal return %d:%d from %d:%d\n",s.scn_number,s.scn_pt,scn_number, script - script_start);
223b71206888 Initial import
thib
parents:
diff changeset
700 if (s.scn_number != -1) {
223b71206888 Initial import
thib
parents:
diff changeset
701 if (! ChangeScript(s.scn_number, 0)) return; // 読み込めない; abort.
223b71206888 Initial import
thib
parents:
diff changeset
702 }
223b71206888 Initial import
thib
parents:
diff changeset
703 script = script_start + s.scn_pt;
223b71206888 Initial import
thib
parents:
diff changeset
704 cmd.clear();
223b71206888 Initial import
thib
parents:
diff changeset
705 }
223b71206888 Initial import
thib
parents:
diff changeset
706 } else if (cmd.cmd1 == 2 && cmd.cmd2 == 1 && cmd.cmd3 == 12) { // DLL Call
53
ddbcbd000206 * MuSys, AyuSysConfig, FileSearcher (former FILESEARCHER) and KeyHolder (former KEYHOLDER) are now singletons
thib
parents: 52
diff changeset
707 const char* regname = config->GetParaStr("#REGNAME");
52
15a18fbe6f21 * Known bugs added to the README
thib
parents: 50
diff changeset
708 const char key_lb[] = "KEY\\LittleBusters";//FIXME: too specific to be here?
0
223b71206888 Initial import
thib
parents:
diff changeset
709 if (strcmp(regname, key_lb) == 0) {
223b71206888 Initial import
thib
parents:
diff changeset
710 DllCall_LB(cmd, flag);
223b71206888 Initial import
thib
parents:
diff changeset
711 cmd.clear();
223b71206888 Initial import
thib
parents:
diff changeset
712 }
223b71206888 Initial import
thib
parents:
diff changeset
713 } else if (cmd.cmd1 == 0 && cmd.cmd2 == 0x04) { // メニューモード
223b71206888 Initial import
thib
parents:
diff changeset
714 if (cmd.cmd3 == 300 || cmd.cmd3 == 301 || cmd.cmd3 == 302) {
223b71206888 Initial import
thib
parents:
diff changeset
715 // メニューからのreturn
223b71206888 Initial import
thib
parents:
diff changeset
716 cmd.cmd2 = 1;
223b71206888 Initial import
thib
parents:
diff changeset
717 cmd.cmd3 = 0x0d;
223b71206888 Initial import
thib
parents:
diff changeset
718 SysExec(cmd);
223b71206888 Initial import
thib
parents:
diff changeset
719 }
223b71206888 Initial import
thib
parents:
diff changeset
720 } else if (cmd.cmd1 == 1 && cmd.cmd2 == 0x04) {
223b71206888 Initial import
thib
parents:
diff changeset
721 if (cmd.cmd3 == 0 && cmd.cmd4 == 0) { // タイトル名設定
223b71206888 Initial import
thib
parents:
diff changeset
722 const char* name = cmd.Str(cmd.args[0]);
52
15a18fbe6f21 * Known bugs added to the README
thib
parents: 50
diff changeset
723 if (name == NULL) name = "";
0
223b71206888 Initial import
thib
parents:
diff changeset
724 window_title = name;
53
ddbcbd000206 * MuSys, AyuSysConfig, FileSearcher (former FILESEARCHER) and KeyHolder (former KEYHOLDER) are now singletons
thib
parents: 52
diff changeset
725 const char* config_name = config->GetParaStr("#CAPTION");
52
15a18fbe6f21 * Known bugs added to the README
thib
parents: 50
diff changeset
726 if (config_name == NULL) config_name = "";
0
223b71206888 Initial import
thib
parents:
diff changeset
727 string setname = kconv(string(config_name) + " " + window_title);
223b71206888 Initial import
thib
parents:
diff changeset
728 parent.Root().SetWindowCaption(setname.c_str());
223b71206888 Initial import
thib
parents:
diff changeset
729 cmd.clear();
223b71206888 Initial import
thib
parents:
diff changeset
730 } else if (cmd.cmd3 == 0x82 && cmd.cmd4 == 0) {
223b71206888 Initial import
thib
parents:
diff changeset
731 /* cmd.cmd3 == 0x82 : マウスの press 状態クリアかも */
223b71206888 Initial import
thib
parents:
diff changeset
732 event.presscount(MOUSE_LEFT);
223b71206888 Initial import
thib
parents:
diff changeset
733 event.presscount(MOUSE_RIGHT);
223b71206888 Initial import
thib
parents:
diff changeset
734 cmd.clear();
223b71206888 Initial import
thib
parents:
diff changeset
735 } else if (cmd.cmd3 == 0x85 && cmd.cmd4 == 0) {
223b71206888 Initial import
thib
parents:
diff changeset
736 int x,y,left,right;
223b71206888 Initial import
thib
parents:
diff changeset
737 event.MousePos(x,y);
223b71206888 Initial import
thib
parents:
diff changeset
738 if (event.presscount(MOUSE_LEFT)) left = 2;
223b71206888 Initial import
thib
parents:
diff changeset
739 else if (event.pressed(MOUSE_LEFT)) left = 1;
223b71206888 Initial import
thib
parents:
diff changeset
740 else left = 0;
223b71206888 Initial import
thib
parents:
diff changeset
741
223b71206888 Initial import
thib
parents:
diff changeset
742 if (event.presscount(MOUSE_RIGHT)) right = 2;
223b71206888 Initial import
thib
parents:
diff changeset
743 else if (event.pressed(MOUSE_RIGHT)) right = 1;
223b71206888 Initial import
thib
parents:
diff changeset
744 else right = 0;
223b71206888 Initial import
thib
parents:
diff changeset
745
223b71206888 Initial import
thib
parents:
diff changeset
746 // eprintf("mouse pos\n");
223b71206888 Initial import
thib
parents:
diff changeset
747 flag.Set(cmd.args[0], x);
223b71206888 Initial import
thib
parents:
diff changeset
748 flag.Set(cmd.args[1], y);
223b71206888 Initial import
thib
parents:
diff changeset
749 flag.Set(cmd.args[2], left);
223b71206888 Initial import
thib
parents:
diff changeset
750 flag.Set(cmd.args[3], right);
223b71206888 Initial import
thib
parents:
diff changeset
751 cmd.clear();
223b71206888 Initial import
thib
parents:
diff changeset
752 } else if (cmd.cmd3 == 0x15e || cmd.cmd3 == 0x161 || cmd.cmd3 == 0x162 || cmd.cmd3 == 0x14c || cmd.cmd3 == 0x7d1) {
223b71206888 Initial import
thib
parents:
diff changeset
753 /* 15e, 161, 162, 14c, 7d1 : なんらかのシステム情報を返す(skip modeなど?) */
223b71206888 Initial import
thib
parents:
diff changeset
754 /* 7d1: == 1 || 14c: == 1 || (15e==1&&161==1&&162==0) || (press_val == 2) : スキップ中? タイトル画面のアニメーション終了 */
223b71206888 Initial import
thib
parents:
diff changeset
755 flag.SetSys(0);
223b71206888 Initial import
thib
parents:
diff changeset
756 cmd.clear();
223b71206888 Initial import
thib
parents:
diff changeset
757 } else if (cmd.cmd3 == 0x4b0) { // 終了
223b71206888 Initial import
thib
parents:
diff changeset
758 System::Main::Quit();
52
15a18fbe6f21 * Known bugs added to the README
thib
parents: 50
diff changeset
759 //script = NULL; script_start = NULL; script_end = NULL;
0
223b71206888 Initial import
thib
parents:
diff changeset
760 cmd.clear();
223b71206888 Initial import
thib
parents:
diff changeset
761 cmd.cmd_type = CMD_WAITFRAMEUPDATE;
223b71206888 Initial import
thib
parents:
diff changeset
762 } else if (cmd.cmd3 == 0x4b4 || cmd.cmd3 == 0x4b5) { // 選択肢巻き戻し
223b71206888 Initial import
thib
parents:
diff changeset
763 LoadRollback(cmd);
223b71206888 Initial import
thib
parents:
diff changeset
764 } else if (cmd.cmd3 == 0x58d) {
223b71206888 Initial import
thib
parents:
diff changeset
765 // 前にロード|セーブされた番号を返す。
16
92765a5661f7 added "new" label on last savegame and corrected StatSaveFile
thib
parents: 15
diff changeset
766 int lastsave;
53
ddbcbd000206 * MuSys, AyuSysConfig, FileSearcher (former FILESEARCHER) and KeyHolder (former KEYHOLDER) are now singletons
thib
parents: 52
diff changeset
767 config->GetParam("#LASTSAVE", 1, &lastsave);
16
92765a5661f7 added "new" label on last savegame and corrected StatSaveFile
thib
parents: 15
diff changeset
768 flag.SetSys(lastsave-1);
0
223b71206888 Initial import
thib
parents:
diff changeset
769 } else if (cmd.cmd3 == 0x585) {
223b71206888 Initial import
thib
parents:
diff changeset
770 // 第一引数の記録された日付、タイトルなどが返される
223b71206888 Initial import
thib
parents:
diff changeset
771 // データがないなら sys に 0が、あるなら 1 が返る
223b71206888 Initial import
thib
parents:
diff changeset
772 int y,m,d,wd,h,min,s,ms;
223b71206888 Initial import
thib
parents:
diff changeset
773 string title;
223b71206888 Initial import
thib
parents:
diff changeset
774 fprintf(stderr,"StatSave %d:",cmd.args[0].value+1);
223b71206888 Initial import
thib
parents:
diff changeset
775 if (StatSaveFile(cmd.args[0].value+1,y,m,d,wd,h,min,s,ms,title) == true) {
223b71206888 Initial import
thib
parents:
diff changeset
776 flag.Set(cmd.args[1], y);
223b71206888 Initial import
thib
parents:
diff changeset
777 flag.Set(cmd.args[2], m);
223b71206888 Initial import
thib
parents:
diff changeset
778 flag.Set(cmd.args[3], d);
223b71206888 Initial import
thib
parents:
diff changeset
779 flag.Set(cmd.args[4], wd);
223b71206888 Initial import
thib
parents:
diff changeset
780 flag.Set(cmd.args[5], h);
223b71206888 Initial import
thib
parents:
diff changeset
781 flag.Set(cmd.args[6], min);
223b71206888 Initial import
thib
parents:
diff changeset
782 flag.Set(cmd.args[7], s);
223b71206888 Initial import
thib
parents:
diff changeset
783 flag.Set(cmd.args[8], ms);
223b71206888 Initial import
thib
parents:
diff changeset
784 if (cmd.args[9].type == TYPE_VARSTR) {
12
2e6a92ed913b Fixes savegames names
thib
parents: 8
diff changeset
785 flag.SetStr(cmd.args[9], kconv_rev(title));
0
223b71206888 Initial import
thib
parents:
diff changeset
786 }
223b71206888 Initial import
thib
parents:
diff changeset
787 flag.SetSys(1);
223b71206888 Initial import
thib
parents:
diff changeset
788 } else {
223b71206888 Initial import
thib
parents:
diff changeset
789 flag.SetSys(0);
223b71206888 Initial import
thib
parents:
diff changeset
790 }
223b71206888 Initial import
thib
parents:
diff changeset
791 cmd.clear();
223b71206888 Initial import
thib
parents:
diff changeset
792 } else if (cmd.cmd3 == 0xc23) { // save
223b71206888 Initial import
thib
parents:
diff changeset
793 Save(cmd);
223b71206888 Initial import
thib
parents:
diff changeset
794 } else if (cmd.cmd3 == 0xc25) { // load
223b71206888 Initial import
thib
parents:
diff changeset
795 Load(cmd);
223b71206888 Initial import
thib
parents:
diff changeset
796 } else if (cmd.cmd3 == 0x4b1 || cmd.cmd3 == 0x4b3) { // menu へ戻る (4b3: バッドエンド)
223b71206888 Initial import
thib
parents:
diff changeset
797 int scn_start;
53
ddbcbd000206 * MuSys, AyuSysConfig, FileSearcher (former FILESEARCHER) and KeyHolder (former KEYHOLDER) are now singletons
thib
parents: 52
diff changeset
798 if (config->GetParam("#SEEN_MENU", 1, &scn_start) == 0) {
0
223b71206888 Initial import
thib
parents:
diff changeset
799 ChangeScript(scn_start, 0);
223b71206888 Initial import
thib
parents:
diff changeset
800 save_scn = 0;
223b71206888 Initial import
thib
parents:
diff changeset
801 save_point = 0;
223b71206888 Initial import
thib
parents:
diff changeset
802 window_title = "";
53
ddbcbd000206 * MuSys, AyuSysConfig, FileSearcher (former FILESEARCHER) and KeyHolder (former KEYHOLDER) are now singletons
thib
parents: 52
diff changeset
803 const char* window_title_config = config->GetParaStr("#CAPTION");
0
223b71206888 Initial import
thib
parents:
diff changeset
804 if (window_title_config) window_title = window_title_config;
223b71206888 Initial import
thib
parents:
diff changeset
805 parent.Root().SetWindowCaption(kconv(window_title).c_str());
223b71206888 Initial import
thib
parents:
diff changeset
806 stack.clear();
223b71206888 Initial import
thib
parents:
diff changeset
807 cmd_stack.clear();
223b71206888 Initial import
thib
parents:
diff changeset
808 cmd_stack_str = cmd_stack_str_orig;
223b71206888 Initial import
thib
parents:
diff changeset
809 flag.Load("");
223b71206888 Initial import
thib
parents:
diff changeset
810 text_exec.Load("");
223b71206888 Initial import
thib
parents:
diff changeset
811 grp_exec.Load("");
223b71206888 Initial import
thib
parents:
diff changeset
812 SetSkipMode(SKIP_NO);
223b71206888 Initial import
thib
parents:
diff changeset
813 }
223b71206888 Initial import
thib
parents:
diff changeset
814 } else if (cmd.cmd3 == 0xcc) {
223b71206888 Initial import
thib
parents:
diff changeset
815 eprintf("show mouse cursor\n");
223b71206888 Initial import
thib
parents:
diff changeset
816 ShowCursor();
223b71206888 Initial import
thib
parents:
diff changeset
817 cmd.clear();
223b71206888 Initial import
thib
parents:
diff changeset
818 } else if (cmd.cmd3 == 0xcd) {
223b71206888 Initial import
thib
parents:
diff changeset
819 eprintf("hide mouse cursor\n");
223b71206888 Initial import
thib
parents:
diff changeset
820 HideCursor();
223b71206888 Initial import
thib
parents:
diff changeset
821 cmd.clear();
223b71206888 Initial import
thib
parents:
diff changeset
822 } else if (cmd.cmd3 == 0xcf) {
223b71206888 Initial import
thib
parents:
diff changeset
823 mouse_type = cmd.args[0].value;
223b71206888 Initial import
thib
parents:
diff changeset
824 eprintf("change mouse cursor : %d\n", mouse_type);
223b71206888 Initial import
thib
parents:
diff changeset
825 if (mouse_surface) ShowCursor();
223b71206888 Initial import
thib
parents:
diff changeset
826 cmd.clear();
223b71206888 Initial import
thib
parents:
diff changeset
827 }
223b71206888 Initial import
thib
parents:
diff changeset
828 }
223b71206888 Initial import
thib
parents:
diff changeset
829
223b71206888 Initial import
thib
parents:
diff changeset
830 }
223b71206888 Initial import
thib
parents:
diff changeset
831
52
15a18fbe6f21 * Known bugs added to the README
thib
parents: 50
diff changeset
832 #include <sys/types.h>
15a18fbe6f21 * Known bugs added to the README
thib
parents: 50
diff changeset
833 #include <sys/stat.h>
15a18fbe6f21 * Known bugs added to the README
thib
parents: 50
diff changeset
834 #include <errno.h>
15a18fbe6f21 * Known bugs added to the README
thib
parents: 50
diff changeset
835 #include <unistd.h>
0
223b71206888 Initial import
thib
parents:
diff changeset
836
223b71206888 Initial import
thib
parents:
diff changeset
837 // セーブファイルの名前をつくる
223b71206888 Initial import
thib
parents:
diff changeset
838 string Scn2k::MakeSaveFile(void) const {
223b71206888 Initial import
thib
parents:
diff changeset
839 struct stat sstatus;
223b71206888 Initial import
thib
parents:
diff changeset
840 string dir = "~/.xkanon";
223b71206888 Initial import
thib
parents:
diff changeset
841
223b71206888 Initial import
thib
parents:
diff changeset
842 if (dir.c_str()[0] == '~' && dir.c_str()[1] == '/') {
223b71206888 Initial import
thib
parents:
diff changeset
843 char* home = getenv("HOME");
52
15a18fbe6f21 * Known bugs added to the README
thib
parents: 50
diff changeset
844 if (home != NULL) {
0
223b71206888 Initial import
thib
parents:
diff changeset
845 string new_dir = string(home) + (dir.c_str()+1);
223b71206888 Initial import
thib
parents:
diff changeset
846 dir = new_dir;
223b71206888 Initial import
thib
parents:
diff changeset
847 }
223b71206888 Initial import
thib
parents:
diff changeset
848 }
223b71206888 Initial import
thib
parents:
diff changeset
849 // savepathにファイル名が入っていれば、それをセーブファイルとして使う
223b71206888 Initial import
thib
parents:
diff changeset
850 if (stat(dir.c_str(), &sstatus) == -1) {
223b71206888 Initial import
thib
parents:
diff changeset
851 if (errno != ENOENT) {
223b71206888 Initial import
thib
parents:
diff changeset
852 fprintf(stderr,"Cannot open save file; dir %s is not directory\n",dir.c_str());
223b71206888 Initial import
thib
parents:
diff changeset
853 return "";
223b71206888 Initial import
thib
parents:
diff changeset
854 }
223b71206888 Initial import
thib
parents:
diff changeset
855 if (mkdir(dir.c_str(), S_IRWXU) != 0 && errno != EEXIST) {
223b71206888 Initial import
thib
parents:
diff changeset
856 fprintf(stderr, "Cannot create directory %s ; Please create manually!!\n",dir.c_str());
223b71206888 Initial import
thib
parents:
diff changeset
857 }
223b71206888 Initial import
thib
parents:
diff changeset
858 } else {
223b71206888 Initial import
thib
parents:
diff changeset
859 if ( (sstatus.st_mode & S_IFMT) == S_IFREG) {
223b71206888 Initial import
thib
parents:
diff changeset
860 return dir;
223b71206888 Initial import
thib
parents:
diff changeset
861 }
223b71206888 Initial import
thib
parents:
diff changeset
862 }
223b71206888 Initial import
thib
parents:
diff changeset
863 // ファイル名を作る
53
ddbcbd000206 * MuSys, AyuSysConfig, FileSearcher (former FILESEARCHER) and KeyHolder (former KEYHOLDER) are now singletons
thib
parents: 52
diff changeset
864 const char* regname = config->GetParaStr("#REGNAME");
0
223b71206888 Initial import
thib
parents:
diff changeset
865
223b71206888 Initial import
thib
parents:
diff changeset
866 char* fname = new char[strlen(regname)+1];
223b71206888 Initial import
thib
parents:
diff changeset
867 /* レジストリ名をファイル名として有効なものにする */
223b71206888 Initial import
thib
parents:
diff changeset
868 int i; for (i=0; regname[i]!=0; i++) {
223b71206888 Initial import
thib
parents:
diff changeset
869 char c = regname[i];
223b71206888 Initial import
thib
parents:
diff changeset
870 if (c == '\\' || c == '/' || c == ':' || c <= 0x20) c = '_';
223b71206888 Initial import
thib
parents:
diff changeset
871 fname[i] = tolower(c);
223b71206888 Initial import
thib
parents:
diff changeset
872 }
223b71206888 Initial import
thib
parents:
diff changeset
873 fname[i] = 0;
223b71206888 Initial import
thib
parents:
diff changeset
874 dir += "/save.";
223b71206888 Initial import
thib
parents:
diff changeset
875 dir += fname;
8
55b577e5f5b5 Some memory leaks fixed
thib
parents: 6
diff changeset
876 delete[] fname;
0
223b71206888 Initial import
thib
parents:
diff changeset
877 return dir;
223b71206888 Initial import
thib
parents:
diff changeset
878 }
52
15a18fbe6f21 * Known bugs added to the README
thib
parents: 50
diff changeset
879
0
223b71206888 Initial import
thib
parents:
diff changeset
880 // セーブファイルの名前をつくる
223b71206888 Initial import
thib
parents:
diff changeset
881 string Scn2kSaveTitle::operator() (int number) const {
223b71206888 Initial import
thib
parents:
diff changeset
882 int y,m,d,wd,h,min,sec,msec;
223b71206888 Initial import
thib
parents:
diff changeset
883 string title;
223b71206888 Initial import
thib
parents:
diff changeset
884 if (! impl.StatSaveFile(number, y,m,d,wd,h,min,sec,msec,title)) {
223b71206888 Initial import
thib
parents:
diff changeset
885 return "";
223b71206888 Initial import
thib
parents:
diff changeset
886 } else {
223b71206888 Initial import
thib
parents:
diff changeset
887 char buf[1024];
223b71206888 Initial import
thib
parents:
diff changeset
888 sprintf(buf, "%2d/%2d %2d:%2d ",m,d,h,min);
223b71206888 Initial import
thib
parents:
diff changeset
889 return string(buf) + title;
223b71206888 Initial import
thib
parents:
diff changeset
890 }
52
15a18fbe6f21 * Known bugs added to the README
thib
parents: 50
diff changeset
891 }
0
223b71206888 Initial import
thib
parents:
diff changeset
892
223b71206888 Initial import
thib
parents:
diff changeset
893 void Scn2k::SaveSys(void) {
223b71206888 Initial import
thib
parents:
diff changeset
894 char buf[1024];
223b71206888 Initial import
thib
parents:
diff changeset
895 string save;
223b71206888 Initial import
thib
parents:
diff changeset
896 string path = MakeSaveFile();
223b71206888 Initial import
thib
parents:
diff changeset
897
53
ddbcbd000206 * MuSys, AyuSysConfig, FileSearcher (former FILESEARCHER) and KeyHolder (former KEYHOLDER) are now singletons
thib
parents: 52
diff changeset
898 sprintf(buf, "KEY=%s\n", config->GetParaStr("#REGNAME"));
52
15a18fbe6f21 * Known bugs added to the README
thib
parents: 50
diff changeset
899 save += buf;
0
223b71206888 Initial import
thib
parents:
diff changeset
900 string save_config;
53
ddbcbd000206 * MuSys, AyuSysConfig, FileSearcher (former FILESEARCHER) and KeyHolder (former KEYHOLDER) are now singletons
thib
parents: 52
diff changeset
901 config->DiffOriginal(save_config);
0
223b71206888 Initial import
thib
parents:
diff changeset
902 save += "CONFIG=";
223b71206888 Initial import
thib
parents:
diff changeset
903 save += save_config;
223b71206888 Initial import
thib
parents:
diff changeset
904 save += "\n";
223b71206888 Initial import
thib
parents:
diff changeset
905 string save_flag; flag.SaveSys(save_flag);
223b71206888 Initial import
thib
parents:
diff changeset
906 save += save_flag;
223b71206888 Initial import
thib
parents:
diff changeset
907 string save_grp; grp_exec.SaveSys(save_grp);
223b71206888 Initial import
thib
parents:
diff changeset
908 save += save_grp;
223b71206888 Initial import
thib
parents:
diff changeset
909 map<int,set<int> >::iterator it;
223b71206888 Initial import
thib
parents:
diff changeset
910 save += "[TextRead]\n";
223b71206888 Initial import
thib
parents:
diff changeset
911 for (it=text_readflag.begin(); it != text_readflag.end(); it++) {
223b71206888 Initial import
thib
parents:
diff changeset
912 set<int>& read_flag = it->second;
223b71206888 Initial import
thib
parents:
diff changeset
913 set<int>::iterator jt;
223b71206888 Initial import
thib
parents:
diff changeset
914 char buf[1024];
223b71206888 Initial import
thib
parents:
diff changeset
915 sprintf(buf,"T<%05d>=",it->first);
223b71206888 Initial import
thib
parents:
diff changeset
916 string save_readflag = buf;
223b71206888 Initial import
thib
parents:
diff changeset
917 for (jt=read_flag.begin(); jt != read_flag.end(); jt++) {
223b71206888 Initial import
thib
parents:
diff changeset
918 sprintf(buf, "%d,", *jt);
223b71206888 Initial import
thib
parents:
diff changeset
919 save_readflag += buf;
223b71206888 Initial import
thib
parents:
diff changeset
920 }
223b71206888 Initial import
thib
parents:
diff changeset
921 save_readflag += "\n";
223b71206888 Initial import
thib
parents:
diff changeset
922 save += save_readflag;
223b71206888 Initial import
thib
parents:
diff changeset
923 }
223b71206888 Initial import
thib
parents:
diff changeset
924
223b71206888 Initial import
thib
parents:
diff changeset
925 path += ".0";
223b71206888 Initial import
thib
parents:
diff changeset
926 FILE* f = fopen(path.c_str(), "w");
52
15a18fbe6f21 * Known bugs added to the README
thib
parents: 50
diff changeset
927 if (f == NULL) {
0
223b71206888 Initial import
thib
parents:
diff changeset
928 fprintf(stderr,"Cannot open save file %s\n",path.c_str());
223b71206888 Initial import
thib
parents:
diff changeset
929 return;
223b71206888 Initial import
thib
parents:
diff changeset
930 }
223b71206888 Initial import
thib
parents:
diff changeset
931 fwrite(save.c_str(), save.length(), 1, f);
223b71206888 Initial import
thib
parents:
diff changeset
932 fclose(f);
223b71206888 Initial import
thib
parents:
diff changeset
933 return;
223b71206888 Initial import
thib
parents:
diff changeset
934 }
223b71206888 Initial import
thib
parents:
diff changeset
935
223b71206888 Initial import
thib
parents:
diff changeset
936 void Scn2k::LoadSys(void) {
223b71206888 Initial import
thib
parents:
diff changeset
937 char buf[1024];
223b71206888 Initial import
thib
parents:
diff changeset
938 string path = MakeSaveFile();
223b71206888 Initial import
thib
parents:
diff changeset
939 path += ".0";
223b71206888 Initial import
thib
parents:
diff changeset
940 FILE* f = fopen(path.c_str(), "r");
52
15a18fbe6f21 * Known bugs added to the README
thib
parents: 50
diff changeset
941 if (f == NULL) {
0
223b71206888 Initial import
thib
parents:
diff changeset
942 fprintf(stderr, "Cannot open save file %s\n",path.c_str());
223b71206888 Initial import
thib
parents:
diff changeset
943 } else {
52
15a18fbe6f21 * Known bugs added to the README
thib
parents: 50
diff changeset
944 fseek(f, 0, SEEK_END);
0
223b71206888 Initial import
thib
parents:
diff changeset
945 int sz = ftell(f);
52
15a18fbe6f21 * Known bugs added to the README
thib
parents: 50
diff changeset
946 fseek(f, 0, SEEK_SET);
0
223b71206888 Initial import
thib
parents:
diff changeset
947 char* savedata = new char[sz+1];
223b71206888 Initial import
thib
parents:
diff changeset
948 fread(savedata, sz, 1, f);
223b71206888 Initial import
thib
parents:
diff changeset
949 savedata[sz] = 0;
223b71206888 Initial import
thib
parents:
diff changeset
950 fclose(f);
223b71206888 Initial import
thib
parents:
diff changeset
951
53
ddbcbd000206 * MuSys, AyuSysConfig, FileSearcher (former FILESEARCHER) and KeyHolder (former KEYHOLDER) are now singletons
thib
parents: 52
diff changeset
952 sprintf(buf, "KEY=%s\n", config->GetParaStr("#REGNAME"));
0
223b71206888 Initial import
thib
parents:
diff changeset
953 if (strncmp(savedata, buf, strlen(buf)) != 0) {
43
01aa5ddf7dc8 A lot of very minor improvements (deleted some unused variables, and other things like that...)
thib
parents: 19
diff changeset
954 fprintf(stderr,"Invalid header in save file %s: it must be started with \"%s\"\n", path.c_str(), buf);
0
223b71206888 Initial import
thib
parents:
diff changeset
955 } else {
223b71206888 Initial import
thib
parents:
diff changeset
956 char* config_str = strstr(savedata, "\nCONFIG=");
223b71206888 Initial import
thib
parents:
diff changeset
957 if (config_str) {
223b71206888 Initial import
thib
parents:
diff changeset
958 config_str += strlen("\nCONFIG=");
223b71206888 Initial import
thib
parents:
diff changeset
959 char* strend = strchr(config_str, '\n');
223b71206888 Initial import
thib
parents:
diff changeset
960 if (strend) {
223b71206888 Initial import
thib
parents:
diff changeset
961 int l = strend - config_str;
223b71206888 Initial import
thib
parents:
diff changeset
962 char* config_copy = new char[l+1];
223b71206888 Initial import
thib
parents:
diff changeset
963 strncpy(config_copy, config_str, l);
223b71206888 Initial import
thib
parents:
diff changeset
964 config_copy[l] = 0;
53
ddbcbd000206 * MuSys, AyuSysConfig, FileSearcher (former FILESEARCHER) and KeyHolder (former KEYHOLDER) are now singletons
thib
parents: 52
diff changeset
965 config->PatchOriginal(config_copy);
0
223b71206888 Initial import
thib
parents:
diff changeset
966 delete[] config_copy;
223b71206888 Initial import
thib
parents:
diff changeset
967 }
223b71206888 Initial import
thib
parents:
diff changeset
968 }
223b71206888 Initial import
thib
parents:
diff changeset
969 flag.LoadSys(savedata);
223b71206888 Initial import
thib
parents:
diff changeset
970 grp_exec.LoadSys(savedata);
223b71206888 Initial import
thib
parents:
diff changeset
971 char* save = strstr(savedata, "\n[TextRead]\n");
223b71206888 Initial import
thib
parents:
diff changeset
972 if (save) {
223b71206888 Initial import
thib
parents:
diff changeset
973 save += strlen("\n[TextRead]\n");
223b71206888 Initial import
thib
parents:
diff changeset
974 do {
223b71206888 Initial import
thib
parents:
diff changeset
975 if (save[0] == '[') break; // next section
223b71206888 Initial import
thib
parents:
diff changeset
976 char* next_save = strchr(save, '\n');
223b71206888 Initial import
thib
parents:
diff changeset
977 if (next_save) {
223b71206888 Initial import
thib
parents:
diff changeset
978 *next_save++ = 0;
223b71206888 Initial import
thib
parents:
diff changeset
979 }
223b71206888 Initial import
thib
parents:
diff changeset
980 // T<XXXXX>=YYY,YYY,YYY,...
223b71206888 Initial import
thib
parents:
diff changeset
981 if (strncmp(save,"T<",2) == 0) {
223b71206888 Initial import
thib
parents:
diff changeset
982 int scn_num = atoi(save+2);
223b71206888 Initial import
thib
parents:
diff changeset
983 set<int>& read_flag = text_readflag[scn_num];
223b71206888 Initial import
thib
parents:
diff changeset
984 save += strlen("T<XXXXX>=");
223b71206888 Initial import
thib
parents:
diff changeset
985 while(save && *save) {
223b71206888 Initial import
thib
parents:
diff changeset
986 if (save[0] >= '0' && save[0] <= '9') {
223b71206888 Initial import
thib
parents:
diff changeset
987 int num = atoi(save);
223b71206888 Initial import
thib
parents:
diff changeset
988 read_flag.insert(num);
223b71206888 Initial import
thib
parents:
diff changeset
989 }
223b71206888 Initial import
thib
parents:
diff changeset
990 save = strchr(save, ',');
223b71206888 Initial import
thib
parents:
diff changeset
991 if (save) save++;
223b71206888 Initial import
thib
parents:
diff changeset
992 }
223b71206888 Initial import
thib
parents:
diff changeset
993 }
223b71206888 Initial import
thib
parents:
diff changeset
994 save = next_save;
223b71206888 Initial import
thib
parents:
diff changeset
995 } while(save);
223b71206888 Initial import
thib
parents:
diff changeset
996 }
223b71206888 Initial import
thib
parents:
diff changeset
997
223b71206888 Initial import
thib
parents:
diff changeset
998 }
223b71206888 Initial import
thib
parents:
diff changeset
999 delete[] savedata;
223b71206888 Initial import
thib
parents:
diff changeset
1000 }
223b71206888 Initial import
thib
parents:
diff changeset
1001
223b71206888 Initial import
thib
parents:
diff changeset
1002 /* 初期化 */
53
ddbcbd000206 * MuSys, AyuSysConfig, FileSearcher (former FILESEARCHER) and KeyHolder (former KEYHOLDER) are now singletons
thib
parents: 52
diff changeset
1003 int scn_start; config->GetParam("#SEEN_START", 1, &scn_start);
0
223b71206888 Initial import
thib
parents:
diff changeset
1004 ChangeScript(scn_start, 0);
223b71206888 Initial import
thib
parents:
diff changeset
1005 save_scn = 0;
223b71206888 Initial import
thib
parents:
diff changeset
1006 save_point = 0;
223b71206888 Initial import
thib
parents:
diff changeset
1007 window_title = "";
53
ddbcbd000206 * MuSys, AyuSysConfig, FileSearcher (former FILESEARCHER) and KeyHolder (former KEYHOLDER) are now singletons
thib
parents: 52
diff changeset
1008 const char* window_title_config = config->GetParaStr("#CAPTION");
0
223b71206888 Initial import
thib
parents:
diff changeset
1009 if (window_title_config) window_title = window_title_config;
223b71206888 Initial import
thib
parents:
diff changeset
1010 parent.Root().SetWindowCaption(kconv(window_title).c_str());
223b71206888 Initial import
thib
parents:
diff changeset
1011 stack.clear();
223b71206888 Initial import
thib
parents:
diff changeset
1012 cmd_stack.clear();
223b71206888 Initial import
thib
parents:
diff changeset
1013 cmd_stack_str = cmd_stack_str_orig;
223b71206888 Initial import
thib
parents:
diff changeset
1014
223b71206888 Initial import
thib
parents:
diff changeset
1015 return;
223b71206888 Initial import
thib
parents:
diff changeset
1016 }
223b71206888 Initial import
thib
parents:
diff changeset
1017
223b71206888 Initial import
thib
parents:
diff changeset
1018 bool Scn2k::StatSaveFile(int num, int& year, int& month, int& day, int& wday, int& hour,int& min, int& sec, int& msec, string& title) const {
223b71206888 Initial import
thib
parents:
diff changeset
1019 char buf[1024];
223b71206888 Initial import
thib
parents:
diff changeset
1020 string path = MakeSaveFile();
19
94fe9153efa5 Enable the 99th save
thib
parents: 16
diff changeset
1021 if (num <= 0 || num > 100) return false;
0
223b71206888 Initial import
thib
parents:
diff changeset
1022 sprintf(buf,".%d",num);
223b71206888 Initial import
thib
parents:
diff changeset
1023 path += buf;
223b71206888 Initial import
thib
parents:
diff changeset
1024
223b71206888 Initial import
thib
parents:
diff changeset
1025 struct stat sb;
223b71206888 Initial import
thib
parents:
diff changeset
1026 if (stat(path.c_str(), &sb) == -1) return false;
223b71206888 Initial import
thib
parents:
diff changeset
1027 struct tm* t = localtime(&sb.st_mtime);
16
92765a5661f7 added "new" label on last savegame and corrected StatSaveFile
thib
parents: 15
diff changeset
1028 year = t->tm_year;
0
223b71206888 Initial import
thib
parents:
diff changeset
1029 month = t->tm_mon + 1;
223b71206888 Initial import
thib
parents:
diff changeset
1030 day = t->tm_mday;
223b71206888 Initial import
thib
parents:
diff changeset
1031 hour = t->tm_hour;
223b71206888 Initial import
thib
parents:
diff changeset
1032 min = t->tm_min;
16
92765a5661f7 added "new" label on last savegame and corrected StatSaveFile
thib
parents: 15
diff changeset
1033 sec = t->tm_sec;
92765a5661f7 added "new" label on last savegame and corrected StatSaveFile
thib
parents: 15
diff changeset
1034 msec = 0;
0
223b71206888 Initial import
thib
parents:
diff changeset
1035 /* タイトルの取得 */
223b71206888 Initial import
thib
parents:
diff changeset
1036 FILE* savefile = fopen(path.c_str(), "rb");
52
15a18fbe6f21 * Known bugs added to the README
thib
parents: 50
diff changeset
1037 if (savefile == NULL) return false;
0
223b71206888 Initial import
thib
parents:
diff changeset
1038 char regname[1024];
53
ddbcbd000206 * MuSys, AyuSysConfig, FileSearcher (former FILESEARCHER) and KeyHolder (former KEYHOLDER) are now singletons
thib
parents: 52
diff changeset
1039 sprintf(regname, "KEY=%s\n", config->GetParaStr("#REGNAME"));
0
223b71206888 Initial import
thib
parents:
diff changeset
1040 fgets(buf,1000,savefile);
223b71206888 Initial import
thib
parents:
diff changeset
1041 if (strncmp(regname, buf, strlen(regname)) != 0) {
223b71206888 Initial import
thib
parents:
diff changeset
1042 fprintf(stderr,"invalid save file %s (registory name is not %s)\n",path.c_str(),regname);
223b71206888 Initial import
thib
parents:
diff changeset
1043 fclose(savefile);
223b71206888 Initial import
thib
parents:
diff changeset
1044 return false;
223b71206888 Initial import
thib
parents:
diff changeset
1045 }
223b71206888 Initial import
thib
parents:
diff changeset
1046 title="none";
223b71206888 Initial import
thib
parents:
diff changeset
1047 while(!feof(savefile)) {
223b71206888 Initial import
thib
parents:
diff changeset
1048 fgets(buf,1000,savefile);
223b71206888 Initial import
thib
parents:
diff changeset
1049 if (strncmp(buf,"Title=",6) == 0) {
223b71206888 Initial import
thib
parents:
diff changeset
1050 if (buf[strlen(buf)-2] == 0x0a) buf[strlen(buf)-2] = 0;
223b71206888 Initial import
thib
parents:
diff changeset
1051 if (strlen(buf) > 20) buf[20] = 0, buf[21] = 0;
223b71206888 Initial import
thib
parents:
diff changeset
1052 title = kconv(buf+6);
223b71206888 Initial import
thib
parents:
diff changeset
1053 break;
223b71206888 Initial import
thib
parents:
diff changeset
1054 }
223b71206888 Initial import
thib
parents:
diff changeset
1055 }
223b71206888 Initial import
thib
parents:
diff changeset
1056 fclose(savefile);
223b71206888 Initial import
thib
parents:
diff changeset
1057 return true;
223b71206888 Initial import
thib
parents:
diff changeset
1058 }
223b71206888 Initial import
thib
parents:
diff changeset
1059
223b71206888 Initial import
thib
parents:
diff changeset
1060 void Scn2k::SaveRollback(void) {
223b71206888 Initial import
thib
parents:
diff changeset
1061 fprintf(stderr,"Save rollback\n");
223b71206888 Initial import
thib
parents:
diff changeset
1062 new_rollback_save = "";
223b71206888 Initial import
thib
parents:
diff changeset
1063 string save_sys; SaveImpl(save_sys);
223b71206888 Initial import
thib
parents:
diff changeset
1064 string save_flag; flag.Save(save_flag);
223b71206888 Initial import
thib
parents:
diff changeset
1065 string save_text; text_exec.Save(save_text, true);
223b71206888 Initial import
thib
parents:
diff changeset
1066 string save_grp; grp_exec.Save(save_grp);
223b71206888 Initial import
thib
parents:
diff changeset
1067 new_rollback_save += save_sys;
223b71206888 Initial import
thib
parents:
diff changeset
1068 new_rollback_save += save_flag;
223b71206888 Initial import
thib
parents:
diff changeset
1069 new_rollback_save += save_text;
223b71206888 Initial import
thib
parents:
diff changeset
1070 new_rollback_save += save_grp;
223b71206888 Initial import
thib
parents:
diff changeset
1071 }
223b71206888 Initial import
thib
parents:
diff changeset
1072
223b71206888 Initial import
thib
parents:
diff changeset
1073 void Scn2k::LoadRollback(Cmd& cmd) {
223b71206888 Initial import
thib
parents:
diff changeset
1074 if (rollback_save.empty()) return;
223b71206888 Initial import
thib
parents:
diff changeset
1075 new_rollback_save = "";
223b71206888 Initial import
thib
parents:
diff changeset
1076 string savedata = rollback_save.back();
223b71206888 Initial import
thib
parents:
diff changeset
1077 rollback_save.pop_back();
223b71206888 Initial import
thib
parents:
diff changeset
1078 LoadImpl(savedata.c_str());
223b71206888 Initial import
thib
parents:
diff changeset
1079 flag.Load(savedata.c_str());
223b71206888 Initial import
thib
parents:
diff changeset
1080 text_exec.Load(savedata.c_str());
223b71206888 Initial import
thib
parents:
diff changeset
1081 grp_exec.Load(savedata.c_str());
223b71206888 Initial import
thib
parents:
diff changeset
1082
223b71206888 Initial import
thib
parents:
diff changeset
1083 /* 画面の回復など */
223b71206888 Initial import
thib
parents:
diff changeset
1084 SetSkipMode(SKIP_NO);
223b71206888 Initial import
thib
parents:
diff changeset
1085 vector<CmdSimplified>::iterator it;
223b71206888 Initial import
thib
parents:
diff changeset
1086 cmd.clear();
223b71206888 Initial import
thib
parents:
diff changeset
1087 for (it = cmd_stack.begin(); it != cmd_stack.end(); it++) {
223b71206888 Initial import
thib
parents:
diff changeset
1088 cmd.read(*it);
223b71206888 Initial import
thib
parents:
diff changeset
1089 cmd.cmd_type = CMD_OTHER;
223b71206888 Initial import
thib
parents:
diff changeset
1090 flag.Exec(cmd);
223b71206888 Initial import
thib
parents:
diff changeset
1091 text_exec.Exec(cmd);
223b71206888 Initial import
thib
parents:
diff changeset
1092 grp_exec.Exec(cmd);
223b71206888 Initial import
thib
parents:
diff changeset
1093 }
223b71206888 Initial import
thib
parents:
diff changeset
1094 cmd.clear();
223b71206888 Initial import
thib
parents:
diff changeset
1095 return;
223b71206888 Initial import
thib
parents:
diff changeset
1096 }
223b71206888 Initial import
thib
parents:
diff changeset
1097
223b71206888 Initial import
thib
parents:
diff changeset
1098 void Scn2k::Save(Cmd& cmd) {
223b71206888 Initial import
thib
parents:
diff changeset
1099 if (cmd.cmd_type == CMD_SAVEREQ) {
52
15a18fbe6f21 * Known bugs added to the README
thib
parents: 50
diff changeset
1100 if (menu == NULL) {
0
223b71206888 Initial import
thib
parents:
diff changeset
1101 SetSkipMode(SKIP_IN_MENU); // テキストスキップ等はここで中断
223b71206888 Initial import
thib
parents:
diff changeset
1102 menu = new Scn2kMenu(Scn2kMenu::MENU_SAVE, *this, flag, text_exec, system_version);
223b71206888 Initial import
thib
parents:
diff changeset
1103 menu->InitPanel(event, parent);
223b71206888 Initial import
thib
parents:
diff changeset
1104 menu->InitTitle(Scn2kSaveTitle(*this));
223b71206888 Initial import
thib
parents:
diff changeset
1105 if (mouse_surface) menu_mouseshown = true;
223b71206888 Initial import
thib
parents:
diff changeset
1106 else menu_mouseshown = false;
223b71206888 Initial import
thib
parents:
diff changeset
1107 ShowCursor();
223b71206888 Initial import
thib
parents:
diff changeset
1108 return;
223b71206888 Initial import
thib
parents:
diff changeset
1109 }
223b71206888 Initial import
thib
parents:
diff changeset
1110 }
223b71206888 Initial import
thib
parents:
diff changeset
1111 char buf[1024];
223b71206888 Initial import
thib
parents:
diff changeset
1112 string save;
52
15a18fbe6f21 * Known bugs added to the README
thib
parents: 50
diff changeset
1113 FILE* f = NULL;
0
223b71206888 Initial import
thib
parents:
diff changeset
1114 if (save_scn == 0) {
223b71206888 Initial import
thib
parents:
diff changeset
1115 fprintf(stderr,"Cannot decide save point\n");
223b71206888 Initial import
thib
parents:
diff changeset
1116 return; // セーブ位置が保存されてない
223b71206888 Initial import
thib
parents:
diff changeset
1117 }
223b71206888 Initial import
thib
parents:
diff changeset
1118 string path = MakeSaveFile();
223b71206888 Initial import
thib
parents:
diff changeset
1119 int file_number = 1;
223b71206888 Initial import
thib
parents:
diff changeset
1120 if (cmd.args.size() == 1)
223b71206888 Initial import
thib
parents:
diff changeset
1121 file_number = cmd.args[0].value + 1;
223b71206888 Initial import
thib
parents:
diff changeset
1122 if (file_number <= 0) {
223b71206888 Initial import
thib
parents:
diff changeset
1123 fprintf(stderr, "Cannot open save file %s\n",path.c_str());
223b71206888 Initial import
thib
parents:
diff changeset
1124 return;
223b71206888 Initial import
thib
parents:
diff changeset
1125 }
223b71206888 Initial import
thib
parents:
diff changeset
1126 sprintf(buf, ".%d",file_number);
223b71206888 Initial import
thib
parents:
diff changeset
1127 path += buf;
223b71206888 Initial import
thib
parents:
diff changeset
1128
223b71206888 Initial import
thib
parents:
diff changeset
1129 /* セーブファイル確認 */
223b71206888 Initial import
thib
parents:
diff changeset
1130
53
ddbcbd000206 * MuSys, AyuSysConfig, FileSearcher (former FILESEARCHER) and KeyHolder (former KEYHOLDER) are now singletons
thib
parents: 52
diff changeset
1131 sprintf(buf, "KEY=%s\n", config->GetParaStr("#REGNAME")); save += buf;
0
223b71206888 Initial import
thib
parents:
diff changeset
1132 string save_sys; SaveImpl(save_sys);
223b71206888 Initial import
thib
parents:
diff changeset
1133 string save_flag; flag.Save(save_flag);
223b71206888 Initial import
thib
parents:
diff changeset
1134 string save_text; text_exec.Save(save_text, false);
223b71206888 Initial import
thib
parents:
diff changeset
1135 string save_grp; grp_exec.Save(save_grp);
223b71206888 Initial import
thib
parents:
diff changeset
1136 save += save_sys;
223b71206888 Initial import
thib
parents:
diff changeset
1137 save += save_flag;
223b71206888 Initial import
thib
parents:
diff changeset
1138 save += save_text;
223b71206888 Initial import
thib
parents:
diff changeset
1139 save += save_grp;
223b71206888 Initial import
thib
parents:
diff changeset
1140 vector<string>::iterator it;
223b71206888 Initial import
thib
parents:
diff changeset
1141 for (it=rollback_save.begin(); it != rollback_save.end(); it++) {
223b71206888 Initial import
thib
parents:
diff changeset
1142 save += "[Rollback Data]\n";
223b71206888 Initial import
thib
parents:
diff changeset
1143 save += *it;
223b71206888 Initial import
thib
parents:
diff changeset
1144 save += "[Rollback End]\n";
223b71206888 Initial import
thib
parents:
diff changeset
1145 }
223b71206888 Initial import
thib
parents:
diff changeset
1146
223b71206888 Initial import
thib
parents:
diff changeset
1147 f = fopen(path.c_str(), "w");
52
15a18fbe6f21 * Known bugs added to the README
thib
parents: 50
diff changeset
1148 if (f == NULL) {
0
223b71206888 Initial import
thib
parents:
diff changeset
1149 fprintf(stderr,"Cannot open save file %s\n",path.c_str());
223b71206888 Initial import
thib
parents:
diff changeset
1150 return;
223b71206888 Initial import
thib
parents:
diff changeset
1151 }
223b71206888 Initial import
thib
parents:
diff changeset
1152 fwrite(save.c_str(), save.length(), 1, f);
223b71206888 Initial import
thib
parents:
diff changeset
1153 fclose(f);
53
ddbcbd000206 * MuSys, AyuSysConfig, FileSearcher (former FILESEARCHER) and KeyHolder (former KEYHOLDER) are now singletons
thib
parents: 52
diff changeset
1154 config->SetParam("#LASTSAVE", 1, file_number);
0
223b71206888 Initial import
thib
parents:
diff changeset
1155 cmd.clear();
223b71206888 Initial import
thib
parents:
diff changeset
1156 }
223b71206888 Initial import
thib
parents:
diff changeset
1157
223b71206888 Initial import
thib
parents:
diff changeset
1158 void Scn2k::Load(Cmd& cmd) {
223b71206888 Initial import
thib
parents:
diff changeset
1159 if (cmd.cmd_type == CMD_LOADREQ) {
52
15a18fbe6f21 * Known bugs added to the README
thib
parents: 50
diff changeset
1160 if (menu == NULL) {
0
223b71206888 Initial import
thib
parents:
diff changeset
1161 menu = new Scn2kMenu(Scn2kMenu::MENU_LOAD, *this, flag, text_exec, system_version);
223b71206888 Initial import
thib
parents:
diff changeset
1162 menu->InitPanel(event, parent);
223b71206888 Initial import
thib
parents:
diff changeset
1163 menu->InitTitle(Scn2kSaveTitle(*this));
223b71206888 Initial import
thib
parents:
diff changeset
1164 SetSkipMode(SKIP_IN_MENU); // テキストスキップ等はここで中断
223b71206888 Initial import
thib
parents:
diff changeset
1165 if (mouse_surface) menu_mouseshown = true;
223b71206888 Initial import
thib
parents:
diff changeset
1166 else menu_mouseshown = false;
223b71206888 Initial import
thib
parents:
diff changeset
1167 ShowCursor();
223b71206888 Initial import
thib
parents:
diff changeset
1168 return;
223b71206888 Initial import
thib
parents:
diff changeset
1169 }
223b71206888 Initial import
thib
parents:
diff changeset
1170 }
223b71206888 Initial import
thib
parents:
diff changeset
1171 char buf[1024];
223b71206888 Initial import
thib
parents:
diff changeset
1172 string path = MakeSaveFile();
223b71206888 Initial import
thib
parents:
diff changeset
1173 int file_number = 1;
223b71206888 Initial import
thib
parents:
diff changeset
1174 if (cmd.args.size() == 1)
223b71206888 Initial import
thib
parents:
diff changeset
1175 file_number = cmd.args[0].value + 1;
223b71206888 Initial import
thib
parents:
diff changeset
1176 sprintf(buf, ".%d",file_number);
223b71206888 Initial import
thib
parents:
diff changeset
1177 path += buf;
52
15a18fbe6f21 * Known bugs added to the README
thib
parents: 50
diff changeset
1178 FILE* f = NULL;
0
223b71206888 Initial import
thib
parents:
diff changeset
1179 if (file_number > 0) f = fopen(path.c_str(), "r");
52
15a18fbe6f21 * Known bugs added to the README
thib
parents: 50
diff changeset
1180 if (f == NULL) {
0
223b71206888 Initial import
thib
parents:
diff changeset
1181 fprintf(stderr, "Cannot open save file %s\n",path.c_str());
223b71206888 Initial import
thib
parents:
diff changeset
1182 return;
223b71206888 Initial import
thib
parents:
diff changeset
1183 }
223b71206888 Initial import
thib
parents:
diff changeset
1184
52
15a18fbe6f21 * Known bugs added to the README
thib
parents: 50
diff changeset
1185 fseek(f, 0, SEEK_END);
0
223b71206888 Initial import
thib
parents:
diff changeset
1186 int sz = ftell(f);
52
15a18fbe6f21 * Known bugs added to the README
thib
parents: 50
diff changeset
1187 fseek(f, 0, SEEK_SET);
0
223b71206888 Initial import
thib
parents:
diff changeset
1188 char* savedata = new char[sz+1];
223b71206888 Initial import
thib
parents:
diff changeset
1189 fread(savedata, sz, 1, f);
223b71206888 Initial import
thib
parents:
diff changeset
1190 savedata[sz] = 0;
223b71206888 Initial import
thib
parents:
diff changeset
1191 fclose(f);
223b71206888 Initial import
thib
parents:
diff changeset
1192
53
ddbcbd000206 * MuSys, AyuSysConfig, FileSearcher (former FILESEARCHER) and KeyHolder (former KEYHOLDER) are now singletons
thib
parents: 52
diff changeset
1193 sprintf(buf, "KEY=%s\n", config->GetParaStr("#REGNAME"));
0
223b71206888 Initial import
thib
parents:
diff changeset
1194 if (strncmp(savedata, buf, strlen(buf)) != 0) {
43
01aa5ddf7dc8 A lot of very minor improvements (deleted some unused variables, and other things like that...)
thib
parents: 19
diff changeset
1195 fprintf(stderr,"Invalid header in save file %s: it must be started with \"%s\"\n", path.c_str(), buf);
0
223b71206888 Initial import
thib
parents:
diff changeset
1196 delete[] savedata;
223b71206888 Initial import
thib
parents:
diff changeset
1197 return;
223b71206888 Initial import
thib
parents:
diff changeset
1198 }
223b71206888 Initial import
thib
parents:
diff changeset
1199 LoadImpl(savedata);
223b71206888 Initial import
thib
parents:
diff changeset
1200 flag.Load(savedata);
223b71206888 Initial import
thib
parents:
diff changeset
1201 text_exec.Load(savedata);
223b71206888 Initial import
thib
parents:
diff changeset
1202 grp_exec.Load(savedata);
223b71206888 Initial import
thib
parents:
diff changeset
1203 rollback_save.clear();
223b71206888 Initial import
thib
parents:
diff changeset
1204 new_rollback_save = "";
223b71206888 Initial import
thib
parents:
diff changeset
1205 char* rollback_data = savedata;
52
15a18fbe6f21 * Known bugs added to the README
thib
parents: 50
diff changeset
1206 while( (rollback_data = strstr(rollback_data,"[Rollback Data]\n")) != NULL) {
0
223b71206888 Initial import
thib
parents:
diff changeset
1207 rollback_data += strlen("[Rollback Data]\n");
223b71206888 Initial import
thib
parents:
diff changeset
1208 char* rollback_end = strstr(rollback_data, "[Rollback End]\n");
52
15a18fbe6f21 * Known bugs added to the README
thib
parents: 50
diff changeset
1209 if (rollback_end == NULL) rollback_end = rollback_data + strlen(rollback_data);
0
223b71206888 Initial import
thib
parents:
diff changeset
1210 string s(rollback_data, rollback_end);
223b71206888 Initial import
thib
parents:
diff changeset
1211 rollback_save.push_back(s);
223b71206888 Initial import
thib
parents:
diff changeset
1212 rollback_data = rollback_end;
223b71206888 Initial import
thib
parents:
diff changeset
1213 }
223b71206888 Initial import
thib
parents:
diff changeset
1214
223b71206888 Initial import
thib
parents:
diff changeset
1215 /* 画面の回復など */
223b71206888 Initial import
thib
parents:
diff changeset
1216 SetSkipMode(SKIP_NO);
223b71206888 Initial import
thib
parents:
diff changeset
1217 vector<CmdSimplified>::iterator it;
223b71206888 Initial import
thib
parents:
diff changeset
1218 for (it = cmd_stack.begin(); it != cmd_stack.end(); it++) {
223b71206888 Initial import
thib
parents:
diff changeset
1219 cmd.read(*it);
223b71206888 Initial import
thib
parents:
diff changeset
1220 cmd.cmd_type = CMD_OTHER;
223b71206888 Initial import
thib
parents:
diff changeset
1221 flag.Exec(cmd);
223b71206888 Initial import
thib
parents:
diff changeset
1222 text_exec.Exec(cmd);
223b71206888 Initial import
thib
parents:
diff changeset
1223 grp_exec.Exec(cmd);
223b71206888 Initial import
thib
parents:
diff changeset
1224 }
223b71206888 Initial import
thib
parents:
diff changeset
1225 cmd.clear();
50
35ce1a30f3f9 * Added va_end where there is a va_start
thib
parents: 43
diff changeset
1226
35ce1a30f3f9 * Added va_end where there is a va_start
thib
parents: 43
diff changeset
1227 delete[] savedata;
0
223b71206888 Initial import
thib
parents:
diff changeset
1228 }
223b71206888 Initial import
thib
parents:
diff changeset
1229
223b71206888 Initial import
thib
parents:
diff changeset
1230 void Scn2k::SaveImpl(string& save) {
223b71206888 Initial import
thib
parents:
diff changeset
1231 char buf[1024];
223b71206888 Initial import
thib
parents:
diff changeset
1232
223b71206888 Initial import
thib
parents:
diff changeset
1233 /* save point */
223b71206888 Initial import
thib
parents:
diff changeset
1234 sprintf(buf, "\n[SCENARIO]\nScn=%d\nPoint=%d\n",save_scn, save_point); save += buf;
223b71206888 Initial import
thib
parents:
diff changeset
1235 sprintf(buf, "Title=%s\nMouseType=%d\nMouseShown=1\n",window_title.c_str(), mouse_type); save += buf;
223b71206888 Initial import
thib
parents:
diff changeset
1236 vector<StackItem>::iterator sit;
223b71206888 Initial import
thib
parents:
diff changeset
1237 for (sit=stack.begin(); sit!=stack.end(); sit++) {
223b71206888 Initial import
thib
parents:
diff changeset
1238 if (sit->scn_number == SCN_INFO && sit->scn_pt == SCN_INFO_MENU) break; // メニューに入る直前までのスタックを保存
223b71206888 Initial import
thib
parents:
diff changeset
1239 sprintf(buf, "Stack=%d,%d\n",sit->scn_number,sit->scn_pt);
223b71206888 Initial import
thib
parents:
diff changeset
1240 save += buf;
223b71206888 Initial import
thib
parents:
diff changeset
1241 }
223b71206888 Initial import
thib
parents:
diff changeset
1242 vector<string>::reverse_iterator ssit;
223b71206888 Initial import
thib
parents:
diff changeset
1243 for (ssit=stack_strbuffer.rbegin(); ssit != stack_strbuffer.rend(); ssit++) {
223b71206888 Initial import
thib
parents:
diff changeset
1244 sprintf(buf, "StackStr=%s\n",ssit->c_str());
223b71206888 Initial import
thib
parents:
diff changeset
1245 save += buf;
223b71206888 Initial import
thib
parents:
diff changeset
1246 }
223b71206888 Initial import
thib
parents:
diff changeset
1247 vector<CmdSimplified>::iterator cit;
223b71206888 Initial import
thib
parents:
diff changeset
1248 for (cit=cmd_stack.begin(); cit != cmd_stack.end(); cit++) {
223b71206888 Initial import
thib
parents:
diff changeset
1249 if (cit->type == CMD_SAVECMDGRP || cit->type == CMD_SAVECMDGRP_ONCE || cit->type == CMD_SAVECMDGRP_START) {
223b71206888 Initial import
thib
parents:
diff changeset
1250 save += "CmdG=";
223b71206888 Initial import
thib
parents:
diff changeset
1251 } else {
223b71206888 Initial import
thib
parents:
diff changeset
1252 save += "Cmd=";
223b71206888 Initial import
thib
parents:
diff changeset
1253 }
223b71206888 Initial import
thib
parents:
diff changeset
1254 string s; cit->Save(s);
223b71206888 Initial import
thib
parents:
diff changeset
1255 save += s;
223b71206888 Initial import
thib
parents:
diff changeset
1256 save += "\n";
223b71206888 Initial import
thib
parents:
diff changeset
1257 }
223b71206888 Initial import
thib
parents:
diff changeset
1258 }
223b71206888 Initial import
thib
parents:
diff changeset
1259
223b71206888 Initial import
thib
parents:
diff changeset
1260 void Scn2k::LoadImpl(const char* save) {
223b71206888 Initial import
thib
parents:
diff changeset
1261 save_scn = 0;
223b71206888 Initial import
thib
parents:
diff changeset
1262 save_point = 0;
223b71206888 Initial import
thib
parents:
diff changeset
1263 window_title = "";
223b71206888 Initial import
thib
parents:
diff changeset
1264 stack.clear();
223b71206888 Initial import
thib
parents:
diff changeset
1265 cmd_stack.clear();
223b71206888 Initial import
thib
parents:
diff changeset
1266 cmd_stack_str = cmd_stack_str_orig;
223b71206888 Initial import
thib
parents:
diff changeset
1267
223b71206888 Initial import
thib
parents:
diff changeset
1268 save = strstr(save, "\n[SCENARIO]\n");
52
15a18fbe6f21 * Known bugs added to the README
thib
parents: 50
diff changeset
1269 if (save == NULL) return;
0
223b71206888 Initial import
thib
parents:
diff changeset
1270 save += strlen("\n[SCENARIO]\n");
223b71206888 Initial import
thib
parents:
diff changeset
1271 while(save[0] != 0 && save[0] != '[') { // while next section start
223b71206888 Initial import
thib
parents:
diff changeset
1272 if (strncmp(save, "Scn=", 4) == 0) {
223b71206888 Initial import
thib
parents:
diff changeset
1273 sscanf(save, "Scn=%d", &save_scn);
223b71206888 Initial import
thib
parents:
diff changeset
1274 } else if (strncmp(save, "Point=", 6) == 0) {
223b71206888 Initial import
thib
parents:
diff changeset
1275 sscanf(save, "Point=%d", &save_point);
223b71206888 Initial import
thib
parents:
diff changeset
1276 } else if (strncmp(save, "Title=", 6) == 0) {
223b71206888 Initial import
thib
parents:
diff changeset
1277 save += 6;
223b71206888 Initial import
thib
parents:
diff changeset
1278 char* s = strchr(save, '\n');
52
15a18fbe6f21 * Known bugs added to the README
thib
parents: 50
diff changeset
1279 if (s == NULL) window_title = save;
0
223b71206888 Initial import
thib
parents:
diff changeset
1280 else window_title.assign(save, s-save);
53
ddbcbd000206 * MuSys, AyuSysConfig, FileSearcher (former FILESEARCHER) and KeyHolder (former KEYHOLDER) are now singletons
thib
parents: 52
diff changeset
1281 const char* config_name = config->GetParaStr("#CAPTION");
52
15a18fbe6f21 * Known bugs added to the README
thib
parents: 50
diff changeset
1282 if (config_name == NULL) config_name = "";
0
223b71206888 Initial import
thib
parents:
diff changeset
1283 string setname = kconv(string(config_name)+" "+window_title);
223b71206888 Initial import
thib
parents:
diff changeset
1284 parent.Root().SetWindowCaption(setname.c_str());
223b71206888 Initial import
thib
parents:
diff changeset
1285 } else if (strncmp(save, "MouseType=", 10) == 0) {
223b71206888 Initial import
thib
parents:
diff changeset
1286 sscanf(save, "MouseType=%d", &mouse_type);
223b71206888 Initial import
thib
parents:
diff changeset
1287 } else if (strncmp(save, "MouseShown=", 11) == 0) {
223b71206888 Initial import
thib
parents:
diff changeset
1288 int v;
223b71206888 Initial import
thib
parents:
diff changeset
1289 sscanf(save, "MouseShown=%d", &v);
223b71206888 Initial import
thib
parents:
diff changeset
1290 if (v) ShowCursor();
223b71206888 Initial import
thib
parents:
diff changeset
1291 else HideCursor();
223b71206888 Initial import
thib
parents:
diff changeset
1292 } else if (strncmp(save, "Stack=", 6) == 0) {
223b71206888 Initial import
thib
parents:
diff changeset
1293 int scn, pt;
223b71206888 Initial import
thib
parents:
diff changeset
1294 sscanf(save, "Stack=%d,%d", &scn, &pt);
223b71206888 Initial import
thib
parents:
diff changeset
1295 stack.push_back( StackItem(scn, pt));
223b71206888 Initial import
thib
parents:
diff changeset
1296 } else if (strncmp(save, "StackStr=", 9) == 0) {
223b71206888 Initial import
thib
parents:
diff changeset
1297 save += 9;
223b71206888 Initial import
thib
parents:
diff changeset
1298 char* s = strchr(save, '\n');
52
15a18fbe6f21 * Known bugs added to the README
thib
parents: 50
diff changeset
1299 if (s == NULL) stack_strbuffer.push_back("");
0
223b71206888 Initial import
thib
parents:
diff changeset
1300 else stack_strbuffer.push_back(string(save, s-save));
223b71206888 Initial import
thib
parents:
diff changeset
1301 } else if (strncmp(save, "Cmd=", 4) == 0) {
223b71206888 Initial import
thib
parents:
diff changeset
1302 CmdSimplified cmd;
223b71206888 Initial import
thib
parents:
diff changeset
1303 cmd.Load(save+4, cmd_stack_str);
223b71206888 Initial import
thib
parents:
diff changeset
1304 cmd_stack.push_back(cmd);
223b71206888 Initial import
thib
parents:
diff changeset
1305 } else if (strncmp(save, "CmdG=", 5) == 0) {
223b71206888 Initial import
thib
parents:
diff changeset
1306 CmdSimplified cmd;
223b71206888 Initial import
thib
parents:
diff changeset
1307 cmd.Load(save+5, cmd_stack_str);
223b71206888 Initial import
thib
parents:
diff changeset
1308 cmd.type = CMD_SAVECMDGRP;
223b71206888 Initial import
thib
parents:
diff changeset
1309 cmd_stack.push_back(cmd);
223b71206888 Initial import
thib
parents:
diff changeset
1310 }
223b71206888 Initial import
thib
parents:
diff changeset
1311 save = strchr(save, '\n');
52
15a18fbe6f21 * Known bugs added to the README
thib
parents: 50
diff changeset
1312 if (save != NULL) save++;
0
223b71206888 Initial import
thib
parents:
diff changeset
1313 }
223b71206888 Initial import
thib
parents:
diff changeset
1314 ChangeScript(save_scn, 0);
223b71206888 Initial import
thib
parents:
diff changeset
1315 script = script_start + save_point;
223b71206888 Initial import
thib
parents:
diff changeset
1316 }
52
15a18fbe6f21 * Known bugs added to the README
thib
parents: 50
diff changeset
1317
0
223b71206888 Initial import
thib
parents:
diff changeset
1318 void Scn2k::SetSkipMode(SkipMode mode) {
223b71206888 Initial import
thib
parents:
diff changeset
1319 if (skip_mode != mode) {
223b71206888 Initial import
thib
parents:
diff changeset
1320 skip_mode = mode;
223b71206888 Initial import
thib
parents:
diff changeset
1321 text_exec.SetSkipMode(mode);
223b71206888 Initial import
thib
parents:
diff changeset
1322 grp_exec.SetSkipMode(mode);
223b71206888 Initial import
thib
parents:
diff changeset
1323 }
223b71206888 Initial import
thib
parents:
diff changeset
1324 }
223b71206888 Initial import
thib
parents:
diff changeset
1325
223b71206888 Initial import
thib
parents:
diff changeset
1326 /***********************************************************
223b71206888 Initial import
thib
parents:
diff changeset
1327 **
223b71206888 Initial import
thib
parents:
diff changeset
1328 ** DLL Call Implementation
223b71206888 Initial import
thib
parents:
diff changeset
1329 **
223b71206888 Initial import
thib
parents:
diff changeset
1330 **/
223b71206888 Initial import
thib
parents:
diff changeset
1331 static double* lb_ef_param = 0;
223b71206888 Initial import
thib
parents:
diff changeset
1332 void DLLCall_LB_EF00_0(Cmd& cmd, Flags& flags) { // エフェクトの設定
223b71206888 Initial import
thib
parents:
diff changeset
1333 if (lb_ef_param == 0) {
223b71206888 Initial import
thib
parents:
diff changeset
1334 lb_ef_param = new double[sizeof(double) * 0x60 * 8];
223b71206888 Initial import
thib
parents:
diff changeset
1335 }
223b71206888 Initial import
thib
parents:
diff changeset
1336 int i,j;
223b71206888 Initial import
thib
parents:
diff changeset
1337 int param_top, param_size;
223b71206888 Initial import
thib
parents:
diff changeset
1338 if (cmd.args[2].value == 1) {
223b71206888 Initial import
thib
parents:
diff changeset
1339 param_top = 0;
223b71206888 Initial import
thib
parents:
diff changeset
1340 param_size = 0x20;
223b71206888 Initial import
thib
parents:
diff changeset
1341 } else {
223b71206888 Initial import
thib
parents:
diff changeset
1342 param_top = cmd.args[3].value;
223b71206888 Initial import
thib
parents:
diff changeset
1343 param_size = cmd.args[4].value;
223b71206888 Initial import
thib
parents:
diff changeset
1344 if (param_top < 0) param_top = 0;
223b71206888 Initial import
thib
parents:
diff changeset
1345 if (param_top > 0x20) param_top = 0x20;
223b71206888 Initial import
thib
parents:
diff changeset
1346 if (param_size+param_top > 0x20) param_size = 0x20 - param_top;
223b71206888 Initial import
thib
parents:
diff changeset
1347 }
223b71206888 Initial import
thib
parents:
diff changeset
1348 for (i=0; i<8; i++) {
223b71206888 Initial import
thib
parents:
diff changeset
1349 double* param = lb_ef_param + i*0x60 + param_top*3;
223b71206888 Initial import
thib
parents:
diff changeset
1350 for (j=0; j<param_size; j++) {
223b71206888 Initial import
thib
parents:
diff changeset
1351 *param++ = random() % 800 - 400;
223b71206888 Initial import
thib
parents:
diff changeset
1352 *param++ = random() % 600 - 300;
223b71206888 Initial import
thib
parents:
diff changeset
1353 *param++ = random() % 700 - 350;
223b71206888 Initial import
thib
parents:
diff changeset
1354 }
223b71206888 Initial import
thib
parents:
diff changeset
1355 }
223b71206888 Initial import
thib
parents:
diff changeset
1356 if (cmd.args[5].value != 1) return;
52
15a18fbe6f21 * Known bugs added to the README
thib
parents: 50
diff changeset
1357
15a18fbe6f21 * Known bugs added to the README
thib
parents: 50
diff changeset
1358 static int random_dirtable[] = {
0
223b71206888 Initial import
thib
parents:
diff changeset
1359 0, 2, 1, 3, 0, 2, 1, 3,
223b71206888 Initial import
thib
parents:
diff changeset
1360 1, 3, 2, 0, 1, 3, 2, 0,
223b71206888 Initial import
thib
parents:
diff changeset
1361 0, 0, 0, 0, 3, 1, 2, 0,
223b71206888 Initial import
thib
parents:
diff changeset
1362 3, 1, 3, 1, 0, 2, 3, 1
223b71206888 Initial import
thib
parents:
diff changeset
1363 };
52
15a18fbe6f21 * Known bugs added to the README
thib
parents: 50
diff changeset
1364
0
223b71206888 Initial import
thib
parents:
diff changeset
1365 int* dir = &random_dirtable[(random()&3) * 8];
223b71206888 Initial import
thib
parents:
diff changeset
1366 for (i=0; i<8; i++) {
223b71206888 Initial import
thib
parents:
diff changeset
1367 double* param = lb_ef_param + i*0x60;
223b71206888 Initial import
thib
parents:
diff changeset
1368 double x = random()%600 - 300;
223b71206888 Initial import
thib
parents:
diff changeset
1369 double y = random()%480-240;
223b71206888 Initial import
thib
parents:
diff changeset
1370 if (x < 0) x -= 80;
223b71206888 Initial import
thib
parents:
diff changeset
1371 else x += 80;
223b71206888 Initial import
thib
parents:
diff changeset
1372 if (y < 0) y -= 80;
223b71206888 Initial import
thib
parents:
diff changeset
1373 else y += 80;
223b71206888 Initial import
thib
parents:
diff changeset
1374 switch(*dir++) {
223b71206888 Initial import
thib
parents:
diff changeset
1375 case 0:
223b71206888 Initial import
thib
parents:
diff changeset
1376 if (x < 0) x = -x;
223b71206888 Initial import
thib
parents:
diff changeset
1377 if (y < 0) y = -y;
223b71206888 Initial import
thib
parents:
diff changeset
1378 break;
223b71206888 Initial import
thib
parents:
diff changeset
1379 case 1:
223b71206888 Initial import
thib
parents:
diff changeset
1380 if (x > 0) x = -x;
223b71206888 Initial import
thib
parents:
diff changeset
1381 if (y < 0) y = -y;
223b71206888 Initial import
thib
parents:
diff changeset
1382 break;
223b71206888 Initial import
thib
parents:
diff changeset
1383 case 2:
223b71206888 Initial import
thib
parents:
diff changeset
1384 if (x < 0) x = -x;
223b71206888 Initial import
thib
parents:
diff changeset
1385 if (y > 0) y = -y;
223b71206888 Initial import
thib
parents:
diff changeset
1386 break;
223b71206888 Initial import
thib
parents:
diff changeset
1387 case 4:
223b71206888 Initial import
thib
parents:
diff changeset
1388 if (x > 0) x = -x;
223b71206888 Initial import
thib
parents:
diff changeset
1389 if (y > 0) y = -y;
223b71206888 Initial import
thib
parents:
diff changeset
1390 break;
223b71206888 Initial import
thib
parents:
diff changeset
1391 }
223b71206888 Initial import
thib
parents:
diff changeset
1392 param[9] = x*1.2;
223b71206888 Initial import
thib
parents:
diff changeset
1393 param[10] = y*1.2;
223b71206888 Initial import
thib
parents:
diff changeset
1394 param[11] *= 1.2;
223b71206888 Initial import
thib
parents:
diff changeset
1395 param[12] *= -0.08;
223b71206888 Initial import
thib
parents:
diff changeset
1396 param[13] *= -0.08;
223b71206888 Initial import
thib
parents:
diff changeset
1397 param[14] *= -0.08;
223b71206888 Initial import
thib
parents:
diff changeset
1398 param[15] = -param[9];
223b71206888 Initial import
thib
parents:
diff changeset
1399 param[16] = -param[10];
223b71206888 Initial import
thib
parents:
diff changeset
1400 param[17] = -param[11];
223b71206888 Initial import
thib
parents:
diff changeset
1401 }
223b71206888 Initial import
thib
parents:
diff changeset
1402 return;
223b71206888 Initial import
thib
parents:
diff changeset
1403 }
52
15a18fbe6f21 * Known bugs added to the README
thib
parents: 50
diff changeset
1404
0
223b71206888 Initial import
thib
parents:
diff changeset
1405 void DLLCall_LB_EF00_1(Cmd& cmd, Flags& flags) { // 計算を行う
223b71206888 Initial import
thib
parents:
diff changeset
1406 if (lb_ef_param == 0) {
223b71206888 Initial import
thib
parents:
diff changeset
1407 fprintf(stderr,"Warning : DLLCall_LB_EF00_1 : Script error : effect calculation was called before setting\n");
223b71206888 Initial import
thib
parents:
diff changeset
1408 return;
223b71206888 Initial import
thib
parents:
diff changeset
1409 }
223b71206888 Initial import
thib
parents:
diff changeset
1410 int index = cmd.args[2].value;
223b71206888 Initial import
thib
parents:
diff changeset
1411 int v5_1154 = flags.Get(5, 1154+index);
223b71206888 Initial import
thib
parents:
diff changeset
1412 int j = ((v5_1154) & 0x1f) + index * 0x20;
223b71206888 Initial import
thib
parents:
diff changeset
1413 int k = ((v5_1154+1) & 0x1f) + index * 0x20;
223b71206888 Initial import
thib
parents:
diff changeset
1414 int l = ((v5_1154+2) & 0x1f) + index * 0x20;
223b71206888 Initial import
thib
parents:
diff changeset
1415 int m = ((v5_1154+3) & 0x1f) + index * 0x20;
223b71206888 Initial import
thib
parents:
diff changeset
1416 j *= 3;
223b71206888 Initial import
thib
parents:
diff changeset
1417 k *= 3;
223b71206888 Initial import
thib
parents:
diff changeset
1418 l *= 3;
223b71206888 Initial import
thib
parents:
diff changeset
1419 m *= 3;
223b71206888 Initial import
thib
parents:
diff changeset
1420
223b71206888 Initial import
thib
parents:
diff changeset
1421 // 0 < x < 1
223b71206888 Initial import
thib
parents:
diff changeset
1422 // va - vd は 0-1 の範囲で対称性を持つ3次関数
223b71206888 Initial import
thib
parents:
diff changeset
1423 double x = double(flags.Get(5, 1162 + index)) * 0.001;
223b71206888 Initial import
thib
parents:
diff changeset
1424 double va = (x * x * x)/6;
223b71206888 Initial import
thib
parents:
diff changeset
1425 double vb = (-x*x*x + 3*x*x - 3*x + 1) / 6;
223b71206888 Initial import
thib
parents:
diff changeset
1426 double vc = (3*x*x*x - 6*x*x + 4) / 6;
223b71206888 Initial import
thib
parents:
diff changeset
1427 double vd = (-3*x*x*x+3*x*x+3*x+1) / 6;
223b71206888 Initial import
thib
parents:
diff changeset
1428
223b71206888 Initial import
thib
parents:
diff changeset
1429 double r1 = va * lb_ef_param[m+3] + vd * lb_ef_param[l+3] + vc * lb_ef_param[k+3] + vb * lb_ef_param[j+3];
223b71206888 Initial import
thib
parents:
diff changeset
1430 double r2 = va * lb_ef_param[m+2] + vd * lb_ef_param[l+2] + vc * lb_ef_param[k+2] + vb * lb_ef_param[j+2];
223b71206888 Initial import
thib
parents:
diff changeset
1431 double r3 = va * lb_ef_param[m+1] + vd * lb_ef_param[l+1] + vc * lb_ef_param[k+1] + vb * lb_ef_param[j+1];
223b71206888 Initial import
thib
parents:
diff changeset
1432 if (r1 != 400) {
223b71206888 Initial import
thib
parents:
diff changeset
1433 r2 = r2 * 800 / (400-r1);
223b71206888 Initial import
thib
parents:
diff changeset
1434 r3 = r3 * 700 / (400-r1);
223b71206888 Initial import
thib
parents:
diff changeset
1435 }
223b71206888 Initial import
thib
parents:
diff changeset
1436 VarInfo var;
223b71206888 Initial import
thib
parents:
diff changeset
1437 var.type = 5;
223b71206888 Initial import
thib
parents:
diff changeset
1438 var.number = 1151;
223b71206888 Initial import
thib
parents:
diff changeset
1439 flags.Set(var, int(r2));
223b71206888 Initial import
thib
parents:
diff changeset
1440 var.number = 1152;
223b71206888 Initial import
thib
parents:
diff changeset
1441 flags.Set(var, int(r3));
223b71206888 Initial import
thib
parents:
diff changeset
1442 var.number = 1153;
223b71206888 Initial import
thib
parents:
diff changeset
1443 flags.Set(var, int(r1));
223b71206888 Initial import
thib
parents:
diff changeset
1444 return;
223b71206888 Initial import
thib
parents:
diff changeset
1445 }
223b71206888 Initial import
thib
parents:
diff changeset
1446
223b71206888 Initial import
thib
parents:
diff changeset
1447
223b71206888 Initial import
thib
parents:
diff changeset
1448 void DllCall_LB(Cmd& cmd, Flags& flags) { // リトルバスターズ!の EF00.dll をエミュレート
223b71206888 Initial import
thib
parents:
diff changeset
1449 if (cmd.args[0].value == 1) {
223b71206888 Initial import
thib
parents:
diff changeset
1450 // "EF00.dll"
223b71206888 Initial import
thib
parents:
diff changeset
1451 if (cmd.args[1].value == 0) { // エフェクトの設定
223b71206888 Initial import
thib
parents:
diff changeset
1452 DLLCall_LB_EF00_0(cmd, flags);
223b71206888 Initial import
thib
parents:
diff changeset
1453 } else if (cmd.args[1].value == 1) { // 計算を行う
223b71206888 Initial import
thib
parents:
diff changeset
1454 DLLCall_LB_EF00_1(cmd, flags);
223b71206888 Initial import
thib
parents:
diff changeset
1455 }
223b71206888 Initial import
thib
parents:
diff changeset
1456 } else {
223b71206888 Initial import
thib
parents:
diff changeset
1457 fprintf(stderr,"Unsupported DLL call for DLL<%d>\n",cmd.args[0].value);
223b71206888 Initial import
thib
parents:
diff changeset
1458 }
223b71206888 Initial import
thib
parents:
diff changeset
1459 return;
223b71206888 Initial import
thib
parents:
diff changeset
1460 }
223b71206888 Initial import
thib
parents:
diff changeset
1461
223b71206888 Initial import
thib
parents:
diff changeset
1462 /**********************************************************
223b71206888 Initial import
thib
parents:
diff changeset
1463 **
223b71206888 Initial import
thib
parents:
diff changeset
1464 ** MenuImpl
223b71206888 Initial import
thib
parents:
diff changeset
1465 **
223b71206888 Initial import
thib
parents:
diff changeset
1466 */
223b71206888 Initial import
thib
parents:
diff changeset
1467
52
15a18fbe6f21 * Known bugs added to the README
thib
parents: 50
diff changeset
1468 #include "window/widget.h"
15a18fbe6f21 * Known bugs added to the README
thib
parents: 50
diff changeset
1469 #include "window/menuitem.h"
0
223b71206888 Initial import
thib
parents:
diff changeset
1470
223b71206888 Initial import
thib
parents:
diff changeset
1471 void DSurfaceFill(Surface* src, const Rect& rect, int r, int g, int b, int a = 0xff);
223b71206888 Initial import
thib
parents:
diff changeset
1472
223b71206888 Initial import
thib
parents:
diff changeset
1473 struct Scn2kMenuImpl {
223b71206888 Initial import
thib
parents:
diff changeset
1474 Scn2kMenu& interface;
223b71206888 Initial import
thib
parents:
diff changeset
1475 MenuItem* menu;
223b71206888 Initial import
thib
parents:
diff changeset
1476 Event::Container* pevent;
223b71206888 Initial import
thib
parents:
diff changeset
1477 PicContainer* pparent;
223b71206888 Initial import
thib
parents:
diff changeset
1478
223b71206888 Initial import
thib
parents:
diff changeset
1479 virtual void InitPanel(Event::Container& event, PicContainer& parent) = 0;
223b71206888 Initial import
thib
parents:
diff changeset
1480 virtual void InitTitle(const SaveTitle&) = 0;
223b71206888 Initial import
thib
parents:
diff changeset
1481 virtual void Cancel(void) = 0;
223b71206888 Initial import
thib
parents:
diff changeset
1482 virtual void Exec(Cmd& cmd) = 0;
223b71206888 Initial import
thib
parents:
diff changeset
1483 Scn2kMenuImpl(Scn2kMenu& _interface) : interface(_interface) {
52
15a18fbe6f21 * Known bugs added to the README
thib
parents: 50
diff changeset
1484 menu = NULL;
15a18fbe6f21 * Known bugs added to the README
thib
parents: 50
diff changeset
1485 pevent = NULL;
15a18fbe6f21 * Known bugs added to the README
thib
parents: 50
diff changeset
1486 pparent = NULL;
0
223b71206888 Initial import
thib
parents:
diff changeset
1487 }
223b71206888 Initial import
thib
parents:
diff changeset
1488 virtual ~Scn2kMenuImpl() {
223b71206888 Initial import
thib
parents:
diff changeset
1489 if (menu) delete menu;
52
15a18fbe6f21 * Known bugs added to the README
thib
parents: 50
diff changeset
1490 menu = NULL;
0
223b71206888 Initial import
thib
parents:
diff changeset
1491 }
223b71206888 Initial import
thib
parents:
diff changeset
1492 };
223b71206888 Initial import
thib
parents:
diff changeset
1493
223b71206888 Initial import
thib
parents:
diff changeset
1494 struct LoadMenu : Scn2kMenuImpl {
223b71206888 Initial import
thib
parents:
diff changeset
1495 vector<string> title;
223b71206888 Initial import
thib
parents:
diff changeset
1496 vector<int> title_valid;
223b71206888 Initial import
thib
parents:
diff changeset
1497 RadioButton* btn_local;
223b71206888 Initial import
thib
parents:
diff changeset
1498 RadioButton* btn_page;
223b71206888 Initial import
thib
parents:
diff changeset
1499 RadioButton* btn_set;
223b71206888 Initial import
thib
parents:
diff changeset
1500 Scale* btn_scale;
223b71206888 Initial import
thib
parents:
diff changeset
1501 Dialog* awk_dialog;
223b71206888 Initial import
thib
parents:
diff changeset
1502 int btn_page_val, btn_set_val, btn_local_val, select_page, select_value;
223b71206888 Initial import
thib
parents:
diff changeset
1503 LoadMenu(Scn2kMenu& _interface);
223b71206888 Initial import
thib
parents:
diff changeset
1504 ~LoadMenu();
223b71206888 Initial import
thib
parents:
diff changeset
1505 void InitPanel(Event::Container& event, PicContainer& parent);
223b71206888 Initial import
thib
parents:
diff changeset
1506 void InitTitle(const SaveTitle&);
223b71206888 Initial import
thib
parents:
diff changeset
1507 void Cancel(void);
223b71206888 Initial import
thib
parents:
diff changeset
1508 void Exec(Cmd& cmd);
223b71206888 Initial import
thib
parents:
diff changeset
1509 static void ChangeBtnPage(void* pointer, MenuItem* widget);
223b71206888 Initial import
thib
parents:
diff changeset
1510 static void ChangeBtnLocal(void* pointer, MenuItem* widget);
223b71206888 Initial import
thib
parents:
diff changeset
1511 static void ChangeBtnScale(void* pointer, Scale* widget);
223b71206888 Initial import
thib
parents:
diff changeset
1512 static void ChangeBtnSet(void* pointer, MenuItem* widget);
223b71206888 Initial import
thib
parents:
diff changeset
1513 static void ChangeDialog(void* pointer, Dialog* widget);
223b71206888 Initial import
thib
parents:
diff changeset
1514 bool in_setpage;
223b71206888 Initial import
thib
parents:
diff changeset
1515 void SetPage(int new_page);
223b71206888 Initial import
thib
parents:
diff changeset
1516 void SetValue(int new_value);
223b71206888 Initial import
thib
parents:
diff changeset
1517 void PressOk(void);
223b71206888 Initial import
thib
parents:
diff changeset
1518 };
223b71206888 Initial import
thib
parents:
diff changeset
1519 LoadMenu::LoadMenu(Scn2kMenu& _interface) : Scn2kMenuImpl(_interface) {
52
15a18fbe6f21 * Known bugs added to the README
thib
parents: 50
diff changeset
1520 btn_local = NULL;
15a18fbe6f21 * Known bugs added to the README
thib
parents: 50
diff changeset
1521 btn_scale = NULL;
15a18fbe6f21 * Known bugs added to the README
thib
parents: 50
diff changeset
1522 btn_set = NULL;
0
223b71206888 Initial import
thib
parents:
diff changeset
1523 btn_page_val = 0;
223b71206888 Initial import
thib
parents:
diff changeset
1524 btn_set_val = -1;
223b71206888 Initial import
thib
parents:
diff changeset
1525 btn_local_val = -1;
52
15a18fbe6f21 * Known bugs added to the README
thib
parents: 50
diff changeset
1526 awk_dialog = NULL;
0
223b71206888 Initial import
thib
parents:
diff changeset
1527 in_setpage = false;
223b71206888 Initial import
thib
parents:
diff changeset
1528 select_page = 0;
223b71206888 Initial import
thib
parents:
diff changeset
1529 select_value = -1;
223b71206888 Initial import
thib
parents:
diff changeset
1530 }
223b71206888 Initial import
thib
parents:
diff changeset
1531 LoadMenu::~LoadMenu() {
223b71206888 Initial import
thib
parents:
diff changeset
1532 if (awk_dialog) delete awk_dialog;
223b71206888 Initial import
thib
parents:
diff changeset
1533 }
223b71206888 Initial import
thib
parents:
diff changeset
1534 void LoadMenu::InitPanel(Event::Container& event, PicContainer& parent) {
223b71206888 Initial import
thib
parents:
diff changeset
1535 pevent = &event;
223b71206888 Initial import
thib
parents:
diff changeset
1536 pparent = &parent;
223b71206888 Initial import
thib
parents:
diff changeset
1537
223b71206888 Initial import
thib
parents:
diff changeset
1538 if (menu) delete menu;
52
15a18fbe6f21 * Known bugs added to the README
thib
parents: 50
diff changeset
1539 menu = NULL;
0
223b71206888 Initial import
thib
parents:
diff changeset
1540 menu = new MenuItem(&parent, Rect(80,30,560, 450), 1, 3, 0);
223b71206888 Initial import
thib
parents:
diff changeset
1541 Surface* surface = parent.Root().NewSurface(menu->Pic()->Width(), menu->Pic()->Height(), ALPHA_MASK);
223b71206888 Initial import
thib
parents:
diff changeset
1542 if (interface.type == Scn2kMenu::MENU_LOAD) {
223b71206888 Initial import
thib
parents:
diff changeset
1543 menu->SetLabelTop(new Label(menu->PicNode(), Rect(0,0), true, "Load", 26), Rect(0,0,10,0), Rect(0,0,0,20));
223b71206888 Initial import
thib
parents:
diff changeset
1544 DSurfaceFill(surface, Rect(*surface), 0, 0, 0x80, 0x80);
223b71206888 Initial import
thib
parents:
diff changeset
1545 } else {
223b71206888 Initial import
thib
parents:
diff changeset
1546 menu->SetLabelTop(new Label(menu->PicNode(), Rect(0,0), true, "Save", 26), Rect(0,0,10,0), Rect(0,0,0,20));
223b71206888 Initial import
thib
parents:
diff changeset
1547 DSurfaceFill(surface, Rect(*surface), 0, 0x80, 0, 0x80);
223b71206888 Initial import
thib
parents:
diff changeset
1548 }
223b71206888 Initial import
thib
parents:
diff changeset
1549 menu->Pic()->SetSurface(surface, 0, 0);
223b71206888 Initial import
thib
parents:
diff changeset
1550 menu->Pic()->SetSurfaceFreeFlag();
223b71206888 Initial import
thib
parents:
diff changeset
1551
223b71206888 Initial import
thib
parents:
diff changeset
1552 btn_page = new RadioButton(event, menu->PicNode(), Rect(0, 0, 480, 40), 10, 1, &btn_page_val,
223b71206888 Initial import
thib
parents:
diff changeset
1553 Rect(0,0,0,0), 18, Color(0,0,0),Color(0xff,0,0),Color(0xff,0x80,0));
223b71206888 Initial import
thib
parents:
diff changeset
1554 btn_page->set_func = &ChangeBtnPage;
223b71206888 Initial import
thib
parents:
diff changeset
1555 btn_page->set_pointer = this;
223b71206888 Initial import
thib
parents:
diff changeset
1556 btn_page->SetLabelLeft(new Label(btn_page->PicNode(), Rect(0,0), true, "Page", 18), Rect(0, 0, 180, 0), Rect(0,0));
223b71206888 Initial import
thib
parents:
diff changeset
1557 btn_page->Add(" 1 ");
223b71206888 Initial import
thib
parents:
diff changeset
1558 btn_page->Add(" 2 ");
223b71206888 Initial import
thib
parents:
diff changeset
1559 btn_page->Add(" 3 ");
223b71206888 Initial import
thib
parents:
diff changeset
1560 btn_page->Add(" 4 ");
223b71206888 Initial import
thib
parents:
diff changeset
1561 btn_page->Add(" 5 ");
223b71206888 Initial import
thib
parents:
diff changeset
1562 btn_page->Add(" 6 ");
223b71206888 Initial import
thib
parents:
diff changeset
1563 btn_page->Add(" 7 ");
223b71206888 Initial import
thib
parents:
diff changeset
1564 btn_page->Add(" 8 ");
223b71206888 Initial import
thib
parents:
diff changeset
1565 btn_page->Add(" 9 ");
223b71206888 Initial import
thib
parents:
diff changeset
1566 btn_page->Add(" 10 ");
223b71206888 Initial import
thib
parents:
diff changeset
1567 btn_page->pack();
223b71206888 Initial import
thib
parents:
diff changeset
1568 /*
223b71206888 Initial import
thib
parents:
diff changeset
1569 surface = parent.Root().NewSurface(btn_page->Pic()->Width(), btn_page->Pic()->Height(), ALPHA_MASK);
223b71206888 Initial import
thib
parents:
diff changeset
1570 DSurfaceFill(surface, Rect(*surface), 0xff, 0, 0, 0x80);
223b71206888 Initial import
thib
parents:
diff changeset
1571 btn_page->Pic()->SetSurface(surface, 0, 0);
223b71206888 Initial import
thib
parents:
diff changeset
1572 btn_page->Pic()->SetSurfaceFreeFlag();
223b71206888 Initial import
thib
parents:
diff changeset
1573 */
223b71206888 Initial import
thib
parents:
diff changeset
1574 menu->item[0] = btn_page;
223b71206888 Initial import
thib
parents:
diff changeset
1575 btn_set = new RadioButton(event, menu->PicNode(), Rect(0, 0, 480, 40), 2, 1, &btn_set_val,
223b71206888 Initial import
thib
parents:
diff changeset
1576 Rect(0,0,0,0), 18, Color(0,0,0),Color(0xff,0,0),Color(0xff,0x80,0));
223b71206888 Initial import
thib
parents:
diff changeset
1577 btn_set->set_func = &ChangeBtnSet;
223b71206888 Initial import
thib
parents:
diff changeset
1578 btn_set->set_pointer = this;
223b71206888 Initial import
thib
parents:
diff changeset
1579 btn_set->SetLabelLeft(new Label(btn_set->PicNode(), Rect(0,0)), Rect(0,0,200,0), Rect(0,0));
223b71206888 Initial import
thib
parents:
diff changeset
1580 if (interface.type == Scn2kMenu::MENU_LOAD) {
223b71206888 Initial import
thib
parents:
diff changeset
1581 btn_set->Add(" Load ");
223b71206888 Initial import
thib
parents:
diff changeset
1582 } else {
223b71206888 Initial import
thib
parents:
diff changeset
1583 btn_set->Add(" Save ");
223b71206888 Initial import
thib
parents:
diff changeset
1584 }
223b71206888 Initial import
thib
parents:
diff changeset
1585 btn_set->Add(" Cancel ");
223b71206888 Initial import
thib
parents:
diff changeset
1586 btn_set->pack();
223b71206888 Initial import
thib
parents:
diff changeset
1587 /*
223b71206888 Initial import
thib
parents:
diff changeset
1588 surface = parent.Root().NewSurface(btn_set->Pic()->Width(), btn_set->Pic()->Height(), ALPHA_MASK);
223b71206888 Initial import
thib
parents:
diff changeset
1589 DSurfaceFill(surface, Rect(*surface), 0, 0, 0xff, 0x80);
223b71206888 Initial import
thib
parents:
diff changeset
1590 btn_set->Pic()->SetSurface(surface, 0, 0);
223b71206888 Initial import
thib
parents:
diff changeset
1591 btn_set->Pic()->SetSurfaceFreeFlag();
223b71206888 Initial import
thib
parents:
diff changeset
1592 */
223b71206888 Initial import
thib
parents:
diff changeset
1593 menu->item[2] = btn_set;
223b71206888 Initial import
thib
parents:
diff changeset
1594 // void btn_set_press(void* pointer, MenuItem* widget);
223b71206888 Initial import
thib
parents:
diff changeset
1595 // btn_set->set_func = btn_set_press;
223b71206888 Initial import
thib
parents:
diff changeset
1596 // btn_set->set_pointer = this;
223b71206888 Initial import
thib
parents:
diff changeset
1597 btn_local = new RadioButton(*pevent, menu->PicNode(), Rect(0, 0, 480, 300), 1, 100, &btn_local_val,
223b71206888 Initial import
thib
parents:
diff changeset
1598 Rect(0,0,300,30), 18, Color(0,0,0),Color(0xff,0,0),Color(0xff,0x80,0));
223b71206888 Initial import
thib
parents:
diff changeset
1599 btn_local->set_func = &ChangeBtnLocal;
223b71206888 Initial import
thib
parents:
diff changeset
1600 btn_local->set_pointer = this;
223b71206888 Initial import
thib
parents:
diff changeset
1601 /*
223b71206888 Initial import
thib
parents:
diff changeset
1602 surface = pparent->Root().NewSurface(btn_local->Pic()->Width(), btn_local->Pic()->Height(), ALPHA_MASK);
223b71206888 Initial import
thib
parents:
diff changeset
1603 DSurfaceFill(surface, Rect(*surface), 0, 0xff, 0, 0x80);
223b71206888 Initial import
thib
parents:
diff changeset
1604 btn_local->Pic()->SetSurface(surface, 0, 0);
223b71206888 Initial import
thib
parents:
diff changeset
1605 btn_local->Pic()->SetSurfaceFreeFlag();
223b71206888 Initial import
thib
parents:
diff changeset
1606 */
223b71206888 Initial import
thib
parents:
diff changeset
1607 menu->item[1] = btn_local;
223b71206888 Initial import
thib
parents:
diff changeset
1608 int i;
223b71206888 Initial import
thib
parents:
diff changeset
1609 for (i=0; i<12; i++)
223b71206888 Initial import
thib
parents:
diff changeset
1610 btn_local->Add("",false);
223b71206888 Initial import
thib
parents:
diff changeset
1611 btn_local->pack();
223b71206888 Initial import
thib
parents:
diff changeset
1612 btn_local->show_all();
223b71206888 Initial import
thib
parents:
diff changeset
1613 menu->pack();
223b71206888 Initial import
thib
parents:
diff changeset
1614
223b71206888 Initial import
thib
parents:
diff changeset
1615 PicBase* local_pic = btn_local->Pic();
223b71206888 Initial import
thib
parents:
diff changeset
1616 int local_x2 = local_pic->PosX() + local_pic->Width();
223b71206888 Initial import
thib
parents:
diff changeset
1617 int local_y2 = local_pic->PosY() + local_pic->Height();
223b71206888 Initial import
thib
parents:
diff changeset
1618 btn_scale = new Scale(*pevent, menu->PicNode(), Rect(local_x2-16, local_pic->PosY(), local_x2, local_y2), Color(0xff, 0x80, 0), true);
223b71206888 Initial import
thib
parents:
diff changeset
1619 btn_scale->SetRange(0, 900);
223b71206888 Initial import
thib
parents:
diff changeset
1620 btn_scale->InitCursor(1024/10);
223b71206888 Initial import
thib
parents:
diff changeset
1621 btn_scale->SetValue(0);
223b71206888 Initial import
thib
parents:
diff changeset
1622 btn_scale->change_func = &ChangeBtnScale;
223b71206888 Initial import
thib
parents:
diff changeset
1623 btn_scale->change_pointer = this;
223b71206888 Initial import
thib
parents:
diff changeset
1624
223b71206888 Initial import
thib
parents:
diff changeset
1625 menu->PicNode()->show_all();
223b71206888 Initial import
thib
parents:
diff changeset
1626 }
223b71206888 Initial import
thib
parents:
diff changeset
1627
223b71206888 Initial import
thib
parents:
diff changeset
1628 void LoadMenu::InitTitle(const SaveTitle& title_op) {
223b71206888 Initial import
thib
parents:
diff changeset
1629 title.clear();
223b71206888 Initial import
thib
parents:
diff changeset
1630 int i;
223b71206888 Initial import
thib
parents:
diff changeset
1631 for (i=1; i<=100; i++) {
223b71206888 Initial import
thib
parents:
diff changeset
1632 char buf[100];
223b71206888 Initial import
thib
parents:
diff changeset
1633 sprintf(buf,"%2d:",i);
223b71206888 Initial import
thib
parents:
diff changeset
1634 string t = title_op(i);
223b71206888 Initial import
thib
parents:
diff changeset
1635 string s = string(buf) + t;
223b71206888 Initial import
thib
parents:
diff changeset
1636 if (t.length() == 0) {
223b71206888 Initial import
thib
parents:
diff changeset
1637 string s = string(buf) + "--------";
223b71206888 Initial import
thib
parents:
diff changeset
1638 title_valid.push_back(0);
223b71206888 Initial import
thib
parents:
diff changeset
1639 } else {
223b71206888 Initial import
thib
parents:
diff changeset
1640 title_valid.push_back(1);
223b71206888 Initial import
thib
parents:
diff changeset
1641 }
223b71206888 Initial import
thib
parents:
diff changeset
1642 title.push_back(s);
223b71206888 Initial import
thib
parents:
diff changeset
1643 }
223b71206888 Initial import
thib
parents:
diff changeset
1644 if (btn_local==0) return;
223b71206888 Initial import
thib
parents:
diff changeset
1645 for (i=0; i<10; i++) {
223b71206888 Initial import
thib
parents:
diff changeset
1646 TextButton* button = dynamic_cast<TextButton*>(btn_local->item[i]);
223b71206888 Initial import
thib
parents:
diff changeset
1647 if (button) button->SetText(title[i].c_str());
223b71206888 Initial import
thib
parents:
diff changeset
1648 }
223b71206888 Initial import
thib
parents:
diff changeset
1649 }
223b71206888 Initial import
thib
parents:
diff changeset
1650
223b71206888 Initial import
thib
parents:
diff changeset
1651 void LoadMenu::SetPage(int new_page) {
223b71206888 Initial import
thib
parents:
diff changeset
1652 if (new_page < 0) new_page = 0;
223b71206888 Initial import
thib
parents:
diff changeset
1653 if (new_page > 900) new_page = 900;
223b71206888 Initial import
thib
parents:
diff changeset
1654 if (select_page == new_page) return;
223b71206888 Initial import
thib
parents:
diff changeset
1655 if (in_setpage) return;
223b71206888 Initial import
thib
parents:
diff changeset
1656 in_setpage = true;
223b71206888 Initial import
thib
parents:
diff changeset
1657
223b71206888 Initial import
thib
parents:
diff changeset
1658 int prev_page = select_page / 10;
223b71206888 Initial import
thib
parents:
diff changeset
1659 int cur_page = new_page / 10;
223b71206888 Initial import
thib
parents:
diff changeset
1660 int prev_point = select_page%10;
223b71206888 Initial import
thib
parents:
diff changeset
1661 int new_point = new_page%10;
223b71206888 Initial import
thib
parents:
diff changeset
1662 select_page = new_page;
223b71206888 Initial import
thib
parents:
diff changeset
1663 if (prev_page != cur_page) {
223b71206888 Initial import
thib
parents:
diff changeset
1664 int i;
223b71206888 Initial import
thib
parents:
diff changeset
1665 for (i=0; i<12; i++) {
223b71206888 Initial import
thib
parents:
diff changeset
1666 TextButton* button = dynamic_cast<TextButton*>(btn_local->item[i]);
223b71206888 Initial import
thib
parents:
diff changeset
1667 if (button) {
223b71206888 Initial import
thib
parents:
diff changeset
1668 if (cur_page+i < title.size()) button->SetText(title[cur_page+i].c_str());
223b71206888 Initial import
thib
parents:
diff changeset
1669 else button->SetText("----");
223b71206888 Initial import
thib
parents:
diff changeset
1670 }
223b71206888 Initial import
thib
parents:
diff changeset
1671 }
223b71206888 Initial import
thib
parents:
diff changeset
1672 // ボタンの内容を変更する
223b71206888 Initial import
thib
parents:
diff changeset
1673 if (select_value < cur_page || select_value > cur_page+12)
223b71206888 Initial import
thib
parents:
diff changeset
1674 btn_local->SetValue(-1);
223b71206888 Initial import
thib
parents:
diff changeset
1675 else
223b71206888 Initial import
thib
parents:
diff changeset
1676 btn_local->SetValue(select_value - cur_page);
223b71206888 Initial import
thib
parents:
diff changeset
1677 }
223b71206888 Initial import
thib
parents:
diff changeset
1678 if (prev_point != new_point) {
223b71206888 Initial import
thib
parents:
diff changeset
1679 int i;
223b71206888 Initial import
thib
parents:
diff changeset
1680 for (i=0; i<12; i++) {
223b71206888 Initial import
thib
parents:
diff changeset
1681 int old_x = btn_local->item[i]->Pic()->PosX();
223b71206888 Initial import
thib
parents:
diff changeset
1682 btn_local->item[i]->Pic()->Move(old_x, i*30-new_point*3);
223b71206888 Initial import
thib
parents:
diff changeset
1683 }
223b71206888 Initial import
thib
parents:
diff changeset
1684 }
52
15a18fbe6f21 * Known bugs added to the README
thib
parents: 50
diff changeset
1685 if (btn_page != NULL) {
0
223b71206888 Initial import
thib
parents:
diff changeset
1686 if (select_page%100 == 0) btn_page->SetValue(select_page/100);
223b71206888 Initial import
thib
parents:
diff changeset
1687 else btn_page->SetValue(-1);
223b71206888 Initial import
thib
parents:
diff changeset
1688 }
52
15a18fbe6f21 * Known bugs added to the README
thib
parents: 50
diff changeset
1689 if (btn_scale != NULL) {
0
223b71206888 Initial import
thib
parents:
diff changeset
1690 btn_scale->SetValue(select_page);
223b71206888 Initial import
thib
parents:
diff changeset
1691 }
223b71206888 Initial import
thib
parents:
diff changeset
1692 in_setpage = false;
223b71206888 Initial import
thib
parents:
diff changeset
1693 }
52
15a18fbe6f21 * Known bugs added to the README
thib
parents: 50
diff changeset
1694
0
223b71206888 Initial import
thib
parents:
diff changeset
1695 void LoadMenu::SetValue(int new_value) {
223b71206888 Initial import
thib
parents:
diff changeset
1696 if (in_setpage) return;
223b71206888 Initial import
thib
parents:
diff changeset
1697 in_setpage = true;
223b71206888 Initial import
thib
parents:
diff changeset
1698
223b71206888 Initial import
thib
parents:
diff changeset
1699 if (new_value < 0 || new_value > title.size() ||
223b71206888 Initial import
thib
parents:
diff changeset
1700 (interface.type == Scn2kMenu::MENU_LOAD && title_valid[new_value] == 0) ) { // 無効な選択肢
223b71206888 Initial import
thib
parents:
diff changeset
1701 if (select_value < select_page/10 || select_value > select_page/10+12)
223b71206888 Initial import
thib
parents:
diff changeset
1702 btn_local->SetValue(-1);
223b71206888 Initial import
thib
parents:
diff changeset
1703 else
223b71206888 Initial import
thib
parents:
diff changeset
1704 btn_local->SetValue(select_value-select_page/10);
223b71206888 Initial import
thib
parents:
diff changeset
1705 } else { // 選択肢を変更する
223b71206888 Initial import
thib
parents:
diff changeset
1706 if (select_value == new_value) {
223b71206888 Initial import
thib
parents:
diff changeset
1707 PressOk(); // ダブルクリック
223b71206888 Initial import
thib
parents:
diff changeset
1708 } else {
223b71206888 Initial import
thib
parents:
diff changeset
1709 select_value = new_value;
223b71206888 Initial import
thib
parents:
diff changeset
1710 if (interface.type == Scn2kMenu::MENU_SAVE && title_valid[select_value] == 0) {
223b71206888 Initial import
thib
parents:
diff changeset
1711 PressOk(); // 新しいセーブデータなら無条件に選択
223b71206888 Initial import
thib
parents:
diff changeset
1712 }
223b71206888 Initial import
thib
parents:
diff changeset
1713 }
223b71206888 Initial import
thib
parents:
diff changeset
1714 }
223b71206888 Initial import
thib
parents:
diff changeset
1715
223b71206888 Initial import
thib
parents:
diff changeset
1716 in_setpage = false;
223b71206888 Initial import
thib
parents:
diff changeset
1717 }
52
15a18fbe6f21 * Known bugs added to the README
thib
parents: 50
diff changeset
1718
0
223b71206888 Initial import
thib
parents:
diff changeset
1719 void LoadMenu::PressOk(void) {
223b71206888 Initial import
thib
parents:
diff changeset
1720 if (select_value == -1) {
223b71206888 Initial import
thib
parents:
diff changeset
1721 btn_set->SetValue(-1); // なにもしない
223b71206888 Initial import
thib
parents:
diff changeset
1722 return;
223b71206888 Initial import
thib
parents:
diff changeset
1723 }
223b71206888 Initial import
thib
parents:
diff changeset
1724 menu->deactivate();
223b71206888 Initial import
thib
parents:
diff changeset
1725 if (interface.type == Scn2kMenu::MENU_LOAD) {
223b71206888 Initial import
thib
parents:
diff changeset
1726 interface.cmd.cmd_type = CMD_LOAD;
223b71206888 Initial import
thib
parents:
diff changeset
1727 interface.cmd.args.push_back(VarInfo(select_value));
223b71206888 Initial import
thib
parents:
diff changeset
1728 awk_dialog = new Dialog(*pevent, pparent, "ファイルをロードしますか?", true);
223b71206888 Initial import
thib
parents:
diff changeset
1729 awk_dialog->set_pointer = this;
223b71206888 Initial import
thib
parents:
diff changeset
1730 awk_dialog->set_func = ChangeDialog;
223b71206888 Initial import
thib
parents:
diff changeset
1731 } else {// MENU_SAVE
223b71206888 Initial import
thib
parents:
diff changeset
1732 interface.cmd.cmd_type = CMD_SAVE;
223b71206888 Initial import
thib
parents:
diff changeset
1733 interface.cmd.args.push_back(VarInfo(select_value));
223b71206888 Initial import
thib
parents:
diff changeset
1734 if (title_valid[select_value] == 0) { // 新しいセーブデータ
223b71206888 Initial import
thib
parents:
diff changeset
1735 interface.status = Scn2kMenu::MenuStatus(Scn2kMenu::MENU_CMD | Scn2kMenu::MENU_DELETE);
223b71206888 Initial import
thib
parents:
diff changeset
1736 } else { // セーブデータを上書き:確認
223b71206888 Initial import
thib
parents:
diff changeset
1737 awk_dialog = new Dialog(*pevent, pparent, "データを上書きしますか?", true);
223b71206888 Initial import
thib
parents:
diff changeset
1738 awk_dialog->set_pointer = this;
223b71206888 Initial import
thib
parents:
diff changeset
1739 awk_dialog->set_func = ChangeDialog;
223b71206888 Initial import
thib
parents:
diff changeset
1740 }
223b71206888 Initial import
thib
parents:
diff changeset
1741 }
223b71206888 Initial import
thib
parents:
diff changeset
1742 }
52
15a18fbe6f21 * Known bugs added to the README
thib
parents: 50
diff changeset
1743
0
223b71206888 Initial import
thib
parents:
diff changeset
1744 void LoadMenu::Cancel(void) {
52
15a18fbe6f21 * Known bugs added to the README
thib
parents: 50
diff changeset
1745 if (awk_dialog != NULL) { // ダイアログのキャンセル
0
223b71206888 Initial import
thib
parents:
diff changeset
1746 awk_dialog->status = Dialog::CANCEL;
223b71206888 Initial import
thib
parents:
diff changeset
1747 ChangeDialog(this, awk_dialog);
223b71206888 Initial import
thib
parents:
diff changeset
1748 } else { // 一般キャンセル
223b71206888 Initial import
thib
parents:
diff changeset
1749 btn_set->SetValue(1);
223b71206888 Initial import
thib
parents:
diff changeset
1750 }
223b71206888 Initial import
thib
parents:
diff changeset
1751 }
52
15a18fbe6f21 * Known bugs added to the README
thib
parents: 50
diff changeset
1752
0
223b71206888 Initial import
thib
parents:
diff changeset
1753 void LoadMenu::Exec(Cmd& cmd) {
223b71206888 Initial import
thib
parents:
diff changeset
1754 }
52
15a18fbe6f21 * Known bugs added to the README
thib
parents: 50
diff changeset
1755
0
223b71206888 Initial import
thib
parents:
diff changeset
1756 void LoadMenu::ChangeBtnPage(void* pointer, MenuItem* widget) {
223b71206888 Initial import
thib
parents:
diff changeset
1757 LoadMenu* instance = (LoadMenu*)pointer;
223b71206888 Initial import
thib
parents:
diff changeset
1758 if (instance->btn_page_val == -1) return;
223b71206888 Initial import
thib
parents:
diff changeset
1759 instance->SetPage(instance->btn_page_val*100);
223b71206888 Initial import
thib
parents:
diff changeset
1760 }
52
15a18fbe6f21 * Known bugs added to the README
thib
parents: 50
diff changeset
1761
0
223b71206888 Initial import
thib
parents:
diff changeset
1762 void LoadMenu::ChangeBtnScale(void* pointer, Scale* from) {
223b71206888 Initial import
thib
parents:
diff changeset
1763 LoadMenu* instance = (LoadMenu*)pointer;
223b71206888 Initial import
thib
parents:
diff changeset
1764 int value = from->GetValue();
223b71206888 Initial import
thib
parents:
diff changeset
1765 instance->SetPage(value);
223b71206888 Initial import
thib
parents:
diff changeset
1766 }
52
15a18fbe6f21 * Known bugs added to the README
thib
parents: 50
diff changeset
1767
0
223b71206888 Initial import
thib
parents:
diff changeset
1768 void LoadMenu::ChangeBtnSet(void* pointer, MenuItem* widget) {
223b71206888 Initial import
thib
parents:
diff changeset
1769 LoadMenu* instance = (LoadMenu*)pointer;
223b71206888 Initial import
thib
parents:
diff changeset
1770 if (instance->btn_set_val == 1) { // cancel
223b71206888 Initial import
thib
parents:
diff changeset
1771 instance->interface.status = Scn2kMenu::MENU_DELETE;
223b71206888 Initial import
thib
parents:
diff changeset
1772 return;
223b71206888 Initial import
thib
parents:
diff changeset
1773 } else if (instance->btn_set_val == 0) { // OK
223b71206888 Initial import
thib
parents:
diff changeset
1774 instance->PressOk();
223b71206888 Initial import
thib
parents:
diff changeset
1775 }
223b71206888 Initial import
thib
parents:
diff changeset
1776 }
52
15a18fbe6f21 * Known bugs added to the README
thib
parents: 50
diff changeset
1777
0
223b71206888 Initial import
thib
parents:
diff changeset
1778 void LoadMenu::ChangeDialog(void* pointer, Dialog* widget) {
223b71206888 Initial import
thib
parents:
diff changeset
1779 LoadMenu* instance = (LoadMenu*)pointer;
223b71206888 Initial import
thib
parents:
diff changeset
1780 if (widget->status == Dialog::CANCEL) {
223b71206888 Initial import
thib
parents:
diff changeset
1781 // ダイアログ消去、OK ボタン復帰
223b71206888 Initial import
thib
parents:
diff changeset
1782 delete instance->awk_dialog;
52
15a18fbe6f21 * Known bugs added to the README
thib
parents: 50
diff changeset
1783 instance->awk_dialog = NULL;
0
223b71206888 Initial import
thib
parents:
diff changeset
1784 instance->menu->activate();
223b71206888 Initial import
thib
parents:
diff changeset
1785 instance->btn_set->SetValue(-1);
223b71206888 Initial import
thib
parents:
diff changeset
1786 return;
223b71206888 Initial import
thib
parents:
diff changeset
1787 } else if (widget->status == Dialog::OK) {
223b71206888 Initial import
thib
parents:
diff changeset
1788 instance->interface.status = Scn2kMenu::MenuStatus(Scn2kMenu::MENU_CMD | Scn2kMenu::MENU_DELETE);
223b71206888 Initial import
thib
parents:
diff changeset
1789 return;
223b71206888 Initial import
thib
parents:
diff changeset
1790 }
223b71206888 Initial import
thib
parents:
diff changeset
1791 }
52
15a18fbe6f21 * Known bugs added to the README
thib
parents: 50
diff changeset
1792
0
223b71206888 Initial import
thib
parents:
diff changeset
1793 void LoadMenu::ChangeBtnLocal(void* pointer, MenuItem* widget) {
223b71206888 Initial import
thib
parents:
diff changeset
1794 LoadMenu* instance = (LoadMenu*)pointer;
223b71206888 Initial import
thib
parents:
diff changeset
1795 if (instance->btn_local_val == -1) return;
223b71206888 Initial import
thib
parents:
diff changeset
1796 instance->SetValue( (instance->select_page/10) + instance->btn_local_val);
223b71206888 Initial import
thib
parents:
diff changeset
1797 }
223b71206888 Initial import
thib
parents:
diff changeset
1798
223b71206888 Initial import
thib
parents:
diff changeset
1799 struct BacklogMenu : Scn2kMenuImpl {
223b71206888 Initial import
thib
parents:
diff changeset
1800 Scn2k& scn_impl;
223b71206888 Initial import
thib
parents:
diff changeset
1801 Text& text_exec;
223b71206888 Initial import
thib
parents:
diff changeset
1802 bool backlog_update;
223b71206888 Initial import
thib
parents:
diff changeset
1803 int backlog_cnt;
223b71206888 Initial import
thib
parents:
diff changeset
1804 BacklogMenu(Scn2kMenu& _interface, Scn2k& scn_impl, Text& text_exec);
223b71206888 Initial import
thib
parents:
diff changeset
1805 ~BacklogMenu();
223b71206888 Initial import
thib
parents:
diff changeset
1806 void InitPanel(Event::Container& event, PicContainer& parent);
223b71206888 Initial import
thib
parents:
diff changeset
1807 void InitTitle(const SaveTitle&);
223b71206888 Initial import
thib
parents:
diff changeset
1808 void Cancel(void);
223b71206888 Initial import
thib
parents:
diff changeset
1809 void Exec(Cmd& cmd);
223b71206888 Initial import
thib
parents:
diff changeset
1810 };
52
15a18fbe6f21 * Known bugs added to the README
thib
parents: 50
diff changeset
1811
0
223b71206888 Initial import
thib
parents:
diff changeset
1812 BacklogMenu::BacklogMenu(Scn2kMenu& _interface, Scn2k& _scn, Text& parent_text_exec) : Scn2kMenuImpl(_interface), scn_impl(_scn), text_exec(parent_text_exec) {
223b71206888 Initial import
thib
parents:
diff changeset
1813 backlog_cnt = -1;
223b71206888 Initial import
thib
parents:
diff changeset
1814 backlog_update = false;
223b71206888 Initial import
thib
parents:
diff changeset
1815 }
52
15a18fbe6f21 * Known bugs added to the README
thib
parents: 50
diff changeset
1816
0
223b71206888 Initial import
thib
parents:
diff changeset
1817 BacklogMenu::~BacklogMenu() {
223b71206888 Initial import
thib
parents:
diff changeset
1818 }
52
15a18fbe6f21 * Known bugs added to the README
thib
parents: 50
diff changeset
1819
0
223b71206888 Initial import
thib
parents:
diff changeset
1820 void BacklogMenu::InitPanel(Event::Container& event, PicContainer& parent) {
223b71206888 Initial import
thib
parents:
diff changeset
1821 pevent = &event;
223b71206888 Initial import
thib
parents:
diff changeset
1822 }
223b71206888 Initial import
thib
parents:
diff changeset
1823
223b71206888 Initial import
thib
parents:
diff changeset
1824 void BacklogMenu::InitTitle(const SaveTitle& title_op) {
223b71206888 Initial import
thib
parents:
diff changeset
1825 }
52
15a18fbe6f21 * Known bugs added to the README
thib
parents: 50
diff changeset
1826
0
223b71206888 Initial import
thib
parents:
diff changeset
1827 void BacklogMenu::Cancel(void) {
223b71206888 Initial import
thib
parents:
diff changeset
1828 interface.status = Scn2kMenu::MenuStatus(Scn2kMenu::MENU_DELETE);
223b71206888 Initial import
thib
parents:
diff changeset
1829 }
52
15a18fbe6f21 * Known bugs added to the README
thib
parents: 50
diff changeset
1830
0
223b71206888 Initial import
thib
parents:
diff changeset
1831 void BacklogMenu::Exec(Cmd& cmd) {
223b71206888 Initial import
thib
parents:
diff changeset
1832 int command_direction = 0; // forward
223b71206888 Initial import
thib
parents:
diff changeset
1833 if (cmd.cmd_type == CMD_NOP) text_exec.Wait(0xffffffffUL, cmd);
223b71206888 Initial import
thib
parents:
diff changeset
1834 if (cmd.cmd_type == CMD_BACKLOGREQ || pevent->presscount(MOUSE_UP)) {
223b71206888 Initial import
thib
parents:
diff changeset
1835 if (cmd.cmd_type == CMD_BACKLOGREQ) cmd.clear();
223b71206888 Initial import
thib
parents:
diff changeset
1836 backlog_cnt++;
223b71206888 Initial import
thib
parents:
diff changeset
1837 backlog_update = false;
223b71206888 Initial import
thib
parents:
diff changeset
1838 command_direction = 1;
223b71206888 Initial import
thib
parents:
diff changeset
1839 }
223b71206888 Initial import
thib
parents:
diff changeset
1840 if (cmd.cmd_type == CMD_BACKLOGREQ_FWD || pevent->presscount(MOUSE_DOWN)) {
223b71206888 Initial import
thib
parents:
diff changeset
1841 if (cmd.cmd_type == CMD_BACKLOGREQ_FWD) cmd.clear();
223b71206888 Initial import
thib
parents:
diff changeset
1842 backlog_cnt--;
223b71206888 Initial import
thib
parents:
diff changeset
1843 backlog_update = false;
223b71206888 Initial import
thib
parents:
diff changeset
1844 if (backlog_cnt == -2 || (
223b71206888 Initial import
thib
parents:
diff changeset
1845 (backlog_cnt == -1 && text_exec.backlog_item.scn == -1 && text_exec.backlog_item.pos == -1)) ){
223b71206888 Initial import
thib
parents:
diff changeset
1846 Cancel();
223b71206888 Initial import
thib
parents:
diff changeset
1847 return;
223b71206888 Initial import
thib
parents:
diff changeset
1848 }
223b71206888 Initial import
thib
parents:
diff changeset
1849 command_direction = -1;
223b71206888 Initial import
thib
parents:
diff changeset
1850 }
223b71206888 Initial import
thib
parents:
diff changeset
1851 if (cmd.cmd_type != CMD_NOP) return;
223b71206888 Initial import
thib
parents:
diff changeset
1852 if (backlog_update) return;
223b71206888 Initial import
thib
parents:
diff changeset
1853 // backlog を最新の状態に更新
223b71206888 Initial import
thib
parents:
diff changeset
1854 cmd.clear();
223b71206888 Initial import
thib
parents:
diff changeset
1855 BacklogItem item;
223b71206888 Initial import
thib
parents:
diff changeset
1856
223b71206888 Initial import
thib
parents:
diff changeset
1857 retry:
223b71206888 Initial import
thib
parents:
diff changeset
1858 if (backlog_cnt < -1) backlog_cnt = -1;
223b71206888 Initial import
thib
parents:
diff changeset
1859 if (backlog_cnt >= int(text_exec.backlog.size())) backlog_cnt = text_exec.backlog.size() - 1;
223b71206888 Initial import
thib
parents:
diff changeset
1860
223b71206888 Initial import
thib
parents:
diff changeset
1861 if (backlog_cnt == -1) {
223b71206888 Initial import
thib
parents:
diff changeset
1862 if (text_exec.backlog_item.scn == -1 && text_exec.backlog_item.pos == -1) {
223b71206888 Initial import
thib
parents:
diff changeset
1863 if (text_exec.backlog.size() == 0 || command_direction < 0) {
223b71206888 Initial import
thib
parents:
diff changeset
1864 Cancel();
223b71206888 Initial import
thib
parents:
diff changeset
1865 return;
223b71206888 Initial import
thib
parents:
diff changeset
1866 }
223b71206888 Initial import
thib
parents:
diff changeset
1867 item = text_exec.backlog.back();
223b71206888 Initial import
thib
parents:
diff changeset
1868 backlog_cnt = 0;
223b71206888 Initial import
thib
parents:
diff changeset
1869 } else {
223b71206888 Initial import
thib
parents:
diff changeset
1870 // item = text_exec.backlog.back();
223b71206888 Initial import
thib
parents:
diff changeset
1871 item = text_exec.backlog_item;
223b71206888 Initial import
thib
parents:
diff changeset
1872 }
223b71206888 Initial import
thib
parents:
diff changeset
1873 } else {
223b71206888 Initial import
thib
parents:
diff changeset
1874 item = text_exec.backlog[text_exec.backlog.size()-1-backlog_cnt];
223b71206888 Initial import
thib
parents:
diff changeset
1875 }
223b71206888 Initial import
thib
parents:
diff changeset
1876 if (item.scn == BacklogItem::SaveSelect) { // select marker ; skip this item
223b71206888 Initial import
thib
parents:
diff changeset
1877 if (command_direction == 0) command_direction = 1;
223b71206888 Initial import
thib
parents:
diff changeset
1878 backlog_cnt += command_direction;
223b71206888 Initial import
thib
parents:
diff changeset
1879 goto retry;
223b71206888 Initial import
thib
parents:
diff changeset
1880 }
223b71206888 Initial import
thib
parents:
diff changeset
1881 if (item.scn == 0 && item.pos == -1) ; // not read cmd
223b71206888 Initial import
thib
parents:
diff changeset
1882 else {
223b71206888 Initial import
thib
parents:
diff changeset
1883 scn_impl.ReadCmdAt(cmd, item.scn, item.pos);
223b71206888 Initial import
thib
parents:
diff changeset
1884 }
223b71206888 Initial import
thib
parents:
diff changeset
1885 text_exec.DrawBacklog(item, cmd);
223b71206888 Initial import
thib
parents:
diff changeset
1886 cmd.clear();
223b71206888 Initial import
thib
parents:
diff changeset
1887 backlog_update = true;
223b71206888 Initial import
thib
parents:
diff changeset
1888 }
223b71206888 Initial import
thib
parents:
diff changeset
1889
223b71206888 Initial import
thib
parents:
diff changeset
1890 /*******************************************************************************
223b71206888 Initial import
thib
parents:
diff changeset
1891 **
223b71206888 Initial import
thib
parents:
diff changeset
1892 **
223b71206888 Initial import
thib
parents:
diff changeset
1893 */
223b71206888 Initial import
thib
parents:
diff changeset
1894
223b71206888 Initial import
thib
parents:
diff changeset
1895 Scn2kMenu::Scn2kMenu(MenuType _type, Scn2k& scn_impl, const Flags& flags, Text& text_exec, int system_version) :
223b71206888 Initial import
thib
parents:
diff changeset
1896 cmd(flags, system_version), type(_type) {
52
15a18fbe6f21 * Known bugs added to the README
thib
parents: 50
diff changeset
1897 pimpl = NULL;
0
223b71206888 Initial import
thib
parents:
diff changeset
1898 status = MENU_CONTINUE;
223b71206888 Initial import
thib
parents:
diff changeset
1899 switch(type) {
223b71206888 Initial import
thib
parents:
diff changeset
1900 case MENU_LOAD: pimpl = new LoadMenu(*this); break;
223b71206888 Initial import
thib
parents:
diff changeset
1901 case MENU_SAVE: pimpl = new LoadMenu(*this); break;
223b71206888 Initial import
thib
parents:
diff changeset
1902 case MENU_BACKLOG: pimpl = new BacklogMenu(*this, scn_impl, text_exec); break;
223b71206888 Initial import
thib
parents:
diff changeset
1903 }
223b71206888 Initial import
thib
parents:
diff changeset
1904 }
53
ddbcbd000206 * MuSys, AyuSysConfig, FileSearcher (former FILESEARCHER) and KeyHolder (former KEYHOLDER) are now singletons
thib
parents: 52
diff changeset
1905
0
223b71206888 Initial import
thib
parents:
diff changeset
1906 Scn2kMenu::~Scn2kMenu() {
223b71206888 Initial import
thib
parents:
diff changeset
1907 if (pimpl) delete pimpl;
52
15a18fbe6f21 * Known bugs added to the README
thib
parents: 50
diff changeset
1908 pimpl = NULL;
0
223b71206888 Initial import
thib
parents:
diff changeset
1909 }
52
15a18fbe6f21 * Known bugs added to the README
thib
parents: 50
diff changeset
1910
0
223b71206888 Initial import
thib
parents:
diff changeset
1911 void Scn2kMenu::InitPanel(Event::Container& event, PicContainer& parent) {
52
15a18fbe6f21 * Known bugs added to the README
thib
parents: 50
diff changeset
1912 if (pimpl != NULL) pimpl->InitPanel(event, parent);
0
223b71206888 Initial import
thib
parents:
diff changeset
1913 }
52
15a18fbe6f21 * Known bugs added to the README
thib
parents: 50
diff changeset
1914
0
223b71206888 Initial import
thib
parents:
diff changeset
1915 void Scn2kMenu::InitTitle(const SaveTitle& t) {
52
15a18fbe6f21 * Known bugs added to the README
thib
parents: 50
diff changeset
1916 if (pimpl != NULL) pimpl->InitTitle(t);
0
223b71206888 Initial import
thib
parents:
diff changeset
1917 }
52
15a18fbe6f21 * Known bugs added to the README
thib
parents: 50
diff changeset
1918
0
223b71206888 Initial import
thib
parents:
diff changeset
1919 void Scn2kMenu::Cancel(void) {
223b71206888 Initial import
thib
parents:
diff changeset
1920 if (pimpl) pimpl->Cancel();
223b71206888 Initial import
thib
parents:
diff changeset
1921 }
52
15a18fbe6f21 * Known bugs added to the README
thib
parents: 50
diff changeset
1922
0
223b71206888 Initial import
thib
parents:
diff changeset
1923 void Scn2kMenu::Exec(Cmd& ret_cmd) {
52
15a18fbe6f21 * Known bugs added to the README
thib
parents: 50
diff changeset
1924 if (pimpl == NULL) return;
0
223b71206888 Initial import
thib
parents:
diff changeset
1925 pimpl->Exec(ret_cmd);
223b71206888 Initial import
thib
parents:
diff changeset
1926 if (pimpl->pevent->presscount(MOUSE_RIGHT)) {
223b71206888 Initial import
thib
parents:
diff changeset
1927 Cancel();
223b71206888 Initial import
thib
parents:
diff changeset
1928 }
223b71206888 Initial import
thib
parents:
diff changeset
1929 if (status & MENU_CMD && cmd.cmd_type != CMD_NOP) {
223b71206888 Initial import
thib
parents:
diff changeset
1930 status = Scn2kMenu::MenuStatus(status & (~Scn2kMenu::MENU_CMD) );
223b71206888 Initial import
thib
parents:
diff changeset
1931 CmdSimplified tmp_cmd;
223b71206888 Initial import
thib
parents:
diff changeset
1932 char cmd_str[32768];
223b71206888 Initial import
thib
parents:
diff changeset
1933 char* tmp_cmd_str = cmd_str;
223b71206888 Initial import
thib
parents:
diff changeset
1934 cmd.write(tmp_cmd, tmp_cmd_str);
223b71206888 Initial import
thib
parents:
diff changeset
1935 ret_cmd.read(tmp_cmd);
223b71206888 Initial import
thib
parents:
diff changeset
1936 }
223b71206888 Initial import
thib
parents:
diff changeset
1937 }
52
15a18fbe6f21 * Known bugs added to the README
thib
parents: 50
diff changeset
1938
0
223b71206888 Initial import
thib
parents:
diff changeset
1939 void Scn2kMenu::activate(void) {
52
15a18fbe6f21 * Known bugs added to the README
thib
parents: 50
diff changeset
1940 if (pimpl != NULL && pimpl->menu) pimpl->menu->activate();
0
223b71206888 Initial import
thib
parents:
diff changeset
1941 }
223b71206888 Initial import
thib
parents:
diff changeset
1942
52
15a18fbe6f21 * Known bugs added to the README
thib
parents: 50
diff changeset
1943 void Scn2kMenu::deactivate(void) {
15a18fbe6f21 * Known bugs added to the README
thib
parents: 50
diff changeset
1944 if (pimpl != NULL && pimpl->menu) pimpl->menu->deactivate();
15a18fbe6f21 * Known bugs added to the README
thib
parents: 50
diff changeset
1945 }
15a18fbe6f21 * Known bugs added to the README
thib
parents: 50
diff changeset
1946