1 // Property of Alientrap
2 // custom/creategame.qm
4 // uses target and _target
5 // requires neighbors: Picture, Name, Description
6 void() Nex_MapSelector_UpdateMap =
10 local entity lSelector;
13 lSelector = Menu_GetItem( "::Data::Server::Map::Selector" );
14 Raise_DataEvent( lSelector, ITEM_DATALINK_GET );
15 lIndex = lSelector._realValue;
16 lInfo = Nex_MapDB_GetByIndex( lIndex );
18 // If there is a new selected map, the info panel is updated accordingly
19 if( lIndex != self.minValue ) {
20 self.minValue = lIndex;
22 lItem = Menu_GetItem( "Picture" );
23 String_EntitySet( lItem, picture, lInfo.picture );
25 lItem = Menu_GetItem( "Name" );
26 String_EntitySet( lItem, text, lInfo.normal );
28 lItem = Menu_GetItem( "Description" );
29 String_EntitySet( lItem, text, lInfo.text );
32 lItem = Menu_GetItem( "::Data::Server::Map::Cycle" );
33 DataLink_Nex_MapList_SetFirst( lItem, lInfo.normal, lInfo.link );
36 void() Nex_MapSelector_Synchronize =
39 local entity lSelector;
41 lCycle = Menu_GetItem( "::Data::Server::Map::Cycle" );
42 lSelector = Menu_GetItem( "::Data::Server::Map::Selector" );
44 if( lCycle.stepValue == 0.0 ) {
45 Raise_DataEvent( lCycle, ITEM_DATA_RESET );
48 local entity lMapInfo;
50 lPath = Util_GetAltStringItem( lCycle.valueList, 0 );
51 lMapInfo = Nex_MapDB_GetByPath( lPath );
54 if( lMapInfo == null_entity ) {
55 Raise_DataEvent( lCycle, ITEM_DATA_RESET );
57 lSelector._realValue = Nex_MapDB_GetIndex( lMapInfo );
58 Raise_DataEvent( lSelector, ITEM_DATALINK_SET );
63 // more concrete functions
64 void() Nex_Action_MapSelector_Next =
68 lItem = Menu_GetItem( "::Data::Server::Map::Selector" );
69 Raise_DataEvent( lItem, ITEM_DATALINK_GET );
70 lItem._realValue = lItem._realValue + 1;
71 Raise_DataEvent( lItem, ITEM_DATALINK_SET );
74 void() Nex_Action_MapSelector_Prev =
78 lItem = Menu_GetItem( "::Data::Server::Map::Selector" );
79 Raise_DataEvent( lItem, ITEM_DATALINK_GET );
80 lItem._realValue = lItem._realValue - 1;
81 Raise_DataEvent( lItem, ITEM_DATALINK_SET );
84 #define MAPLIST "maplist.cfg"
86 void() Nex_WriteCycleList =
93 lHandle = fopen( MAPLIST, FILE_WRITE );
95 print( "menu: Failed to write ", MAPLIST, "!\n" );
99 lCycle = Menu_GetItem( "::Data::Server::Map::Cycle" );
100 lCount = Util_GetAltStringCount( lCycle.valueList );
101 for( lIndex = 0 ; lIndex < lCount ; lIndex++ ) {
102 fputs( lHandle, String_Normal( Util_GetAltStringItem( lCycle.valueList, lIndex ) ) );
103 fputs( lHandle, "\n" );
109 void() Nex_ReadCycleList =
113 local entity lMapInfo;
116 lHandle = fopen( MAPLIST, FILE_READ );
121 lCycle = Menu_GetItem( "::Data::Server::Map::Cycle" );
122 DataLink_Nex_MapList_Clear( lCycle );
124 lLine = String_Create();
126 lLine = String_Set( lLine, fgets( lHandle ) );
131 lMapInfo = Nex_MapDB_GetByPath( lLine );
132 if( lMapInfo == null_entity ) {
133 print( MAPLIST, ": Map '", lLine, "' not found in database - ignored\n" );
137 lCycle.descList = Util_AltStringPushBack( lCycle.descList, lMapInfo.normal );
138 lCycle.valueList = Util_AltStringPushBack( lCycle.valueList, lMapInfo.link );
140 String_Free( lLine );
144 DataLink_Nex_MapList_UpdateRange( lCycle );
145 Nex_MapSelector_Synchronize();
148 // TODO: Make MaxPlayers real Data items (no container with correct set behavior)
149 void() Nex_Action_Map_Start =
152 local float lNumBots, lSkill;
153 // we need to set the following var
154 lItem = Menu_GetItem( "::Data::Server::NumBots" );
155 lNumBots = stof( lItem.value );
156 lItem = Menu_GetItem( "::Data::Server::BotSkill" );
157 lSkill = stof( lItem.value );
159 cvar_set( "saved1", "1" );
160 cvar_set( "scratch1", ftos( pow( 2, lNumBots ) - 1 ) );
161 cvar_set( "scratch2", ftos( lSkill * (pow(4, min(lNumBots, 8)) - 1) / 3) );
162 cvar_set( "scratch3", ftos( lSkill * (pow(4, min(lNumBots - 8, 8)) - 1) / 3) );
164 lItem = Menu_GetItem( "::Data::Server::MaxPlayers" );
165 cmd( "maxplayers \"" );
169 lItem = Menu_GetItem( "::Data::Server::Map::Cycle" );
171 cmd( String_Normal( Util_GetAltStringItem( lItem.valueList, 0 ) ) );
174 Nex_WriteCycleList();
176 // force the menu to hide
180 // cycle list edit features
181 void() Nex_Action_Cycle_Add =
188 lList = Menu_GetItem( "::Data::Server::Map::List" );
189 lCycle = Menu_GetItem( "::Data::Server::Map::Cycle" );
191 lName = DataLink_Nex_MapList_GetCurrentName( lList );
192 lPath = DataLink_Nex_MapList_GetCurrentPath( lList );
194 if( lCycle.stepValue == 1.0 ) {
195 DataLink_Nex_MapList_InsertEntryAfter( lCycle, lName, lPath );
197 DataLink_Nex_MapList_SetFirst( lCycle, lName, lPath );
200 String_Free( lName );
201 String_Free( lPath );
203 lCycle._realValue = lCycle._realValue + 1;
204 Raise_DataEvent( lCycle, ITEM_DATALINK_SET );
206 Nex_MapSelector_Synchronize();
209 void() Nex_Action_Cycle_Remove =
213 lCycle = Menu_GetItem( "::Data::Server::Map::Cycle" );
214 DataLink_Nex_MapList_DeleteEntry( lCycle );
216 Nex_MapSelector_Synchronize();
219 void() Nex_Action_Cycle_MoveUp =
223 lCycle = Menu_GetItem( "::Data::Server::Map::Cycle" );
224 DataLink_Nex_MapList_MoveEntryUp( lCycle );
226 lCycle._realValue = lCycle._realValue - 1;
227 Raise_DataEvent( lCycle, ITEM_DATALINK_SET );
229 Nex_MapSelector_Synchronize();
232 void() Nex_Action_Cycle_MoveDown =
236 lCycle = Menu_GetItem( "::Data::Server::Map::Cycle" );
237 DataLink_Nex_MapList_MoveEntryDown( lCycle );
239 lCycle._realValue = lCycle._realValue + 1;
240 Raise_DataEvent( lCycle, ITEM_DATALINK_SET );
242 Nex_MapSelector_Synchronize();
245 void() Nex_Action_Cycle_Clear =
249 lCycle = Menu_GetItem( "::Data::Server::Map::Cycle" );
250 DataLink_Nex_MapList_Clear( lCycle );
252 Nex_MapSelector_Synchronize();