OSDN Git Service

More work, and added "Simple - Escalator" building
[skyscrapersim/skyscraper.git] / src / frontend / script_floors.cpp
1 /* $Id$ */
2
3 /*
4         Skyscraper 1.11 Alpha - Script Processor - Floor Section
5         Copyright (C)2003-2016 Ryan Thoryk
6         http://www.skyscrapersim.com
7         http://sourceforge.net/projects/skyscraper
8         Contact - ryan@skyscrapersim.com
9
10         This program is free software; you can redistribute it and/or
11         modify it under the terms of the GNU General Public License
12         as published by the Free Software Foundation; either version 2
13         of the License, or (at your option) any later version.
14
15         This program is distributed in the hope that it will be useful,
16         but WITHOUT ANY WARRANTY; without even the implied warranty of
17         MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18         GNU General Public License for more details.
19
20         You should have received a copy of the GNU General Public License
21         along with this program; if not, write to the Free Software
22         Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
23 */
24
25 #include "globals.h"
26 #include "sbs.h"
27 #include "skyscraper.h"
28 #include "enginecontext.h"
29 #include "floor.h"
30 #include "wall.h"
31 #include "model.h"
32 #include "cameratexture.h"
33 #include "trigger.h"
34 #include "callbutton.h"
35 #include "shaft.h"
36 #include "stairs.h"
37 #include "control.h"
38 #include "elevator.h"
39 #include "elevatorcar.h"
40 #include "sound.h"
41 #include "floorindicator.h"
42 #include "door.h"
43 #include "revolvingdoor.h"
44 #include "directional.h"
45 #include "escalator.h"
46 #include "scriptprocessor.h"
47 #include "script_section.h"
48
49 using namespace SBS;
50
51 namespace Skyscraper {
52
53 ScriptProcessor::FloorSection::FloorSection(ScriptProcessor *parent) : Section(parent)
54 {
55         floorcache_firstrun = true;
56         cache_current = 0;
57         cache_current_s = "";
58         cache_height = 0;
59         cache_height_s = "";
60         cache_fullheight = 0;
61         cache_fullheight_s = "";
62         cache_interfloorheight = 0;
63         cache_interfloorheight_s = "";
64         cache_base = 0;
65         cache_base_s = "";
66
67         Reset();
68 }
69
70 void ScriptProcessor::FloorSection::Reset()
71 {
72         FloorCheck = 0;
73         callbutton_elevators.clear();
74 }
75
76 int ScriptProcessor::FloorSection::Run(std::string &LineData)
77 {
78         //process floors
79
80         Floor *floor = Simcore->GetFloor(config->Current);
81
82         //exit with error if floor is invalid
83         if (!floor)
84         {
85                 std::string floornum;
86                 floornum = ToString(config->Current);
87                 return ScriptError("Invalid floor " + floornum);
88         }
89
90         //cache floor parameters
91         if (cache_current != config->Current || floorcache_firstrun == true)
92         {
93                 cache_current = config->Current;
94                 cache_current_s = ToString(cache_current);
95         }
96         if (cache_height != floor->Height || floorcache_firstrun == true)
97         {
98                 cache_height = floor->Height;
99                 cache_height_s = ToString(cache_height);
100         }
101         if (cache_fullheight != floor->FullHeight() || floorcache_firstrun == true)
102         {
103                 cache_fullheight = floor->FullHeight();
104                 cache_fullheight_s = ToString(cache_fullheight);
105         }
106         if (cache_interfloorheight != floor->InterfloorHeight || floorcache_firstrun == true)
107         {
108                 cache_interfloorheight = floor->InterfloorHeight;
109                 cache_interfloorheight_s = ToString(cache_interfloorheight);
110         }
111         if (cache_base != floor->GetBase() || floorcache_firstrun == true)
112         {
113                 cache_base = floor->GetBase();
114                 cache_base_s = ToString(cache_base);
115         }
116
117         floorcache_firstrun = false;
118
119         //replace variables with actual values
120         ReplaceAll(LineData, "%floor%", cache_current_s);
121         ReplaceAll(LineData, "%height%", cache_height_s);
122         ReplaceAll(LineData, "%fullheight%", cache_fullheight_s);
123         ReplaceAll(LineData, "%interfloorheight%", cache_interfloorheight_s);
124         ReplaceAll(LineData, "%base%", cache_base_s);
125         ReplaceAll(LineData, "%floorid%", floor->ID);
126         ReplaceAll(LineData, "%floorname%", floor->Name);
127         ReplaceAll(LineData, "%floortype%", floor->FloorType);
128         ReplaceAll(LineData, "%description%", floor->Description);
129
130         if (parent->getfloordata == true)
131                 return sCheckFloors;
132
133         //IF/While statement stub (continue to global commands for processing)
134         if (SetCaseCopy(LineData.substr(0, 2), false) == "if" || SetCaseCopy(LineData.substr(0, 5), false) == "while")
135                 return sContinue;
136
137         //process math functions
138         if (MathFunctions(LineData) == sError)
139                 return sError;
140
141         //process functions
142         if (parent->FunctionProc() == true)
143                 return sNextLine;
144
145         //get text after equal sign
146         bool equals = true;
147         if ((int)LineData.find("=", 0) == -1)
148                 equals = false;
149         std::string value = GetAfterEquals(LineData);
150
151         //create a lowercase string of the line
152         std::string linecheck = SetCaseCopy(LineData, false);
153
154         //parameters
155         if (linecheck.substr(0, 6) == "height")
156         {
157                 if (equals == false)
158                         return ScriptError("Syntax error");
159                 std::string str = Calc(value);
160                 if (!IsNumeric(str, floor->Height))
161                         return ScriptError("Invalid value");
162                 if (FloorCheck < 2)
163                         FloorCheck = 1;
164                 else
165                         FloorCheck = 3;
166         }
167         if (linecheck.substr(0, 16) == "interfloorheight")
168         {
169                 if (equals == false)
170                         return ScriptError("Syntax error");
171                 std::string str = Calc(value);
172                 if (!IsNumeric(str, floor->InterfloorHeight))
173                         return ScriptError("Invalid value");
174                 if (FloorCheck == 0)
175                         FloorCheck = 2;
176                 else
177                         FloorCheck = 3;
178         }
179         if (linecheck.substr(0, 8) == "altitude")
180         {
181                 if (equals == false)
182                         return ScriptError("Syntax error");
183                 std::string str = Calc(value);
184                 float alt;
185                 if (!IsNumeric(str, alt))
186                         return ScriptError("Invalid value");
187                 floor->SetAltitude(alt);
188                 return sNextLine;
189         }
190         if (linecheck.substr(0, 2) == "id")
191         {
192                 if (equals == false)
193                         return ScriptError("Syntax error");
194                 floor->ID = Calc(value);
195                 return sNextLine;
196         }
197         if (linecheck.substr(0, 4) == "name")
198         {
199                 if (equals == false)
200                         return ScriptError("Syntax error");
201                 floor->Name = Calc(value);
202                 return sNextLine;
203         }
204         if (linecheck.substr(0, 4) == "type")
205         {
206                 if (equals == false)
207                         return ScriptError("Syntax error");
208                 floor->FloorType = value;
209                 return sNextLine;
210         }
211         if (linecheck.substr(0, 11) == "description")
212         {
213                 if (equals == false)
214                         return ScriptError("Syntax error");
215                 floor->Description = value;
216                 return sNextLine;
217         }
218         if (linecheck.substr(0, 16) == "indicatortexture")
219         {
220                 if (equals == false)
221                         return ScriptError("Syntax error");
222                 floor->IndicatorTexture = Calc(value);
223                 return sNextLine;
224         }
225         if (linecheck.substr(0, 5) == "group")
226         {
227                 //copy string listing of group floors into array
228
229                 int params = SplitAfterEquals(LineData, false);
230                 if (params < 1)
231                         return ScriptError("Syntax Error");
232
233                 for (int line = 0; line < params; line++)
234                 {
235                         if (tempdata[line].find("-", 1) > 0)
236                         {
237                                 int start, end;
238                                 //found a range marker
239                                 std::string str1 = tempdata[line].substr(0, tempdata[line].find("-", 1));
240                                 std::string str2 = tempdata[line].substr(tempdata[line].find("-", 1) + 1);
241                                 TrimString(str1);
242                                 TrimString(str2);
243                                 if (!IsNumeric(str1, start) || !IsNumeric(str2, end))
244                                         return ScriptError("Invalid value");
245                                 if (end < start)
246                                 {
247                                         int temp = start;
248                                         start = end;
249                                         end = temp;
250                                 }
251
252                                 for (int k = start; k <= end; k++)
253                                         floor->AddGroupFloor(k);
254                         }
255                         else
256                         {
257                                 int data;
258                                 if (!IsNumeric(tempdata[line], data))
259                                         return ScriptError("Invalid value");
260                                 floor->AddGroupFloor(data);
261                         }
262                 }
263                 return sNextLine;
264         }
265
266         //calculate altitude
267         if (FloorCheck == 3)
268         {
269                 FloorCheck = 0;
270                 if (floor->CalculateAltitude() == false)
271                         return ScriptError();
272                 return sNextLine;
273         }
274
275         //Exit command
276         if (linecheck.substr(0, 4) == "exit")
277         {
278                 if (config->RangeL != config->RangeH)
279                         LineData = "<endfloors>";
280                 else
281                         LineData = "<endfloor>";
282
283                 //update linecheck
284                 linecheck = SetCaseCopy(LineData, false);
285         }
286
287         //AddFloor command
288         if (linecheck.substr(0, 9) == "addfloor ")
289         {
290                 //get data
291                 int params = SplitData(LineData, 9);
292
293                 if (params != 12 && params != 14)
294                         return ScriptError("Incorrect number of parameters");
295
296                 bool compat = false;
297                 if (params == 12)
298                         compat = true;
299
300                 //check numeric values
301                 if (compat == true)
302                 {
303                         for (int i = 2; i <= 10; i++)
304                         {
305                                 if (!IsNumeric(tempdata[i]))
306                                         return ScriptError("Invalid value: " + tempdata[i]);
307                         }
308                         if (warn_deprecated == true)
309                                 ScriptWarning("Syntax deprecated");
310                 }
311                 else
312                 {
313                         for (int i = 2; i <= 12; i++)
314                         {
315                                 if (i == 9)
316                                         i = 11;
317                                 if (!IsNumeric(tempdata[i]))
318                                         return ScriptError("Invalid value: " + tempdata[i]);
319                         }
320                 }
321
322                 //stop here if in Check mode
323                 if (config->CheckScript == true)
324                         return sNextLine;
325
326                 //create floor
327                 if (compat == true)
328                         StoreCommand(floor->AddFloor(tempdata[0], tempdata[1], ToFloat(tempdata[2]), ToFloat(tempdata[3]), ToFloat(tempdata[4]), ToFloat(tempdata[5]), ToFloat(tempdata[6]), ToFloat(tempdata[7]), ToFloat(tempdata[8]), config->ReverseAxis, false, ToFloat(tempdata[9]), ToFloat(tempdata[10]), ToBool(tempdata[11]), true));
329                 else
330                         StoreCommand(floor->AddFloor(tempdata[0], tempdata[1], ToFloat(tempdata[2]), ToFloat(tempdata[3]), ToFloat(tempdata[4]), ToFloat(tempdata[5]), ToFloat(tempdata[6]), ToFloat(tempdata[7]), ToFloat(tempdata[8]), ToBool(tempdata[9]), ToBool(tempdata[10]), ToFloat(tempdata[11]), ToFloat(tempdata[12]), ToBool(tempdata[13])));
331                 return sNextLine;
332         }
333
334         //AddShaftFloor command
335         if (linecheck.substr(0, 13) == "addshaftfloor")
336         {
337                 //get data
338                 int params = SplitData(LineData, 14);
339
340                 if (params != 12 && params != 14)
341                         return ScriptError("Incorrect number of parameters");
342
343                 bool compat = false;
344                 if (params == 12)
345                         compat = true;
346
347                 //check numeric values
348                 if (compat == true)
349                 {
350                         for (int i = 3; i <= 11; i++)
351                         {
352                                 if (i == 1)
353                                         i = 3; //skip non-numeric parameters
354                                 if (!IsNumeric(tempdata[i]))
355                                         return ScriptError("Invalid value: " + tempdata[i]);
356                         }
357                         if (warn_deprecated == true)
358                                 ScriptWarning("Syntax deprecated");
359                 }
360                 else
361                 {
362                         for (int i = 3; i <= 13; i++)
363                         {
364                                 if (i == 1)
365                                         i = 3; //skip non-numeric parameters
366                                 if (i == 10)
367                                         i = 12;
368                                 if (!IsNumeric(tempdata[i]))
369                                         return ScriptError("Invalid value: " + tempdata[i]);
370                         }
371                 }
372
373                 //create floor
374                 if (Simcore->GetShaft(ToInt(tempdata[0])))
375                 {
376                         //stop here if in Check mode
377                         if (config->CheckScript == true)
378                                 return sNextLine;
379
380                         if (compat == true)
381                                 StoreCommand(Simcore->GetShaft(ToInt(tempdata[0]))->AddFloor(config->Current, tempdata[1], tempdata[2], ToFloat(tempdata[3]), ToFloat(tempdata[4]), ToFloat(tempdata[5]), ToFloat(tempdata[6]), ToFloat(tempdata[7]), ToFloat(tempdata[8]), ToFloat(tempdata[9]), config->ReverseAxis, false, ToFloat(tempdata[10]), ToFloat(tempdata[11]), true));
382                         else
383                                 StoreCommand(Simcore->GetShaft(ToInt(tempdata[0]))->AddFloor(config->Current, tempdata[1], tempdata[2], ToFloat(tempdata[3]), ToFloat(tempdata[4]), ToFloat(tempdata[5]), ToFloat(tempdata[6]), ToFloat(tempdata[7]), ToFloat(tempdata[8]), ToFloat(tempdata[9]), ToBool(tempdata[10]), ToBool(tempdata[11]), ToFloat(tempdata[12]), ToFloat(tempdata[13])));
384                 }
385                 else
386                         return ScriptError("Invalid shaft");
387                 return sNextLine;
388         }
389
390         //AddStairsFloor command
391         if (linecheck.substr(0, 14) == "addstairsfloor")
392         {
393                 //get data
394                 int params = SplitData(LineData, 14);
395
396                 if (params != 12 && params != 14)
397                         return ScriptError("Incorrect number of parameters");
398
399                 bool compat = false;
400                 if (params == 12)
401                         compat = true;
402
403                 //check numeric values
404                 if (compat == true)
405                 {
406                         for (int i = 3; i <= 11; i++)
407                         {
408                                 if (i == 1)
409                                         i = 3; //skip non-numeric parameters
410                                 if (!IsNumeric(tempdata[i]))
411                                         return ScriptError("Invalid value: " + tempdata[i]);
412                         }
413                         if (warn_deprecated == true)
414                                 ScriptWarning("Syntax deprecated");
415                 }
416                 else
417                 {
418                         for (int i = 3; i <= 13; i++)
419                         {
420                                 if (i == 1)
421                                         i = 3; //skip non-numeric parameters
422                                 if (i == 10)
423                                         i = 12;
424                                 if (!IsNumeric(tempdata[i]))
425                                         return ScriptError("Invalid value: " + tempdata[i]);
426                         }
427                 }
428
429                 //create floor
430                 if (Simcore->GetStairs(ToInt(tempdata[0])))
431                 {
432                         //stop here if in Check mode
433                         if (config->CheckScript == true)
434                                 return sNextLine;
435
436                         if (compat == true)
437                                 StoreCommand(Simcore->GetStairs(ToInt(tempdata[0]))->AddFloor(config->Current, tempdata[1], tempdata[2], ToFloat(tempdata[3]), ToFloat(tempdata[4]), ToFloat(tempdata[5]), ToFloat(tempdata[6]), ToFloat(tempdata[7]), ToFloat(tempdata[8]), ToFloat(tempdata[9]), config->ReverseAxis, false, ToFloat(tempdata[10]), ToFloat(tempdata[11]), true));
438                         else
439                                 StoreCommand(Simcore->GetStairs(ToInt(tempdata[0]))->AddFloor(config->Current, tempdata[1], tempdata[2], ToFloat(tempdata[3]), ToFloat(tempdata[4]), ToFloat(tempdata[5]), ToFloat(tempdata[6]), ToFloat(tempdata[7]), ToFloat(tempdata[8]), ToFloat(tempdata[9]), ToBool(tempdata[10]), ToBool(tempdata[11]), ToFloat(tempdata[12]), ToFloat(tempdata[13])));
440                 }
441                 else
442                         return ScriptError("Invalid stairwell");
443                 return sNextLine;
444         }
445
446         //AddInterFloorFloor command
447         if (linecheck.substr(0, 18) == "addinterfloorfloor")
448         {
449                 //get data
450                 int params = SplitData(LineData, 19);
451
452                 if (params != 11 && params != 13)
453                         return ScriptError("Incorrect number of parameters");
454
455                 bool compat = false;
456                 if (params == 11)
457                         compat = true;
458
459                 //check numeric values
460                 if (compat == true)
461                 {
462                         for (int i = 2; i <= 10; i++)
463                         {
464                                 if (!IsNumeric(tempdata[i]))
465                                         return ScriptError("Invalid value: " + tempdata[i]);
466                         }
467                         if (warn_deprecated == true)
468                                 ScriptWarning("Syntax deprecated");
469                 }
470                 else
471                 {
472                         for (int i = 2; i <= 12; i++)
473                         {
474                                 if (i == 9)
475                                         i = 11;
476                                 if (!IsNumeric(tempdata[i]))
477                                         return ScriptError("Invalid value: " + tempdata[i]);
478                         }
479                 }
480
481                 //stop here if in Check mode
482                 if (config->CheckScript == true)
483                         return sNextLine;
484
485                 //create floor
486                 if (compat == true)
487                         StoreCommand(floor->AddInterfloorFloor(tempdata[0], tempdata[1], ToFloat(tempdata[2]), ToFloat(tempdata[3]), ToFloat(tempdata[4]), ToFloat(tempdata[5]), ToFloat(tempdata[6]), ToFloat(tempdata[7]), ToFloat(tempdata[8]), config->ReverseAxis, false, ToFloat(tempdata[9]), ToFloat(tempdata[10]), true));
488                 else
489                         StoreCommand(floor->AddInterfloorFloor(tempdata[0], tempdata[1], ToFloat(tempdata[2]), ToFloat(tempdata[3]), ToFloat(tempdata[4]), ToFloat(tempdata[5]), ToFloat(tempdata[6]), ToFloat(tempdata[7]), ToFloat(tempdata[8]), ToBool(tempdata[9]), ToBool(tempdata[10]), ToFloat(tempdata[11]), ToFloat(tempdata[12])));
490                 return sNextLine;
491         }
492
493         //AddWall command
494         if (linecheck.substr(0, 7) == "addwall")
495         {
496                 //get data
497                 int params = SplitData(LineData, 8);
498
499                 if (params != 14)
500                         return ScriptError("Incorrect number of parameters");
501
502                 //check numeric values
503                 for (int i = 2; i <= 12; i++)
504                 {
505                         if (!IsNumeric(tempdata[i]))
506                                 return ScriptError("Invalid value: " + tempdata[i]);
507                 }
508
509                 //stop here if in Check mode
510                 if (config->CheckScript == true)
511                         return sNextLine;
512
513                 //create wall
514                 StoreCommand(floor->AddWall(tempdata[0], tempdata[1], ToFloat(tempdata[2]), ToFloat(tempdata[3]), ToFloat(tempdata[4]), ToFloat(tempdata[5]), ToFloat(tempdata[6]), ToFloat(tempdata[7]), ToFloat(tempdata[8]), ToFloat(tempdata[9]), ToFloat(tempdata[10]), ToFloat(tempdata[11]), ToFloat(tempdata[12]), ToBool(tempdata[13])));
515                 return sNextLine;
516         }
517
518         //AddShaftWall command
519         if (linecheck.substr(0, 12) == "addshaftwall")
520         {
521                 //get data
522                 int params = SplitData(LineData, 13);
523
524                 if (params != 14)
525                         return ScriptError("Incorrect number of parameters");
526
527                 //check numeric values
528                 for (int i = 0; i <= 13; i++)
529                 {
530                         if (i == 1)
531                                 i = 3; //skip non-numeric parameters
532                         if (!IsNumeric(tempdata[i]))
533                                 return ScriptError("Invalid value: " + tempdata[i]);
534                 }
535
536                 //create wall
537                 if (Simcore->GetShaft(ToInt(tempdata[0])))
538                 {
539                         //stop here if in Check mode
540                         if (config->CheckScript == true)
541                                 return sNextLine;
542
543                         StoreCommand(Simcore->GetShaft(ToInt(tempdata[0]))->AddWall(config->Current, tempdata[1], tempdata[2], ToFloat(tempdata[3]), ToFloat(tempdata[4]), ToFloat(tempdata[5]), ToFloat(tempdata[6]), ToFloat(tempdata[7]), ToFloat(tempdata[8]), ToFloat(tempdata[9]), ToFloat(tempdata[10]), ToFloat(tempdata[11]), ToFloat(tempdata[12]), ToFloat(tempdata[13])));
544                 }
545                 else
546                         return ScriptError("Invalid shaft");
547                 return sNextLine;
548         }
549
550         //AddStairsWall command
551         if (linecheck.substr(0, 13) == "addstairswall")
552         {
553                 //get data
554                 int params = SplitData(LineData, 14);
555
556                 if (params != 14)
557                         return ScriptError("Incorrect number of parameters");
558
559                 //check numeric values
560                 for (int i = 0; i <= 13; i++)
561                 {
562                         if (i == 1)
563                                 i = 3; //skip non-numeric parameters
564                         if (!IsNumeric(tempdata[i]))
565                                 return ScriptError("Invalid value: " + tempdata[i]);
566                 }
567
568                 //create wall
569                 if (Simcore->GetStairs(ToInt(tempdata[0])))
570                 {
571                         //stop here if in Check mode
572                         if (config->CheckScript == true)
573                                 return sNextLine;
574
575                         StoreCommand(Simcore->GetStairs(ToInt(tempdata[0]))->AddWall(config->Current, tempdata[1], tempdata[2], ToFloat(tempdata[3]), ToFloat(tempdata[4]), ToFloat(tempdata[5]), ToFloat(tempdata[6]), ToFloat(tempdata[7]), ToFloat(tempdata[8]), ToFloat(tempdata[9]), ToFloat(tempdata[10]), ToFloat(tempdata[11]), ToFloat(tempdata[12]), ToFloat(tempdata[13])));
576                 }
577                 else
578                         return ScriptError("Invalid stairwell");
579                 return sNextLine;
580         }
581
582         //AddInterFloorWall command
583         if (linecheck.substr(0, 17) == "addinterfloorwall")
584         {
585                 //get data
586                 int params = SplitData(LineData, 18);
587
588                 if (params != 13)
589                         return ScriptError("Incorrect number of parameters");
590
591                 //check numeric values
592                 for (int i = 2; i <= 12; i++)
593                 {
594                         if (!IsNumeric(tempdata[i]))
595                                 return ScriptError("Invalid value: " + tempdata[i]);
596                 }
597
598                 //stop here if in Check mode
599                 if (config->CheckScript == true)
600                         return sNextLine;
601
602                 //create wall
603                 StoreCommand(floor->AddInterfloorWall(tempdata[0], tempdata[1], ToFloat(tempdata[2]), ToFloat(tempdata[3]), ToFloat(tempdata[4]), ToFloat(tempdata[5]), ToFloat(tempdata[6]), ToFloat(tempdata[7]), ToFloat(tempdata[8]), ToFloat(tempdata[9]), ToFloat(tempdata[10]), ToFloat(tempdata[11]), ToFloat(tempdata[12])));
604                 return sNextLine;
605         }
606
607         //ColumnWallBox command
608         if (linecheck.substr(0, 14) == "columnwallbox ")
609         {
610                 //get data
611                 int params = SplitData(LineData, 14);
612
613                 if (params != 14)
614                         return ScriptError("Incorrect number of parameters");
615
616                 //check numeric values
617                 for (int i = 2; i <= 9; i++)
618                 {
619                         if (!IsNumeric(tempdata[i]))
620                                 return ScriptError("Invalid value: " + tempdata[i]);
621                 }
622
623                 //stop here if in Check mode
624                 if (config->CheckScript == true)
625                         return sNextLine;
626
627                 StoreCommand(floor->ColumnWallBox(tempdata[0], tempdata[1], ToFloat(tempdata[2]), ToFloat(tempdata[3]), ToFloat(tempdata[4]), ToFloat(tempdata[5]), ToFloat(tempdata[6]), ToFloat(tempdata[7]), ToFloat(tempdata[8]), ToFloat(tempdata[9]), ToBool(tempdata[10]), ToBool(tempdata[11]), ToBool(tempdata[12]), ToBool(tempdata[13])));
628                 return sNextLine;
629         }
630
631         //ColumnWallBox2 command
632         if (linecheck.substr(0, 14) == "columnwallbox2")
633         {
634                 //get data
635                 int params = SplitData(LineData, 15);
636
637                 if (params != 14)
638                         return ScriptError("Incorrect number of parameters");
639
640                 //check numeric values
641                 for (int i = 2; i <= 9; i++)
642                 {
643                         if (!IsNumeric(tempdata[i]))
644                                 return ScriptError("Invalid value: " + tempdata[i]);
645                 }
646
647                 //stop here if in Check mode
648                 if (config->CheckScript == true)
649                         return sNextLine;
650
651                 StoreCommand(floor->ColumnWallBox2(tempdata[0], tempdata[1], ToFloat(tempdata[2]), ToFloat(tempdata[3]), ToFloat(tempdata[4]), ToFloat(tempdata[5]), ToFloat(tempdata[6]), ToFloat(tempdata[7]), ToFloat(tempdata[8]), ToFloat(tempdata[9]), ToBool(tempdata[10]), ToBool(tempdata[11]), ToBool(tempdata[12]), ToBool(tempdata[13])));
652                 return sNextLine;
653         }
654
655         //CallButtonElevators command
656         if (linecheck.substr(0, 19) == "callbuttonelevators")
657         {
658                 //construct array containing floor numbers
659                 int params = SplitAfterEquals(LineData, false);
660                 if (params < 1)
661                         return ScriptError("Syntax Error");
662
663                 callbutton_elevators.clear();
664                 callbutton_elevators.resize(params);
665
666                 for (int line = 0; line < params; line++)
667                 {
668                         int elevnumber;
669                         if (!IsNumeric(tempdata[line], elevnumber))
670                                 return ScriptError("Invalid elevator number");
671                         if (elevnumber < 1 || elevnumber > Simcore->GetElevatorCount())
672                                 return ScriptError("Invalid elevator number");
673                         callbutton_elevators[line] = elevnumber;
674                 }
675                 return sNextLine;
676         }
677
678         //CreateCallButtons command
679         if (linecheck.substr(0, 17) == "createcallbuttons")
680         {
681                 if (callbutton_elevators.size() == 0)
682                         return ScriptError("No elevators specified");
683
684                 //get data
685                 int params = SplitData(LineData, 18);
686
687                 int compat = 0;
688                 if (params == 12)
689                         compat = 1;
690                 if (params == 14)
691                         compat = 2;
692
693                 //check numeric values
694                 if (compat == 1)
695                 {
696                         for (int i = 3; i <= 11; i++)
697                         {
698                                 if (i == 6 || i == 9) //skip non-numeric parameters
699                                         i++;
700                                 if (!IsNumeric(tempdata[i]))
701                                         return ScriptError("Invalid value: " + tempdata[i]);
702                         }
703                         if (warn_deprecated == true)
704                                 ScriptWarning("Syntax deprecated");
705                 }
706                 else if (compat == 2)
707                 {
708                         for (int i = 5; i <= 13; i++)
709                         {
710                                 if (i == 8 || i == 11) //skip non-numeric parameters
711                                         i++;
712                                 if (!IsNumeric(tempdata[i]))
713                                         return ScriptError("Invalid value: " + tempdata[i]);
714                         }
715                         if (warn_deprecated == true)
716                                 ScriptWarning("Syntax deprecated");
717                 }
718                 else
719                 {
720                         if (params != 15)
721                                 return ScriptError("Incorrect number of parameters");
722
723                         for (int i = 6; i <= 14; i++)
724                         {
725                                 if (i == 9 || i == 12) //skip non-numeric parameters
726                                         i++;
727                                 if (!IsNumeric(tempdata[i]))
728                                         return ScriptError("Invalid value: " + tempdata[i]);
729                         }
730                 }
731
732                 //stop here if in Check mode
733                 if (config->CheckScript == true)
734                         return sNextLine;
735
736                 //create call button
737                 CallButton* callbutton = 0;
738                 if (compat == 1)
739                         callbutton = floor->AddCallButtons(callbutton_elevators, "", tempdata[0], tempdata[1], tempdata[1], tempdata[2], tempdata[2], ToFloat(tempdata[3]), ToFloat(tempdata[4]), ToFloat(tempdata[5]), tempdata[6], ToFloat(tempdata[7]), ToFloat(tempdata[8]), ToBool(tempdata[9]), ToFloat(tempdata[10]), ToFloat(tempdata[11]));
740                 else if (compat == 2)
741                         callbutton = floor->AddCallButtons(callbutton_elevators, "", tempdata[0], tempdata[1], tempdata[2], tempdata[3], tempdata[4], ToFloat(tempdata[5]), ToFloat(tempdata[6]), ToFloat(tempdata[7]), tempdata[8], ToFloat(tempdata[9]), ToFloat(tempdata[10]), ToBool(tempdata[11]), ToFloat(tempdata[12]), ToFloat(tempdata[13]));
742                 else
743                         callbutton = floor->AddCallButtons(callbutton_elevators, tempdata[0], tempdata[1], tempdata[2], tempdata[3], tempdata[4], tempdata[5], ToFloat(tempdata[6]), ToFloat(tempdata[7]), ToFloat(tempdata[8]), tempdata[9], ToFloat(tempdata[10]), ToFloat(tempdata[11]), ToBool(tempdata[12]), ToFloat(tempdata[13]), ToFloat(tempdata[14]));
744
745                 if (callbutton)
746                 {
747                         if (config->lockvalue == 0)
748                                 callbutton->SetLocked(false, config->keyvalue);
749                         else
750                                 callbutton->SetLocked(true, config->keyvalue);
751                 }
752                 StoreCommand(callbutton);
753                 return sNextLine;
754         }
755
756         //AddStairs command
757         if (linecheck.substr(0, 10) == "addstairs ")
758         {
759                 //get data
760                 int params = SplitData(LineData, 10);
761
762                 if (params != 13)
763                         return ScriptError("Incorrect number of parameters");
764
765                 //check numeric values
766                 for (int i = 0; i <= 12; i++)
767                 {
768                         if (i == 1)
769                                 i = 4; //skip non-numeric parameters
770                         if (!IsNumeric(tempdata[i]))
771                                 return ScriptError("Invalid value: " + tempdata[i]);
772                 }
773
774                 //create stairs
775                 if (Simcore->GetStairs(ToInt(tempdata[0])))
776                 {
777                         //stop here if in Check mode
778                         if (config->CheckScript == true)
779                                 return sNextLine;
780
781                         StoreCommand(Simcore->GetStairs(ToInt(tempdata[0]))->AddStairs(config->Current, tempdata[1], tempdata[2], tempdata[3], ToFloat(tempdata[4]), ToFloat(tempdata[5]), ToFloat(tempdata[6]), ToFloat(tempdata[7]), ToFloat(tempdata[8]), ToInt(tempdata[9]), ToFloat(tempdata[10]), ToFloat(tempdata[11]), ToFloat(tempdata[12])));
782                 }
783                 else
784                         return ScriptError("Invalid stairwell");
785                 return sNextLine;
786         }
787
788         //AddDoor command
789         if (linecheck.substr(0, 8) == "adddoor ")
790         {
791                 //get data
792                 int params = SplitData(LineData, 8);
793
794                 if (params < 10 || params == 11 || params > 14)
795                         return ScriptError("Incorrect number of parameters");
796
797                 int compat = 0;
798
799                 //check numeric values
800                 if (params == 10)
801                 {
802                         for (int i = 1; i <= 9; i++)
803                         {
804                                 if (!IsNumeric(tempdata[i]))
805                                         return ScriptError("Invalid value: " + tempdata[i]);
806                         }
807                         compat = 1;
808                 }
809                 if (params == 12)
810                 {
811                         for (int i = 3; i <= 11; i++)
812                         {
813                                 if (!IsNumeric(tempdata[i]))
814                                         return ScriptError("Invalid value: " + tempdata[i]);
815                         }
816                         compat = 2;
817                 }
818                 if (params == 13)
819                 {
820                         for (int i = 3; i <= 12; i++)
821                         {
822                                 if (!IsNumeric(tempdata[i]))
823                                         return ScriptError("Invalid value: " + tempdata[i]);
824                         }
825                         compat = 3;
826                 }
827                 if (params == 14)
828                 {
829                         for (int i = 4; i <= 13; i++)
830                         {
831                                 if (!IsNumeric(tempdata[i]))
832                                         return ScriptError("Invalid value: " + tempdata[i]);
833                         }
834                 }
835
836                 //check to see if file exists
837                 if (compat != 1)
838                 {
839                         parent->CheckFile("data/" + tempdata[0]);
840                         parent->CheckFile("data/" + tempdata[1]);
841                 }
842
843                 if (compat > 0 && warn_deprecated == true)
844                         ScriptWarning("Syntax deprecated");
845
846                 //stop here if in Check mode
847                 if (config->CheckScript == true)
848                         return sNextLine;
849
850                 //create door
851                 Door* door;
852
853                 if (compat == 1)
854                         door = floor->AddDoor("", "", false, tempdata[0], ToFloat(tempdata[1]), ToInt(tempdata[2]), 0, ToFloat(tempdata[3]), ToFloat(tempdata[4]), ToFloat(tempdata[5]), ToFloat(tempdata[6]), ToFloat(tempdata[7]), ToFloat(tempdata[8]), ToFloat(tempdata[9]));
855                 if (compat == 2)
856                         door = floor->AddDoor(tempdata[0], tempdata[1], false, tempdata[2], ToFloat(tempdata[3]), ToInt(tempdata[4]), 0, ToFloat(tempdata[5]), ToFloat(tempdata[6]), ToFloat(tempdata[7]), ToFloat(tempdata[8]), ToFloat(tempdata[9]), ToFloat(tempdata[10]), ToFloat(tempdata[11]));
857                 if (compat == 3)
858                         door = floor->AddDoor(tempdata[0], tempdata[1], false, tempdata[2], ToFloat(tempdata[3]), ToInt(tempdata[4]), ToFloat(tempdata[5]), ToFloat(tempdata[6]), ToFloat(tempdata[7]), ToFloat(tempdata[8]), ToFloat(tempdata[9]), ToFloat(tempdata[10]), ToFloat(tempdata[11]), ToFloat(tempdata[12]));
859                 if (compat == 0)
860                         door = floor->AddDoor(tempdata[0], tempdata[1], ToBool(tempdata[2]), tempdata[3], ToFloat(tempdata[4]), ToInt(tempdata[5]), ToFloat(tempdata[6]), ToFloat(tempdata[7]), ToFloat(tempdata[8]), ToFloat(tempdata[9]), ToFloat(tempdata[10]), ToFloat(tempdata[11]), ToFloat(tempdata[12]), ToFloat(tempdata[13]));
861
862                 if (door)
863                         door->SetLocked(config->lockvalue, config->keyvalue);
864
865                 StoreCommand(door);
866                 return sNextLine;
867         }
868
869         //AddStairsDoor command
870         if (linecheck.substr(0, 14) == "addstairsdoor ")
871         {
872                 //get data
873                 int params = SplitData(LineData, 14);
874
875                 if (params < 11 || params == 12 || params > 15)
876                         return ScriptError("Incorrect number of parameters");
877
878                 int compat = 0;
879
880                 //check numeric values
881                 if (params == 11)
882                 {
883                         for (int i = 0; i <= 10; i++)
884                         {
885                                 if (i == 1)
886                                         i = 2; //skip non-numeric parameters
887                                 if (!IsNumeric(tempdata[i]))
888                                         return ScriptError("Invalid value: " + tempdata[i]);
889                         }
890                         compat = 1;
891                 }
892                 if (params == 13)
893                 {
894                         for (int i = 0; i <= 12; i++)
895                         {
896                                 if (i == 1)
897                                         i = 4; //skip non-numeric parameters
898                                 if (!IsNumeric(tempdata[i]))
899                                         return ScriptError("Invalid value: " + tempdata[i]);
900                         }
901                         compat = 2;
902                 }
903                 if (params == 14)
904                 {
905                         for (int i = 0; i <= 13; i++)
906                         {
907                                 if (i == 1)
908                                         i = 4; //skip non-numeric parameters
909                                 if (!IsNumeric(tempdata[i]))
910                                         return ScriptError("Invalid value: " + tempdata[i]);
911                         }
912                         compat = 3;
913                 }
914                 if (params == 15)
915                 {
916                         for (int i = 0; i <= 14; i++)
917                         {
918                                 if (i == 1)
919                                         i = 5; //skip non-numeric parameters
920                                 if (!IsNumeric(tempdata[i]))
921                                         return ScriptError("Invalid value: " + tempdata[i]);
922                         }
923                 }
924
925                 //check to see if file exists
926                 if (compat != 1)
927                 {
928                         parent->CheckFile("data/" + tempdata[1]);
929                         parent->CheckFile("data/" + tempdata[2]);
930                 }
931
932                 if (compat > 0 && warn_deprecated == true)
933                         ScriptWarning("Syntax deprecated");
934
935                 //create door
936                 if (Simcore->GetStairs(ToInt(tempdata[0])))
937                 {
938                         //stop here if in Check mode
939                         if (config->CheckScript == true)
940                                 return sNextLine;
941
942                         Door* door;
943
944                         if (compat == 1)
945                                 door = Simcore->GetStairs(ToInt(tempdata[0]))->AddDoor(config->Current, "", "", false, tempdata[1], ToFloat(tempdata[2]), ToInt(tempdata[3]), 0, ToFloat(tempdata[4]), ToFloat(tempdata[5]), ToFloat(tempdata[6]), ToFloat(tempdata[7]), ToFloat(tempdata[8]), ToFloat(tempdata[9]), ToFloat(tempdata[10]));
946                         if (compat == 2)
947                                 door = Simcore->GetStairs(ToInt(tempdata[0]))->AddDoor(config->Current, tempdata[1], tempdata[2], false, tempdata[3], ToFloat(tempdata[4]), ToInt(tempdata[5]), 0, ToFloat(tempdata[6]), ToFloat(tempdata[7]), ToFloat(tempdata[8]), ToFloat(tempdata[9]), ToFloat(tempdata[10]), ToFloat(tempdata[11]), ToFloat(tempdata[12]));
948                         if (compat == 3)
949                                 door = Simcore->GetStairs(ToInt(tempdata[0]))->AddDoor(config->Current, tempdata[1], tempdata[2], false, tempdata[3], ToFloat(tempdata[4]), ToInt(tempdata[5]), ToFloat(tempdata[6]), ToFloat(tempdata[7]), ToFloat(tempdata[8]), ToFloat(tempdata[9]), ToFloat(tempdata[10]), ToFloat(tempdata[11]), ToFloat(tempdata[12]), ToFloat(tempdata[13]));
950                         if (compat == 0)
951                                 door = Simcore->GetStairs(ToInt(tempdata[0]))->AddDoor(config->Current, tempdata[1], tempdata[2], ToBool(tempdata[3]), tempdata[4], ToFloat(tempdata[5]), ToInt(tempdata[6]), ToFloat(tempdata[7]), ToFloat(tempdata[8]), ToFloat(tempdata[9]), ToFloat(tempdata[10]), ToFloat(tempdata[11]), ToFloat(tempdata[12]), ToFloat(tempdata[13]), ToFloat(tempdata[14]));
952
953                         if (door)
954                                 door->SetLocked(config->lockvalue, config->keyvalue);
955
956                         StoreCommand(door);
957                 }
958                 else
959                         return ScriptError("Invalid stairwell");
960                 return sNextLine;
961         }
962
963         //AddShaftStdDoor command
964         if (linecheck.substr(0, 16) == "addshaftstddoor ")
965         {
966                 //get data
967                 int params = SplitData(LineData, 16);
968
969                 if (params != 17)
970                         return ScriptError("Incorrect number of parameters");
971
972                 //check numeric values
973                 for (int i = 0; i <= 14; i++)
974                 {
975                         if (i == 1)
976                                 i = 5; //skip non-numeric parameters
977                         if (!IsNumeric(tempdata[i]))
978                                 return ScriptError("Invalid value: " + tempdata[i]);
979                 }
980
981                 //check to see if file exists
982                 parent->CheckFile("data/" + tempdata[1]);
983                 parent->CheckFile("data/" + tempdata[2]);
984
985                 //create door
986                 if (Simcore->GetShaft(ToInt(tempdata[0])))
987                 {
988                         //stop here if in Check mode
989                         if (config->CheckScript == true)
990                                 return sNextLine;
991
992                         Door* door = Simcore->GetShaft(ToInt(tempdata[0]))->AddDoor(config->Current, tempdata[1], tempdata[2], ToBool(tempdata[3]), tempdata[4], ToFloat(tempdata[5]), ToInt(tempdata[6]), ToFloat(tempdata[7]), ToFloat(tempdata[8]), ToFloat(tempdata[9]), ToFloat(tempdata[10]), ToFloat(tempdata[11]), ToFloat(tempdata[12]), ToFloat(tempdata[13]), ToFloat(tempdata[14]));
993
994                         if (door)
995                                 door->SetLocked(config->lockvalue, config->keyvalue);
996
997                         StoreCommand(door);
998                 }
999                 else
1000                         return ScriptError("Invalid shaft");
1001                 return sNextLine;
1002         }
1003
1004         //AddExternalDoor command
1005         if (linecheck.substr(0, 16) == "addexternaldoor ")
1006         {
1007                 //get data
1008                 int params = SplitData(LineData, 16);
1009
1010                 if (params != 14)
1011                         return ScriptError("Incorrect number of parameters");
1012
1013                 //check numeric values
1014                 for (int i = 4; i <= 13; i++)
1015                 {
1016                         if (!IsNumeric(tempdata[i]))
1017                                 return ScriptError("Invalid value: " + tempdata[i]);
1018                 }
1019
1020                 //check to see if file exists
1021                 parent->CheckFile("data/" + tempdata[0]);
1022                 parent->CheckFile("data/" + tempdata[1]);
1023
1024                 //stop here if in Check mode
1025                 if (config->CheckScript == true)
1026                         return sNextLine;
1027
1028                 //create door
1029                 Door* door = floor->AddDoor(tempdata[0], tempdata[1], ToBool(tempdata[2]), tempdata[3], ToFloat(tempdata[4]), ToInt(tempdata[5]), ToFloat(tempdata[6]), ToFloat(tempdata[7]), ToFloat(tempdata[8]), ToFloat(tempdata[9]), ToFloat(tempdata[10]), ToFloat(tempdata[11]), ToFloat(tempdata[12]), ToFloat(tempdata[13]), true);
1030
1031                 if (door)
1032                         door->SetLocked(config->lockvalue, config->keyvalue);
1033
1034                 StoreCommand(door);
1035                 return sNextLine;
1036         }
1037
1038         //AddDirectionalIndicator command
1039         if (linecheck.substr(0, 23) == "adddirectionalindicator")
1040         {
1041                 //get data
1042                 int params = SplitData(LineData, 24);
1043
1044                 if (params != 18 && params != 19)
1045                         return ScriptError("Incorrect number of parameters");
1046
1047                 bool compat = false;
1048
1049                 //check numeric values
1050                 if (params == 18)
1051                 {
1052                         for (int i = 9; i <= 17; i++)
1053                         {
1054                                 if (i == 12)
1055                                         i = 13;
1056                                 if (i == 15)
1057                                         i = 16;
1058                                 if (!IsNumeric(tempdata[i]))
1059                                         return ScriptError("Invalid value: " + tempdata[i]);
1060                         }
1061                         compat = true;
1062                         if (warn_deprecated == true)
1063                                 ScriptWarning("Syntax deprecated");
1064                 }
1065                 if (params == 19)
1066                 {
1067                         for (int i = 10; i <= 18; i++)
1068                         {
1069                                 if (i == 13)
1070                                         i = 14;
1071                                 if (i == 16)
1072                                         i = 17;
1073                                 if (!IsNumeric(tempdata[i]))
1074                                         return ScriptError("Invalid value: " + tempdata[i]);
1075                         }
1076                 }
1077
1078                 int elevator, car;
1079                 if (!GetElevatorCar(tempdata[0], floor->Number, elevator, car))
1080                         return sError;
1081
1082                 //stop here if in Check mode
1083                 if (config->CheckScript == true)
1084                         return sNextLine;
1085
1086                 if (compat == true)
1087                         StoreCommand(floor->AddDirectionalIndicator(elevator, car, ToBool(tempdata[1]), false, ToBool(tempdata[2]), ToBool(tempdata[3]), tempdata[4], tempdata[5], tempdata[6], tempdata[7], tempdata[8], ToFloat(tempdata[9]), ToFloat(tempdata[10]), ToFloat(tempdata[11]), tempdata[12], ToFloat(tempdata[13]), ToFloat(tempdata[14]), ToBool(tempdata[15]), ToFloat(tempdata[16]), ToFloat(tempdata[17])));
1088                 else
1089                         StoreCommand(floor->AddDirectionalIndicator(elevator, car, ToBool(tempdata[1]), ToBool(tempdata[2]), ToBool(tempdata[3]), ToBool(tempdata[4]), tempdata[5], tempdata[6], tempdata[7], tempdata[8], tempdata[9], ToFloat(tempdata[10]), ToFloat(tempdata[11]), ToFloat(tempdata[12]), tempdata[13], ToFloat(tempdata[14]), ToFloat(tempdata[15]), ToBool(tempdata[16]), ToFloat(tempdata[17]), ToFloat(tempdata[18])));
1090                 return sNextLine;
1091         }
1092
1093         //AddShaftDoor command
1094         if (linecheck.substr(0, 13) == "addshaftdoor ")
1095         {
1096                 //get data
1097                 int params = SplitData(LineData, 13);
1098
1099                 if (params != 5 && params != 6 && params != 10)
1100                         return ScriptError("Incorrect number of parameters");
1101
1102                 int compat = 0;
1103                 if (params == 5)
1104                         compat = 1; //1.4 compatibility mode
1105                 if (params == 6)
1106                         compat = 2;
1107
1108                 //exit if the SetShaftDoors command was never used
1109                 if (compat > 0 && config->setshaftdoors == false)
1110                         return ScriptError("SetShaftDoors must be used before AddShaftDoor");
1111
1112                 //check numeric values
1113                 if (compat == 0)
1114                 {
1115                         for (int i = 1; i <= 9; i++)
1116                         {
1117                                 if (i == 2)
1118                                         i = 4;
1119                                 if (!IsNumeric(tempdata[i]))
1120                                         return ScriptError("Invalid value: " + tempdata[i]);
1121                         }
1122                 }
1123                 if (compat == 1)
1124                 {
1125                         for (int i = 1; i <= 4; i++)
1126                         {
1127                                 if (i == 2)
1128                                         i = 3;
1129                                 if (!IsNumeric(tempdata[i]))
1130                                         return ScriptError("Invalid value: " + tempdata[i]);
1131                         }
1132                 }
1133                 if (compat == 2)
1134                 {
1135                         for (int i = 1; i <= 5; i++)
1136                         {
1137                                 if (i == 2)
1138                                         i = 4;
1139                                 if (!IsNumeric(tempdata[i]))
1140                                         return ScriptError("Invalid value: " + tempdata[i]);
1141                         }
1142                 }
1143
1144                 if (compat > 0 && warn_deprecated == true)
1145                         ScriptWarning("Syntax deprecated");
1146
1147                 int elevator, carnum;
1148                 if (!GetElevatorCar(tempdata[0], floor->Number, elevator, carnum))
1149                         return sError;
1150
1151                 //stop here if in Check mode
1152                 if (config->CheckScript == true)
1153                         return sNextLine;
1154
1155                 Elevator *elev = Simcore->GetElevator(elevator);
1156                 ElevatorCar *car = elev->GetCar(carnum);
1157
1158                 if (compat == 0)
1159                         StoreCommand(car->AddShaftDoor(config->Current, ToInt(tempdata[1]), tempdata[2], tempdata[3], ToFloat(tempdata[4]), ToFloat(tempdata[5]), ToFloat(tempdata[6]), ToFloat(tempdata[7]), ToFloat(tempdata[8]), ToFloat(tempdata[9])));
1160                 if (compat == 1)
1161                         StoreCommand(car->AddShaftDoor(config->Current, ToInt(tempdata[1]), tempdata[2], tempdata[2], ToFloat(tempdata[3]), ToFloat(tempdata[4])));
1162                 if (compat == 2)
1163                         StoreCommand(car->AddShaftDoor(config->Current, ToInt(tempdata[1]), tempdata[2], tempdata[3], ToFloat(tempdata[4]), ToFloat(tempdata[5])));
1164                 return sNextLine;
1165         }
1166
1167         //AddFloorIndicator command
1168         if (linecheck.substr(0, 17) == "addfloorindicator")
1169         {
1170                 //get data
1171                 int params = SplitData(LineData, 18);
1172
1173                 if (params != 8 && params != 9)
1174                         return ScriptError("Incorrect number of parameters");
1175
1176                 bool compat = false;
1177                 if (params == 8)
1178                         compat = true; //1.4 compatibility mode
1179
1180                 //check numeric values
1181                 if (compat == true)
1182                 {
1183                         for (int i = 3; i <= 7; i++)
1184                         {
1185                                 if (!IsNumeric(tempdata[i]))
1186                                         return ScriptError("Invalid value: " + tempdata[i]);
1187                         }
1188                         if (warn_deprecated == true)
1189                                 ScriptWarning("Syntax deprecated");
1190                 }
1191                 else
1192                 {
1193                         for (int i = 4; i <= 8; i++)
1194                         {
1195                                 if (!IsNumeric(tempdata[i]))
1196                                         return ScriptError("Invalid value: " + tempdata[i]);
1197                         }
1198                 }
1199
1200                 int elevator, car;
1201                 if (!GetElevatorCar(tempdata[0], floor->Number, elevator, car))
1202                         return sError;
1203
1204                 //stop here if in Check mode
1205                 if (config->CheckScript == true)
1206                         return sNextLine;
1207
1208                 if (compat == false)
1209                         StoreCommand(floor->AddFloorIndicator(elevator, car, ToBool(tempdata[1]), tempdata[2], tempdata[3], ToFloat(tempdata[4]), ToFloat(tempdata[5]), ToFloat(tempdata[6]), ToFloat(tempdata[7]), ToFloat(tempdata[8])));
1210                 else
1211                         StoreCommand(floor->AddFloorIndicator(elevator, car, ToBool(tempdata[1]), "Button", tempdata[2], ToFloat(tempdata[3]), ToFloat(tempdata[4]), ToFloat(tempdata[5]), ToFloat(tempdata[6]), ToFloat(tempdata[7])));
1212                 return sNextLine;
1213         }
1214
1215         //AddFillerWalls command
1216         if (linecheck.substr(0, 14) == "addfillerwalls")
1217         {
1218                 //get data
1219                 int params = SplitData(LineData, 15);
1220
1221                 if (params < 10 || params > 11)
1222                         return ScriptError("Incorrect number of parameters");
1223
1224                 bool compat = false;
1225
1226                 if (params == 10)
1227                         compat = true;
1228
1229                 //check numeric values
1230                 for (int i = 1; i <= 9; i++)
1231                 {
1232                         if (i == 7)
1233                                 i = 8;
1234                         if (!IsNumeric(tempdata[i]))
1235                                 return ScriptError("Invalid value: " + tempdata[i]);
1236                 }
1237
1238                 //stop here if in Check mode
1239                 if (config->CheckScript == true)
1240                         return sNextLine;
1241
1242                 if (compat == true)
1243                         floor->AddFillerWalls(tempdata[0], ToFloat(tempdata[1]), ToFloat(tempdata[2]), ToFloat(tempdata[3]), ToFloat(tempdata[4]), ToFloat(tempdata[5]), ToFloat(tempdata[6]), ToBool(tempdata[7]), ToFloat(tempdata[8]), ToFloat(tempdata[9]), false);
1244                 else
1245                         floor->AddFillerWalls(tempdata[0], ToFloat(tempdata[1]), ToFloat(tempdata[2]), ToFloat(tempdata[3]), ToFloat(tempdata[4]), ToFloat(tempdata[5]), ToFloat(tempdata[6]), ToBool(tempdata[7]), ToFloat(tempdata[8]), ToFloat(tempdata[9]), ToBool(tempdata[10]));
1246
1247                 return sNextLine;
1248         }
1249
1250         //AddSound command
1251         if (linecheck.substr(0, 8) == "addsound")
1252         {
1253                 //get data
1254                 int params = SplitData(LineData, 9, true);
1255
1256                 if (params != 5 && params != 6 && params != 13 && params != 17)
1257                         return ScriptError("Incorrect number of parameters");
1258
1259                 bool partial = false;
1260                 bool compat = false;
1261                 if (params == 5 || params == 6)
1262                         partial = true;
1263                 if (params == 5 || params == 13)
1264                         compat = true;
1265
1266                 //check numeric values
1267                 if (partial == true)
1268                 {
1269                         for (int i = 2; i <= 4; i++)
1270                         {
1271                                 if (!IsNumeric(tempdata[i]))
1272                                         return ScriptError("Invalid value: " + tempdata[i]);
1273                         }
1274                 }
1275                 else
1276                 {
1277                         if (compat == true)
1278                         {
1279                                 for (int i = 2; i <= 12; i++)
1280                                 {
1281                                         if (!IsNumeric(tempdata[i]))
1282                                                 return ScriptError("Invalid value: " + tempdata[i]);
1283                                 }
1284                                 if (warn_deprecated == true)
1285                                         ScriptWarning("Syntax deprecated");
1286                         }
1287                         else
1288                         {
1289                                 for (int i = 2; i <= 16; i++)
1290                                 {
1291                                         if (i == 5)
1292                                                 i = 6;
1293
1294                                         if (!IsNumeric(tempdata[i]))
1295                                                 return ScriptError("Invalid value: " + tempdata[i]);
1296                                 }
1297                         }
1298                 }
1299
1300                 //check to see if file exists
1301                 parent->CheckFile("data/" + tempdata[1]);
1302
1303                 //stop here if in Check mode
1304                 if (config->CheckScript == true)
1305                         return sNextLine;
1306
1307                 if (compat == true)
1308                 {
1309                         if (partial == true)
1310                                 StoreCommand(floor->AddSound(tempdata[0], tempdata[1], Ogre::Vector3(ToFloat(tempdata[2]), ToFloat(tempdata[3]), ToFloat(tempdata[4]))));
1311                         else
1312                                 StoreCommand(floor->AddSound(tempdata[0], tempdata[1], Ogre::Vector3(ToFloat(tempdata[2]), ToFloat(tempdata[3]), ToFloat(tempdata[4])), true, ToFloat(tempdata[5]), ToInt(tempdata[6]), ToFloat(tempdata[7]), ToFloat(tempdata[8]), 0.0, 360, 360, 1.0, Ogre::Vector3(ToFloat(tempdata[10]), ToFloat(tempdata[11]), ToFloat(tempdata[12]))));
1313                 }
1314                 else
1315                 {
1316                         if (partial == true)
1317                                 StoreCommand(floor->AddSound(tempdata[0], tempdata[1], Ogre::Vector3(ToFloat(tempdata[2]), ToFloat(tempdata[3]), ToFloat(tempdata[4])), ToBool(tempdata[5])));
1318                         else
1319                                 StoreCommand(floor->AddSound(tempdata[0], tempdata[1], Ogre::Vector3(ToFloat(tempdata[2]), ToFloat(tempdata[3]), ToFloat(tempdata[4])), ToBool(tempdata[5]), ToFloat(tempdata[6]), ToInt(tempdata[7]), ToFloat(tempdata[8]), ToFloat(tempdata[9]), ToFloat(tempdata[10]), ToFloat(tempdata[11]), ToFloat(tempdata[12]), ToFloat(tempdata[13]), Ogre::Vector3(ToFloat(tempdata[14]), ToFloat(tempdata[15]), ToFloat(tempdata[16]))));
1320                 }
1321                 return sNextLine;
1322         }
1323
1324         //AddShaftDoorComponent command
1325         if (linecheck.substr(0, 21) == "addshaftdoorcomponent")
1326         {
1327                 //get data
1328                 int params = SplitData(LineData, 22);
1329
1330                 if (params != 18 && params != 19)
1331                         return ScriptError("Incorrect number of parameters");
1332
1333                 //check numeric values
1334                 bool compat = false;
1335                 if (params == 18)
1336                 {
1337                         compat = true;
1338                         if (warn_deprecated == true)
1339                                 ScriptWarning("Syntax deprecated");
1340                 }
1341
1342                 for (int i = 1; i <= params - 1; i++)
1343                 {
1344                         if (i == 2)
1345                                 i = 5;
1346                         if (i == 6)
1347                                 i++;
1348                         if (!IsNumeric(tempdata[i]))
1349                                 return ScriptError("Invalid value: " + tempdata[i]);
1350                 }
1351
1352                 int elevator, carnum;
1353                 if (!GetElevatorCar(tempdata[0], floor->Number, elevator, carnum))
1354                         return sError;
1355
1356                 //stop here if in Check mode
1357                 if (config->CheckScript == true)
1358                         return sNextLine;
1359
1360                 Elevator *elev = Simcore->GetElevator(elevator);
1361                 ElevatorCar *car = elev->GetCar(carnum);
1362
1363                 if (compat == true)
1364                         StoreCommand(car->AddShaftDoorComponent(ToInt(tempdata[1]), config->Current, tempdata[2], tempdata[3], tempdata[4], ToFloat(tempdata[5]), tempdata[6], ToFloat(tempdata[7]), ToFloat(tempdata[7]), ToFloat(tempdata[8]), ToFloat(tempdata[9]), ToFloat(tempdata[10]), ToFloat(tempdata[11]), ToFloat(tempdata[12]), ToFloat(tempdata[13]), ToFloat(tempdata[14]), ToFloat(tempdata[15]), ToFloat(tempdata[16]), ToFloat(tempdata[17])));
1365                 else
1366                         StoreCommand(car->AddShaftDoorComponent(ToInt(tempdata[1]), config->Current, tempdata[2], tempdata[3], tempdata[4], ToFloat(tempdata[5]), tempdata[6], ToFloat(tempdata[7]), ToFloat(tempdata[8]), ToFloat(tempdata[9]), ToFloat(tempdata[10]), ToFloat(tempdata[11]), ToFloat(tempdata[12]), ToFloat(tempdata[13]), ToFloat(tempdata[14]), ToFloat(tempdata[15]), ToFloat(tempdata[16]), ToFloat(tempdata[17]), ToFloat(tempdata[18])));
1367                 return sNextLine;
1368         }
1369
1370         //FinishShaftDoor command
1371         if (linecheck.substr(0, 16) == "finishshaftdoor ")
1372         {
1373                 //get data
1374                 int params = SplitData(LineData, 16);
1375
1376                 bool legacy = false;
1377
1378                 if (params < 2)
1379                         return ScriptError("Incorrect number of parameters");
1380
1381                 if (params > 3)
1382                 {
1383                         if (IsNumeric(tempdata[2]) == true)
1384                         {
1385                                 if (warn_deprecated == true)
1386                                         ScriptWarning("Syntax deprecated");
1387                                 legacy = true;
1388                         }
1389                 }
1390
1391                 //check numeric values
1392                 for (int i = 1; i <= 1; i++)
1393                 {
1394                         if (!IsNumeric(tempdata[i]))
1395                                 return ScriptError("Invalid value: " + tempdata[i]);
1396                 }
1397
1398                 int elevator, carnum;
1399                 if (!GetElevatorCar(tempdata[0], floor->Number, elevator, carnum))
1400                         return sError;
1401
1402                 //stop here if in Check mode
1403                 if (config->CheckScript == true)
1404                         return sNextLine;
1405
1406                 Elevator *elev = Simcore->GetElevator(elevator);
1407                 ElevatorCar *car = elev->GetCar(carnum);
1408
1409                 if (params == 2 || legacy == true)
1410                         StoreCommand(car->FinishShaftDoor(ToInt(tempdata[1]), config->Current));
1411                 else if (params == 3)
1412                         StoreCommand(car->FinishShaftDoor(ToInt(tempdata[1]), config->Current, ToBool(tempdata[2])));
1413                 else
1414                         StoreCommand(car->FinishShaftDoor(ToInt(tempdata[1]), config->Current, ToBool(tempdata[2]), ToBool(tempdata[3])));
1415                 return sNextLine;
1416         }
1417
1418         //AddModel command
1419         if (linecheck.substr(0, 8) == "addmodel")
1420         {
1421                 //get data
1422                 int params = SplitData(LineData, 9, true);
1423
1424                 if (params != 14 && params != 15)
1425                         return ScriptError("Incorrect number of parameters");
1426
1427                 bool compat = false;
1428                 if (params == 14)
1429                         compat = true;
1430
1431                 //check numeric values
1432                 if (compat == true)
1433                 {
1434                         for (int i = 2; i <= 13; i++)
1435                         {
1436                                 if (i == 10)
1437                                         i++;
1438                                 if (!IsNumeric(tempdata[i]))
1439                                         return ScriptError("Invalid value: " + tempdata[i]);
1440                         }
1441                         if (warn_deprecated == true)
1442                                 ScriptWarning("Syntax deprecated");
1443                 }
1444                 else
1445                 {
1446                         for (int i = 3; i <= 14; i++)
1447                         {
1448                                 if (i == 11)
1449                                         i++;
1450                                 if (!IsNumeric(tempdata[i]))
1451                                         return ScriptError("Invalid value: " + tempdata[i]);
1452                         }
1453                 }
1454
1455                 //check to see if file exists
1456                 parent->CheckFile("data/" + tempdata[1]);
1457
1458                 //stop here if in Check mode
1459                 if (config->CheckScript == true)
1460                 {
1461                         config->setkey = false;
1462                         return sNextLine;
1463                 }
1464
1465                 //create model
1466                 Model *model;
1467                 if (compat == true)
1468                         model = floor->AddModel(tempdata[0], tempdata[1], false, Ogre::Vector3(ToFloat(tempdata[2]), ToFloat(tempdata[3]), ToFloat(tempdata[4])), Ogre::Vector3(ToFloat(tempdata[5]), ToFloat(tempdata[6]), ToFloat(tempdata[7])), ToFloat(tempdata[8]), ToFloat(tempdata[9]), ToBool(tempdata[10]), ToFloat(tempdata[11]), ToFloat(tempdata[12]), ToFloat(tempdata[13]));
1469                 else
1470                         model = floor->AddModel(tempdata[0], tempdata[1], ToBool(tempdata[2]), Ogre::Vector3(ToFloat(tempdata[3]), ToFloat(tempdata[4]), ToFloat(tempdata[5])), Ogre::Vector3(ToFloat(tempdata[6]), ToFloat(tempdata[7]), ToFloat(tempdata[8])), ToFloat(tempdata[9]), ToFloat(tempdata[10]), ToBool(tempdata[11]), ToFloat(tempdata[12]), ToFloat(tempdata[13]), ToFloat(tempdata[14]));
1471
1472                 if (config->setkey == true && model)
1473                         model->SetKey(config->keyvalue);
1474                 config->setkey = false;
1475
1476                 StoreCommand(model);
1477                 return sNextLine;
1478         }
1479
1480         //AddStairsModel command
1481         if (linecheck.substr(0, 14) == "addstairsmodel")
1482         {
1483                 //get data
1484                 int params = SplitData(LineData, 15, true);
1485
1486                 if (params != 15 && params != 16)
1487                         return ScriptError("Incorrect number of parameters");
1488
1489                 bool compat = false;
1490                 if (params == 15)
1491                         compat = true;
1492
1493                 //check numeric values
1494                 if (compat == true)
1495                 {
1496                         for (int i = 3; i <= 14; i++)
1497                         {
1498                                 if (i == 11)
1499                                         i++;
1500                                 if (!IsNumeric(tempdata[i]))
1501                                         return ScriptError("Invalid value: " + tempdata[i]);
1502                         }
1503                         if (warn_deprecated == true)
1504                                 ScriptWarning("Syntax deprecated");
1505                 }
1506                 else
1507                 {
1508                         for (int i = 4; i <= 15; i++)
1509                         {
1510                                 if (i == 12)
1511                                         i++;
1512                                 if (!IsNumeric(tempdata[i]))
1513                                         return ScriptError("Invalid value: " + tempdata[i]);
1514                         }
1515                 }
1516
1517                 //check to see if file exists
1518                 parent->CheckFile("data/" + tempdata[2]);
1519
1520                 //create model
1521                 if (Simcore->GetStairs(ToInt(tempdata[0])))
1522                 {
1523                         //stop here if in Check mode
1524                         if (config->CheckScript == true)
1525                         {
1526                                 config->setkey = false;
1527                                 return sNextLine;
1528                         }
1529
1530                         Model *model;
1531
1532                         if (compat == true)
1533                                 model = Simcore->GetStairs(ToInt(tempdata[0]))->AddModel(config->Current, tempdata[1], tempdata[2], false, Ogre::Vector3(ToFloat(tempdata[3]), ToFloat(tempdata[4]), ToFloat(tempdata[5])), Ogre::Vector3(ToFloat(tempdata[6]), ToFloat(tempdata[7]), ToFloat(tempdata[8])), ToFloat(tempdata[9]), ToFloat(tempdata[10]), ToBool(tempdata[11]), ToFloat(tempdata[12]), ToFloat(tempdata[13]), ToFloat(tempdata[14]));
1534                         else
1535                                 model = Simcore->GetStairs(ToInt(tempdata[0]))->AddModel(config->Current, tempdata[1], tempdata[2], ToBool(tempdata[3]), Ogre::Vector3(ToFloat(tempdata[4]), ToFloat(tempdata[5]), ToFloat(tempdata[6])), Ogre::Vector3(ToFloat(tempdata[7]), ToFloat(tempdata[8]), ToFloat(tempdata[9])), ToFloat(tempdata[10]), ToFloat(tempdata[11]), ToBool(tempdata[12]), ToFloat(tempdata[13]), ToFloat(tempdata[14]), ToFloat(tempdata[15]));
1536
1537                         if (config->setkey == true && model)
1538                                 model->SetKey(config->keyvalue);
1539                         config->setkey = false;
1540
1541                         StoreCommand(model);
1542                 }
1543                 else
1544                         return ScriptError("Invalid stairwell");
1545                 return sNextLine;
1546         }
1547
1548         //AddShaftModel command
1549         if (linecheck.substr(0, 13) == "addshaftmodel")
1550         {
1551                 //get data
1552                 int params = SplitData(LineData, 14, true);
1553
1554                 if (params != 15 && params != 16)
1555                         return ScriptError("Incorrect number of parameters");
1556
1557                 bool compat = false;
1558                 if (params == 15)
1559                         compat = true;
1560
1561                 //check numeric values
1562                 if (compat == true)
1563                 {
1564                         for (int i = 3; i <= 14; i++)
1565                         {
1566                                 if (i == 11)
1567                                         i++;
1568                                 if (!IsNumeric(tempdata[i]))
1569                                         return ScriptError("Invalid value: " + tempdata[i]);
1570                         }
1571                         if (warn_deprecated == true)
1572                                 ScriptWarning("Syntax deprecated");
1573                 }
1574                 else
1575                 {
1576                         for (int i = 4; i <= 15; i++)
1577                         {
1578                                 if (i == 12)
1579                                         i++;
1580                                 if (!IsNumeric(tempdata[i]))
1581                                         return ScriptError("Invalid value: " + tempdata[i]);
1582                         }
1583                 }
1584
1585                 //check to see if file exists
1586                 parent->CheckFile("data/" + tempdata[2]);
1587
1588                 //create model
1589                 if (Simcore->GetShaft(ToInt(tempdata[0])))
1590                 {
1591                         //stop here if in Check mode
1592                         if (config->CheckScript == true)
1593                         {
1594                                 config->setkey = false;
1595                                 return sNextLine;
1596                         }
1597
1598                         Model *model;
1599                         if (compat == true)
1600                                 model = Simcore->GetShaft(ToInt(tempdata[0]))->AddModel(config->Current, tempdata[1], tempdata[2], false, Ogre::Vector3(ToFloat(tempdata[3]), ToFloat(tempdata[4]), ToFloat(tempdata[5])), Ogre::Vector3(ToFloat(tempdata[6]), ToFloat(tempdata[7]), ToFloat(tempdata[8])), ToFloat(tempdata[9]), ToFloat(tempdata[10]), ToBool(tempdata[11]), ToFloat(tempdata[12]), ToFloat(tempdata[13]), ToFloat(tempdata[14]));
1601                         else
1602                                 model = Simcore->GetShaft(ToInt(tempdata[0]))->AddModel(config->Current, tempdata[1], tempdata[2], ToBool(tempdata[3]), Ogre::Vector3(ToFloat(tempdata[4]), ToFloat(tempdata[5]), ToFloat(tempdata[6])), Ogre::Vector3(ToFloat(tempdata[7]), ToFloat(tempdata[8]), ToFloat(tempdata[9])), ToFloat(tempdata[10]), ToFloat(tempdata[11]), ToBool(tempdata[12]), ToFloat(tempdata[13]), ToFloat(tempdata[14]), ToFloat(tempdata[15]));
1603
1604                         if (config->setkey == true && model)
1605                                 model->SetKey(config->keyvalue);
1606                         config->setkey = false;
1607
1608                         StoreCommand(model);
1609                 }
1610                 else
1611                         return ScriptError("Invalid shaft");
1612                 return sNextLine;
1613         }
1614
1615         //AddActionControl command
1616         if (linecheck.substr(0, 16) == "addactioncontrol")
1617         {
1618                 //get data
1619                 int params = SplitData(LineData, 17);
1620
1621                 if (params < 10)
1622                         return ScriptError("Incorrect number of parameters");
1623
1624                 //set backwards compatibility
1625                 bool compat = false;
1626                 if (IsNumeric(tempdata[8]) == false)
1627                         compat = true;
1628
1629                 int end = 8;
1630                 if (compat == true)
1631                         end = 7;
1632
1633                 //check numeric values
1634                 for (int i = 3; i <= end; i++)
1635                 {
1636                         if (!IsNumeric(tempdata[i]))
1637                                 return ScriptError("Invalid value: " + tempdata[i]);
1638                 }
1639
1640                 std::vector<std::string> action_array, tex_array;
1641                 int slength, parameters;
1642
1643                 //get number of action & texture parameters
1644                 slength = (int)tempdata.size();
1645                 parameters = slength - (end + 1); //strip off main parameters
1646
1647                 //action & texture parameter number needs to be even
1648                 if (IsEven(parameters) == false)
1649                         return ScriptError("Incorrect number of parameters");
1650
1651                 for (int i = (end + 1); i < slength - (parameters / 2); i++)
1652                         action_array.push_back(tempdata[i]);
1653                 for (int i = slength - (parameters / 2); i < slength; i++)
1654                         tex_array.push_back(tempdata[i]);
1655
1656                 //check to see if file exists
1657                 parent->CheckFile("data/" + tempdata[1]);
1658
1659                 //stop here if in Check mode
1660                 if (config->CheckScript == true)
1661                         return sNextLine;
1662
1663                 Control* control = 0;
1664                 if (compat == true)
1665                         control = floor->AddControl(tempdata[0], tempdata[1], tempdata[2], ToFloat(tempdata[3]), ToFloat(tempdata[4]), ToFloat(tempdata[5]), ToFloat(tempdata[6]), ToFloat(tempdata[7]), 1, action_array, tex_array);
1666                 else
1667                         control = floor->AddControl(tempdata[0], tempdata[1], tempdata[2], ToFloat(tempdata[3]), ToFloat(tempdata[4]), ToFloat(tempdata[5]), ToFloat(tempdata[6]), ToFloat(tempdata[7]), ToInt(tempdata[8]), action_array, tex_array);
1668
1669                 if (control)
1670                 {
1671                         if (config->lockvalue == 0)
1672                                 control->SetLocked(false, config->keyvalue);
1673                         else
1674                                 control->SetLocked(true, config->keyvalue);
1675                 }
1676                 StoreCommand(control);
1677                 return sNextLine;
1678         }
1679
1680         //AddShaftActionControl command
1681         if (linecheck.substr(0, 21) == "addshaftactioncontrol")
1682         {
1683                 //get data
1684                 int params = SplitData(LineData, 21);
1685
1686                 if (params < 11)
1687                         return ScriptError("Incorrect number of parameters");
1688
1689                 //set backwards compatibility
1690                 bool compat = false;
1691                 if (IsNumeric(tempdata[9]) == false)
1692                         compat = true;
1693
1694                 int end = 9;
1695                 if (compat == true)
1696                         end = 8;
1697
1698                 //check numeric values
1699                 for (int i = 0; i <= end; i++)
1700                 {
1701                         if (i == 1)
1702                                 i = 4;
1703                         if (!IsNumeric(tempdata[i]))
1704                                 return ScriptError("Invalid value: " + tempdata[i]);
1705                 }
1706
1707                 std::vector<std::string> action_array, tex_array;
1708                 int slength, parameters;
1709
1710                 //get number of action & texture parameters
1711                 slength = (int)tempdata.size();
1712                 parameters = slength - (end + 1); //strip off main parameters
1713
1714                 //action & texture parameter number needs to be even
1715                 if (IsEven(parameters) == false)
1716                         return ScriptError("Incorrect number of parameters");
1717
1718                 for (int i = (end + 1); i < slength - (parameters / 2); i++)
1719                         action_array.push_back(tempdata[i]);
1720                 for (int i = slength - (parameters / 2); i < slength; i++)
1721                         tex_array.push_back(tempdata[i]);
1722
1723                 //check to see if file exists
1724                 parent->CheckFile("data/" + tempdata[1]);
1725
1726                 if (Simcore->GetShaft(ToInt(tempdata[0])))
1727                 {
1728                         //stop here if in Check mode
1729                         if (config->CheckScript == true)
1730                                 return sNextLine;
1731
1732                         Control* control = 0;
1733                         if (compat == true)
1734                                 control = Simcore->GetShaft(ToInt(tempdata[0]))->AddControl(config->Current, tempdata[1], tempdata[2], tempdata[3], ToFloat(tempdata[4]), ToFloat(tempdata[5]), ToFloat(tempdata[6]), ToFloat(tempdata[7]), ToFloat(tempdata[8]), 1, action_array, tex_array);
1735                         else
1736                                 control = Simcore->GetShaft(ToInt(tempdata[0]))->AddControl(config->Current, tempdata[1], tempdata[2], tempdata[3], ToFloat(tempdata[4]), ToFloat(tempdata[5]), ToFloat(tempdata[6]), ToFloat(tempdata[7]), ToFloat(tempdata[8]), ToInt(tempdata[9]), action_array, tex_array);
1737
1738                         if (control)
1739                         {
1740                                 if (config->lockvalue == 0)
1741                                         control->SetLocked(false, config->keyvalue);
1742                                 else
1743                                         control->SetLocked(true, config->keyvalue);
1744                         }
1745                         StoreCommand(control);
1746                 }
1747                 else
1748                         return ScriptError("Invalid shaft");
1749                 return sNextLine;
1750         }
1751
1752         //AddStairsActionControl command
1753         if (linecheck.substr(0, 21) == "addstairsactioncontrol")
1754         {
1755                 //get data
1756                 int params = SplitData(LineData, 21);
1757
1758                 if (params < 11)
1759                         return ScriptError("Incorrect number of parameters");
1760
1761                 //set backwards compatibility
1762                 bool compat = false;
1763                 if (IsNumeric(tempdata[9]) == false)
1764                         compat = true;
1765
1766                 int end = 9;
1767                 if (compat == true)
1768                         end = 8;
1769
1770                 //check numeric values
1771                 for (int i = 0; i <= end; i++)
1772                 {
1773                         if (i == 1)
1774                                 i = 4;
1775                         if (!IsNumeric(tempdata[i]))
1776                                 return ScriptError("Invalid value: " + tempdata[i]);
1777                 }
1778
1779                 std::vector<std::string> action_array, tex_array;
1780                 int slength, parameters;
1781
1782                 //get number of action & texture parameters
1783                 slength = (int)tempdata.size();
1784                 parameters = slength - (end + 1); //strip off main parameters
1785
1786                 //action & texture parameter number needs to be even
1787                 if (IsEven(parameters) == false)
1788                         return ScriptError("Incorrect number of parameters");
1789
1790                 for (int i = (end + 1); i < slength - (parameters / 2); i++)
1791                         action_array.push_back(tempdata[i]);
1792                 for (int i = slength - (parameters / 2); i < slength; i++)
1793                         tex_array.push_back(tempdata[i]);
1794
1795                 //check to see if file exists
1796                 parent->CheckFile("data/" + tempdata[1]);
1797
1798                 if (Simcore->GetStairs(ToInt(tempdata[0])))
1799                 {
1800                         //stop here if in Check mode
1801                         if (config->CheckScript == true)
1802                                 return sNextLine;
1803
1804                         Control* control = 0;
1805                         if (compat == true)
1806                                 control = Simcore->GetStairs(ToInt(tempdata[0]))->AddControl(config->Current, tempdata[1], tempdata[2], tempdata[3], ToFloat(tempdata[4]), ToFloat(tempdata[5]), ToFloat(tempdata[6]), ToFloat(tempdata[7]), ToFloat(tempdata[8]), 1, action_array, tex_array);
1807                         else
1808                                 control = Simcore->GetStairs(ToInt(tempdata[0]))->AddControl(config->Current, tempdata[1], tempdata[2], tempdata[3], ToFloat(tempdata[4]), ToFloat(tempdata[5]), ToFloat(tempdata[6]), ToFloat(tempdata[7]), ToFloat(tempdata[8]), ToInt(tempdata[9]), action_array, tex_array);
1809
1810                         if (control)
1811                         {
1812                                 if (config->lockvalue == 0)
1813                                         control->SetLocked(false, config->keyvalue);
1814                                 else
1815                                         control->SetLocked(true, config->keyvalue);
1816                         }
1817                         StoreCommand(control);
1818                 }
1819                 else
1820                         return ScriptError("Invalid stairwell");
1821                 return sNextLine;
1822         }
1823
1824         //AddTrigger command
1825         if (linecheck.substr(0, 10) == "addtrigger")
1826         {
1827                 //get data
1828                 int params = SplitData(LineData, 11);
1829
1830                 if (params < 9)
1831                         return ScriptError("Incorrect number of parameters");
1832
1833                 //check numeric values
1834                 for (int i = 2; i <= 7; i++)
1835                 {
1836                         if (!IsNumeric(tempdata[i]))
1837                                 return ScriptError("Invalid value: " + tempdata[i]);
1838                 }
1839
1840                 std::vector<std::string> action_array;
1841
1842                 //get number of action & texture parameters
1843                 for (int i = 8; i < params; i++)
1844                         action_array.push_back(tempdata[i]);
1845
1846                 //check to see if file exists
1847                 parent->CheckFile("data/" + tempdata[1]);
1848
1849                 //stop here if in Check mode
1850                 if (config->CheckScript == true)
1851                         return sNextLine;
1852
1853                 Ogre::Vector3 min = Ogre::Vector3(ToFloat(tempdata[2]), ToFloat(tempdata[3]), ToFloat(tempdata[4]));
1854                 Ogre::Vector3 max = Ogre::Vector3(ToFloat(tempdata[5]), ToFloat(tempdata[6]), ToFloat(tempdata[7]));
1855                 StoreCommand(floor->AddTrigger(tempdata[0], tempdata[1], min, max, action_array));
1856                 return sNextLine;
1857         }
1858
1859         //AddShaftTrigger command
1860         /*if (linecheck.substr(0, 15) == "addshafttrigger")
1861         {
1862                 //get data
1863                 int params = SplitData(LineData, 16);
1864
1865                 if (params < 10)
1866                         return ScriptError("Incorrect number of parameters");
1867
1868                 //check numeric values
1869                 for (int i = 0; i <= 8; i++)
1870                 {
1871                         if (i == 1)
1872                                 i = 3;
1873                         if (!IsNumeric(tempdata[i]))
1874                                 return ScriptError("Invalid value: " + tempdata[i]);
1875                 }
1876
1877                 std::vector<std::string> action_array;
1878
1879                 //get number of action & texture parameters
1880                 for (int i = 9; i < params; i++)
1881                         action_array.push_back(tempdata[i]);
1882
1883                 //check to see if file exists
1884                 parent->CheckFile("data/" + tempdata[1]);
1885
1886                 //stop here if in Check mode
1887                 if (config->CheckScript == true)
1888                         return sNextLine;
1889
1890                 Ogre::Vector3 min = Ogre::Vector3(ToFloat(tempdata[3]), ToFloat(tempdata[4]), ToFloat(tempdata[5]));
1891                 Ogre::Vector3 max = Ogre::Vector3(ToFloat(tempdata[6]), ToFloat(tempdata[7]), ToFloat(tempdata[8]));
1892                 if (Simcore->GetShaft(ToInt(tempdata[0])))
1893                         StoreCommand(Simcore->GetShaft(ToInt(tempdata[0]))->AddTrigger(Current, tempdata[1], tempdata[2], min, max, action_array));
1894                 else
1895                         return ScriptError("Invalid shaft");
1896                 return sNextLine;
1897         }
1898
1899         //AddStairsTrigger command
1900         if (linecheck.substr(0, 15) == "addstairstrigger")
1901         {
1902                 //get data
1903                 int params = SplitData(LineData, 16);
1904
1905                 if (params < 10)
1906                         return ScriptError("Incorrect number of parameters");
1907
1908                 //check numeric values
1909                 for (int i = 0; i <= 8; i++)
1910                 {
1911                         if (i == 1)
1912                                 i = 3;
1913                         if (!IsNumeric(tempdata[i]))
1914                                 return ScriptError("Invalid value: " + tempdata[i]);
1915                 }
1916
1917                 std::vector<std::string> action_array;
1918
1919                 //get number of action & texture parameters
1920                 for (int i = 9; i < params; i++)
1921                         action_array.push_back(tempdata[i]);
1922
1923                 //check to see if file exists
1924                 parent->CheckFile("data/" + tempdata[1]);
1925
1926                 //stop here if in Check mode
1927                 if (config->CheckScript == true)
1928                         return sNextLine;
1929
1930                 Ogre::Vector3 min = Ogre::Vector3(ToFloat(tempdata[3]), ToFloat(tempdata[4]), ToFloat(tempdata[5]));
1931                 Ogre::Vector3 max = Ogre::Vector3(ToFloat(tempdata[6]), ToFloat(tempdata[7]), ToFloat(tempdata[8]));
1932                 if (Simcore->GetStairs(ToInt(tempdata[0])))
1933                         StoreCommand(Simcore->GetStairs(ToInt(tempdata[0]))->AddTrigger(Current, tempdata[1], tempdata[2], min, max, action_array));
1934                 else
1935                         return ScriptError("Invalid stairwell");
1936                 return sNextLine;
1937         }*/
1938
1939         //AddCameraTexture command
1940         if (linecheck.substr(0, 16) == "addcameratexture")
1941         {
1942                 //get data
1943                 int params = SplitData(LineData, 17);
1944
1945                 if (params != 11)
1946                         return ScriptError("Incorrect number of parameters");
1947
1948                 //check numeric values
1949                 for (int i = 2; i <= 10; i++)
1950                 {
1951                         if (i == 7)
1952                                 i++;
1953
1954                         if (!IsNumeric(tempdata[i]))
1955                                 return ScriptError("Invalid value: " + tempdata[i]);
1956                 }
1957
1958                 //stop here if in Check mode
1959                 if (config->CheckScript == true)
1960                         return sNextLine;
1961
1962                 StoreCommand(floor->AddCameraTexture(tempdata[0], ToBool(tempdata[1]), ToInt(tempdata[2]), ToFloat(tempdata[3]), Ogre::Vector3(ToFloat(tempdata[4]), ToFloat(tempdata[5]), ToFloat(tempdata[6])), ToBool(tempdata[7]), Ogre::Vector3(ToFloat(tempdata[8]), ToFloat(tempdata[9]), ToFloat(tempdata[10]))));
1963                 return sNextLine;
1964         }
1965
1966         //Cut command
1967         if (linecheck.substr(0, 4) == "cut ")
1968         {
1969                 //get data
1970                 int params = SplitData(LineData, 4);
1971
1972                 if (params != 8)
1973                         return ScriptError("Incorrect number of parameters");
1974
1975                 //check numeric values
1976                 for (int i = 0; i <= 5; i++)
1977                 {
1978                         if (!IsNumeric(tempdata[i]))
1979                                 return ScriptError("Invalid value: " + tempdata[i]);
1980                 }
1981
1982                 //stop here if in Check mode
1983                 if (config->CheckScript == true)
1984                         return sNextLine;
1985
1986                 //perform cut on floor
1987                 floor->Cut(Ogre::Vector3(ToFloat(tempdata[0]), ToFloat(tempdata[1]), ToFloat(tempdata[2])), Ogre::Vector3(ToFloat(tempdata[3]), ToFloat(tempdata[4]), ToFloat(tempdata[5])), ToBool(tempdata[6]), ToBool(tempdata[7]), false);
1988                 return sNextLine;
1989         }
1990
1991         //CutAll command
1992         if (linecheck.substr(0, 6) == "cutall")
1993         {
1994                 //get data
1995                 int params = SplitData(LineData, 7);
1996
1997                 if (params != 8)
1998                         return ScriptError("Incorrect number of parameters");
1999
2000                 //check numeric values
2001                 for (int i = 0; i <= 5; i++)
2002                 {
2003                         if (!IsNumeric(tempdata[i]))
2004                                 return ScriptError("Invalid value: " + tempdata[i]);
2005                 }
2006
2007                 //stop here if in Check mode
2008                 if (config->CheckScript == true)
2009                         return sNextLine;
2010
2011                 //perform cut on all objects related to the current floor
2012                 floor->CutAll(Ogre::Vector3(ToFloat(tempdata[0]), ToFloat(tempdata[1]), ToFloat(tempdata[2])), Ogre::Vector3(ToFloat(tempdata[3]), ToFloat(tempdata[4]), ToFloat(tempdata[5])), ToBool(tempdata[6]), ToBool(tempdata[7]));
2013                 return sNextLine;
2014         }
2015
2016         //AddRevolvingDoor command
2017         if (linecheck.substr(0, 17) == "addrevolvingdoor ")
2018         {
2019                 //get data
2020                 int params = SplitData(LineData, 17);
2021
2022                 if (params != 15)
2023                         return ScriptError("Incorrect number of parameters");
2024
2025                 //check numeric values
2026                 for (int i = 2; i <= 13; i++)
2027                 {
2028                         if (i == 3)
2029                                 i++;
2030
2031                         if (!IsNumeric(tempdata[i]))
2032                                 return ScriptError("Invalid value: " + tempdata[i]);
2033                 }
2034
2035                 //check to see if file exists
2036                 parent->CheckFile("data/" + tempdata[0]);
2037
2038                 //stop here if in Check mode
2039                 if (config->CheckScript == true)
2040                         return sNextLine;
2041
2042                 //create door
2043                 RevolvingDoor* door = floor->AddRevolvingDoor(tempdata[0], tempdata[1], ToFloat(tempdata[2]), ToBool(tempdata[3]), ToInt(tempdata[4]), ToFloat(tempdata[5]), ToFloat(tempdata[6]), ToFloat(tempdata[7]), ToFloat(tempdata[8]), ToFloat(tempdata[9]), ToFloat(tempdata[10]), ToFloat(tempdata[11]), ToFloat(tempdata[12]), ToFloat(tempdata[13]), ToBool(tempdata[14]));
2044
2045                 if (door)
2046                 {
2047                         if (config->lockvalue == 0)
2048                                 door->SetLocked(false, config->keyvalue);
2049                         else
2050                                 door->SetLocked(true, config->keyvalue);
2051                 }
2052
2053                 StoreCommand(door);
2054                 return sNextLine;
2055         }
2056
2057         //AddEscalator command
2058         if (linecheck.substr(0, 13) == "addescalator ")
2059         {
2060                 //get data
2061                 int params = SplitData(LineData, 13);
2062
2063                 if (params != 15)
2064                         return ScriptError("Incorrect number of parameters");
2065
2066                 //check numeric values
2067                 for (int i = 1; i <= 14; i++)
2068                 {
2069                         if (i == 2)
2070                                 i = 6; //skip non-numeric parameters
2071                         if (!IsNumeric(tempdata[i]))
2072                                 return ScriptError("Invalid value: " + tempdata[i]);
2073                 }
2074
2075                 //create escalator
2076
2077                 //stop here if in Check mode
2078                 if (config->CheckScript == true)
2079                         return sNextLine;
2080
2081                 StoreCommand(floor->AddEscalator(tempdata[0], ToInt(tempdata[1]), ToFloat(tempdata[2]), tempdata[3], tempdata[4], tempdata[5], ToFloat(tempdata[6]), ToFloat(tempdata[7]), ToFloat(tempdata[8]), ToFloat(tempdata[9]), ToFloat(tempdata[10]), ToInt(tempdata[11]), ToFloat(tempdata[12]), ToFloat(tempdata[13]), ToFloat(tempdata[14])));
2082
2083                 return sNextLine;
2084         }
2085
2086         //handle end of floor section
2087         if (linecheck == "<endfloor>" && config->RangeL == config->RangeH)
2088         {
2089                 //when finishing a floor, make sure the altitude is valid
2090                 if (floor->AltitudeSet == false)
2091                         return ScriptError("Floor altitude or height has not been set");
2092
2093                 config->SectionNum = 0;
2094                 config->Context = "None";
2095                 engine->Report("Finished floor");
2096                 return sNextLine;
2097         }
2098
2099         //handle floor range
2100         if (config->RangeL != config->RangeH && linecheck.substr(0, 9) == "<endfloor")
2101         {
2102                 //when finishing a floor, make sure the altitude is valid
2103                 if (floor->AltitudeSet == false)
2104                         return ScriptError("Floor altitude is invalid");
2105
2106                 if (config->RangeL < config->RangeH)
2107                 {
2108                         if (config->Current < config->RangeH)
2109                         {
2110                                 config->Current++;
2111                                 parent->line = config->RangeStart;  //loop back
2112                                 return sNextLine;
2113                         }
2114                         else
2115                         {
2116                                 config->SectionNum = 0; //break out of loop
2117                                 config->Context = "None";
2118                                 config->RangeL = 0;
2119                                 config->RangeH = 0;
2120                                 engine->Report("Finished floors");
2121                                 return sNextLine;
2122                         }
2123                 }
2124                 else
2125                 {
2126                         if (config->Current > config->RangeH)
2127                         {
2128                                 config->Current--;
2129                                 parent->line = config->RangeStart; //loop back
2130                                 return sNextLine;
2131                         }
2132                         else
2133                         {
2134                                 config->SectionNum = 0; //break out of loop
2135                                 config->Context = "None";
2136                                 config->RangeL = 0;
2137                                 config->RangeH = 0;
2138                                 engine->Report("Finished floors");
2139                                 return sNextLine;
2140                         }
2141                 }
2142         }
2143
2144         return sContinue;
2145 }
2146
2147 }