Skip to content
This repository has been archived by the owner on Oct 4, 2024. It is now read-only.

Commit

Permalink
console: add /give command
Browse files Browse the repository at this point in the history
  • Loading branch information
rr- committed Sep 4, 2024
1 parent e93efa1 commit a63bf69
Show file tree
Hide file tree
Showing 9 changed files with 174 additions and 19 deletions.
3 changes: 2 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
7 changes: 7 additions & 0 deletions COMMANDS.md
Original file line number Diff line number Diff line change
Expand Up @@ -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}`
Expand Down
7 changes: 6 additions & 1 deletion data/ship/cfg/TR2X_gameflow.json5
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down Expand Up @@ -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",
Expand All @@ -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",
Expand Down
64 changes: 64 additions & 0 deletions src/game/console_cmd.c
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand All @@ -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);
Expand Down Expand Up @@ -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) {
Expand Down Expand Up @@ -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 },
Expand Down
5 changes: 5 additions & 0 deletions src/game/game_string.def
Original file line number Diff line number Diff line change
Expand Up @@ -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")
Expand All @@ -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")
Expand Down
3 changes: 3 additions & 0 deletions src/game/inventory.c
Original file line number Diff line number Diff line change
Expand Up @@ -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];
Expand Down
99 changes: 83 additions & 16 deletions src/game/lara/lara_cheat.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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)
Expand Down
3 changes: 3 additions & 0 deletions src/game/lara/lara_cheat.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);
2 changes: 1 addition & 1 deletion src/game/objects/names.def
Original file line number Diff line number Diff line change
Expand Up @@ -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")
Expand Down

0 comments on commit a63bf69

Please # to comment.