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" );
123 lLine = String_Create();
125 lLine = String_Set( lLine, fgets( lHandle ) );
130 lMapInfo = Nex_MapDB_GetByPath( lLine );
131 if( lMapInfo == null_entity ) {
132 print( MAPLIST, ": Map '", lLine, "' not found in database - ignored\n" );
136 lCycle.descList = Util_AltStringPushBack( lCycle.descList, lMapInfo.normal );
137 lCycle.valueList = Util_AltStringPushBack( lCycle.valueList, lMapInfo.link );
139 String_Free( lLine );
143 DataLink_Nex_MapList_UpdateRange( lCycle );
144 Nex_MapSelector_Synchronize();
147 // TODO: Make MaxPlayers real Data items (no container with correct set behavior)
148 void() Nex_Action_Map_Start =
151 local float lNumBots, lSkill;
152 // we need to set the following var
153 lItem = Menu_GetItem( "::Data::Server::NumBots" );
154 lNumBots = stof( lItem.value );
155 lItem = Menu_GetItem( "::Data::Server::BotSkill" );
156 lSkill = stof( lItem.value );
158 cvar_set( "saved1", "1" );
159 cvar_set( "scratch1", ftos( pow( 2, lNumBots ) - 1 ) );
160 cvar_set( "scratch2", ftos( lSkill * (pow(4, min(lNumBots, 8)) - 1) / 3) );
161 cvar_set( "scratch3", ftos( lSkill * (pow(4, min(lNumBots - 8, 8)) - 1) / 3) );
163 lItem = Menu_GetItem( "::Data::Server::MaxPlayers" );
164 cmd( "maxplayers \"" );
168 lItem = Menu_GetItem( "::Data::Server::Map::Cycle" );
170 cmd( String_Normal( Util_GetAltStringItem( lItem.valueList, 0 ) ) );
173 Nex_WriteCycleList();
175 // force the menu to hide
179 // cycle list edit features
180 void() Nex_Action_Cycle_Add =
187 lList = Menu_GetItem( "::Data::Server::Map::List" );
188 lCycle = Menu_GetItem( "::Data::Server::Map::Cycle" );
190 lName = DataLink_Nex_MapList_GetCurrentName( lList );
191 lPath = DataLink_Nex_MapList_GetCurrentPath( lList );
193 DataLink_Nex_MapList_InsertEntryAfter( lCycle, lName, lPath );
195 String_Free( lName );
196 String_Free( lPath );
198 lCycle._realValue = lCycle._realValue + 1;
199 Raise_DataEvent( lCycle, ITEM_DATALINK_SET );
201 Nex_MapSelector_Synchronize();
204 void() Nex_Action_Cycle_Remove =
208 lCycle = Menu_GetItem( "::Data::Server::Map::Cycle" );
209 DataLink_Nex_MapList_DeleteEntry( lCycle );
211 Nex_MapSelector_Synchronize();
214 void() Nex_Action_Cycle_MoveUp =
218 lCycle = Menu_GetItem( "::Data::Server::Map::Cycle" );
219 DataLink_Nex_MapList_MoveEntryUp( lCycle );
221 lCycle._realValue = lCycle._realValue - 1;
222 Raise_DataEvent( lCycle, ITEM_DATALINK_SET );
224 Nex_MapSelector_Synchronize();
227 void() Nex_Action_Cycle_MoveDown =
231 lCycle = Menu_GetItem( "::Data::Server::Map::Cycle" );
232 DataLink_Nex_MapList_MoveEntryDown( lCycle );
234 lCycle._realValue = lCycle._realValue + 1;
235 Raise_DataEvent( lCycle, ITEM_DATALINK_SET );
237 Nex_MapSelector_Synchronize();
240 void() Nex_Action_Cycle_Clear =
244 lCycle = Menu_GetItem( "::Data::Server::Map::Cycle" );
245 DataLink_Nex_MapList_Clear( lCycle );
247 Nex_MapSelector_Synchronize();