/** * Author: dkanus * Home repo: https://www.insultplayers.ru/git/AcediaFramework/AcediaCore * License: GPL * Copyright 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 Entity extends AcediaObject abstract; /// Describes a "blueprint" for creating a brand new entity. struct Template { /// A type field that new entity will have. /// /// For vanilla Killing Floor classes this will coincide with `class` name. var public Text type; /// Set of tags that will be associated with new entity. /// /// Can be used to mark intended purpose of a corresponding entity. /// For instance, weapons might be tagged as "main", "secondary", or "offhand", while enemies /// could be categorized as "trash", "minor", "tough", "brutal" or "boss". var public array tags; /// A list of components that the new entity will initially possess, each defining specific /// functionalities or properties, such as health, position, or abilities. var public array components; }; /// Record entity's type. /// /// `none` means no type is set. /// Should only be accessible through this class. When returning its value or receiving tags from/to /// the user, an independent copy must be made. var protected Text type; /// Set of tags associated with this entity. /// /// Should not contain `none`s. Every `Text` item in the array should only be accessible through /// this class. When returning an array or receiving tags from/to the user, an independent copy must /// be made. var protected array tags; /// Returns a copy of the type of the current instance, or `none` if no type is set. public function Text GetType() { if (type == none) { return none; } return type.Copy(); } /// Sets the type of the current instance to a copy of `newType`, or `none` if `newType` is `none`. public function SetType(BaseText newType) { if (newType == none) { type = none; } else { type = newType.Copy(); } } /// Retrieves all tags associated with the instance and returns them as an array. /// /// The result is guaranteed to contain no `none`s. public function array GetTags() { local int i; local array result; i = 0; while (i < tags.length) { // Check for `none` just in case someone messed up a variable that is only the `protected` if (tags[i] == none) { tags.Remove(i, 1); } else { result[result.length] = tags[i].Copy(); i += 1; } } return result; } /// Clears existing set of tags and sets new tags based on `newTags`, copying // each tag that is not `none`. public function SetTags(array newTags) { local int i; _.memory.FreeMany(tags); tags.length = 0; for (i = 0; i < newTags.length; i += 1) { if (newTags[i] != none) { tags[tags.length] = newTags[i].Copy(); } } } defaultproperties { }