2017-04-17 10:27:19 +00:00
|
|
|
/*
|
|
|
|
** a_pickups.cpp
|
|
|
|
** Inventory base class implementation
|
|
|
|
**
|
|
|
|
**---------------------------------------------------------------------------
|
|
|
|
** Copyright 2005-2016 Randy Heit
|
|
|
|
** Copyright 2005-2016 Cheistoph Oelckers
|
|
|
|
** All rights reserved.
|
|
|
|
**
|
|
|
|
** Redistribution and use in source and binary forms, with or without
|
|
|
|
** modification, are permitted provided that the following conditions
|
|
|
|
** are met:
|
|
|
|
**
|
|
|
|
** 1. Redistributions of source code must retain the above copyright
|
|
|
|
** notice, this list of conditions and the following disclaimer.
|
|
|
|
** 2. Redistributions in binary form must reproduce the above copyright
|
|
|
|
** notice, this list of conditions and the following disclaimer in the
|
|
|
|
** documentation and/or other materials provided with the distribution.
|
|
|
|
** 3. The name of the author may not be used to endorse or promote products
|
|
|
|
** derived from this software without specific prior written permission.
|
|
|
|
**
|
|
|
|
** THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
|
|
|
** IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
|
|
|
** OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
|
|
|
** IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
|
|
** INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
|
|
|
** NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
|
|
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
|
|
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
|
|
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
|
|
|
** THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
|
|
**---------------------------------------------------------------------------
|
|
|
|
**
|
|
|
|
*/
|
|
|
|
|
2016-03-01 15:47:10 +00:00
|
|
|
#include <assert.h>
|
|
|
|
|
|
|
|
#include "gstrings.h"
|
2019-02-01 17:15:49 +00:00
|
|
|
#include "sbar.h"
|
2016-03-01 15:47:10 +00:00
|
|
|
#include "doomstat.h"
|
|
|
|
#include "d_player.h"
|
2017-04-12 23:12:04 +00:00
|
|
|
#include "vm.h"
|
2017-01-08 17:45:30 +00:00
|
|
|
#include "g_levellocals.h"
|
2016-03-01 15:47:10 +00:00
|
|
|
|
2016-11-30 11:24:50 +00:00
|
|
|
EXTERN_CVAR(Bool, sv_unlimited_pickup)
|
2016-03-01 15:47:10 +00:00
|
|
|
|
|
|
|
|
|
|
|
//===========================================================================
|
|
|
|
//
|
2018-12-04 17:16:01 +00:00
|
|
|
// This is only native so it can have some static storage for comparison.
|
2016-03-01 15:47:10 +00:00
|
|
|
//
|
|
|
|
//===========================================================================
|
2017-01-19 19:56:31 +00:00
|
|
|
static int StaticLastMessageTic;
|
|
|
|
static FString StaticLastMessage;
|
2016-03-01 15:47:10 +00:00
|
|
|
|
2018-12-04 17:16:01 +00:00
|
|
|
void PrintPickupMessage(bool localview, const FString &str)
|
2016-03-01 15:47:10 +00:00
|
|
|
{
|
2017-01-19 19:56:31 +00:00
|
|
|
if (str.IsNotEmpty() && localview && (StaticLastMessageTic != gametic || StaticLastMessage.Compare(str)))
|
2016-03-01 15:47:10 +00:00
|
|
|
{
|
2017-01-19 19:56:31 +00:00
|
|
|
StaticLastMessageTic = gametic;
|
|
|
|
StaticLastMessage = str;
|
|
|
|
const char *pstr = str.GetChars();
|
2018-12-04 17:16:01 +00:00
|
|
|
|
2017-01-19 19:56:31 +00:00
|
|
|
if (pstr[0] == '$') pstr = GStrings(pstr + 1);
|
|
|
|
if (pstr[0] != 0) Printf(PRINT_LOW, "%s\n", pstr);
|
|
|
|
StatusBar->FlashCrosshair();
|
2016-03-01 15:47:10 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
//===========================================================================
|
|
|
|
//
|
|
|
|
// AInventory :: DepleteOrDestroy
|
|
|
|
//
|
|
|
|
// If the item is depleted, just change its amount to 0, otherwise it's destroyed.
|
|
|
|
//
|
|
|
|
//===========================================================================
|
|
|
|
|
2018-12-04 16:00:48 +00:00
|
|
|
void DepleteOrDestroy (AActor *item)
|
2016-03-01 15:47:10 +00:00
|
|
|
{
|
2018-12-04 16:00:48 +00:00
|
|
|
IFVIRTUALPTRNAME(item, NAME_Inventory, DepleteOrDestroy)
|
2016-03-01 15:47:10 +00:00
|
|
|
{
|
2018-12-02 13:56:10 +00:00
|
|
|
VMValue params[1] = { item };
|
2017-04-12 23:12:04 +00:00
|
|
|
VMCall(func, params, 1, nullptr, 0);
|
2016-03-01 15:47:10 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
//===========================================================================
|
|
|
|
//
|
2017-01-19 22:42:12 +00:00
|
|
|
// AInventory :: CallTryPickup
|
2016-03-01 15:47:10 +00:00
|
|
|
//
|
|
|
|
//===========================================================================
|
|
|
|
|
2018-12-04 16:00:48 +00:00
|
|
|
bool CallTryPickup(AActor *item, AActor *toucher, AActor **toucher_return)
|
2016-03-01 15:47:10 +00:00
|
|
|
{
|
2017-01-19 22:42:12 +00:00
|
|
|
static VMFunction *func = nullptr;
|
2017-01-31 12:41:23 +00:00
|
|
|
if (func == nullptr) PClass::FindFunction(&func, NAME_Inventory, NAME_CallTryPickup);
|
2018-11-29 23:06:20 +00:00
|
|
|
VMValue params[2] = { (DObject*)item, toucher };
|
2017-01-19 22:42:12 +00:00
|
|
|
VMReturn ret[2];
|
|
|
|
int res;
|
|
|
|
AActor *tret;
|
|
|
|
ret[0].IntAt(&res);
|
|
|
|
ret[1].PointerAt((void**)&tret);
|
2017-04-12 23:12:04 +00:00
|
|
|
VMCall(func, params, 2, ret, 2);
|
2017-01-19 22:42:12 +00:00
|
|
|
if (toucher_return) *toucher_return = tret;
|
|
|
|
return !!res;
|
2016-03-01 15:47:10 +00:00
|
|
|
}
|
|
|
|
|