/**
* Author: dkanus
* Home repo: https://www.insultplayers.ru/git/AcediaFramework/AcediaCore
* License: GPL
* Copyright 2021-2024 Anton Tarasenko
*------------------------------------------------------------------------------
* This file is part of Acedia.
*
* Acedia is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3 of the License, or
* (at your option) any later version.
*
* Acedia is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Acedia. If not, see .
*/
class TradingGameplayAPI extends AcediaObject
abstract;
//! Subset of functionality for dealing with everything related to traders.
/// Describes a cost of an item.
///
/// The money that can be used to buy a single item is described by a set of
/// costs: each cost outlines which currencies and what amounts are necessary to
/// purchase an item.
/// This structure represents one such cost, pairing currencies and costs with
/// the same indices.
struct TradableCost {
var public array requiredCurrencies;
var public int requiredAmounts;
};
var protected SimpleSignal onStartSignal;
var protected SimpleSignal onEndSignal;
var protected Trading_OnSelect_Signal onTraderSelectSignal;
protected function Constructor() {
onStartSignal = SimpleSignal(_.memory.Allocate(class'SimpleSignal'));
onEndSignal = SimpleSignal(_.memory.Allocate(class'SimpleSignal'));
onTraderSelectSignal = Trading_OnSelect_Signal(
_.memory.Allocate(class'Trading_OnSelect_Signal'));
}
protected function Finalizer() {
_.memory.Free(onStartSignal);
_.memory.Free(onEndSignal);
_.memory.Free(onTraderSelectSignal);
onStartSignal = none;
onEndSignal = none;
onTraderSelectSignal = none;
}
/// Signal that will be emitted whenever trading time starts.
///
/// # Signal signature
///
/// void ()
/* SIGNAL */
public final function SimpleSlot OnStart(AcediaObject receiver) {
return SimpleSlot(onStartSignal.NewSlot(receiver));
}
/// Signal that will be emitted whenever trading time ends.
///
/// # Signal signature
///
/// void ()
/* SIGNAL */
public final function SimpleSlot OnEnd(AcediaObject receiver) {
return SimpleSlot(onEndSignal.NewSlot(receiver));
}
/// Signal that will be emitted whenever a new trader is selected.
///
/// # Signal signature
///
/// void (EPawn target, EPawn instigator, HashTable damageData)
///
/// Parameters [`oldTrader`] and [`newTrader`] refer previously selected and
/// currently (after this event) selected trader respectively.
/// Both arguments are allowed to be `none`.
/* SIGNAL */
public final function Trading_OnSelect_Slot OnTraderSelected(AcediaObject receiver) {
return Trading_OnSelect_Slot(onTraderSelectSignal.NewSlot(receiver));
}
/// Returns an array with all existing traders on the level, including those
/// that are disabled.
///
/// The array is guaranteed to not contain any `none` references.
public function array GetTraders();
/// Retrieves a trader by the given name `traderName`.
///
/// If multiple traders share the same name, this function returns one
/// arbitrarily.
/// The trader name is case-sensitive.
/// It returns an [`ETrader`] for a valid `traderName` or `none` if no trader
/// matches the name or if the name itself is `none`.
public function ETrader GetTrader(BaseText traderName);
/// Fetches a trader that is currently accessible to the specified player.
///
/// If several traders are accessible, one is chosen at random.
/// This function returns an [`ETrader`] that the specified player can use or
/// `none` if the player cannot use any trader at the moment.
public function ETrader GetTraderFor(EPlayer player);
/// Checks whether trading is currently active in the game.
///
/// In the classic KF game mode, this means it is trader time and one or more
/// traders are open.
/// However, this interface allows trading to be active at any time,
/// independently of game mode conditions.
/// Trading should only be permitted when this function returns active status.
/// This function returns `true` if trading is active and `false` otherwise.
public function bool IsTradingActive();
/// Alters the current status of trading.
///
/// See [`TradingGameplayAPI::IsTradingActive()`] for behavior details.
public function SetTradingStatus(bool makeActive);
/// Returns the duration, in seconds, that the trading period will last.
///
/// In the classic KF game mode, the trading time defaults to 60 seconds.
/// This function returns the duration of the trading period in seconds.
///
/// Returned negative values mean that trading time has no time limit.
public function int GetTradingInterval();
/// Sets the duration of the trading period, in seconds, for the current round.
///
/// This setting affects only the current round and lasts until the end of
/// the map.
/// In the classic KF game mode, it refers to setting the trading time, which
/// defaults to 60 seconds.
/// The [`newTradingInterval`] specifies the new length of the trading period.
///
/// Negative values mean no time limit.
public function SetTradingInterval(int newTradingInterval);
/// Returns the remaining time, in seconds, of the current trading period.
///
/// In the classic KF game mode, this refers to the remaining time for trading.
/// This function indicates how much time is left in the current trading period.
/// It returns `0` if trading is currently inactive.
/// Returned negative values mean that trading is active, but has no time limit.
public function int GetCountdown();
/// Modifies the remaining time, in seconds, of the current trading period.
///
/// This setting can immediately end the trading period if set to `0`.
/// Negative values would disable time limit on the current trading.
/// In the classic KF game mode, this adjustment impacts the ongoing
/// trader time.
public function SetCountdown(int newTradingInterval);
/// Checks if the trading countdown has been paused.
///
/// This pause affects only the current trading period and resets after
/// the period ends.
/// It returns `true` if the countdown is paused and `false` otherwise.
/// If trading is inactive, it also returns `false`.
public function bool IsCountdownPaused();
/// Sets whether the trading countdown should be paused.
///
/// This pause impacts only the current trading period and will reset when
/// the next period starts.
/// The [`doPause`] parameter is `true` to pause the countdown and `false` to
/// resume it.
/// If trading time is currently inactive, this operation does nothing.
public function SetCountdownPause(bool doPause);
/// Retrieves the currently selected trader.
///
/// In classic KF game mode, the selected trader is indicated by the arrow in
/// the HUD's top left corner and by the red wisp during trading time.
/// This interface allows generalization of the selected trader concept to any
/// specially marked trader or avoids using it entirely.
///
/// After calling [`SelectTrader()`], [`GetSelectedTrader()`] should return
/// the specified [`ETrader`].
/// If the selected trader changes through other means, it should trigger
/// the [`OnTraderSelected()`] signal first.
public function ETrader GetSelectedTrader();
/// Changes the currently selected trader.
///
/// Refer to [`GetSelectedTrader()`] for detailed behavior.
public function SelectTrader(ETrader newSelection);
defaultproperties {
}