88#include " Pedestrian.h"
99#include " MemoryManager.h"
1010
11+ static const char * InputsConfigPath = " config/inputs.json" ;
12+
13+ // ////////////////////////////////////////////////////////////////////////
14+
1115CarnageGame gCarnageGame ;
1216
17+ // ////////////////////////////////////////////////////////////////////////
18+
1319bool CarnageGame::Initialize ()
1420{
1521 gGameCheatsWindow .mWindowShown = true ; // show by default
1622
23+ SetInputActionsFromConfig ();
24+
1725 gGameRules .LoadDefaults ();
1826 if (gSystem .mStartupParams .mDebugMapName .empty ())
1927 {
@@ -70,7 +78,7 @@ bool CarnageGame::Initialize()
7078 }
7179
7280 mPlayerPedestrian = mObjectsManager .CreatePedestrian (pos);
73- mHumanController .SetCharacter (mPlayerPedestrian );
81+ mHumanCharacters [ 0 ] .SetCharacter (mPlayerPedestrian );
7482
7583 SetCameraController (&mFollowCameraController );
7684
@@ -115,22 +123,30 @@ void CarnageGame::InputEvent(KeyInputEvent& inputEvent)
115123 return ;
116124 }
117125
118- mHumanController .InputEvent (inputEvent);
119-
120126 if (inputEvent.mKeycode == eKeycode_ESCAPE && inputEvent.mPressed )
121127 {
122128 gSystem .QuitRequest ();
129+ return ;
123130 }
124131
125132 if (inputEvent.mKeycode == eKeycode_C && inputEvent.mPressed )
126133 {
127134 gGameCheatsWindow .mWindowShown = !gGameCheatsWindow .mWindowShown ;
135+ return ;
128136 }
129137
130138 if (mCameraController )
131139 {
132140 mCameraController ->InputEvent (inputEvent);
133141 }
142+
143+ for (HumanCharacterController& currentController: mHumanCharacters )
144+ {
145+ if (inputEvent.mConsumed )
146+ break ;
147+
148+ currentController.InputEvent (inputEvent);
149+ }
134150}
135151
136152void CarnageGame::InputEvent (MouseButtonInputEvent& inputEvent)
@@ -163,7 +179,13 @@ void CarnageGame::InputEvent(KeyCharEvent& inputEvent)
163179
164180void CarnageGame::InputEvent (GamepadInputEvent& inputEvent)
165181{
166-
182+ for (int icurr = 0 ; icurr < GAME_MAX_PLAYERS; ++icurr)
183+ {
184+ if (inputEvent.mConsumed )
185+ break ;
186+
187+ mHumanCharacters [icurr].InputEvent (inputEvent);
188+ }
167189}
168190
169191void CarnageGame::SetCameraController (CameraController* controller)
@@ -177,3 +199,38 @@ void CarnageGame::SetCameraController(CameraController* controller)
177199 mCameraController ->SetupInitial ();
178200 }
179201}
202+
203+ bool CarnageGame::SetInputActionsFromConfig ()
204+ {
205+ std::string jsonContent;
206+ if (!gFiles .ReadTextFile (InputsConfigPath, jsonContent))
207+ {
208+ gConsole .LogMessage (eLogMessage_Warning, " Cannot load input config from '%s'" , InputsConfigPath);
209+ return false ;
210+ }
211+
212+ cxx::config_document configDocument;
213+ if (!configDocument.parse_document (jsonContent.c_str ()))
214+ {
215+ gConsole .LogMessage (eLogMessage_Warning, " Cannot parse input config document" );
216+ return false ;
217+ }
218+
219+ cxx::string_buffer_32 tempString;
220+ for (int iplayer = 0 ; iplayer < GAME_MAX_PLAYERS; ++iplayer)
221+ {
222+ HumanCharacterController& currentChar = mHumanCharacters [iplayer];
223+ currentChar.mInputActionsMapping .SetNull ();
224+
225+ if (iplayer == 0 ) // force default mapping for first player
226+ {
227+ currentChar.mInputActionsMapping .SetDefaults ();
228+ }
229+
230+ tempString.printf (" player%d" , iplayer + 1 );
231+
232+ cxx::config_node configNode = configDocument.get_root_node ().get_child (tempString.c_str ());
233+ currentChar.mInputActionsMapping .SetFromConfig (configNode);
234+ }
235+ return true ;
236+ }
0 commit comments