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