Anton Tarasenko
2 years ago
6 changed files with 412 additions and 0 deletions
@ -0,0 +1,116 @@
|
||||
/** |
||||
* Object that is meant to describe a squad of zeds for Killing Floor spawning |
||||
* system. Zeds can be either added individually or through native squad |
||||
* definitions "3A1B2D1G1H". |
||||
* Copyright 2022 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 <https://www.gnu.org/licenses/>. |
||||
*/ |
||||
class ASquad extends AcediaObject; |
||||
|
||||
struct ZedCountPair |
||||
{ |
||||
var Text template; |
||||
var int count; |
||||
}; |
||||
|
||||
/** |
||||
* Resets caller squad, removing all zeds inside. |
||||
*/ |
||||
public function Reset(); |
||||
|
||||
/** |
||||
* Changes amount of zeds with given template inside the caller squad. |
||||
* |
||||
* @param template Template for which to change stored count. |
||||
* @param delta By how much to change zed count in squad. Negative |
||||
* values are allowed. |
||||
*/ |
||||
public function ChangeCount(BaseText template, int delta); |
||||
|
||||
/** |
||||
* Changes amount of zeds with given template inside the caller squad. |
||||
* |
||||
* @param template Template for which to change stored count. |
||||
* @param delta By how much to change zed count in squad. Negative |
||||
* values are allowed. |
||||
*/ |
||||
public final function ChangeCount_S(string template, int delta) |
||||
{ |
||||
local MutableText wrapper; |
||||
|
||||
wrapper = _.text.FromStringM(template); |
||||
ChangeCount(wrapper, delta); |
||||
wrapper.FreeSelf(); |
||||
} |
||||
|
||||
/** |
||||
* Adds zeds into the squad from the text definition format. |
||||
* |
||||
* For example "3clot5crawer1fp" will add 3 clots, 5 crawlers and 1 fleshpound |
||||
* into the squad (names are resolved via entity aliases). |
||||
* Counts inside a definition cannot be negative. |
||||
* |
||||
* @param definition Text definition of the addition to squad. |
||||
*/ |
||||
public function AddFromDefinition(BaseText definition); |
||||
|
||||
/** |
||||
* Adds zeds into the squad from the text definition format. |
||||
* |
||||
* For example "3clot5crawer1fp" will add 3 clots, 5 crawlers and 1 fleshpound |
||||
* into the squad (names are resolved via entity aliases). |
||||
* Counts inside a definition cannot be negative. |
||||
* |
||||
* @param definition Text definition of the addition to squad. |
||||
*/ |
||||
public final function AddFromDefinition_S(string definition) |
||||
{ |
||||
local MutableText wrapper; |
||||
|
||||
wrapper = _.text.FromStringM(definition); |
||||
AddFromDefinition(wrapper); |
||||
wrapper.FreeSelf(); |
||||
} |
||||
|
||||
/** |
||||
* Returns list of zeds inside caller squad as an array of zed template and |
||||
* the count of that zed in a squad. |
||||
* |
||||
* @return Array of pairs of template and corresponding zed count inside |
||||
* a squad. Guaranteed that there cannot be two array elements with |
||||
* the same template. |
||||
*/ |
||||
public function array<ZedCountPair> GetZedList(); |
||||
|
||||
/** |
||||
* Returns amount of zeds of the given template inside the caller squad. |
||||
* |
||||
* @return Current amount of zeds of the given template inside the caller |
||||
* squad. |
||||
*/ |
||||
public function int GetZedCount(BaseText template); |
||||
|
||||
/** |
||||
* Returns current total zed count inside a squad. |
||||
* |
||||
* @return Current total zed count inside a caller squad. |
||||
*/ |
||||
public function int GetTotalZedCount(); |
||||
|
||||
defaultproperties |
||||
{ |
||||
} |
@ -0,0 +1,25 @@
|
||||
/** |
||||
* Subset of functionality for dealing with everything related to traders. |
||||
* Copyright 2021 - 2022 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 <https://www.gnu.org/licenses/>. |
||||
*/ |
||||
class AWavesComponent extends AcediaObject |
||||
abstract; |
||||
|
||||
defaultproperties |
||||
{ |
||||
} |
@ -0,0 +1,237 @@
|
||||
/** |
||||
* `ASquad`'s implementation for `KF1_Frontend`. |
||||
* Copyright 2022 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 <https://www.gnu.org/licenses/>. |
||||
*/ |
||||
class AKF1_Squad extends ASquad; |
||||
|
||||
struct KF1_ZedCountPair |
||||
{ |
||||
var class<KFMonster> zedClass; |
||||
var int count; |
||||
}; |
||||
var array<KF1_ZedCountPair> squadZeds; |
||||
|
||||
protected function Finalizer() |
||||
{ |
||||
Reset(); |
||||
} |
||||
|
||||
public function Reset() |
||||
{ |
||||
squadZeds.length = 0; |
||||
} |
||||
|
||||
public function ChangeCount(BaseText template, int delta) |
||||
{ |
||||
local int pairIndex; |
||||
local class<KFMonster> templateClass; |
||||
|
||||
templateClass = class<KFMonster>(_.memory.LoadClass(template)); |
||||
if (templateClass == none) { |
||||
return; |
||||
} |
||||
pairIndex = FindPairIndex(templateClass, true); |
||||
squadZeds[pairIndex].count += delta; |
||||
if (squadZeds[pairIndex].count <= 0) { |
||||
squadZeds.Remove(pairIndex, 1); |
||||
} |
||||
} |
||||
|
||||
private function int FindPairIndex( |
||||
class<KFMonster> zedClass, |
||||
optional bool createIfMissing) |
||||
{ |
||||
local int i; |
||||
local KF1_ZedCountPair newPair; |
||||
|
||||
for (i = 0; i < squadZeds.length; i += 1) |
||||
{ |
||||
if (squadZeds[i].zedClass == zedClass) { |
||||
return i; |
||||
} |
||||
} |
||||
if (createIfMissing) |
||||
{ |
||||
newPair.zedClass = zedClass; |
||||
squadZeds[squadZeds.length] = newPair; |
||||
return (squadZeds.length - 1); |
||||
} |
||||
return -1; |
||||
} |
||||
|
||||
public function AddFromDefinition(BaseText definition) |
||||
{ |
||||
local int index, nextCount; |
||||
local Text nextTemplate; |
||||
local MutableText numericPart, idPart; |
||||
local BaseText.Character nextCharacter; |
||||
|
||||
if (definition == none) { |
||||
return; |
||||
} |
||||
while (index < definition.GetLength()) |
||||
{ |
||||
numericPart = _.text.Empty(); |
||||
idPart = _.text.Empty(); |
||||
nextCharacter = definition.GetCharacter(index); |
||||
while ( index < definition.GetLength() |
||||
&& _.text.IsDigit(nextCharacter)) |
||||
{ |
||||
numericPart.AppendCharacter(nextCharacter); |
||||
index += 1; |
||||
nextCharacter = definition.GetCharacter(index); |
||||
} |
||||
while ( index < definition.GetLength() |
||||
&& _.text.IsDigit(nextCharacter)) |
||||
{ |
||||
idPart.AppendCharacter(nextCharacter); |
||||
index += 1; |
||||
nextCharacter = definition.GetCharacter(index); |
||||
} |
||||
nextTemplate = ReadTemplateFromZedID(idPart); |
||||
nextCount = int(numericPart.ToString()); |
||||
ChangeCount(nextTemplate, nextCount); |
||||
_.memory.Free(nextTemplate); |
||||
_.memory.Free(idPart); |
||||
_.memory.Free(numericPart); |
||||
} |
||||
} |
||||
|
||||
private function Text ReadTemplateFromZedID(BaseText zedID) |
||||
{ |
||||
local Text result; |
||||
|
||||
if (zedID == none) { |
||||
return none; |
||||
} |
||||
result = _.alias.ResolveEntity(zedID); |
||||
if (result == none) { |
||||
result = TryLoadingFromMID(zedID); |
||||
} |
||||
return result; |
||||
} |
||||
|
||||
private function Text TryLoadingFromMID(BaseText zedID) |
||||
{ |
||||
if (_server.unreal.GetKFGameType().kfGameLength != 3) { // `GL_Custom == 3` |
||||
return TryLoadingFromMID_Collection(zedId); |
||||
} |
||||
return TryLoadingFromMID_GameType(zedId); |
||||
} |
||||
|
||||
// Assumes `zedID != none`. |
||||
private function Text TryLoadingFromMID_Collection(BaseText zedID) |
||||
{ |
||||
local int i; |
||||
local string zedIDasString; |
||||
local array<KFMonstersCollection.MClassTypes> monsterClasses; |
||||
|
||||
zedIDasString = zedID.ToString(); |
||||
if (zedIDasString == "") { |
||||
return none; |
||||
} |
||||
monsterClasses = _server.unreal |
||||
.GetKFGameType() |
||||
.monsterCollection.default.monsterClasses; |
||||
for (i = 0; i < monsterClasses.Length; i += 1) |
||||
{ |
||||
if (monsterClasses[i].mid == zedIDasString) { |
||||
return _.text.FromString(monsterClasses[i].mClassName); |
||||
} |
||||
} |
||||
return none; |
||||
} |
||||
|
||||
// Assumes `zedID != none`. |
||||
private function Text TryLoadingFromMID_GameType(BaseText zedID) |
||||
{ |
||||
local int i; |
||||
local string zedIDasString; |
||||
local array<KFGameType.MClassTypes> monsterClasses; |
||||
|
||||
zedIDasString = zedID.ToString(); |
||||
if (zedIDasString == "") { |
||||
return none; |
||||
} |
||||
monsterClasses = _server.unreal |
||||
.GetKFGameType() |
||||
.monsterClasses; |
||||
for (i = 0; i < monsterClasses.Length; i += 1) |
||||
{ |
||||
if (monsterClasses[i].mid == zedIDasString) { |
||||
return _.text.FromString(monsterClasses[i].mClassName); |
||||
} |
||||
} |
||||
return none; |
||||
} |
||||
|
||||
/** |
||||
* Returns list of zeds inside caller squad in a native for KF1 format: |
||||
* as pairs of `class<KFMonster>` and their counts. |
||||
* |
||||
* @return Array of pairs `class<KFMonster>` and corresponding zed count inside |
||||
* a squad. Guaranteed that there cannot be two array elements with |
||||
* the same class. |
||||
*/ |
||||
public function array<KF1_ZedCountPair> GetNativeZedList() |
||||
{ |
||||
return squadZeds; |
||||
} |
||||
|
||||
public function array<ZedCountPair> GetZedList() |
||||
{ |
||||
local int i; |
||||
local ZedCountPair nextPair; |
||||
local array<ZedCountPair> result; |
||||
|
||||
for (i = 0; i < squadZeds.length; i += 1) |
||||
{ |
||||
nextPair.template = _.text.FromClass(squadZeds[i].zedClass); |
||||
nextPair.count = squadZeds[i].count; |
||||
result[result.length] = nextPair; |
||||
} |
||||
return result; |
||||
} |
||||
|
||||
public function int GetZedCount(BaseText template) |
||||
{ |
||||
local int pairIndex; |
||||
local class<KFMonster> templateClass; |
||||
|
||||
templateClass = class<KFMonster>(_.memory.LoadClass(template)); |
||||
pairIndex = FIndPairIndex(templateClass); |
||||
if (pairIndex < 0) { |
||||
return 0; |
||||
} |
||||
return squadZeds[pairIndex].count; |
||||
} |
||||
|
||||
public function int GetTotalZedCount() |
||||
{ |
||||
local int i; |
||||
local int totalCount; |
||||
|
||||
for (i = 0; i < squadZeds.length; i += 1) { |
||||
totalCount += squadZeds[i].count; |
||||
} |
||||
return totalCount; |
||||
} |
||||
|
||||
defaultproperties |
||||
{ |
||||
} |
@ -0,0 +1,24 @@
|
||||
/** |
||||
* `AWavesComponent`'s implementation for `KF1_Frontend`. |
||||
* Copyright 2022 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 <https://www.gnu.org/licenses/>. |
||||
*/ |
||||
class KF1_WavesComponent extends AWavesComponent; |
||||
|
||||
defaultproperties |
||||
{ |
||||
} |
Loading…
Reference in new issue