console: add /give command

This commit is contained in:
Marcin Kurczewski 2024-09-04 19:57:09 +02:00
parent bab4642cdc
commit 5ca75e447a
No known key found for this signature in database
GPG Key ID: CC65E6FD28CAE42A
9 changed files with 174 additions and 19 deletions

View File

@ -8,8 +8,9 @@
- `/save [slot]`
- `/exit`
- `/fly`
- `/flip`
- `/give`
- `/kill`
- `/flip`
- added `/tp` console command's ability to teleport to specific items
- added `/fly` console command's ability to open nearest doors
- added an option to fix M16 accuracy while running (#45)

View File

@ -19,6 +19,13 @@ Currently supported commands:
- `/fly`
Turns on the fly cheat. Why even walk?
- `/give {item_name}`
`/give {num} {item_name}`
`/give all`
`/give guns`
`/give keys`
Gives Lara an item. Try `/give guns` to arm her to the teeth, and `/give keys` to get her all important puzzle items. Ain't nobody got time for searching!
- `/kill`
`/kill all`
`/kill {enemy_type}`

View File

@ -220,7 +220,7 @@
"O_COMPASS_ITEM": "Compass",
"O_PISTOL_ITEM": "Pistols",
"O_SHOTGUN_ITEM": "Shotgun",
"O_MAGNUM_ITEM": "Magnums",
"O_MAGNUM_ITEM": "Automatic Pistols",
"O_UZI_ITEM": "Uzis",
"O_HARPOON_ITEM": "Harpoon",
"O_M16_ITEM": "M16",
@ -360,6 +360,10 @@
"OSD_POS_SET_ROOM_FAIL": "Failed to teleport to room: %d",
"OSD_POS_SET_ITEM": "Teleported to object: %s",
"OSD_POS_SET_ITEM_FAIL": "Failed to teleport to object: %s",
"OSD_GIVE_ITEM": "Added %s to Lara's inventory",
"OSD_GIVE_ITEM_ALL_KEYS": "Surprise! Every key item Lara needs is now in her backpack.",
"OSD_GIVE_ITEM_ALL_GUNS": "Lock'n'load - Lara's armed to the teeth!",
"OSD_GIVE_ITEM_CHEAT": "Lara's backpack just got way heavier!",
"OSD_FLIPMAP_ON": "Flipmap set to ON",
"OSD_FLIPMAP_OFF": "Flipmap set to OFF",
"OSD_FLIPMAP_FAIL_ALREADY_ON": "Flipmap is already ON",
@ -370,6 +374,7 @@
"OSD_KILL_FAIL": "No enemy nearby...",
"OSD_COMPLETE_LEVEL": "Level complete!",
"OSD_PLAY_LEVEL": "Loading %s",
"OSD_INVALID_ITEM": "Invalid item: %s",
"OSD_INVALID_ROOM": "Invalid room: %d. Valid rooms are 0-%d",
"OSD_INVALID_OBJECT": "Invalid object",
"OSD_OBJECT_NOT_FOUND": "Object not found",

View File

@ -5,6 +5,7 @@
#include "game/creature.h"
#include "game/game_string.h"
#include "game/gameflow/gameflow_new.h"
#include "game/inventory.h"
#include "game/items.h"
#include "game/lara/lara_cheat.h"
#include "game/lara/lara_control.h"
@ -31,6 +32,7 @@ static COMMAND_RESULT Console_Cmd_SetHealth(const char *args);
static COMMAND_RESULT Console_Cmd_Heal(const char *args);
static COMMAND_RESULT Console_Cmd_Fly(const char *const args);
static COMMAND_RESULT Console_Cmd_FlipMap(const char *args);
static COMMAND_RESULT Console_Cmd_GiveItem(const char *args);
static COMMAND_RESULT Console_Cmd_Kill(const char *args);
static COMMAND_RESULT Console_Cmd_EndLevel(const char *args);
static COMMAND_RESULT Console_Cmd_StartLevel(const char *args);
@ -385,6 +387,66 @@ static COMMAND_RESULT Console_Cmd_Kill(const char *args)
}
}
static COMMAND_RESULT Console_Cmd_GiveItem(const char *args)
{
if (g_GameInfo.current_level.type == GFL_TITLE
|| g_GameInfo.current_level.type == GFL_DEMO
|| g_GameInfo.current_level.type == GFL_CUTSCENE) {
return CR_UNAVAILABLE;
}
if (g_LaraItem == NULL) {
return CR_UNAVAILABLE;
}
if (String_Equivalent(args, "keys")) {
return Lara_Cheat_GiveAllKeys() ? CR_SUCCESS : CR_FAILURE;
}
if (String_Equivalent(args, "guns")) {
return Lara_Cheat_GiveAllGuns() ? CR_SUCCESS : CR_FAILURE;
}
if (String_Equivalent(args, "all")) {
return Lara_Cheat_GiveAllItems() ? CR_SUCCESS : CR_FAILURE;
}
int32_t num = 1;
if (sscanf(args, "%d ", &num) == 1) {
args = strstr(args, " ");
if (!args) {
return CR_BAD_INVOCATION;
}
args++;
}
if (String_Equivalent(args, "")) {
return CR_BAD_INVOCATION;
}
bool found = false;
int32_t match_count = 0;
GAME_OBJECT_ID *matching_objs = Object_IdsFromName(args, &match_count);
for (int32_t i = 0; i < match_count; i++) {
const GAME_OBJECT_ID obj_id = matching_objs[i];
if (Object_IsObjectType(obj_id, g_PickupObjects)) {
if (g_Objects[obj_id].loaded) {
Inv_AddItemNTimes(obj_id, num);
Console_Log(GS(OSD_GIVE_ITEM), Object_GetName(obj_id));
found = true;
}
}
}
Memory_FreePointer(&matching_objs);
if (!found) {
Console_Log(GS(OSD_INVALID_ITEM), args);
return CR_FAILURE;
}
return CR_SUCCESS;
}
static COMMAND_RESULT Console_Cmd_EndLevel(const char *const args)
{
if (strcmp(args, "") == 0) {
@ -532,6 +594,8 @@ CONSOLE_COMMAND g_ConsoleCommands[] = {
{ .prefix = "hp", .proc = Console_Cmd_SetHealth },
{ .prefix = "heal", .proc = Console_Cmd_Heal },
{ .prefix = "fly", .proc = Console_Cmd_Fly },
{ .prefix = "give", .proc = Console_Cmd_GiveItem },
{ .prefix = "gimme", .proc = Console_Cmd_GiveItem },
{ .prefix = "flip", .proc = Console_Cmd_FlipMap },
{ .prefix = "flipmap", .proc = Console_Cmd_FlipMap },
{ .prefix = "kill", .proc = Console_Cmd_Kill },

View File

@ -7,6 +7,10 @@ GS_DEFINE(OSD_POS_SET_ROOM, "Teleported to room: %d")
GS_DEFINE(OSD_POS_SET_ROOM_FAIL, "Failed to teleport to room: %d")
GS_DEFINE(OSD_POS_SET_ITEM, "Teleported to object: %s")
GS_DEFINE(OSD_POS_SET_ITEM_FAIL, "Failed to teleport to object: %s")
GS_DEFINE(OSD_GIVE_ITEM, "Added %s to Lara's inventory")
GS_DEFINE(OSD_GIVE_ITEM_ALL_KEYS, "Surprise! Every key item Lara needs is now in her backpack.")
GS_DEFINE(OSD_GIVE_ITEM_ALL_GUNS, "Lock'n'load - Lara's armed to the teeth!")
GS_DEFINE(OSD_GIVE_ITEM_CHEAT, "Lara's backpack just got way heavier!")
GS_DEFINE(OSD_FLIPMAP_ON, "Flipmap set to ON")
GS_DEFINE(OSD_FLIPMAP_OFF, "Flipmap set to OFF")
GS_DEFINE(OSD_FLIPMAP_FAIL_ALREADY_ON, "Flipmap is already ON")
@ -17,6 +21,7 @@ GS_DEFINE(OSD_KILL, "Bye-bye!")
GS_DEFINE(OSD_KILL_FAIL, "No enemy nearby...")
GS_DEFINE(OSD_COMPLETE_LEVEL, "Level complete!")
GS_DEFINE(OSD_PLAY_LEVEL, "Loading %s")
GS_DEFINE(OSD_INVALID_ITEM, "Invalid item: %s")
GS_DEFINE(OSD_INVALID_ROOM, "Invalid room: %d. Valid rooms are 0-%d")
GS_DEFINE(OSD_INVALID_OBJECT, "Invalid object")
GS_DEFINE(OSD_OBJECT_NOT_FOUND, "Object not found")

View File

@ -947,6 +947,9 @@ GAME_OBJECT_ID Inv_GetItemOption(const GAME_OBJECT_ID object_id)
int32_t __cdecl Inv_AddItem(const GAME_OBJECT_ID object_id)
{
const GAME_OBJECT_ID inv_object_id = Inv_GetItemOption(object_id);
if (!g_Objects[object_id].loaded) {
return false;
}
for (int32_t i = 0; i < g_Inv_MainObjectsCount; i++) {
const INVENTORY_ITEM *const inv_item = g_Inv_MainList[i];

View File

@ -21,6 +21,48 @@
#include <libtrx/utils.h>
#include <libtrx/vector.h>
static void Lara_Cheat_GiveAllGunsImpl(void);
static void Lara_Cheat_GiveAllMedpacksImpl(void);
static void Lara_Cheat_GiveAllKeysImpl(void);
static void Lara_Cheat_GiveAllGunsImpl(void)
{
Inv_AddItem(O_PISTOL_ITEM);
Inv_AddItem(O_MAGNUM_ITEM);
Inv_AddItem(O_UZI_ITEM);
Inv_AddItem(O_SHOTGUN_ITEM);
Inv_AddItem(O_HARPOON_ITEM);
Inv_AddItem(O_M16_ITEM);
Inv_AddItem(O_GRENADE_ITEM);
g_Lara.magnum_ammo.ammo = 1000;
g_Lara.uzi_ammo.ammo = 2000;
g_Lara.shotgun_ammo.ammo = 300;
g_Lara.harpoon_ammo.ammo = 300;
g_Lara.m16_ammo.ammo = 300;
g_Lara.grenade_ammo.ammo = 300;
}
static void Lara_Cheat_GiveAllMedpacksImpl(void)
{
Inv_AddItemNTimes(O_FLARES_ITEM, 10);
Inv_AddItemNTimes(O_SMALL_MEDIPACK_ITEM, 10);
Inv_AddItemNTimes(O_LARGE_MEDIPACK_ITEM, 10);
}
static void Lara_Cheat_GiveAllKeysImpl(void)
{
Inv_AddItem(O_PUZZLE_ITEM_1);
Inv_AddItem(O_PUZZLE_ITEM_2);
Inv_AddItem(O_PUZZLE_ITEM_3);
Inv_AddItem(O_PUZZLE_ITEM_4);
Inv_AddItem(O_KEY_ITEM_1);
Inv_AddItem(O_KEY_ITEM_2);
Inv_AddItem(O_KEY_ITEM_3);
Inv_AddItem(O_KEY_ITEM_4);
Inv_AddItem(O_PICKUP_ITEM_1);
Inv_AddItem(O_PICKUP_ITEM_2);
}
void __cdecl Lara_Cheat_EndLevel(void)
{
g_LevelComplete = true;
@ -151,24 +193,49 @@ bool Lara_Cheat_OpenNearestDoor(void)
void __cdecl Lara_Cheat_GetStuff(void)
{
Inv_AddItem(O_PISTOL_ITEM);
Inv_AddItem(O_MAGNUM_ITEM);
Inv_AddItem(O_UZI_ITEM);
Inv_AddItem(O_SHOTGUN_ITEM);
Inv_AddItem(O_HARPOON_ITEM);
Inv_AddItem(O_M16_ITEM);
Inv_AddItem(O_GRENADE_ITEM);
Lara_Cheat_GiveAllGunsImpl();
Lara_Cheat_GiveAllMedpacksImpl();
}
Inv_AddItemNTimes(O_FLARES_ITEM, 10);
Inv_AddItemNTimes(O_SMALL_MEDIPACK_ITEM, 10);
Inv_AddItemNTimes(O_LARGE_MEDIPACK_ITEM, 10);
bool Lara_Cheat_GiveAllKeys(void)
{
if (g_LaraItem == NULL) {
return false;
}
g_Lara.magnum_ammo.ammo = 1000;
g_Lara.uzi_ammo.ammo = 2000;
g_Lara.shotgun_ammo.ammo = 300;
g_Lara.harpoon_ammo.ammo = 300;
g_Lara.m16_ammo.ammo = 300;
g_Lara.grenade_ammo.ammo = 300;
Lara_Cheat_GiveAllKeysImpl();
Sound_Effect(SFX_LARA_KEY, NULL, SPM_ALWAYS);
Console_Log(GS(OSD_GIVE_ITEM_ALL_KEYS));
return true;
}
bool Lara_Cheat_GiveAllGuns(void)
{
if (g_LaraItem == NULL) {
return false;
}
Lara_Cheat_GiveAllGunsImpl();
Sound_Effect(SFX_LARA_RELOAD, NULL, SPM_ALWAYS);
Console_Log(GS(OSD_GIVE_ITEM_ALL_GUNS));
return true;
}
bool Lara_Cheat_GiveAllItems(void)
{
if (g_LaraItem == NULL) {
return false;
}
Lara_Cheat_GiveAllGunsImpl();
Lara_Cheat_GiveAllKeysImpl();
Lara_Cheat_GiveAllMedpacksImpl();
Sound_Effect(SFX_LARA_HOLSTER, &g_LaraItem->pos, SPM_NORMAL);
Console_Log(GS(OSD_GIVE_ITEM_CHEAT));
return true;
}
bool Lara_Cheat_Teleport(int32_t x, int32_t y, int32_t z)

View File

@ -7,6 +7,9 @@ void __cdecl Lara_Cheat_EndLevel(void);
bool __cdecl Lara_Cheat_EnterFlyMode(void);
bool __cdecl Lara_Cheat_ExitFlyMode(void);
void __cdecl Lara_Cheat_GetStuff(void);
bool Lara_Cheat_GiveAllKeys(void);
bool Lara_Cheat_GiveAllGuns(void);
bool Lara_Cheat_GiveAllItems(void);
bool Lara_Cheat_OpenNearestDoor(void);
bool Lara_Cheat_Teleport(int32_t x, int32_t y, int32_t z);
bool Lara_Cheat_KillEnemy(int16_t item_num);

View File

@ -135,7 +135,7 @@ OBJ_NAME_DEFINE(O_PASSPORT_CLOSED, "Passport Closed")
OBJ_NAME_DEFINE(O_COMPASS_ITEM, "Compass")
OBJ_NAME_DEFINE(O_PISTOL_ITEM, "Pistols")
OBJ_NAME_DEFINE(O_SHOTGUN_ITEM, "Shotgun")
OBJ_NAME_DEFINE(O_MAGNUM_ITEM, "Magnums")
OBJ_NAME_DEFINE(O_MAGNUM_ITEM, "Automatic Pistols")
OBJ_NAME_DEFINE(O_UZI_ITEM, "Uzis")
OBJ_NAME_DEFINE(O_HARPOON_ITEM, "Harpoon")
OBJ_NAME_DEFINE(O_M16_ITEM, "M16")