Develop and Download Open Source Software

Browse Subversion Repository

Contents of /trunk/RailSim2.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 12 - (show annotations) (download) (as text)
Sat Oct 26 14:53:53 2013 UTC (10 years, 6 months ago) by okadu
File MIME type: text/x-c++src
File size: 13795 byte(s)
[okadu] Version 2.15
橋脚・架線柱手動設置機能
車輌プラグイン以外でクランク等使用可能に
エンジン模型プラグイン追加

1 #include "stdafx.h"
2 #include "RSPV.h"
3 #include "CPluginTree.h"
4 #include "CScene.h"
5 #include "CSaveFile.h"
6 #include "CSkinPlugin.h"
7 #include "CRailPlugin.h"
8 #include "CTiePlugin.h"
9 #include "CGirderPlugin.h"
10 #include "CPierPlugin.h"
11 #include "CLinePlugin.h"
12 #include "CPolePlugin.h"
13 #include "CTrainPlugin.h"
14 #include "CStationPlugin.h"
15 #include "CSurfacePlugin.h"
16 #include "CEnvPlugin.h"
17 #include "CGameMode.h"
18
19 // 内部定数
20 extern const float RAILSIM_VERSION = 2.15f; // 本体バージョン
21 extern const char* VERSION_STRING = "2.15"; // 表示バージョン文字列 (2.00a 等のバグ修正コードを含む)
22
23 // 外部グローバル
24 extern char *g_PluginViewArg;
25 extern string g_SelectedSkin;
26 extern bool g_CursorLockable;
27
28 // 内部グローバル
29 int g_RSPV = RSPV_NONE; // RSPV モード
30 HFONT g_TempFont = NULL; // 初期フォント
31 CCursor g_Cursor; // カーソル
32 CStringTexture *g_StrTex = NULL; // 文字テクスチャ
33 CRailPlugin *g_Rail = NULL; // カレントレール
34 CTiePlugin *g_Tie = NULL; // カレント枕木
35 CGirderPlugin *g_Girder = NULL; // カレント橋桁
36 CPierPlugin *g_Pier = NULL; // カレント橋脚
37 CLinePlugin *g_Line = NULL; // カレント架線
38 CPolePlugin *g_Pole = NULL; // カレント架線柱
39 CSurfacePlugin *g_DefaultSurface = NULL; // デフォルトサーフェイス
40 CEnvPlugin *g_DefaultEnv = NULL; // デフォルト環境
41 CSaveFile *g_SaveFile = NULL; // カレントファイル
42
43 string g_SelectedRailID; // 選択レール ID
44 string g_SelectedTieID; // 選択枕木 ID
45 string g_SelectedGirderID; // 選択橋桁 ID
46 string g_SelectedPierID; // 選択橋脚 ID
47 string g_SelectedLineID; // 選択架線 ID
48 string g_SelectedPoleID; // 選択架線柱 ID
49 string g_SelectedTrainID; // 選択車輌 ID
50 string g_SelectedStationID; // 選択駅舎 ID
51 string g_SelectedStructID; // 選択施設 ID
52 string g_SelectedSurfaceID; // 選択地形 ID
53 string g_SelectedEnvID; // 選択地形 ID
54 string g_SelectedSkinID; // 選択スキン ID
55
56 CRailPluginList *g_RailPluginList; // レールリスト
57 CTiePluginList *g_TiePluginList; // 枕木リスト
58 CGirderPluginList *g_GirderPluginList; // 橋桁リスト
59 CPierPluginList *g_PierPluginList; // 橋脚リスト
60 CLinePluginList *g_LinePluginList; // 架線リスト
61 CPolePluginList *g_PolePluginList; // 架線柱リスト
62 CTrainPluginList *g_TrainPluginList; // 車輌リスト
63 CStationPluginList *g_StationPluginList; // 駅舎リスト
64 CStructPluginList *g_StructPluginList; // 施設リスト
65 CSurfacePluginList *g_SurfacePluginList; // 地形リスト
66 CEnvPluginList *g_EnvPluginList; // 地形リスト
67 CSkinPluginList *g_SkinPluginList; // スキンリスト
68
69 CTexture g_OpeningTexture; // オープニング用画像
70
71 /*
72 * オープニングアニメーション
73 */
74 void Opening(){
75 static int cnt = 0, loading = 0;
76 while(PeekAllMessage()){
77 ScanInputDevice();
78 const int anim = 30;
79 const int letters = 10, letl = 10;
80 const int letsize = 32, letsp = 24;
81 BeginScene();
82 int i;
83 devTEX_LINEAR(0);
84 devBLEND_ADD2();
85 devSetTexture(0, g_OpeningTexture.GetObject());
86 for(i = 0; i<letters; i++){
87 int begin = (anim-letl)*i/(letters-1), end = begin+letl;
88 if(cnt<begin) continue;
89 float u = (i%4)*0.25f, v = (i/4)*0.25f;
90 SetUVMap(u, v, u+0.25f, v+0.25f);
91 int x = (g_DispWidth-letters*(letsize+letsp)+letsp)/2+i*(letsize+letsp);
92 int y = (g_DispHeight-letsize)/2;
93 int yofs = cnt<end ? (end-cnt)*128/letl : 0;
94 int alpha = cnt<end ? (cnt-begin)*255/letl : 255;
95 D3DCOLOR col = i<7
96 ? MAKE_AC(alpha, 0, i*255/6, 255)
97 : MAKE_AC(alpha, 0, 128+(i-7)*127/2, 0);
98 D3DCOLOR sdw = MAKE_AC(alpha/4, 255, 255, 255);
99 int x1 = x, y1 = y-yofs, x2 = x+letsize, y2 = y+letsize+yofs;
100 {
101 int rel = cnt<end ? end-cnt : 0;
102 int sfty = 256/(rel+4);
103 int sft1 = (g_DispWidth/2-x1)*2/(rel+4);
104 int sft2 = (g_DispWidth/2-x2)*2/(rel+4);
105 VTX_TLX vt[] = {
106 x1+sft1-0.5f, y1-sfty-0.5f, 0.0f, 1.0f, sdw&0xff000000, sv3.u[0], sv3.v[0],
107 x2+sft2-0.5f, y1-sfty-0.5f, 0.0f, 1.0f, sdw&0xff000000, sv3.u[1], sv3.v[0],
108 x2-0.5f, y2-0.5f, 0.0f, 1.0f, sdw, sv3.u[1], sv3.v[1],
109 x1-0.5f, y2-0.5f, 0.0f, 1.0f, sdw, sv3.u[0], sv3.v[1]};
110 sv3.pDev->SetVertexShader(FVF_TLX);
111 sv3.pDev->DrawPrimitiveUP(D3DPT_TRIANGLEFAN, 2, vt, sizeof(VTX_TLX));
112 }
113 TexMap2DRect(x1, y1, x2, y2, col);
114 // Dialog("%d %d %p", x, y, col);
115 }
116 devTEX_POINT(0);
117 devBLEND_ALPHA();
118 if(cnt>=anim){
119 const int pitypes = 15;
120 static char *pitype[pitypes] = {
121 "Rail", "Tie", "Girder", "Pier", "Line", "Pole",
122 "RailwayPluginSet", "Train", "TrainGroupTemplate",
123 "Station", "Struct", "Surface", "Env", "Skin", "Layout"};
124 const int grphwid = TILE_UNIT*8;
125 int gx1 = (g_DispWidth-grphwid)/2, gy1 = g_DispHeight-TILE_UNIT*3;
126 int gx2 = (g_DispWidth+grphwid)/2, gy2 = g_DispHeight-TILE_UNIT*3+FONT_HEIGHT;
127 D3DCOLOR fcol[4] = {0xffc0c0c0, 0xffc0c0c0, 0xff808080, 0xff808080};
128 D3DCOLOR gcol[4] = {0xc080c0ff, 0xc080c0ff, 0xc0406080, 0xc0406080};
129 devSetTexture(0, NULL);
130 Grad2DRect(gx1, gy1, gx2, gy2, fcol);
131 Fill2DRect(gx1+1, gy1+1, gx2-1, gy2-1, 0x80000000);
132 int tw = loading<pitypes ? loading*(grphwid-4)/(pitypes-1) : grphwid-4;
133 Grad2DRect(gx1+2, gy1+2, gx1+2+tw, gy2-2, gcol);
134 g_StrTex->RenderCenter(g_DispWidth/2, g_DispHeight-TILE_UNIT*2,
135 0xffc0c0c0, 0, FlashIn("Loading %s...", pitype[loading]));
136 loading++;
137 }
138 EndScene();
139 if(CheckAlt() && GetKey(DIK_F4)==S_PUSH){
140 ExitProcess(0);
141 break;
142 }
143 SyncFrame();
144 if(cnt>=anim) return;
145 cnt++;
146 }
147 }
148
149 /*
150 * エントリーポイント
151 */
152 void Main(){
153 SetListenerSens(10.0f);
154 SetMasterVolume(/*DSBVOLUME_MAX*/);
155 devSetState(D3DRS_AMBIENTMATERIALSOURCE, D3DMCS_COLOR1);
156 Randomize();
157 InitSystemObject();
158 InitSystemSwitch();
159 g_OpeningTexture.LoadResource("OPENING");
160 g_TempFont = CreateFont(FONT_HEIGHT, 0, 0, 0,
161 FW_REGULAR, FALSE, FALSE, FALSE, SHIFTJIS_CHARSET,
162 OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, PROOF_QUALITY,
163 VARIABLE_PITCH|FF_MODERN, NULL/*"MS Pゴシック"*/);
164 g_StrTex = new CStringTexture(FONT_HEIGHT, 1);
165 g_StrTex->SetFont(g_TempFont);
166 CSkinPlugin *skin = NULL;
167 g_RailPluginList = new CRailPluginList;
168 g_TiePluginList = new CTiePluginList;
169 g_GirderPluginList = new CGirderPluginList;
170 g_PierPluginList = new CPierPluginList;
171 g_LinePluginList = new CLinePluginList;
172 g_PolePluginList = new CPolePluginList;
173 g_TrainPluginList = new CTrainPluginList;
174 g_StationPluginList = new CStationPluginList;
175 g_StructPluginList = new CStructPluginList;
176 g_SurfacePluginList = new CSurfacePluginList;
177 g_EnvPluginList = new CEnvPluginList;
178 g_SkinPluginList = new CSkinPluginList;
179
180 if(g_PluginViewArg){
181 char *cparam = g_PluginViewArg;
182 int cplen = strlen(cparam);
183 char tname[256], dname[256];
184 char *ptr = cparam+cplen-5;
185 while(*ptr!='\\') ptr--;
186 strcpy(tname, ptr+1);
187 *ptr = 0;
188 strcpy(dname, cparam);
189 *ptr = '\\';
190 if(!strcmpi(tname, "Rail2.txt")){
191 if(g_RailPluginList->LoadOne(cparam, dname, false)) g_RSPV = RSPV_RAIL;
192 }else if(!strcmpi(tname, "Tie2.txt")){
193 if(g_TiePluginList->LoadOne(cparam, dname, false)) g_RSPV = RSPV_TIE;
194 }else if(!strcmpi(tname, "Girder2.txt")){
195 if(g_GirderPluginList->LoadOne(cparam, dname, false)) g_RSPV = RSPV_GIRDER;
196 }else if(!strcmpi(tname, "Pier2.txt")){
197 if(g_PierPluginList->LoadOne(cparam, dname, false)) g_RSPV = RSPV_PIER;
198 }else if(!strcmpi(tname, "Line2.txt")){
199 if(g_LinePluginList->LoadOne(cparam, dname, false)) g_RSPV = RSPV_LINE;
200 }else if(!strcmpi(tname, "Pole2.txt")){
201 if(g_PolePluginList->LoadOne(cparam, dname, false)) g_RSPV = RSPV_POLE;
202 }else if(!strcmpi(tname, "Train2.txt")){
203 if(g_TrainPluginList->LoadOne(cparam, dname, false)) g_RSPV = RSPV_TRAIN;
204 }else if(!strcmpi(tname, "Station2.txt")){
205 if(g_StationPluginList->LoadOne(cparam, dname, false)) g_RSPV = RSPV_STATION;
206 }else if(!strcmpi(tname, "Struct2.txt")){
207 if(g_StructPluginList->LoadOne(cparam, dname, false)) g_RSPV = RSPV_STRUCT;
208 }else if(!strcmpi(tname, "Surface2.txt")){
209 if(g_SurfacePluginList->LoadOne(cparam, dname, false)) g_RSPV = RSPV_SURFACE;
210 }else if(!strcmpi(tname, "Env2.txt")){
211 if(g_EnvPluginList->LoadOne(cparam, dname, false)) g_RSPV = RSPV_ENV;
212 }else if(!strcmpi(tname, "Skin2.txt")){
213 if(g_SkinPluginList->LoadOne(cparam, dname, false)) g_RSPV = RSPV_SKIN;
214 }else if(!strcmpi(tname, "Train.txt")){
215 if(g_TrainPluginList->LoadOne(cparam, dname, true)) g_RSPV = RSPV_TRAIN;
216 }else if(!strcmpi(tname, "Station.txt")){
217 if(g_StationPluginList->LoadOne(cparam, dname, true)) g_RSPV = RSPV_STATION;
218 }else if(!strcmpi(tname, "Struct.txt")){
219 if(g_StructPluginList->LoadOne(cparam, dname, true)) g_RSPV = RSPV_STRUCT;
220 }else if(!strcmpi(tname, "Surface.txt")){
221 if(g_SurfacePluginList->LoadOne(cparam, dname, true)) g_RSPV = RSPV_SURFACE;
222 }
223 if(!g_RSPV){
224 ErrorDialog("%s: %s", lang(InvalidPluginType), tname);
225 }
226 }
227 if(g_RSPV){
228 SetWindowText(svw.hWnd, "RailSim II - Plugin Viewer Mode");
229 if(!(g_Env = g_EnvPluginList->FindAvailable())){
230 if(!g_EnvPluginList->LoadOne("Env\\Default\\Env2.txt", "Default", false)
231 || !(g_Env = g_EnvPluginList->FindAvailable())){
232 ErrorDialog(lang(NoEnvAvailable));
233 return;
234 }
235 }
236 if(!(skin = g_SkinPluginList->FindAvailable())){
237 if(!g_SkinPluginList->LoadOne("Skin\\Default_Blue\\Skin2.txt", "Default_Blue", false)
238 || !(skin = g_SkinPluginList->FindAvailable())){
239 ErrorDialog(lang(NoSkinAvailable));
240 return;
241 }
242 }
243 }else{
244 Sleep(500);
245 Opening();
246 g_RailPluginList->List();
247 if(!(g_Rail = g_RailPluginList->FindPlugin((char *)g_SelectedRailID.c_str())))
248 g_Rail = g_RailPluginList->FindAvailable();
249 Opening();
250 g_TiePluginList->List();
251 if(!(g_Tie = g_TiePluginList->FindPlugin((char *)g_SelectedTieID.c_str())))
252 g_Tie = g_TiePluginList->FindAvailable();
253 Opening();
254 g_GirderPluginList->List();
255 if(!(g_Girder = g_GirderPluginList->FindPlugin((char *)g_SelectedGirderID.c_str())))
256 g_Girder = g_GirderPluginList->FindAvailable();
257 Opening();
258 g_PierPluginList->List();
259 if(!(g_Pier = g_PierPluginList->FindPlugin((char *)g_SelectedPierID.c_str())))
260 g_Pier = g_PierPluginList->FindAvailable();
261 Opening();
262 g_LinePluginList->List();
263 if(!(g_Line = g_LinePluginList->FindPlugin((char *)g_SelectedLineID.c_str())))
264 g_Line = g_LinePluginList->FindAvailable();
265 Opening();
266 g_PolePluginList->List();
267 if(!(g_Pole = g_PolePluginList->FindPlugin((char *)g_SelectedPoleID.c_str())))
268 g_Pole = g_PolePluginList->FindAvailable();
269 Opening();
270 void LoadRailwayPluginSetList();
271 LoadRailwayPluginSetList();
272 Opening();
273 g_TrainPluginList->List();
274 if(!(g_Train = g_TrainPluginList->FindPlugin((char *)g_SelectedTrainID.c_str())))
275 g_Train = g_TrainPluginList->FindAvailable();
276 Opening();
277 void LoadTrainGroupTemplateList();
278 LoadTrainGroupTemplateList();
279 Opening();
280 g_StationPluginList->List();
281 if(!(g_Station = g_StationPluginList->FindPlugin((char *)g_SelectedStationID.c_str())))
282 g_Station = g_StationPluginList->FindAvailable();
283 Opening();
284 g_StructPluginList->List();
285 if(!(g_Struct = g_StructPluginList->FindPlugin((char *)g_SelectedStructID.c_str())))
286 g_Struct = g_StructPluginList->FindAvailable();
287 Opening();
288 g_SurfacePluginList->List();
289 if(!(g_DefaultSurface = g_SurfacePluginList->FindPlugin("Default"))
290 && !(g_DefaultSurface = g_SurfacePluginList->FindPlugin((char *)g_SelectedSurfaceID.c_str()))
291 && !(g_DefaultSurface = g_SurfacePluginList->FindAvailable())){
292 ErrorDialog(lang(NoSurfaceAvailable));
293 return;
294 }
295 Opening();
296 g_EnvPluginList->List();
297 if(!(g_DefaultEnv = g_EnvPluginList->FindPlugin("Default"))
298 && !(g_DefaultEnv = g_EnvPluginList->FindPlugin((char *)g_SelectedEnvID.c_str()))
299 && !(g_DefaultEnv = g_EnvPluginList->FindAvailable())){
300 ErrorDialog(lang(NoEnvAvailable));
301 return;
302 }
303 Opening();
304 g_SkinPluginList->List();
305 if(!(skin = g_SkinPluginList->FindPlugin((char *)g_SelectedSkinID.c_str()))
306 && !(skin = g_SkinPluginList->FindAvailable())){
307 ErrorDialog(lang(NoSkinAvailable));
308 return;
309 }
310 Opening();
311 }
312 DeleteObject(g_TempFont);
313 skin->SetPreview();
314 CTreeDirElement::InitMenu();
315 g_Cursor.Init();
316 g_CursorLockable = true;
317 InitGrid();
318 CGameMode::MainLoop();
319 DELETE_V(g_SaveFile);
320 ClipCursor(NULL);
321 CTreeDirElement::FreeMenu();
322 DELETE_V(g_StrTex);
323 DELETE_V(g_RailPluginList);
324 DELETE_V(g_TiePluginList);
325 DELETE_V(g_GirderPluginList);
326 DELETE_V(g_PierPluginList);
327 DELETE_V(g_LinePluginList);
328 DELETE_V(g_PolePluginList);
329 DELETE_V(g_TrainPluginList);
330 DELETE_V(g_StationPluginList);
331 DELETE_V(g_StructPluginList);
332 DELETE_V(g_SurfacePluginList);
333 DELETE_V(g_EnvPluginList);
334 DELETE_V(g_SkinPluginList);
335 }
336
337 /*
338 * モデルプラグインの関連インスタンスを解放
339 */
340 void ModelPluginFreeInst(){
341 if(g_Train) g_Train->FreeInst();
342 if(g_Struct) g_Struct->FreeInst();
343 if(g_Station) g_Station->FreeInst();
344 if(g_Surface) g_Surface->FreeInst();
345 }
346
347 /*
348 * 現在選択されているプラグインの ID をセット
349 */
350 void SetCurrentPluginID(){
351 g_SelectedRailID = g_Rail ? g_Rail->GetID() : "";
352 g_SelectedTieID = g_Tie ? g_Tie->GetID() : "";
353 g_SelectedGirderID = g_Girder ? g_Girder->GetID() : "";
354 g_SelectedPierID = g_Pier ? g_Pier->GetID() : "";
355 g_SelectedLineID = g_Line ? g_Line->GetID() : "";
356 g_SelectedPoleID = g_Pole ? g_Pole->GetID() : "";
357 g_SelectedTrainID = g_Train ? g_Train->GetID() : "";
358 g_SelectedStationID = g_Station ? g_Station->GetID() : "";
359 g_SelectedStructID = g_Struct ? g_Struct->GetID() : "";
360 g_SelectedSurfaceID = g_Surface ? g_Surface->GetID() : "";
361 g_SelectedEnvID = g_Env ? g_Env->GetID() : "";
362 g_SelectedSkinID = g_Skin ? g_Skin->GetID() : "";
363 }

Back to OSDN">Back to OSDN
ViewVC Help
Powered by ViewVC 1.1.26