fix compile against newer giflib
[rofl0r-obeditor.git] / src / common__object_stage.cpp
blob6c56a0e788ca09d38be01bc537ccf77f1a258193
1 /*
2 * object_game.cpp
4 * Created on: 24 avr. 2009
5 * Author: pat
6 */
8 #include "wx/wxprec.h"
9 #ifndef WX_PRECOMP
10 #include "wx/wx.h"
11 #endif
13 #include <map>
15 #include "common__tools.h"
16 #include "common__object_stage.h"
19 using namespace std;
21 /*\internal*********************************************
22 ******** OBJECT RELATED TO THE STAGE FILES
23 ******************************************************/
25 //**********************************************
26 //**********************************************
27 //**********************************************
28 /**
29 * The object which hold the datas about a stage of a game
33 * STAGE FILE ORGANISATION
34 * - HEADERS
35 * - Background layer
36 * - Front layer
37 * - Panels
38 * - Walls/Holes
39 * - Spawns
42 wxString stageHeaderTags[] = {
43 wxT("loadingbg"),
44 wxT("music"),
45 wxT("allowselect"),
46 wxT("direction"),
47 wxT("facing"),
48 wxT("rock"),
49 wxT("bgspeed"),
50 wxT("mirror"),
51 wxT("bossmusic"),
52 wxT("settime"),
53 wxT("setweap"),
54 wxT("notime"),
55 wxT("noreset"),
56 wxT("noslow"),
57 wxT("type"),
58 wxT("nohit"),
59 wxT("gravity"),
60 wxT("maxfallspeed"),
61 wxT("maxtossspeed"),
62 wxT("cameratype"),
63 wxT("stagenumber"),
64 wxT("palette"),
65 wxT("updatescript"),
66 wxT("updatedscript"),
67 wxT("keyscript"),
68 wxT("levelscript"),
69 wxT("endlevelscript"),
70 wxT("blocked"),
71 wxT("endhole")
75 bool ob_stage::IsHeaderTag( const wxString& _name )
77 for( size_t i =0; i< t_size_of(stageHeaderTags); i++ )
79 if( _name.Upper() == stageHeaderTags[i].Upper() )
80 return true;
82 return false;
86 //**********************************************
88 int stage_at_types[] = {
89 OB_TYPE_STAGE_AT,
92 bool ob_stage::Is_Stage_At_Type( ob_object* _obj )
94 if( ob_stage::Is_Stage_Spawn_Type( _obj ) )
95 return true;
97 for( size_t i =0; i< t_size_of(stage_at_types); i++ )
99 if( _obj->type == stage_at_types[i] )
100 return true;
102 return false;
106 int stage_spawn_types[] = {
107 OB_TYPE_SPAWN,
108 OB_TYPE_SPAWN_HEALTHY,
109 OB_TYPE_SPAWN_ITEM,
112 bool ob_stage::Is_Stage_Spawn_Type( ob_object* _obj )
114 for( size_t i =0; i< t_size_of(stage_spawn_types); i++ )
116 if( _obj->type == stage_spawn_types[i] )
117 return true;
119 return false;
124 //**********************************************
126 ob_stage::ob_stage()
127 :ob_object_container()
129 type = OB_TYPE_STAGE;
130 direction = STAGE_RIGHT;
133 //-----------------------------------------------------------------
134 void
135 ob_stage::pClone(ob_object*& res )
137 if( res == NULL )
138 res = new ob_stage();
139 ob_object_container::pClone( res );
140 ((ob_stage*)res)->direction = direction;
143 //**********************************************
145 ob_stage::~ob_stage()
149 //---------------------------------------------------------------------
150 bool
151 ob_stage::Add_SubObj( ob_object* temp )
153 if( ob_object_container::Add_SubObj( temp ) == true )
155 if( temp->name.Upper() == wxT("DIRECTION") )
156 Direction_ComputeAndCache();
157 return true;
159 return false;
163 //---------------------------------------------------------------------
164 int
165 ob_stage::Direction_ComputeAndCache()
167 wxString str_dir = GetSubObject_Token( wxT("direction"), 0 ).Upper();
169 if( str_dir == wxString() || str_dir == wxT("RIGHT")
170 ||str_dir == wxT("BOTH") || str_dir == wxT("RIGHTLEFT")
172 direction = STAGE_RIGHT;
174 else if( str_dir == wxT("LEFT") || str_dir == wxT("LEFTRIGHT") )
175 direction = STAGE_LEFT;
177 else if( str_dir == wxT("UP") )
178 direction = STAGE_UP;
180 else if( str_dir == wxT("DOWN") )
181 direction = STAGE_DOWN;
183 else if( str_dir == wxT("IN") || str_dir == wxT("INOUT") )
184 direction = STAGE_IN;
186 else if( str_dir == wxT("OUT") || str_dir == wxT("OUTIN") )
187 direction = STAGE_OUT;
188 else
189 direction = STAGE_RIGHT;
190 return direction;
194 //---------------------------------------------------------------------
195 wxSize
196 ob_stage::GetDefScrollzBounds( ob_object* st_declar )
198 if( st_declar == NULL )
199 return wxSize(0,0);
201 if( direction == STAGE_IN || direction == STAGE_OUT )
202 return wxSize(0,0);
204 return ((ob_StageDeclaration*)st_declar)->GetDefScrollzBounds();
207 //**********************************************
208 ob_stage_panel**
209 ob_stage::Get_Panels( size_t& nb_panels )
211 nb_panels = 0;
213 // Get the panels order
214 wxString curr_order = Get_Panels_Order();
216 if( curr_order.Len() == 0 )
217 return NULL;
219 // Get the panels refs
220 size_t nb_unik_panels = 0;
221 ob_stage_panel** oPanels = (ob_stage_panel**)
222 GetSubObjectS_ofType( OB_TYPE_STAGE_PANEL, nb_unik_panels );
223 if( nb_unik_panels == 0 )
224 return NULL;
226 int tay_panels_map = curr_order.Len();
227 ob_stage_panel** res = new ob_stage_panel*[tay_panels_map];
230 for( int i = 0; i < tay_panels_map; i++ )
232 if( curr_order[i] < 'a' || curr_order[i] >= 'a' + tay_panels_map )
233 continue;
234 res[nb_panels] = oPanels[curr_order[i] - 'a'];
235 nb_panels++;
238 delete[] oPanels;
239 return res;
242 //**********************************************
243 ob_object*
244 ob_stage::Get_LastHeaderObj()
246 ob_object * t = first_subobj;
248 // Get the first one
249 bool b_found = false;
250 while( ! b_found )
252 if( IsHeaderTag(t->name ) )
253 b_found = true;
254 t = t->next;
257 // Get the last one
258 while( t != NULL )
260 if( ! IsHeaderTag(t->name ) && ! t->Is_EmptyOrComment() )
261 return t->prev;
262 t = t->next;
264 return NULL;
268 //**********************************************
270 ob_object* ob_stage::Get_First_AT_Obj()
272 ob_object * t = first_subobj;
273 while( t != NULL )
275 if( ! ob_stage::Is_Stage_At_Type( t ) )
276 break;
277 t = t->next;
279 return t;
282 //---------------------------------------------------------------------
283 list<ob_stage_object*>*
284 ob_stage::Get_SubObj_With_StageType( const int stage_type )
286 list<ob_stage_object*>* res = new list<ob_stage_object*>;
288 size_t tot_subobj_count;
289 ob_object** arr_subobj = GetAllSubObjS( tot_subobj_count );
290 if( arr_subobj == NULL )
291 return res;
293 for( size_t i = 0; i < tot_subobj_count; i++ )
295 if( arr_subobj[i]->Is_Ob_Stage_Object() == true )
297 ob_stage_object* t = (ob_stage_object*) arr_subobj[i];
298 if( t->object_type == stage_type )
299 res->push_back( t );
302 return res;
305 //---------------------------------------------------------------------
306 wxString
307 ob_stage::Get_Panels_Order()
309 wxString res = wxString();
310 size_t nb_orders;
311 ob_object** orders = GetSubObjectS( wxT("order"),nb_orders );
312 if( orders == NULL )
313 return res;
314 else
315 for( size_t i = 0; i < nb_orders; i++ )
316 res += orders[i]->GetToken( 0 );
318 delete[] orders;
319 return res;
323 //**********************************************
325 bool ob_stage::Add_SubObj_Header( ob_object* _obj, bool b_after )
327 ob_object* t = Get_LastHeaderObj();
328 // No non header tag in the object
329 if( t == NULL )
330 return Prepend_SubObj( _obj );
331 else
333 if( b_after )
334 return t->InsertObject_After( _obj );
335 else
336 return t->InsertObject_Before( _obj );
341 //**********************************************
343 // BGS
346 bool ob_stage::Add_SubObj_BGs( ob_object* _obj, bool b_after )
348 size_t nb;
349 ob_object** l_obj = GetSubObjectS_ofType( OB_TYPE_BG_LAYER, nb );
351 if( nb == 0 )
352 return Add_SubObj_Header( _obj, true );
353 else
355 ob_object* t;
356 if( b_after )
358 t = l_obj[nb-1];
359 delete[] l_obj;
360 return t->InsertObject_After( _obj );
362 else
364 t = l_obj[0];
365 delete[] l_obj;
366 return t->InsertObject_Before( _obj );
373 //**********************************************
375 bool ob_stage::Add_SubObj_FrontLayer( ob_object* _obj, bool b_after )
377 size_t nb;
378 ob_object** l_obj = GetSubObjectS_ofType( OB_TYPE_FRONT_PANEL, nb );
380 if( nb == 0 )
382 return Add_SubObj_BGs( _obj, true );
384 else
386 ob_object* t;
387 if( b_after )
389 t = l_obj[nb-1];
390 delete[] l_obj;
391 return t->InsertObject_After( _obj );
393 else
395 t = l_obj[0];
396 delete[] l_obj;
397 return t->InsertObject_Before( _obj );
403 //**********************************************
405 bool ob_stage::Add_SubObj_Panel( ob_object* _obj, bool b_after )
407 size_t nb;
408 ob_object** l_obj = GetSubObjectS_ofType( OB_TYPE_STAGE_PANEL, nb );
410 if( nb == 0 )
412 return Add_SubObj_FrontLayer( _obj, true );
414 else
416 ob_object* t;
417 if( b_after )
419 t = l_obj[nb-1];
420 delete[] l_obj;
421 if( t->next->name.Upper() == wxT("ORDER") && _obj->type != OB_TYPE_STAGE_PANEL )
422 t = t->next;
424 return t->InsertObject_After( _obj );
426 else
428 t = l_obj[0];
429 delete[] l_obj;
430 if( t->prev->name.Upper() == wxT("ORDER") && _obj->type != OB_TYPE_STAGE_PANEL )
431 t = t->prev;
432 return t->InsertObject_Before( _obj );
438 //**********************************************
440 bool ob_stage::Add_SubObj_WallHole( ob_object* _obj, bool b_after )
442 size_t nb;
443 ob_object** l_obj;
444 ob_object* t;
446 if( b_after )
448 l_obj = GetSubObjectS_ofType( OB_TYPE_WALL, nb );
449 if( nb > 0 )
451 t = l_obj[nb-1];
452 delete[] l_obj;
453 return t->InsertObject_After( _obj );
457 l_obj = GetSubObjectS_ofType( OB_TYPE_HOLE, nb );
458 if( nb > 0 )
460 if( b_after )
462 t = l_obj[nb-1];
463 delete[] l_obj;
464 return t->InsertObject_After( _obj );
466 else
468 t = l_obj[0];
469 delete[] l_obj;
470 return t->InsertObject_Before( _obj );
474 else
476 return Add_SubObj_Panel( _obj, true );
481 //**********************************************
482 bool
483 ob_stage::Add_SubObj_AT( ob_object* _obj, bool b_after )
485 if( b_after )
486 return Add_SubObj( _obj );
488 ob_object* t = Get_First_AT_Obj();
489 if( t == NULL )
490 return Add_SubObj_WallHole( _obj, true );
491 else
492 return t->InsertObject_Before( _obj );
495 //----------------------------------------------------------------
496 bool
497 ob_stage::Insert_SubObj_AT( ob_object* _obj )
499 ob_object* t = Get_First_AT_Obj();
500 if( t == NULL )
501 return Add_SubObj_WallHole( _obj, true );
502 if( t->InsertObject_Before( _obj ) == false )
503 return false;
505 ((ob_stage_at*)_obj)->Reorder_At();
506 return true;
510 //**********************************************
511 bool
512 ob_stage::Add_SubObj( ob_object* _obj, bool b_sort_at )
514 // Add a header tag
515 if( IsHeaderTag(_obj->name ) )
516 return Add_SubObj_Header( _obj );
519 // Add a background layer
520 else if( _obj->name.Upper() == wxT("BACKGROUND") || _obj->name.Upper() == wxT("BGLAYER")
521 || _obj->type == OB_TYPE_BG_LAYER
524 return Add_SubObj_BGs( _obj );
527 // Add a front panel object
528 else if( _obj->name.Upper() == wxT("FRONTPANEL") || _obj->type == OB_TYPE_FRONT_PANEL )
530 return Add_SubObj_FrontLayer( _obj );
533 // Add a panel object
534 else if( _obj->name.Upper() == wxT("PANEL") || _obj->type == OB_TYPE_STAGE_PANEL
535 || _obj->name.Upper() == wxT("ORDER") )
537 return Add_SubObj_Panel( _obj );
540 // Add a Wall/Hole object
541 else if( _obj->name.Upper() == wxT("WALL") || _obj->type == OB_TYPE_WALL
542 || _obj->name.Upper() == wxT("HOLE") || _obj->type == OB_TYPE_HOLE )
544 return Add_SubObj_WallHole( _obj );
547 else if( ob_stage::Is_Stage_At_Type( _obj ))
549 if( b_sort_at == false )
550 return Add_SubObj_AT( _obj );
551 else
552 return Insert_SubObj_AT( _obj );
555 else
557 ObjectsLog( MYLOG_WARNING, -1,
558 wxT("ob_stage::Add_SubObj : Unknown object type : ") + _obj->name );
559 return Add_SubObj_Header( _obj );
566 //**********************************************
568 ob_object* ob_stage::Guess_and_ConstructNewObject(MyLine* line, const int _num_line )
570 // if Empty Line
571 if( line == NULL || line->GetTokensCount() <= 0 )
572 return new ob_object(line, _num_line);
574 wxString _name = *(line->GetToken(0)->data);
575 wxString _token;
576 if( line->GetToken(1) != NULL && line->GetToken(1)->data != NULL )
577 _token = *( line->GetToken(1)->data );
579 ob_object *temp;
582 if( _name.Upper() == wxT("BACKGROUND") || _name.Upper() == wxT("BGLAYER") )
583 temp = new ob_BG_Layer(line,_num_line);
585 else if( _name.Upper() == wxT("FRONTPANEL") )
586 temp = new ob_front_panel(line,_num_line);
588 else if( _name.Upper() == wxT("PANEL") )
589 temp = new ob_stage_panel(line,_num_line);
591 else if( _name.Upper() == wxT("HOLE") )
592 temp = new ob_hole(line,_num_line);
594 else if( _name.Upper() == wxT("WALL") )
595 temp = new ob_wall(line,_num_line);
597 else if( ob_player_spawn::Get_StageObjectType(_name) != STAGETYPE_NONE )
598 temp = new ob_player_spawn(line,_num_line);
600 else if( ob_stage_at::Get_StageObjectType( _name ) != STAGETYPE_NONE )
601 temp = new ob_stage_at(line,_num_line);
603 else if( ob_spawn::Get_StageObjectType( _name, _token ) != STAGETYPE_NONE )
604 temp = new ob_spawn(line,_num_line);
606 else if(ob_spawn_healthy::Get_StageObjectType(_name, _token) != STAGETYPE_NONE )
607 temp = new ob_spawn_healthy(line,_num_line);
609 else if( ob_spawn_item::Get_StageObjectType( _name, _token ) != STAGETYPE_NONE )
610 temp = new ob_spawn_item(line,_num_line);
612 else
613 temp = new ob_stage_object( line, _num_line);
615 // wxLogInfo( "At line " + IntToStr( _num_line +1) + ", object build :" + temp->name );
616 return temp;
619 //**********************************************
620 ob_object*
621 ob_stage::Guess_and_ConstructNewObject(const wxString& __name, const wxString& token0 )
623 ob_object *temp;
624 wxString _name = __name;
625 wxArrayString _tokens;
626 _tokens.Add( token0 );
628 if( _name.Upper() == wxT("BACKGROUND") || _name.Upper() == wxT("BGLAYER") )
629 temp = new ob_BG_Layer(_name,_tokens);
631 else if( _name.Upper() == wxT("FRONTPANEL") )
632 temp = new ob_front_panel(_name,_tokens);
634 else if( _name.Upper() == wxT("PANEL") )
635 temp = new ob_stage_panel(_name,_tokens);
637 else if( _name.Upper() == wxT("HOLE"))
638 temp = new ob_hole(_name,_tokens);
640 else if( _name.Upper() == wxT("WALL") )
641 temp = new ob_wall(_name,_tokens);
643 else if( ob_player_spawn::Get_StageObjectType(_name) != STAGETYPE_NONE )
644 temp = new ob_player_spawn(_name,_tokens);
646 else if( ob_stage_at::Get_StageObjectType( _name ) != STAGETYPE_NONE )
647 temp = new ob_stage_at(_name,_tokens);
649 else if( ob_spawn::Get_StageObjectType( _name, token0 ) != STAGETYPE_NONE )
650 temp = new ob_spawn(_name,_tokens);
652 else if(ob_spawn_healthy::Get_StageObjectType(_name, token0) != STAGETYPE_NONE )
653 temp = new ob_spawn_healthy(_name,_tokens);
655 else if( ob_spawn_item::Get_StageObjectType( _name, token0 ) != STAGETYPE_NONE )
656 temp = new ob_spawn_item(_name,_tokens);
658 else
659 temp = new ob_stage_object(_name,_tokens);
661 // wxLogInfo( "At line " + IntToStr( _num_line +1) + ", object build :" + temp->name );
662 return temp;
665 //**********************************************
666 //**********************************************
667 //**********************************************
669 * An object holded by a stage object
672 //**********************************************
674 ob_BG_Layer::ob_BG_Layer( MyLine* line, const int num_line )
675 :ob_object( line, num_line ), Image_Holder()
677 type = OB_TYPE_BG_LAYER;
681 //**********************************************
683 ob_BG_Layer::ob_BG_Layer( const wxString& _name, wxArrayString& _tokens)
684 :ob_object( _name, _tokens ), Image_Holder()
686 type = OB_TYPE_BG_LAYER;
690 //-----------------------------------------------------------------
691 void
692 ob_BG_Layer::pClone(ob_object*& res )
694 if( res == NULL )
695 res = new ob_BG_Layer();
696 ob_object::pClone( res );
699 //**********************************************
701 ob_BG_Layer::~ob_BG_Layer()
706 //**********************************************
708 void ob_BG_Layer::Validate()
713 //**********************************************
715 wxString ob_BG_Layer::GetName()
717 wxString path = GetToken( 0 );
718 if( path == wxString() )
719 return wxT("NOFILE");
721 wxFileName fn = GetObFile( path );
722 return fn.GetFullName();
727 //**********************************************
729 wxFileName ob_BG_Layer::GetFileName()
731 return GetObFile( GetToken( 0 ));
735 //**********************************************
736 void
737 ob_BG_Layer::SetToDefault()
739 name = wxT("bglayer");
740 SetAllTokenFromStr( wxT("data 0.5 0.5 0 0 0 0 5000 5000 0 0") );
743 //**********************************************
744 void
745 ob_BG_Layer::FillMissings()
747 size_t i = 0;
748 if( nb_tokens < i+1 )
749 SetToken( i, wxT("data") );
750 i++;
752 if( nb_tokens < i+1 )
753 SetToken( i, wxT("0.5") );
754 i++;
756 if( nb_tokens < i+1 )
757 SetToken( i, wxT("0.5") );
758 i++;
760 if( nb_tokens < i+1 )
761 SetToken( i, wxT("0") );
762 i++;
764 if( nb_tokens < i+1 )
765 SetToken( i, wxT("0") );
766 i++;
768 if( nb_tokens < i+1 )
769 SetToken( i, wxT("0") );
770 i++;
772 if( nb_tokens < i+1 )
773 SetToken( i, wxT("0") );
774 i++;
776 if( nb_tokens < i+1 )
777 SetToken( i, wxT("5000") );
778 i++;
780 if( nb_tokens < i+1 )
781 SetToken( i, wxT("5000") );
782 i++;
784 if( nb_tokens < i+1 )
785 SetToken( i, wxT("0") );
786 i++;
788 if( nb_tokens < i+1 )
789 SetToken( i, wxT("0") );
790 i++;
793 //------------------------------------------------------------
794 int
795 ob_BG_Layer::Get_RepeatingVal( int direction )
797 wxString res;
798 switch( direction )
800 case STAGE_RIGHT:
801 case STAGE_LEFT:
802 res = GetToken( 7 );
803 break;
804 case STAGE_UP:
805 case STAGE_DOWN:
806 case STAGE_IN:
807 case STAGE_OUT:
808 res = GetToken( 8 );
809 break;
811 if( res == wxString() )
812 res = wxT("5000");
813 return StrToInt( res );
816 //**********************************************
817 bool
818 ob_BG_Layer::Update_With( ob_BG_Layer* oLay )
820 if( oLay == NULL )
821 return false;
823 bool b_res = false;
824 ob_BG_Layer* t0 = (ob_BG_Layer*) this->Clone();
825 ob_BG_Layer* t1 = (ob_BG_Layer*) oLay->Clone();
827 t0->FillMissings();
828 t1->FillMissings();
830 if( t0->arr_token_size != t1->arr_token_size )
831 b_res = true;
832 else
834 for( size_t i = 0; i < t0->arr_token_size; i++ )
835 if( t0->GetToken( i ) != t1->GetToken( i ) )
837 b_res = true;
838 break;
842 delete t0;
843 delete t1;
845 if( b_res == true )
846 SetData( oLay );
848 return b_res;
852 //**********************************************
853 //**********************************************
854 //**********************************************
856 * The object which hold the datas about a stage of a game
859 //**********************************************
861 ob_front_panel::ob_front_panel( MyLine* line, const int num_line )
862 :ob_object( line, num_line ), Image_Holder()
864 type = OB_TYPE_FRONT_PANEL;
868 //**********************************************
870 ob_front_panel::ob_front_panel( const wxString& _name, wxArrayString& _tokens)
871 :ob_object( _name, _tokens ), Image_Holder()
873 type = OB_TYPE_FRONT_PANEL;
877 //-----------------------------------------------------------------
878 void
879 ob_front_panel::pClone(ob_object*& res )
881 if( res == NULL )
882 res = new ob_front_panel();
883 ob_object::pClone( res );
886 //**********************************************
888 ob_front_panel::~ob_front_panel()
893 //**********************************************
895 void ob_front_panel::Validate()
900 //**********************************************
902 wxFileName ob_front_panel::GetFileName()
904 return GetObFile( GetToken( 0 ));
907 //**********************************************
908 wxString
909 ob_front_panel::GetName()
911 wxString path = GetToken( 0 );
912 if( path == wxString() )
913 return wxT("NOFILE");
915 wxFileName fn = GetObFile( path );
916 return fn.GetFullName();
920 //**********************************************
921 bool
922 ob_front_panel::Update_With( ob_front_panel* oPan )
924 if( oPan == NULL )
925 return false;
927 if( oPan->GetToken( 0 ) != this->GetToken( 0 ) )
929 SetToken( 0, oPan->GetToken( 0 ) );
930 return true;
933 return false;
937 //**********************************************
938 //**********************************************
939 //**********************************************
941 * The object which hold the datas about a stage of a game
944 //**********************************************
946 ob_stage_panel::ob_stage_panel( MyLine* line, const int num_line )
947 :ob_object( line, num_line ), Image_Holder()
949 type = OB_TYPE_STAGE_PANEL;
953 //**********************************************
955 ob_stage_panel::ob_stage_panel( const wxString& _name, wxArrayString& _tokens)
956 :ob_object( _name, _tokens ), Image_Holder()
958 type = OB_TYPE_STAGE_PANEL;
962 //-----------------------------------------------------------------
963 void
964 ob_stage_panel::pClone(ob_object*& res )
966 if( res == NULL )
967 res = new ob_stage_panel();
968 ob_object::pClone( res );
971 //**********************************************
973 ob_stage_panel::~ob_stage_panel()
978 //**********************************************
980 void ob_stage_panel::Validate()
985 //**********************************************
987 wxString ob_stage_panel::GetName()
989 wxString path = GetToken( 0 );
990 if( path == wxString() )
991 return wxT("NOFILE");
993 wxFileName fn = GetObFile( path );
994 return fn.GetFullName();
998 //**********************************************
1000 void ob_stage_panel::SetToDefault()
1002 name = wxT("panel");
1003 SetToken( 0, wxT("none" ));
1004 SetToken( 1, wxT("none" ));
1005 SetToken( 2, wxT("none" ));
1009 //**********************************************
1011 wxFileName ob_stage_panel::GetFileName()
1013 wxString ob_path = GetToken( 0 );
1014 if( ob_path == wxString() )
1015 return wxFileName();
1017 return GetObFile( ob_path );
1021 //**********************************************
1022 //**********************************************
1023 //**********************************************
1025 * An object holded by a stage object
1028 ob_stage_object::ob_stage_object( MyLine* line, const int num_line )
1029 :ob_object( line, num_line )
1031 type = OB_STAGE_OBJECT;
1032 object_type = STAGETYPE_NONE;
1036 //**********************************************
1038 ob_stage_object::ob_stage_object(const wxString& _name, wxArrayString& _tokens)
1039 :ob_object( _name, _tokens )
1041 type = OB_STAGE_OBJECT;
1042 object_type = STAGETYPE_NONE;
1046 //-----------------------------------------------------------------
1047 void
1048 ob_stage_object::pClone(ob_object*& res )
1050 if( res == NULL )
1051 res = new ob_stage_object();
1052 ob_object::pClone( res );
1053 ((ob_stage_object*)res)->object_type = object_type;
1056 //**********************************************
1058 ob_stage_object::~ob_stage_object()
1063 //**********************************************
1065 void ob_stage_object::Validate()
1070 //**********************************************
1071 wxString
1072 ob_stage_object::ToStr()
1074 /* wxString t = "++++++++++++++++\n";
1075 t += ob_object::ToStr();
1076 t += "--------------\n";
1077 return t;
1079 return ob_object::ToStr();
1082 //-------------------------------------------------------------
1083 bool
1084 ob_stage_object::Get_Coords(int& x, int& y)
1086 x = -1;
1087 y = -1;
1088 return false;
1091 //-------------------------------------------------------------
1092 // used for object which use coords for screen name
1093 wxString
1094 ob_stage_object::CoordsToStr()
1096 int x,y;
1097 if( Get_Coords(x,y) == false )
1098 return wxT("NO Coords");
1099 return IntToStr(x) + wxT(" , ") + IntToStr(y);
1103 //-------------------------------------------------------------
1104 void
1105 ob_stage_object::Coords_Decal( const wxSize& _decal )
1107 return;
1110 //-------------------------------------------------------------
1111 void
1112 ob_stage_object::Init_and_Center( wxSize& _here )
1114 return;
1118 //**********************************************
1119 //**********************************************
1120 //**********************************************
1122 * A Wall
1125 //**********************************************
1127 ob_wall::ob_wall( MyLine* line, const int num_line )
1128 :ob_stage_object( line, num_line )
1130 type = OB_TYPE_WALL;
1131 object_type = SOBJ_WALL;
1135 //**********************************************
1137 ob_wall::ob_wall(const wxString& _name, wxArrayString& _tokens)
1138 :ob_stage_object( _name, _tokens )
1140 type = OB_TYPE_WALL;
1141 object_type = SOBJ_WALL;
1145 //-----------------------------------------------------------------
1146 void
1147 ob_wall::pClone(ob_object*& res )
1149 if( res == NULL )
1150 res = new ob_wall();
1151 ob_stage_object::pClone( res );
1154 //**********************************************
1156 ob_wall::~ob_wall()
1161 //**********************************************
1162 void
1163 ob_wall::Validate()
1168 //-------------------------------------------------------------
1169 bool
1170 ob_wall::Get_Coords(int& x, int& y)
1172 x = -1;
1173 y = -1;
1174 wxString t;
1175 t = GetToken( 0 );
1176 if( t == wxString() )
1177 return false;
1178 x = StrToInt( t );
1180 t = GetToken( 1 );
1181 if( t == wxString() )
1182 return false;
1183 y = StrToInt( t );
1185 return true;
1188 //-------------------------------------------------------------
1189 void
1190 ob_wall::Coords_Decal( const wxSize& _decal )
1192 int x = StrToInt( GetToken(0));
1193 int z = StrToInt( GetToken(1));
1194 SetToken(0, IntToStr( x + _decal.x ));
1195 SetToken(1, IntToStr( z + _decal.y ));
1198 //-------------------------------------------------------------
1199 void
1200 ob_wall::Init_and_Center( wxSize& _here )
1202 SetToken(0,wxT("0")); //X
1203 SetToken(1,wxT("0")); //Z
1204 SetToken(2,wxT("10"));//ul
1205 SetToken(3,wxT("0"));//ll
1206 SetToken(4,wxT("40"));//ur
1207 SetToken(5,wxT("30"));//lr
1208 SetToken(6,wxT("30"));//depth
1209 SetToken(7,wxT("20"));//alt
1211 SetToken(0,IntToStr(_here.x - 20) ); //X
1212 SetToken(1,IntToStr(_here.y + 25) ); //Z
1217 //**********************************************
1218 //**********************************************
1219 //**********************************************
1221 * A Hole
1223 //**********************************************
1225 ob_hole::ob_hole( MyLine* line, const int num_line )
1226 :ob_stage_object( line, num_line )
1228 type = OB_TYPE_HOLE;
1229 object_type = SOBJ_HOLE;
1233 //**********************************************
1235 ob_hole::ob_hole(const wxString& _name, wxArrayString& _tokens)
1236 :ob_stage_object( _name, _tokens )
1238 type = OB_TYPE_HOLE;
1239 object_type = SOBJ_HOLE;
1243 //-----------------------------------------------------------------
1244 void
1245 ob_hole::pClone(ob_object*& res )
1247 if( res == NULL )
1248 res = new ob_hole();
1249 ob_stage_object::pClone( res );
1252 //**********************************************
1254 ob_hole::~ob_hole()
1259 //-------------------------------------------------------------
1260 void
1261 ob_hole::Validate()
1265 //-------------------------------------------------------------
1266 bool
1267 ob_hole::Get_Coords(int& x, int& y)
1269 x = -1;
1270 y = -1;
1271 wxString t;
1272 t = GetToken( 0 );
1273 if( t == wxString() )
1274 return false;
1275 x = StrToInt( t );
1277 t = GetToken( 1 );
1278 if( t == wxString() )
1279 return false;
1280 y = StrToInt( t );
1282 return true;
1285 //-------------------------------------------------------------
1286 void
1287 ob_hole::Coords_Decal( const wxSize& _decal )
1289 int x = StrToInt( GetToken(0));
1290 int z = StrToInt( GetToken(1));
1291 SetToken(0, IntToStr( x + _decal.x ));
1292 SetToken(1, IntToStr( z + _decal.y ));
1295 //-------------------------------------------------------------
1296 void
1297 ob_hole::Init_and_Center( wxSize& _here )
1299 SetToken(0,wxT("0")); //X
1300 SetToken(1,wxT("0")); //Z
1301 SetToken(2,wxT("10"));//ul
1302 SetToken(3,wxT("0"));//ll
1303 SetToken(4,wxT("40"));//ur
1304 SetToken(5,wxT("30"));//lr
1305 SetToken(6,wxT("30"));//depth
1307 SetToken(0,IntToStr(_here.x - 20) ); //X
1308 SetToken(1,IntToStr(_here.y + 15) ); //Z
1313 //**********************************************
1314 //**********************************************
1315 //**********************************************
1317 * The object which hold the datas about a stage of a game
1321 int ob_player_spawn::Get_StageObjectType( const wxString& _name )
1323 if( _name.Upper() == wxT("SPAWN1") || _name.Upper() == wxT("SPAWN2")
1324 || _name.Upper() == wxT("SPAWN3") || _name.Upper() == wxT("SPAWN4") )
1325 return SOBJ_PLAYER_SPAWN;
1326 else
1327 return STAGETYPE_NONE;
1330 //**********************************************
1332 ob_player_spawn::ob_player_spawn( MyLine* line, const int num_line )
1333 :ob_stage_object( line, num_line )
1335 type = OB_TYPE_PLAYER_SPAWN;
1336 if( line != NULL )
1337 object_type = Get_StageObjectType( *(line->GetToken(0)->data) );
1341 //**********************************************
1343 ob_player_spawn::ob_player_spawn(const wxString& _name, wxArrayString& _tokens)
1344 :ob_stage_object( _name, _tokens )
1346 type = OB_TYPE_PLAYER_SPAWN;
1347 object_type = Get_StageObjectType( _name );
1351 //-----------------------------------------------------------------
1352 void
1353 ob_player_spawn::pClone(ob_object*& res )
1355 if( res == NULL )
1356 res = new ob_player_spawn();
1357 ob_stage_object::pClone( res );
1360 //**********************************************
1362 ob_player_spawn::~ob_player_spawn()
1367 //-------------------------------------------------------------
1368 void
1369 ob_player_spawn::Validate()
1373 //-------------------------------------------------------------
1374 bool
1375 ob_player_spawn::Get_Coords(int& x, int& y)
1377 x = -1;
1378 y = -1;
1379 wxString t;
1380 t = GetToken( 0 );
1381 if( t == wxString() )
1382 return false;
1383 x = StrToInt( t );
1385 t = GetToken( 1 );
1386 if( t == wxString() )
1387 return false;
1388 y = StrToInt( t );
1390 return true;
1393 //-------------------------------------------------------------
1394 void
1395 ob_player_spawn::Coords_Decal( const wxSize& _decal )
1397 SetToken( 0, IntToStr( StrToInt(GetToken(0)) + _decal.x ));
1398 SetToken( 1, IntToStr( StrToInt(GetToken(1)) + _decal.x ));
1401 //-------------------------------------------------------------
1402 void
1403 ob_player_spawn::Init_and_Center( wxSize& _here )
1405 SetToken( 0, IntToStr( _here.x ));
1406 SetToken( 1, IntToStr( _here.y ));
1411 //**********************************************
1412 //**********************************************
1413 //**********************************************
1415 * The object which hold the datas about a stage of a game
1419 int ob_stage_at::Get_StageObjectType( const wxString& _name )
1421 if( _name.Upper() == wxT("SCROLLZ") || _name.Upper() == wxT("SCROLLX") )
1422 return SOBJ_SCROLLZ;
1424 else if( _name.Upper() == wxT("GROUP") )
1425 return SOBJ_GROUP;
1427 else if( _name.Upper() == wxT("LIGHT") )
1428 return SOBJ_LIGHT;
1430 else if( _name.Upper() == wxT("SHADOWCOLOR") )
1431 return SOBJ_SHADOWCOLOR;
1433 else if( _name.Upper() == wxT("SHADOWALPHA") )
1434 return SOBJ_SHADOWALPHA;
1436 else if( _name.Upper() == wxT("SETPALETTE") )
1437 return SOBJ_SETPALETTE;
1439 else if( _name.Upper() == wxT("BLOCKADE") )
1440 return SOBJ_BLOCKADE;
1442 else if( _name.Upper() == wxT("WAIT") )
1443 return SOBJ_WAIT;
1445 else if( _name.Upper() == wxT("NOJOIN") )
1446 return SOBJ_NOJOIN;
1448 else if( _name.Upper() == wxT("CANJOIN") )
1449 return SOBJ_CANJOIN;
1451 else
1452 return STAGETYPE_NONE;
1455 //**********************************************
1457 ob_stage_at::ob_stage_at( MyLine* line, const int num_line )
1458 :ob_stage_object( line, num_line )
1460 type = OB_TYPE_STAGE_AT;
1461 if( line != NULL )
1462 object_type = Get_StageObjectType( *(line->GetToken(0)->data) );
1463 ungry = true;
1467 //**********************************************
1469 ob_stage_at::ob_stage_at(const wxString& _name, wxArrayString& _tokens)
1470 :ob_stage_object( _name, _tokens )
1472 type = OB_TYPE_STAGE_AT;
1473 object_type = Get_StageObjectType( _name );
1477 //-----------------------------------------------------------------
1478 void
1479 ob_stage_at::pClone(ob_object*& res )
1481 if( res == NULL )
1482 res = new ob_stage_at();
1483 ob_stage_object::pClone( res );
1486 //**********************************************
1488 ob_stage_at::~ob_stage_at()
1493 //**********************************************
1495 bool ob_stage_at::Eat( MyLine* line, const int _num_line )
1497 if( ! ungry )
1498 return false;
1500 if( line->IsComment() || line->IsEmpty() )
1502 Add_SubObj( new ob_object( line, _num_line ) );
1503 return true;
1507 wxString _name = *(line->GetToken(0)->data);
1509 // MUST BE followed by a <AT> Tag, or there is a problem
1510 if( _name.Upper() != wxT("AT") )
1512 ObjectsLog( MYLOG_ERROR, _num_line + 1,
1513 wxT("The upper object <") + name + wxT("> require a tag <AT> which is not present !") );
1514 ungry = false;
1515 return false;
1518 // Good, a <AT> tag close the thing !
1519 Add_SubObj( new ob_object( line, _num_line ) );
1520 ungry = false;
1521 return true;
1525 //**********************************************
1526 void
1527 ob_stage_at::Validate()
1531 //---------------------------------------------------------
1532 bool
1533 ob_stage_at::Get_Coords(int& x, int& y)
1535 x = -1;
1536 y = -1;
1537 ob_object* o = GetSubObject( wxT("AT") );
1538 if( o == NULL )
1539 return false;
1541 wxString _tok = o->GetToken( 0 );
1542 if( _tok == wxString() )
1543 return false;
1545 x = StrToInt( _tok );
1546 y = 0;
1547 return true;
1550 //-------------------------------------------------------------
1551 int
1552 ob_stage_at::GetAt()
1554 ob_object* subobj = GetSubObject( wxT("at") );
1555 if( subobj == NULL )
1556 return 0;
1557 return StrToInt( subobj->GetToken(0 ));
1560 //-------------------------------------------------------------
1561 void
1562 ob_stage_at::SetAt(int _here)
1564 ob_object* subobj = GetSubObject( wxT("at") );
1565 if( subobj == NULL )
1567 subobj = new ob_object(wxT("at"));
1568 Add_SubObj( subobj );
1570 subobj->SetToken( 0, IntToStr(_here));
1573 //-------------------------------------------------------------
1574 void
1575 ob_stage_at::Coords_Decal( const wxSize& _decal )
1577 SetAt( GetAt() + _decal.x );
1580 //-------------------------------------------------------------
1581 void
1582 ob_stage_at::Init_and_Center( wxSize& _here )
1584 SetAt( _here.x );
1587 //-------------------------------------------------------------
1588 void
1589 ob_stage_at::Reorder_At()
1591 int at_val = GetAt();
1593 // Must move the AT object at his new right place
1594 ob_object* sibling = this->next;
1595 ob_object* last_obj;
1596 int found_res = 0;
1598 while( sibling != NULL )
1600 if( ob_stage::Is_Stage_At_Type( sibling ) == false )
1602 sibling = sibling->next;
1603 continue;
1606 ob_object* subobj = sibling->GetSubObject( wxT("AT") );
1607 if( subobj != NULL )
1609 if( StrToInt( subobj->GetToken(0)) > at_val )
1610 break;
1611 found_res = 1;
1612 last_obj = sibling;
1614 sibling = sibling->next;
1617 // If no better place upper ==>> try lower
1618 if( sibling == this->next || (sibling == NULL && found_res == 0) )
1620 sibling = this->prev;
1621 while( sibling != NULL )
1623 if( ob_stage::Is_Stage_At_Type( sibling ) == false )
1625 sibling = sibling->prev;
1626 continue;
1629 ob_object* subobj = sibling->GetSubObject( wxT("AT") );
1630 if( subobj != NULL )
1632 if( StrToInt( subobj->GetToken(0)) < at_val )
1633 break;
1634 found_res = 2;
1635 last_obj = sibling;
1638 sibling = sibling->prev;
1641 // no better Lower place neither
1642 if( sibling == this->prev || (sibling == NULL && found_res == 0) )
1644 sibling = NULL;
1648 // Must replace the object next to the sibling found
1649 if( found_res > 0 )
1651 // Front or back case
1652 if( sibling == NULL )
1654 // front case ==>> must be an insert before
1655 if( found_res == 2 )
1656 found_res = 1;
1657 // back case ==>> must be an insert after
1658 else
1659 found_res = 2;
1660 sibling = last_obj;
1663 // Must place it before
1664 if( found_res == 1 )
1665 sibling->InsertObject_Before( this );
1666 else
1667 sibling->InsertObject_After( this );
1671 //-------------------------------------------------------------
1672 bool
1673 ob_stage_at::Add_SubObj( ob_object* temp )
1675 if( temp == NULL )
1676 return false;
1677 if( temp->name.Upper() == wxT("AT") )
1678 return ob_stage_object::Add_SubObj( temp );
1680 if( last_subobj == NULL )
1681 return ob_stage_object::Add_SubObj( temp );
1683 if( last_subobj->name.Upper() == wxT("AT") )
1684 return last_subobj->InsertObject_Before( temp );
1686 return ob_stage_object::Add_SubObj( temp );
1690 //**********************************************
1691 //**********************************************
1692 //**********************************************
1694 * The object which hold the datas about a game (mod)
1697 int ob_spawn::Get_StageObjectType( const wxString& _name, const wxString& entity_name )
1699 if( _name.Upper() != wxT("SPAWN") )
1700 return STAGETYPE_NONE;
1702 obFileEntity* ent = obFileStage::GetEntity( entity_name );
1703 if( ent == NULL )
1704 return STAGETYPE_NONE;
1705 wxString ent_type = ent->obj_container->GetSubObject_Token( wxT("type") );
1707 if( ent_type.Upper() == wxT("NONE") )
1708 return SOBJ_NONE;
1710 if( ent_type.Upper() == wxT("STEAMER") )
1711 return SOBJ_STEAMER;
1713 if( ent_type.Upper() == wxT("PANEL") )
1714 return SOBJ_PANEL;
1716 if( ent_type.Upper() == wxT("TEXT") )
1717 return SOBJ_TEXT;
1719 if( ent_type.Upper() == wxT("TRAP") )
1720 return SOBJ_TRAP;
1722 if( ent_type.Upper() == wxT("PSHOT") || ent_type.Upper() == wxT("SHOT"))
1723 return SOBJ_SHOT;
1725 else
1726 return STAGETYPE_NONE;
1729 //**********************************************
1731 wxString obSpawnTags[] =
1733 wxT("at"),
1734 wxT("2pspawn"),
1735 wxT("3pspawn"),
1736 wxT("4pspawn"),
1737 wxT("flip"),
1738 wxT("alias"),
1739 wxT("map"),
1740 wxT("spawnscript"),
1741 wxT("coords"),
1744 bool
1745 ob_spawn::Is_AcceptedTag( const wxString& _name )
1747 return IsInArray( _name, (wxString*) &obSpawnTags, t_size_of( obSpawnTags ) );
1750 //------------------------------------------------------------------------------
1752 ob_spawn::Get_Entity_StageType( const wxString& ent_name )
1754 int ent_stype = ob_spawn::Get_StageObjectType( wxT("SPAWN"), ent_name );
1756 if( ent_stype == STAGETYPE_NONE )
1757 ent_stype = ob_spawn_healthy::Get_StageObjectType( wxT("SPAWN"), ent_name );
1759 if( ent_stype == STAGETYPE_NONE )
1760 ent_stype = ob_spawn_item::Get_StageObjectType( wxT("SPAWN"), ent_name );
1762 return ent_stype;
1765 //**********************************************
1767 ob_spawn::ob_spawn( MyLine* line, const int num_line )
1768 :ob_stage_at( line, num_line )
1770 type = OB_TYPE_SPAWN;
1771 if( line == NULL || line->GetTokensCount() < 2 )
1773 object_type = STAGETYPE_NONE;
1774 entity_ref = NULL;
1776 else
1778 object_type = Get_StageObjectType( *(line->GetToken(0)->data), *(line->GetToken(1)->data) );
1779 entity_ref = obFileStage::GetEntity( *(line->GetToken(1)->data));
1784 //**********************************************
1786 ob_spawn::ob_spawn(const wxString& _name, wxArrayString& _tokens)
1787 :ob_stage_at( _name, _tokens )
1789 type = OB_TYPE_SPAWN;
1790 if( _tokens.Count() < 1 )
1792 object_type = STAGETYPE_NONE;
1793 entity_ref = NULL;
1795 else
1797 object_type = Get_StageObjectType( _name , _tokens[0] );
1798 entity_ref = obFileStage::GetEntity(_tokens[0] );
1803 //-----------------------------------------------------------------
1804 void
1805 ob_spawn::pClone(ob_object*& res )
1807 if( res == NULL )
1808 res = new ob_spawn();
1809 ob_stage_at::pClone( res );
1810 ((ob_spawn*)res)->entity_ref = entity_ref;
1813 //**********************************************
1815 ob_spawn::~ob_spawn()
1820 //**********************************************
1822 bool ob_spawn::Eat( MyLine* line, const int _num_line )
1824 if( ! ungry )
1825 return false;
1827 if( line->IsComment() || line->IsEmpty() )
1829 Add_SubObj( new ob_object( line, _num_line ) );
1830 return true;
1834 wxString _name = *(line->GetToken(0)->data);
1836 // Accepted !!
1837 if( Is_AcceptedTag( _name ) )
1839 wxString _name = *(line->GetToken(0)->data);
1840 if( GetSubObject( _name ) != NULL )
1841 ObjectsLog( MYLOG_ERROR, _num_line + 1,
1842 wxT("The object <") + name +wxT( "> contain two <") + _name +wxT("> tag !") );
1844 Add_SubObj( new ob_object( line, _num_line ) );
1846 // An <AT> close the stuff
1847 if( _name.Upper() == wxT("AT") )
1849 ungry = false;
1850 Validate();
1852 return true;
1855 // Not a tag for it anymore
1856 else
1858 ungry = false;
1859 Validate();
1860 return false;
1865 //-----------------------------------------------------------------
1866 void
1867 ob_spawn::Validate()
1869 if( GetSubObject( wxT("AT") ) == NULL )
1871 ObjectsLog( MYLOG_ERROR, num_line + 1,
1872 wxT("The object <") + name + wxT("> require a tag <AT> which is not present !" ));
1875 if( GetSubObject( wxT("COORDS") ) == NULL )
1877 ObjectsLog( MYLOG_ERROR, num_line + 1,
1878 wxT("The object <") + name + wxT("> require a tag <COORDS> which is not present !") );
1882 //-----------------------------------------------------------------
1883 wxString
1884 ob_spawn::Get_ScreenList_Name()
1886 if( entity_ref == NULL )
1887 return wxT("NO Entity");
1888 return entity_ref->Name();
1891 //-------------------------------------------------------------
1892 bool
1893 ob_spawn::Get_Coords(int& x, int& y)
1895 if( ob_stage_at::Get_Coords(x,y) == false )
1896 return false;
1897 y = -1;
1899 ob_object* o = GetSubObject(wxT( "coords" ));
1900 if( o == NULL )
1901 return false;
1902 wxString _tok = o->GetToken( 0 );
1903 if( _tok == wxString() )
1904 return false;
1905 x += StrToInt( _tok );
1907 _tok = o->GetToken( 1 );
1908 if( _tok == wxString() )
1909 return false;
1911 y = StrToInt( _tok );
1912 return true;
1915 //-------------------------------------------------------------
1916 void
1917 ob_spawn::Coords_Decal( const wxSize& _decal )
1919 SetAt( GetAt() + _decal.x );
1920 ob_object* coords = GetSubObject(wxT( "coords" ));
1921 if( coords == NULL )
1923 coords = new ob_object(wxT("coords"));
1924 coords->SetToken(0,wxT("0"));
1925 Add_SubObj( coords );
1927 coords->SetToken( 1, IntToStr(StrToInt(coords->GetToken(1)) + _decal.y) );
1930 //-------------------------------------------------------------
1931 void
1932 ob_spawn::Init_and_Center( wxSize& _here )
1934 ob_stage_at::Init_and_Center( _here );
1935 ob_object* coords = GetSubObject( wxT("coords") );
1936 if( coords == NULL )
1938 coords = new ob_object(wxT("coords"));
1939 coords->SetToken(0,wxT("0"));
1940 Add_SubObj( coords );
1942 coords->SetToken( 1, IntToStr(_here.y) );
1947 //**********************************************
1948 //**********************************************
1949 //**********************************************
1951 * The object which hold the datas about a game (mod)
1954 int ob_spawn_healthy::Get_StageObjectType( const wxString& _name, const wxString& entity_name )
1956 if( _name.Upper() != wxT("SPAWN") )
1957 return STAGETYPE_NONE;
1959 obFileEntity* ent = obFileStage::GetEntity( entity_name );
1960 if( ent == NULL )
1961 return STAGETYPE_NONE;
1962 wxString ent_type = ent->obj_container->GetSubObject_Token( wxT("type") );
1964 if( ent_type.Upper() == wxT("OBSTACLE") )
1965 return SOBJ_OBSTACLE;
1967 if( ent_type.Upper() == wxT("NPC") )
1968 return SOBJ_NPC;
1970 if( ent_type.Upper() == wxT("ENEMY") )
1971 return SOBJ_ENEMY;
1973 return STAGETYPE_NONE;
1976 //**********************************************
1978 wxString obSpawnHealthyTags[] =
1980 wxT("boss"),
1981 wxT("health"),
1982 wxT("2phealth"),
1983 wxT("3phealth"),
1984 wxT("4phealth"),
1985 wxT("score"),
1986 wxT("nolife"),
1987 wxT("dying"),
1989 wxT("weapon"),
1990 wxT("aggression"),
1992 wxT("item"),
1993 wxT("credit"),
1994 wxT("2pitem"),
1995 wxT("3pitem"),
1996 wxT("4pitem"),
1997 wxT("itemmap"),
1998 wxT("itemhealth"),
1999 wxT("itemalias"),
2000 wxT("itemtrans"),
2001 wxT("itemalpha"),
2002 wxT("itemtrans"),
2005 bool ob_spawn_healthy::Is_AcceptedTag( const wxString& _name )
2007 return IsInArray( _name, (wxString*) &obSpawnHealthyTags, t_size_of( obSpawnHealthyTags ) )
2008 || ob_spawn::Is_AcceptedTag( _name );
2011 //----------------------------------------------------------------------
2012 wxString obItemHoldedTags[] =
2014 wxT("item"),
2015 wxT("credit"),
2016 wxT("2pitem"),
2017 wxT("3pitem"),
2018 wxT("4pitem"),
2019 wxT("itemmap"),
2020 wxT("itemhealth"),
2021 wxT("itemalias"),
2022 wxT("itemtrans"),
2023 wxT("itemalpha"),
2024 wxT("itemtrans"),
2027 bool
2028 ob_spawn_healthy::IsItemHoldedTag( const wxString& _tag )
2030 return IsInArray( _tag, (wxString*) &obItemHoldedTags, t_size_of( obItemHoldedTags ) );
2033 //**********************************************
2035 ob_spawn_healthy::ob_spawn_healthy( MyLine* line, const int num_line )
2036 :ob_spawn( line, num_line )
2038 type = OB_TYPE_SPAWN_HEALTHY;
2039 if( line != NULL )
2040 object_type = Get_StageObjectType( *(line->GetToken(0)->data), *(line->GetToken(1)->data) );
2044 //**********************************************
2046 ob_spawn_healthy::ob_spawn_healthy(const wxString& _name, wxArrayString& _tokens)
2047 :ob_spawn( _name, _tokens )
2049 type = OB_TYPE_SPAWN_HEALTHY;
2050 object_type = Get_StageObjectType( _name, _tokens[0] );
2054 //-----------------------------------------------------------------
2055 void
2056 ob_spawn_healthy::pClone(ob_object*& res )
2058 if( res == NULL )
2059 res = new ob_spawn_healthy();
2060 ob_spawn::pClone( res );
2063 //**********************************************
2065 ob_spawn_healthy::~ob_spawn_healthy()
2070 //**********************************************
2072 void ob_spawn_healthy::Validate()
2074 ob_spawn::Validate();
2079 //**********************************************
2080 //**********************************************
2081 //**********************************************
2083 * An item spawned (not dropped)
2086 int ob_spawn_item::Get_StageObjectType( const wxString& _name, const wxString& entity_name )
2088 if( _name.Upper() != wxT("SPAWN" ))
2089 return STAGETYPE_NONE;
2091 obFileEntity* ent = obFileStage::GetEntity( entity_name );
2092 if( ent == NULL )
2093 return STAGETYPE_NONE;
2094 wxString ent_type = ent->obj_container->GetSubObject_Token( wxT("type" ));
2096 if( ent_type.Upper() == wxT("ITEM") )
2097 return SOBJ_ITEM;
2099 if( ent_type.Upper() == wxT("ENDLEVEL") )
2100 return SOBJ_ENDLEVEL;
2102 return STAGETYPE_NONE;
2105 //**********************************************
2106 wxString obSpawnItemTags[] =
2108 wxT("mp"),
2109 wxT("credit"),
2112 bool ob_spawn_item::Is_AcceptedTag(const wxString& _name )
2114 return IsInArray( _name, (wxString*) &obSpawnItemTags, t_size_of( obSpawnItemTags ) )
2115 || ob_spawn::Is_AcceptedTag( _name );
2120 //**********************************************
2122 ob_spawn_item::ob_spawn_item( MyLine* line, const int num_line )
2123 :ob_spawn( line, num_line )
2125 type = OB_TYPE_SPAWN_ITEM;
2126 if( line != NULL )
2127 object_type = Get_StageObjectType( *(line->GetToken(0)->data), *(line->GetToken(1)->data) );
2131 //**********************************************
2133 ob_spawn_item::ob_spawn_item(const wxString& _name, wxArrayString& _tokens)
2134 :ob_spawn( _name, _tokens )
2136 type = OB_TYPE_SPAWN_ITEM;
2137 object_type = Get_StageObjectType( _name, _tokens[0] );
2141 //-----------------------------------------------------------------
2142 void
2143 ob_spawn_item::pClone(ob_object*& res )
2145 if( res == NULL )
2146 res = new ob_spawn_item();
2147 ob_spawn::pClone( res );
2150 //**********************************************
2152 ob_spawn_item::~ob_spawn_item()
2157 //**********************************************
2159 void ob_spawn_item::Validate()
2161 ob_spawn::Validate();
2165 /**======================================================================
2166 * Types and Super Types helpers
2169 int list_SST_OTHER__count;
2170 int *list_SST_OTHER;
2171 int list_SST_GEOMETRY__count;
2172 int *list_SST_GEOMETRY;
2173 int list_SST_CONTROL__count;
2174 int *list_SST_CONTROL;
2175 int list_SST_VISUAL_FX__count;
2176 int *list_SST_VISUAL_FX;
2177 int list_SST_STUFFS__count;
2178 int *list_SST_STUFFS;
2179 int list_SST_DECORATION__count;
2180 int *list_SST_DECORATION;
2181 int list_SST_LIVINGS__count;
2182 int *list_SST_LIVINGS;
2184 map<int,int> assoc_type_supertype;
2185 void
2186 Init_SuperTypes()
2188 if( assoc_type_supertype.size() > 0 )
2189 return;
2191 list_SST_OTHER__count = 0;
2192 list_SST_GEOMETRY__count = 0;
2193 list_SST_CONTROL__count = 0;
2194 list_SST_VISUAL_FX__count = 0;
2195 list_SST_STUFFS__count = 0;
2196 list_SST_DECORATION__count = 0;
2197 list_SST_LIVINGS__count = 0;
2199 assoc_type_supertype[SOBJ_TEXT] = SST_OTHER;
2200 assoc_type_supertype[SOBJ_PLAYER_SPAWN] = SST_OTHER;
2201 assoc_type_supertype[SOBJ_SETPALETTE] = SST_OTHER;
2204 assoc_type_supertype[SOBJ_SCROLLZ] = SST_GEOMETRY;
2205 assoc_type_supertype[SOBJ_WALL] = SST_GEOMETRY;
2206 assoc_type_supertype[SOBJ_HOLE] = SST_GEOMETRY;
2208 assoc_type_supertype[SOBJ_WAIT] = SST_CONTROL;
2209 assoc_type_supertype[SOBJ_NOJOIN] = SST_CONTROL;
2210 assoc_type_supertype[SOBJ_CANJOIN] = SST_CONTROL;
2211 assoc_type_supertype[SOBJ_BLOCKADE] = SST_CONTROL;
2212 assoc_type_supertype[SOBJ_GROUP] = SST_CONTROL;
2214 assoc_type_supertype[SOBJ_SHADOWCOLOR] = SST_VISUAL_FX;
2215 assoc_type_supertype[SOBJ_SHADOWALPHA] = SST_VISUAL_FX;
2216 assoc_type_supertype[SOBJ_LIGHT] = SST_VISUAL_FX;
2218 assoc_type_supertype[SOBJ_TRAP] = SST_STUFFS;
2219 assoc_type_supertype[SOBJ_SHOT] = SST_STUFFS;
2220 assoc_type_supertype[SOBJ_ITEM] = SST_STUFFS;
2221 assoc_type_supertype[SOBJ_ENDLEVEL] = SST_STUFFS;
2222 assoc_type_supertype[SOBJ_OBSTACLE] = SST_STUFFS;
2224 assoc_type_supertype[SOBJ_STEAMER] = SST_DECORATION;
2225 assoc_type_supertype[SOBJ_NONE] = SST_DECORATION;
2226 assoc_type_supertype[SOBJ_PANEL] = SST_DECORATION;
2228 assoc_type_supertype[SOBJ_NPC] = SST_LIVINGS;
2229 assoc_type_supertype[SOBJ_ENEMY] = SST_LIVINGS;
2231 // fill the Members Arrays
2232 map<int,int>:: iterator it(assoc_type_supertype.begin())
2233 , it_end(assoc_type_supertype.end());
2236 for(;it!=it_end;it++)
2238 switch( it->second )
2240 case SST_OTHER:
2241 list_SST_OTHER__count++;
2242 break;
2243 case SST_GEOMETRY:
2244 list_SST_GEOMETRY__count++;
2245 break;
2246 case SST_CONTROL:
2247 list_SST_CONTROL__count++;
2248 break;
2249 case SST_VISUAL_FX:
2250 list_SST_VISUAL_FX__count++;
2251 break;
2252 case SST_STUFFS:
2253 list_SST_STUFFS__count++;
2254 break;
2255 case SST_DECORATION:
2256 list_SST_DECORATION__count++;
2257 break;
2258 case SST_LIVINGS:
2259 list_SST_LIVINGS__count++;
2260 break;
2264 if( list_SST_OTHER__count > 0 )
2265 list_SST_OTHER = new int[list_SST_OTHER__count];
2266 else
2267 list_SST_OTHER = NULL;
2268 list_SST_OTHER__count=0;
2270 if( list_SST_GEOMETRY__count > 0 )
2271 list_SST_GEOMETRY = new int[list_SST_GEOMETRY__count];
2272 else
2273 list_SST_GEOMETRY = NULL;
2274 list_SST_GEOMETRY__count=0;
2276 if( list_SST_CONTROL__count > 0 )
2277 list_SST_CONTROL = new int[list_SST_CONTROL__count];
2278 else
2279 list_SST_CONTROL = NULL;
2280 list_SST_CONTROL__count=0;
2282 if( list_SST_VISUAL_FX__count > 0 )
2283 list_SST_VISUAL_FX = new int[list_SST_VISUAL_FX__count];
2284 else
2285 list_SST_VISUAL_FX = NULL;
2286 list_SST_VISUAL_FX__count=0;
2288 if( list_SST_STUFFS__count > 0 )
2289 list_SST_STUFFS = new int[list_SST_STUFFS__count];
2290 else
2291 list_SST_STUFFS = NULL;
2292 list_SST_STUFFS__count=0;
2294 if( list_SST_DECORATION__count > 0 )
2295 list_SST_DECORATION = new int[list_SST_DECORATION__count];
2296 else
2297 list_SST_DECORATION = NULL;
2298 list_SST_DECORATION__count=0;
2300 if( list_SST_LIVINGS__count > 0 )
2301 list_SST_LIVINGS = new int[list_SST_LIVINGS__count];
2302 else
2303 list_SST_LIVINGS = NULL;
2304 list_SST_LIVINGS__count=0;
2306 it = assoc_type_supertype.begin();
2307 for(;it!=it_end;it++)
2309 switch( it->second )
2311 case SST_OTHER:
2312 list_SST_OTHER[list_SST_OTHER__count] = it->first;
2313 list_SST_OTHER__count++;
2314 break;
2315 case SST_GEOMETRY:
2316 list_SST_GEOMETRY[list_SST_GEOMETRY__count] = it->first;
2317 list_SST_GEOMETRY__count++;
2318 break;
2319 case SST_CONTROL:
2320 list_SST_CONTROL[list_SST_CONTROL__count] = it->first;
2321 list_SST_CONTROL__count++;
2322 break;
2323 case SST_VISUAL_FX:
2324 list_SST_VISUAL_FX[list_SST_VISUAL_FX__count] = it->first;
2325 list_SST_VISUAL_FX__count++;
2326 break;
2327 case SST_STUFFS:
2328 list_SST_STUFFS[list_SST_STUFFS__count] = it->first;
2329 list_SST_STUFFS__count++;
2330 break;
2331 case SST_DECORATION:
2332 list_SST_DECORATION[list_SST_DECORATION__count] = it->first;
2333 list_SST_DECORATION__count++;
2334 break;
2335 case SST_LIVINGS:
2336 list_SST_LIVINGS[list_SST_LIVINGS__count] = it->first;
2337 list_SST_LIVINGS__count++;
2338 break;
2345 //------------------------------------------------------------------
2346 wxString
2347 Stage__SuperType_ToStr( const int _sst )
2349 switch( _sst )
2351 case SST_OTHER:
2352 return wxT("Other");
2353 case SST_GEOMETRY:
2354 return wxT("Geometry");
2355 case SST_CONTROL:
2356 return wxT("Control");
2357 case SST_VISUAL_FX:
2358 return wxT("Visual Fx");
2359 case SST_STUFFS:
2360 return wxT("Stuff");
2361 case SST_DECORATION:
2362 return wxT("Decoration");
2363 case SST_LIVINGS:
2364 return wxT("Living");
2365 default:
2366 return wxT("NONE");
2370 //------------------------------------------------------------------
2371 int
2372 Stage__SuperType_ToInt( const wxString& _sst )
2374 if( _sst == wxT("Other" ))
2375 return SST_OTHER;
2376 if( _sst == wxT("Geometry" ))
2377 return SST_GEOMETRY;
2378 if( _sst == wxT("Control" ))
2379 return SST_CONTROL;
2380 if( _sst == wxT("Visual Fx" ))
2381 return SST_VISUAL_FX;
2382 if( _sst == wxT("Stuff" ))
2383 return SST_STUFFS;
2384 if( _sst == wxT("Decoration" ))
2385 return SST_DECORATION;
2386 if( _sst == wxT("Living" ))
2387 return SST_LIVINGS;
2388 return SST_NONE;
2391 //------------------------------------------------------------------
2392 const int*
2393 Stage__SuperType_Get_Type_Array( const int _sst, size_t& arr_size )
2395 Init_SuperTypes();
2397 if( _sst == SST_OTHER )
2399 arr_size = list_SST_OTHER__count;
2400 return list_SST_OTHER;
2402 if( _sst == SST_GEOMETRY )
2404 arr_size = list_SST_GEOMETRY__count;
2405 return list_SST_GEOMETRY;
2407 if( _sst == SST_CONTROL )
2409 arr_size = list_SST_CONTROL__count;
2410 return list_SST_CONTROL;
2412 if( _sst == SST_VISUAL_FX )
2414 arr_size = list_SST_VISUAL_FX__count;
2415 return list_SST_VISUAL_FX;
2417 if( _sst == SST_STUFFS )
2419 arr_size = list_SST_STUFFS__count;
2420 return list_SST_STUFFS;
2422 if( _sst == SST_DECORATION )
2424 arr_size = list_SST_DECORATION__count;
2425 return list_SST_DECORATION;
2427 if( _sst == SST_LIVINGS )
2429 arr_size = list_SST_LIVINGS__count;
2430 return list_SST_LIVINGS;
2433 arr_size = 0;
2434 return NULL;
2437 //------------------------------------------------------------------
2439 Stage__Type__Get_SuperType( const int _sobj_type )
2441 Init_SuperTypes();
2443 map<int,int>::iterator it(assoc_type_supertype.find(_sobj_type));
2444 if( it == assoc_type_supertype.end() )
2445 return SST_NONE;
2447 return it->second;
2450 //------------------------------------------------------------------
2451 bool
2452 Stage__Type_Is_in_SuperType( const int _stype, const int _sst )
2454 return (Stage__Type__Get_SuperType( _stype ) == _sst);
2457 //------------------------------------------------------------------
2458 int
2459 Stage__Type_ToInt( const wxString& _sst )
2461 if( _sst == wxT("Text") )
2462 return SOBJ_TEXT;
2463 if( _sst == wxT("EndLevel" ))
2464 return SOBJ_ENDLEVEL;
2465 if( _sst == wxT("Player Spawn" ))
2466 return SOBJ_PLAYER_SPAWN;
2467 if( _sst == wxT("SetPalette" ))
2468 return SOBJ_SETPALETTE;
2469 if( _sst == wxT("Wall" ))
2470 return SOBJ_WALL;
2471 if( _sst == wxT("Hole" ))
2472 return SOBJ_HOLE;
2473 if( _sst == wxT("Wait" ))
2474 return SOBJ_WAIT;
2475 if( _sst == wxT("NoJoin" ))
2476 return SOBJ_NOJOIN;
2477 if( _sst == wxT("CanJoin" ))
2478 return SOBJ_CANJOIN;
2479 if( _sst == wxT("Scroll[zx]" ))
2480 return SOBJ_SCROLLZ;
2481 if( _sst == wxT("Blockade" ))
2482 return SOBJ_BLOCKADE;
2483 if( _sst == wxT("Group" ))
2484 return SOBJ_GROUP;
2485 if( _sst == wxT("ShadowColor" ))
2486 return SOBJ_SHADOWCOLOR;
2487 if( _sst == wxT("ShadowAlpha" ))
2488 return SOBJ_SHADOWALPHA;
2489 if( _sst == wxT("Light" ))
2490 return SOBJ_LIGHT;
2491 if( _sst == wxT("Trap" ))
2492 return SOBJ_TRAP;
2493 if( _sst == wxT("Shot" ))
2494 return SOBJ_SHOT;
2495 if( _sst == wxT("Item" ))
2496 return SOBJ_ITEM;
2497 if( _sst == wxT("Obstacle" ))
2498 return SOBJ_OBSTACLE;
2499 if( _sst == wxT("Steamer" ))
2500 return SOBJ_STEAMER;
2501 if( _sst == wxT("none" ))
2502 return SOBJ_NONE;
2503 if( _sst == wxT("Panel" ))
2504 return SOBJ_PANEL;
2505 if( _sst == wxT("Npc" ))
2506 return SOBJ_NPC;
2507 if( _sst == wxT("Enemy" ))
2508 return SOBJ_ENEMY;
2509 return STAGETYPE_NONE;
2512 //------------------------------------------------------------------
2513 wxString
2514 Stage__Type_ToStr( const int _sst )
2516 switch( _sst )
2518 case SOBJ_TEXT:
2519 return wxT("Text");
2520 case SOBJ_ENDLEVEL:
2521 return wxT("EndLevel");
2522 case SOBJ_PLAYER_SPAWN:
2523 return wxT("Player Spawn");
2524 case SOBJ_SETPALETTE:
2525 return wxT("SetPalette");
2526 case SOBJ_WALL:
2527 return wxT("Wall");
2528 case SOBJ_HOLE:
2529 return wxT("Hole");
2530 case SOBJ_WAIT:
2531 return wxT("Wait");
2532 case SOBJ_NOJOIN:
2533 return wxT("NoJoin");
2534 case SOBJ_CANJOIN:
2535 return wxT("CanJoin");
2536 case SOBJ_SCROLLZ:
2537 return wxT("Scroll[zx]");
2538 case SOBJ_BLOCKADE:
2539 return wxT("Blockade");
2540 case SOBJ_GROUP:
2541 return wxT("Group");
2542 case SOBJ_SHADOWCOLOR:
2543 return wxT("ShadowColor");
2544 case SOBJ_SHADOWALPHA:
2545 return wxT("ShadowAlpha");
2546 case SOBJ_LIGHT:
2547 return wxT("Light");
2548 case SOBJ_TRAP:
2549 return wxT("Trap");
2550 case SOBJ_SHOT:
2551 return wxT("Shot");
2552 case SOBJ_ITEM:
2553 return wxT("Item");
2554 case SOBJ_OBSTACLE:
2555 return wxT("Obstacle");
2556 case SOBJ_STEAMER:
2557 return wxT("Steamer");
2558 case SOBJ_NONE:
2559 return wxT("none");
2560 case SOBJ_PANEL:
2561 return wxT("Panel");
2562 case SOBJ_NPC:
2563 return wxT("Npc");
2564 case SOBJ_ENEMY:
2565 return wxT("Enemy");
2566 default:
2567 return wxT("NoType");