4 * Created on: 24 avr. 2009
15 #include "common__tools.h"
16 #include "common__object_stage.h"
21 /*\internal*********************************************
22 ******** OBJECT RELATED TO THE STAGE FILES
23 ******************************************************/
25 //**********************************************
26 //**********************************************
27 //**********************************************
29 * The object which hold the datas about a stage of a game
33 * STAGE FILE ORGANISATION
42 wxString stageHeaderTags
[] = {
69 wxT("endlevelscript"),
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() )
86 //**********************************************
88 int stage_at_types
[] = {
92 bool ob_stage::Is_Stage_At_Type( ob_object
* _obj
)
94 if( ob_stage::Is_Stage_Spawn_Type( _obj
) )
97 for( size_t i
=0; i
< t_size_of(stage_at_types
); i
++ )
99 if( _obj
->type
== stage_at_types
[i
] )
106 int stage_spawn_types
[] = {
108 OB_TYPE_SPAWN_HEALTHY
,
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
] )
124 //**********************************************
127 :ob_object_container()
129 type
= OB_TYPE_STAGE
;
130 direction
= STAGE_RIGHT
;
133 //-----------------------------------------------------------------
135 ob_stage::pClone(ob_object
*& res
)
138 res
= new ob_stage();
139 ob_object_container::pClone( res
);
140 ((ob_stage
*)res
)->direction
= direction
;
143 //**********************************************
145 ob_stage::~ob_stage()
149 //---------------------------------------------------------------------
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();
163 //---------------------------------------------------------------------
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
;
189 direction
= STAGE_RIGHT
;
194 //---------------------------------------------------------------------
196 ob_stage::GetDefScrollzBounds( ob_object
* st_declar
)
198 if( st_declar
== NULL
)
201 if( direction
== STAGE_IN
|| direction
== STAGE_OUT
)
204 return ((ob_StageDeclaration
*)st_declar
)->GetDefScrollzBounds();
207 //**********************************************
209 ob_stage::Get_Panels( size_t& nb_panels
)
213 // Get the panels order
214 wxString curr_order
= Get_Panels_Order();
216 if( curr_order
.Len() == 0 )
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 )
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
)
234 res
[nb_panels
] = oPanels
[curr_order
[i
] - 'a'];
242 //**********************************************
244 ob_stage::Get_LastHeaderObj()
246 ob_object
* t
= first_subobj
;
249 bool b_found
= false;
252 if( IsHeaderTag(t
->name
) )
260 if( ! IsHeaderTag(t
->name
) && ! t
->Is_EmptyOrComment() )
268 //**********************************************
270 ob_object
* ob_stage::Get_First_AT_Obj()
272 ob_object
* t
= first_subobj
;
275 if( ! ob_stage::Is_Stage_At_Type( 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
)
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
)
305 //---------------------------------------------------------------------
307 ob_stage::Get_Panels_Order()
309 wxString res
= wxString();
311 ob_object
** orders
= GetSubObjectS( wxT("order"),nb_orders
);
315 for( size_t i
= 0; i
< nb_orders
; i
++ )
316 res
+= orders
[i
]->GetToken( 0 );
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
330 return Prepend_SubObj( _obj
);
334 return t
->InsertObject_After( _obj
);
336 return t
->InsertObject_Before( _obj
);
341 //**********************************************
346 bool ob_stage::Add_SubObj_BGs( ob_object
* _obj
, bool b_after
)
349 ob_object
** l_obj
= GetSubObjectS_ofType( OB_TYPE_BG_LAYER
, nb
);
352 return Add_SubObj_Header( _obj
, true );
360 return t
->InsertObject_After( _obj
);
366 return t
->InsertObject_Before( _obj
);
373 //**********************************************
375 bool ob_stage::Add_SubObj_FrontLayer( ob_object
* _obj
, bool b_after
)
378 ob_object
** l_obj
= GetSubObjectS_ofType( OB_TYPE_FRONT_PANEL
, nb
);
382 return Add_SubObj_BGs( _obj
, true );
391 return t
->InsertObject_After( _obj
);
397 return t
->InsertObject_Before( _obj
);
403 //**********************************************
405 bool ob_stage::Add_SubObj_Panel( ob_object
* _obj
, bool b_after
)
408 ob_object
** l_obj
= GetSubObjectS_ofType( OB_TYPE_STAGE_PANEL
, nb
);
412 return Add_SubObj_FrontLayer( _obj
, true );
421 if( t
->next
->name
.Upper() == wxT("ORDER") && _obj
->type
!= OB_TYPE_STAGE_PANEL
)
424 return t
->InsertObject_After( _obj
);
430 if( t
->prev
->name
.Upper() == wxT("ORDER") && _obj
->type
!= OB_TYPE_STAGE_PANEL
)
432 return t
->InsertObject_Before( _obj
);
438 //**********************************************
440 bool ob_stage::Add_SubObj_WallHole( ob_object
* _obj
, bool b_after
)
448 l_obj
= GetSubObjectS_ofType( OB_TYPE_WALL
, nb
);
453 return t
->InsertObject_After( _obj
);
457 l_obj
= GetSubObjectS_ofType( OB_TYPE_HOLE
, nb
);
464 return t
->InsertObject_After( _obj
);
470 return t
->InsertObject_Before( _obj
);
476 return Add_SubObj_Panel( _obj
, true );
481 //**********************************************
483 ob_stage::Add_SubObj_AT( ob_object
* _obj
, bool b_after
)
486 return Add_SubObj( _obj
);
488 ob_object
* t
= Get_First_AT_Obj();
490 return Add_SubObj_WallHole( _obj
, true );
492 return t
->InsertObject_Before( _obj
);
495 //----------------------------------------------------------------
497 ob_stage::Insert_SubObj_AT( ob_object
* _obj
)
499 ob_object
* t
= Get_First_AT_Obj();
501 return Add_SubObj_WallHole( _obj
, true );
502 if( t
->InsertObject_Before( _obj
) == false )
505 ((ob_stage_at
*)_obj
)->Reorder_At();
510 //**********************************************
512 ob_stage::Add_SubObj( ob_object
* _obj
, bool b_sort_at
)
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
);
552 return Insert_SubObj_AT( _obj
);
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
)
571 if( line
== NULL
|| line
->GetTokensCount() <= 0 )
572 return new ob_object(line
, _num_line
);
574 wxString _name
= *(line
->GetToken(0)->data
);
576 if( line
->GetToken(1) != NULL
&& line
->GetToken(1)->data
!= NULL
)
577 _token
= *( line
->GetToken(1)->data
);
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
);
613 temp
= new ob_stage_object( line
, _num_line
);
615 // wxLogInfo( "At line " + IntToStr( _num_line +1) + ", object build :" + temp->name );
619 //**********************************************
621 ob_stage::Guess_and_ConstructNewObject(const wxString
& __name
, const wxString
& token0
)
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
);
659 temp
= new ob_stage_object(_name
,_tokens
);
661 // wxLogInfo( "At line " + IntToStr( _num_line +1) + ", object build :" + temp->name );
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 //-----------------------------------------------------------------
692 ob_BG_Layer::pClone(ob_object
*& res
)
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 //**********************************************
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 //**********************************************
745 ob_BG_Layer::FillMissings()
748 if( nb_tokens
< i
+1 )
749 SetToken( i
, wxT("data") );
752 if( nb_tokens
< i
+1 )
753 SetToken( i
, wxT("0.5") );
756 if( nb_tokens
< i
+1 )
757 SetToken( i
, wxT("0.5") );
760 if( nb_tokens
< i
+1 )
761 SetToken( i
, wxT("0") );
764 if( nb_tokens
< i
+1 )
765 SetToken( i
, wxT("0") );
768 if( nb_tokens
< i
+1 )
769 SetToken( i
, wxT("0") );
772 if( nb_tokens
< i
+1 )
773 SetToken( i
, wxT("0") );
776 if( nb_tokens
< i
+1 )
777 SetToken( i
, wxT("5000") );
780 if( nb_tokens
< i
+1 )
781 SetToken( i
, wxT("5000") );
784 if( nb_tokens
< i
+1 )
785 SetToken( i
, wxT("0") );
788 if( nb_tokens
< i
+1 )
789 SetToken( i
, wxT("0") );
793 //------------------------------------------------------------
795 ob_BG_Layer::Get_RepeatingVal( int direction
)
811 if( res
== wxString() )
813 return StrToInt( res
);
816 //**********************************************
818 ob_BG_Layer::Update_With( ob_BG_Layer
* oLay
)
824 ob_BG_Layer
* t0
= (ob_BG_Layer
*) this->Clone();
825 ob_BG_Layer
* t1
= (ob_BG_Layer
*) oLay
->Clone();
830 if( t0
->arr_token_size
!= t1
->arr_token_size
)
834 for( size_t i
= 0; i
< t0
->arr_token_size
; i
++ )
835 if( t0
->GetToken( i
) != t1
->GetToken( i
) )
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 //-----------------------------------------------------------------
879 ob_front_panel::pClone(ob_object
*& res
)
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 //**********************************************
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 //**********************************************
922 ob_front_panel::Update_With( ob_front_panel
* oPan
)
927 if( oPan
->GetToken( 0 ) != this->GetToken( 0 ) )
929 SetToken( 0, oPan
->GetToken( 0 ) );
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 //-----------------------------------------------------------------
964 ob_stage_panel::pClone(ob_object
*& res
)
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 //-----------------------------------------------------------------
1048 ob_stage_object::pClone(ob_object
*& res
)
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 //**********************************************
1072 ob_stage_object::ToStr()
1074 /* wxString t = "++++++++++++++++\n";
1075 t += ob_object::ToStr();
1076 t += "--------------\n";
1079 return ob_object::ToStr();
1082 //-------------------------------------------------------------
1084 ob_stage_object::Get_Coords(int& x
, int& y
)
1091 //-------------------------------------------------------------
1092 // used for object which use coords for screen name
1094 ob_stage_object::CoordsToStr()
1097 if( Get_Coords(x
,y
) == false )
1098 return wxT("NO Coords");
1099 return IntToStr(x
) + wxT(" , ") + IntToStr(y
);
1103 //-------------------------------------------------------------
1105 ob_stage_object::Coords_Decal( const wxSize
& _decal
)
1110 //-------------------------------------------------------------
1112 ob_stage_object::Init_and_Center( wxSize
& _here
)
1118 //**********************************************
1119 //**********************************************
1120 //**********************************************
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 //-----------------------------------------------------------------
1147 ob_wall::pClone(ob_object
*& res
)
1150 res
= new ob_wall();
1151 ob_stage_object::pClone( res
);
1154 //**********************************************
1161 //**********************************************
1168 //-------------------------------------------------------------
1170 ob_wall::Get_Coords(int& x
, int& y
)
1176 if( t
== wxString() )
1181 if( t
== wxString() )
1188 //-------------------------------------------------------------
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 //-------------------------------------------------------------
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 //**********************************************
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 //-----------------------------------------------------------------
1245 ob_hole::pClone(ob_object
*& res
)
1248 res
= new ob_hole();
1249 ob_stage_object::pClone( res
);
1252 //**********************************************
1259 //-------------------------------------------------------------
1265 //-------------------------------------------------------------
1267 ob_hole::Get_Coords(int& x
, int& y
)
1273 if( t
== wxString() )
1278 if( t
== wxString() )
1285 //-------------------------------------------------------------
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 //-------------------------------------------------------------
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
;
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
;
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 //-----------------------------------------------------------------
1353 ob_player_spawn::pClone(ob_object
*& res
)
1356 res
= new ob_player_spawn();
1357 ob_stage_object::pClone( res
);
1360 //**********************************************
1362 ob_player_spawn::~ob_player_spawn()
1367 //-------------------------------------------------------------
1369 ob_player_spawn::Validate()
1373 //-------------------------------------------------------------
1375 ob_player_spawn::Get_Coords(int& x
, int& y
)
1381 if( t
== wxString() )
1386 if( t
== wxString() )
1393 //-------------------------------------------------------------
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 //-------------------------------------------------------------
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") )
1427 else if( _name
.Upper() == wxT("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") )
1445 else if( _name
.Upper() == wxT("NOJOIN") )
1448 else if( _name
.Upper() == wxT("CANJOIN") )
1449 return SOBJ_CANJOIN
;
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
;
1462 object_type
= Get_StageObjectType( *(line
->GetToken(0)->data
) );
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 //-----------------------------------------------------------------
1479 ob_stage_at::pClone(ob_object
*& res
)
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
)
1500 if( line
->IsComment() || line
->IsEmpty() )
1502 Add_SubObj( new ob_object( line
, _num_line
) );
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 !") );
1518 // Good, a <AT> tag close the thing !
1519 Add_SubObj( new ob_object( line
, _num_line
) );
1525 //**********************************************
1527 ob_stage_at::Validate()
1531 //---------------------------------------------------------
1533 ob_stage_at::Get_Coords(int& x
, int& y
)
1537 ob_object
* o
= GetSubObject( wxT("AT") );
1541 wxString _tok
= o
->GetToken( 0 );
1542 if( _tok
== wxString() )
1545 x
= StrToInt( _tok
);
1550 //-------------------------------------------------------------
1552 ob_stage_at::GetAt()
1554 ob_object
* subobj
= GetSubObject( wxT("at") );
1555 if( subobj
== NULL
)
1557 return StrToInt( subobj
->GetToken(0 ));
1560 //-------------------------------------------------------------
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 //-------------------------------------------------------------
1575 ob_stage_at::Coords_Decal( const wxSize
& _decal
)
1577 SetAt( GetAt() + _decal
.x
);
1580 //-------------------------------------------------------------
1582 ob_stage_at::Init_and_Center( wxSize
& _here
)
1587 //-------------------------------------------------------------
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
;
1598 while( sibling
!= NULL
)
1600 if( ob_stage::Is_Stage_At_Type( sibling
) == false )
1602 sibling
= sibling
->next
;
1606 ob_object
* subobj
= sibling
->GetSubObject( wxT("AT") );
1607 if( subobj
!= NULL
)
1609 if( StrToInt( subobj
->GetToken(0)) > at_val
)
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
;
1629 ob_object
* subobj
= sibling
->GetSubObject( wxT("AT") );
1630 if( subobj
!= NULL
)
1632 if( StrToInt( subobj
->GetToken(0)) < at_val
)
1638 sibling
= sibling
->prev
;
1641 // no better Lower place neither
1642 if( sibling
== this->prev
|| (sibling
== NULL
&& found_res
== 0) )
1648 // Must replace the object next to the sibling found
1651 // Front or back case
1652 if( sibling
== NULL
)
1654 // front case ==>> must be an insert before
1655 if( found_res
== 2 )
1657 // back case ==>> must be an insert after
1663 // Must place it before
1664 if( found_res
== 1 )
1665 sibling
->InsertObject_Before( this );
1667 sibling
->InsertObject_After( this );
1671 //-------------------------------------------------------------
1673 ob_stage_at::Add_SubObj( ob_object
* temp
)
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
);
1704 return STAGETYPE_NONE
;
1705 wxString ent_type
= ent
->obj_container
->GetSubObject_Token( wxT("type") );
1707 if( ent_type
.Upper() == wxT("NONE") )
1710 if( ent_type
.Upper() == wxT("STEAMER") )
1711 return SOBJ_STEAMER
;
1713 if( ent_type
.Upper() == wxT("PANEL") )
1716 if( ent_type
.Upper() == wxT("TEXT") )
1719 if( ent_type
.Upper() == wxT("TRAP") )
1722 if( ent_type
.Upper() == wxT("PSHOT") || ent_type
.Upper() == wxT("SHOT"))
1726 return STAGETYPE_NONE
;
1729 //**********************************************
1731 wxString obSpawnTags
[] =
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
);
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
;
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
;
1797 object_type
= Get_StageObjectType( _name
, _tokens
[0] );
1798 entity_ref
= obFileStage::GetEntity(_tokens
[0] );
1803 //-----------------------------------------------------------------
1805 ob_spawn::pClone(ob_object
*& res
)
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
)
1827 if( line
->IsComment() || line
->IsEmpty() )
1829 Add_SubObj( new ob_object( line
, _num_line
) );
1834 wxString _name
= *(line
->GetToken(0)->data
);
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") )
1855 // Not a tag for it anymore
1865 //-----------------------------------------------------------------
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 //-----------------------------------------------------------------
1884 ob_spawn::Get_ScreenList_Name()
1886 if( entity_ref
== NULL
)
1887 return wxT("NO Entity");
1888 return entity_ref
->Name();
1891 //-------------------------------------------------------------
1893 ob_spawn::Get_Coords(int& x
, int& y
)
1895 if( ob_stage_at::Get_Coords(x
,y
) == false )
1899 ob_object
* o
= GetSubObject(wxT( "coords" ));
1902 wxString _tok
= o
->GetToken( 0 );
1903 if( _tok
== wxString() )
1905 x
+= StrToInt( _tok
);
1907 _tok
= o
->GetToken( 1 );
1908 if( _tok
== wxString() )
1911 y
= StrToInt( _tok
);
1915 //-------------------------------------------------------------
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 //-------------------------------------------------------------
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
);
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") )
1970 if( ent_type
.Upper() == wxT("ENEMY") )
1973 return STAGETYPE_NONE
;
1976 //**********************************************
1978 wxString obSpawnHealthyTags
[] =
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
[] =
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
;
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 //-----------------------------------------------------------------
2056 ob_spawn_healthy::pClone(ob_object
*& res
)
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
);
2093 return STAGETYPE_NONE
;
2094 wxString ent_type
= ent
->obj_container
->GetSubObject_Token( wxT("type" ));
2096 if( ent_type
.Upper() == wxT("ITEM") )
2099 if( ent_type
.Upper() == wxT("ENDLEVEL") )
2100 return SOBJ_ENDLEVEL
;
2102 return STAGETYPE_NONE
;
2105 //**********************************************
2106 wxString obSpawnItemTags
[] =
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
;
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 //-----------------------------------------------------------------
2143 ob_spawn_item::pClone(ob_object
*& res
)
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
;
2188 if( assoc_type_supertype
.size() > 0 )
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
)
2241 list_SST_OTHER__count
++;
2244 list_SST_GEOMETRY__count
++;
2247 list_SST_CONTROL__count
++;
2250 list_SST_VISUAL_FX__count
++;
2253 list_SST_STUFFS__count
++;
2255 case SST_DECORATION
:
2256 list_SST_DECORATION__count
++;
2259 list_SST_LIVINGS__count
++;
2264 if( list_SST_OTHER__count
> 0 )
2265 list_SST_OTHER
= new int[list_SST_OTHER__count
];
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
];
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
];
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
];
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
];
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
];
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
];
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
)
2312 list_SST_OTHER
[list_SST_OTHER__count
] = it
->first
;
2313 list_SST_OTHER__count
++;
2316 list_SST_GEOMETRY
[list_SST_GEOMETRY__count
] = it
->first
;
2317 list_SST_GEOMETRY__count
++;
2320 list_SST_CONTROL
[list_SST_CONTROL__count
] = it
->first
;
2321 list_SST_CONTROL__count
++;
2324 list_SST_VISUAL_FX
[list_SST_VISUAL_FX__count
] = it
->first
;
2325 list_SST_VISUAL_FX__count
++;
2328 list_SST_STUFFS
[list_SST_STUFFS__count
] = it
->first
;
2329 list_SST_STUFFS__count
++;
2331 case SST_DECORATION
:
2332 list_SST_DECORATION
[list_SST_DECORATION__count
] = it
->first
;
2333 list_SST_DECORATION__count
++;
2336 list_SST_LIVINGS
[list_SST_LIVINGS__count
] = it
->first
;
2337 list_SST_LIVINGS__count
++;
2345 //------------------------------------------------------------------
2347 Stage__SuperType_ToStr( const int _sst
)
2352 return wxT("Other");
2354 return wxT("Geometry");
2356 return wxT("Control");
2358 return wxT("Visual Fx");
2360 return wxT("Stuff");
2361 case SST_DECORATION
:
2362 return wxT("Decoration");
2364 return wxT("Living");
2370 //------------------------------------------------------------------
2372 Stage__SuperType_ToInt( const wxString
& _sst
)
2374 if( _sst
== wxT("Other" ))
2376 if( _sst
== wxT("Geometry" ))
2377 return SST_GEOMETRY
;
2378 if( _sst
== wxT("Control" ))
2380 if( _sst
== wxT("Visual Fx" ))
2381 return SST_VISUAL_FX
;
2382 if( _sst
== wxT("Stuff" ))
2384 if( _sst
== wxT("Decoration" ))
2385 return SST_DECORATION
;
2386 if( _sst
== wxT("Living" ))
2391 //------------------------------------------------------------------
2393 Stage__SuperType_Get_Type_Array( const int _sst
, size_t& arr_size
)
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
;
2437 //------------------------------------------------------------------
2439 Stage__Type__Get_SuperType( const int _sobj_type
)
2443 map
<int,int>::iterator
it(assoc_type_supertype
.find(_sobj_type
));
2444 if( it
== assoc_type_supertype
.end() )
2450 //------------------------------------------------------------------
2452 Stage__Type_Is_in_SuperType( const int _stype
, const int _sst
)
2454 return (Stage__Type__Get_SuperType( _stype
) == _sst
);
2457 //------------------------------------------------------------------
2459 Stage__Type_ToInt( const wxString
& _sst
)
2461 if( _sst
== wxT("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" ))
2471 if( _sst
== wxT("Hole" ))
2473 if( _sst
== wxT("Wait" ))
2475 if( _sst
== wxT("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" ))
2485 if( _sst
== wxT("ShadowColor" ))
2486 return SOBJ_SHADOWCOLOR
;
2487 if( _sst
== wxT("ShadowAlpha" ))
2488 return SOBJ_SHADOWALPHA
;
2489 if( _sst
== wxT("Light" ))
2491 if( _sst
== wxT("Trap" ))
2493 if( _sst
== wxT("Shot" ))
2495 if( _sst
== wxT("Item" ))
2497 if( _sst
== wxT("Obstacle" ))
2498 return SOBJ_OBSTACLE
;
2499 if( _sst
== wxT("Steamer" ))
2500 return SOBJ_STEAMER
;
2501 if( _sst
== wxT("none" ))
2503 if( _sst
== wxT("Panel" ))
2505 if( _sst
== wxT("Npc" ))
2507 if( _sst
== wxT("Enemy" ))
2509 return STAGETYPE_NONE
;
2512 //------------------------------------------------------------------
2514 Stage__Type_ToStr( const int _sst
)
2521 return wxT("EndLevel");
2522 case SOBJ_PLAYER_SPAWN
:
2523 return wxT("Player Spawn");
2524 case SOBJ_SETPALETTE
:
2525 return wxT("SetPalette");
2533 return wxT("NoJoin");
2535 return wxT("CanJoin");
2537 return wxT("Scroll[zx]");
2539 return wxT("Blockade");
2541 return wxT("Group");
2542 case SOBJ_SHADOWCOLOR
:
2543 return wxT("ShadowColor");
2544 case SOBJ_SHADOWALPHA
:
2545 return wxT("ShadowAlpha");
2547 return wxT("Light");
2555 return wxT("Obstacle");
2557 return wxT("Steamer");
2561 return wxT("Panel");
2565 return wxT("Enemy");
2567 return wxT("NoType");