/** * @brief Called by the client when the user type a key * @param[in] key key code, either K_ value or lowercase ascii * @param[in] unicode translated meaning of keypress in unicode * @return true, if we used the event * @todo think about what we should do when the mouse is captured */ bool UI_KeyPressed (unsigned int key, unsigned short unicode) { int windowId; int lastWindowId; if (UI_DNDIsDragging()) { if (key == K_ESCAPE) UI_DNDAbort(); return false; } if (key == K_ESCAPE && CL_BattlescapeRunning() && selActor && CL_ActorFireModeActivated(selActor->actorMode)) { /* Cancel firing with Escape, needed for Android, where right mouse click is bound to multitouch, which is non-obvious */ CL_ActorSetMode(selActor, M_MOVE); return true; } /* translate event into the node with focus */ if (focusNode && UI_Node_KeyPressed(focusNode, key, unicode)) { return true; } /* else use common behaviour */ switch (key) { case K_TAB: if (UI_FocusNextActionNode()) return true; break; case K_ENTER: case K_KP_ENTER: if (UI_FocusExecuteActionNode()) return true; break; case K_ESCAPE: if (UI_GetMouseCapture() != nullptr) { UI_MouseRelease(); return true; } UI_PopWindowWithEscKey(); return true; } lastWindowId = UI_GetLastFullScreenWindow(); if (lastWindowId < 0) return false; /* check "active" window from top to down */ for (windowId = ui_global.windowStackPos - 1; windowId >= lastWindowId; windowId--) { const uiNode_t* window = ui_global.windowStack[windowId]; if (!window) return false; if (UI_KeyPressedInWindow(key, window)) return true; if (UI_WindowIsModal(window)) break; } return false; }
/** * @brief Starts aiming/target mode for selected left/right firemode. * @note Previously know as a combination of CL_FireRightPrimary, CL_FireRightSecondary, * @note CL_FireLeftPrimary and CL_FireLeftSecondary. */ static void HUD_FireWeapon_f (void) { actorHands_t hand; fireDefIndex_t firemode; const objDef_t *ammo; const fireDef_t *fd; if (Cmd_Argc() < 3) { /* no argument given */ Com_Printf("Usage: %s <l|r> <firemode number>\n", Cmd_Argv(0)); return; } if (!selActor) return; hand = ACTOR_GET_HAND_INDEX(Cmd_Argv(1)[0]); firemode = atoi(Cmd_Argv(2)); if (firemode >= MAX_FIREDEFS_PER_WEAPON || firemode < 0) return; fd = HUD_GetFireDefinitionForHand(selActor, hand); if (fd == NULL) return; ammo = fd->obj; /* Let's check if shooting is possible. */ if (!HUD_CheckShooting(selActor, ACTOR_GET_INV(selActor, hand))) return; if (ammo->fd[fd->weapFdsIdx][firemode].time <= CL_ActorUsableTUs(selActor)) { /* Actually start aiming. This is done by changing the current mode of display. */ if (hand == ACTOR_HAND_RIGHT) CL_ActorSetMode(selActor, M_FIRE_R); else CL_ActorSetMode(selActor, M_FIRE_L); /* Store firemode. */ selActor->currentSelectedFiremode = firemode; } else { /* Cannot shoot because of not enough TUs - every other * case should be checked previously in this function. */ HUD_DisplayMessage(_("Can't perform action:\nnot enough TUs.\n")); } }
static void HUD_SetMoveMode_f (void) { if (!selActor) return; CL_ActorSetMode(selActor, M_MOVE); }