From be7bb28c610b845bd7ab9ef5aa0377f5afeba164 Mon Sep 17 00:00:00 2001 From: Nikolay Borodin Date: Sat, 26 Oct 2024 21:41:04 +0200 Subject: [PATCH] Added commander shields --- data/base/audio/audio.json | 3 +- data/base/audio/sfx/misc/shield-hit.ogg | Bin 0 -> 44394 bytes data/base/wrf/audio.wrf | 1 + lib/sound/audio_id.cpp | 1 + lib/sound/audio_id.h | 1 + src/combat.cpp | 41 +++++++++++++++++++++++ src/display3d.cpp | 9 +++++ src/droid.cpp | 42 ++++++++++++++++++++++++ src/droid.h | 12 +++++++ src/droiddef.h | 10 ++++++ 10 files changed, 119 insertions(+), 1 deletion(-) create mode 100644 data/base/audio/sfx/misc/shield-hit.ogg diff --git a/data/base/audio/audio.json b/data/base/audio/audio.json index 43874ec5561..56365d75391 100644 --- a/data/base/audio/audio.json +++ b/data/base/audio/audio.json @@ -450,7 +450,8 @@ { "fileName": "scream.ogg", "loop": false, "range": 1800, "volume": 100 }, { "fileName": "scream2.ogg", "loop": false, "range": 1800, "volume": 100 }, { "fileName": "scream3.ogg", "loop": false, "range": 1800, "volume": 100 }, - { "fileName": "silence.ogg", "loop": false, "range": 1800, "volume": 100 } + { "fileName": "silence.ogg", "loop": false, "range": 1800, "volume": 100 }, + { "fileName": "shield-hit.ogg", "loop": false, "range": 1800, "volume": 100 } ] }, "Extra": { diff --git a/data/base/audio/sfx/misc/shield-hit.ogg b/data/base/audio/sfx/misc/shield-hit.ogg new file mode 100644 index 0000000000000000000000000000000000000000..d4d12671b4890325008d2c7788a0928be9c9591f GIT binary patch literal 44394 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 literal 0 HcmV?d00001 diff --git a/data/base/wrf/audio.wrf b/data/base/wrf/audio.wrf index 8c7f88b35c9..c857b834782 100644 --- a/data/base/wrf/audio.wrf +++ b/data/base/wrf/audio.wrf @@ -338,6 +338,7 @@ file WAV "scream.ogg" file WAV "scream2.ogg" file WAV "scream3.ogg" file WAV "silence.ogg" +file WAV "shield-hit.ogg" directory "audio/extra" file WAV "lndgzne.ogg" file WAV "nmedeted.ogg" diff --git a/lib/sound/audio_id.cpp b/lib/sound/audio_id.cpp index 7ab707b08fe..4d90178fb45 100644 --- a/lib/sound/audio_id.cpp +++ b/lib/sound/audio_id.cpp @@ -439,6 +439,7 @@ static AUDIO_ID_MAP asAudioID[] = {ID_SOUND_BARB_SCREAM2, "scream2.ogg"}, {ID_SOUND_BARB_SCREAM3, "scream3.ogg"}, {ID_SOUND_OF_SILENCE, "silence.ogg"}, + {ID_SOUND_SHIELD_HIT, "shield-hit.ogg"}, /* Extra */ {ID_SOUND_LANDING_ZONE, "lndgzne.ogg"}, diff --git a/lib/sound/audio_id.h b/lib/sound/audio_id.h index e33f820144a..7d88f8a5b26 100644 --- a/lib/sound/audio_id.h +++ b/lib/sound/audio_id.h @@ -428,6 +428,7 @@ enum INGAME_AUDIO ID_SOUND_BARB_SCREAM2, ID_SOUND_BARB_SCREAM3, ID_SOUND_OF_SILENCE, + ID_SOUND_SHIELD_HIT, /* Extra */ diff --git a/src/combat.cpp b/src/combat.cpp index a7da53cf35b..8b905373c81 100644 --- a/src/combat.cpp +++ b/src/combat.cpp @@ -28,6 +28,11 @@ #include "lib/framework/fixedpoint.h" #include "lib/netplay/sync_debug.h" +#include "lib/ivis_opengl/ivisdef.h" + +#include "lib/sound/audio.h" +#include "lib/sound/audio_id.h" + #include "action.h" #include "combat.h" #include "difficulty.h" @@ -38,6 +43,12 @@ #include "qtscript.h" #include "order.h" #include "objmem.h" +#include "effects.h" + + + +#define DROID_SHIELD_DAMAGE_SPREAD (16 - rand()%32) +#define DROID_SHIELD_PARTICLES (6 + rand()%8) /* Fire a weapon at something */ bool combFire(WEAPON *psWeap, BASE_OBJECT *psAttacker, BASE_OBJECT *psTarget, int weapon_slot) @@ -485,6 +496,36 @@ int32_t objDamage(BASE_OBJECT *psObj, unsigned damage, unsigned originalhp, WEAP return -(int64_t)65536 * psObj->body / originalhp; } + // Drain shields first + if (psObj->type == OBJ_DROID) { + DROID *psDroid = castDroid(psObj); + + if (psDroid->shieldPoints > 0) { + if (psDroid->shieldPoints > actualDamage) { + psDroid->shieldPoints -= actualDamage; + actualDamage = 0; + } else { + actualDamage -= psDroid->shieldPoints; + psDroid->shieldPoints = 0; + // shields are interrupted, wait for a while until regeneration starts again + psDroid->shieldInterruptRegenTime = psDroid->time; + psDroid->shieldRegenTime = psDroid->time; + } + + Vector3i dv; + dv.y = psDroid->pos.z; + dv.y += (psDroid->sDisplay.imd->max.y * 2); + + for (uint32_t i = 0; i < DROID_SHIELD_PARTICLES; i++) { + dv.x = psDroid->pos.x + DROID_SHIELD_DAMAGE_SPREAD; + dv.z = psDroid->pos.y + DROID_SHIELD_DAMAGE_SPREAD; + addEffect(&dv, EFFECT_FIREWORK, FIREWORK_TYPE_STARBURST, false, nullptr, 0, gameTime - deltaGameTime + 1); + } + + audio_PlayStaticTrack(psDroid->pos.x, psDroid->pos.y, ID_SOUND_SHIELD_HIT); + } + } + // Subtract the dealt damage from the droid's remaining body points psObj->body -= actualDamage; diff --git a/src/display3d.cpp b/src/display3d.cpp index 6ece53e1847..856cf43e1ef 100644 --- a/src/display3d.cpp +++ b/src/display3d.cpp @@ -3424,6 +3424,14 @@ bool eitherSelected(DROID *psDroid) static void queueDroidPowerBarsRects(DROID *psDroid, bool drawBox, BatchedMultiRectRenderer& batchedMultiRectRenderer, size_t rectGroup) { UDWORD damage = PERCENT(psDroid->body, psDroid->originalBody); + UDWORD shields = 0; + + if (psDroid->shieldPoints >= 0) { + int maxShieldPoints = droidGetMaxShieldPoints(psDroid); + shields = PERCENT(psDroid->shieldPoints, maxShieldPoints); + shields = static_cast((float)psDroid->shieldPoints / (float)maxShieldPoints * (float)psDroid->sDisplay.screenR); + shields *= 2; + } PIELIGHT powerCol = WZCOL_BLACK; PIELIGHT powerColShadow = WZCOL_BLACK; @@ -3464,6 +3472,7 @@ static void queueDroidPowerBarsRects(DROID *psDroid, bool drawBox, BatchedMultiR batchedMultiRectRenderer.addRect(PIERECT_DrawRequest(psDroid->sDisplay.screenX - psDroid->sDisplay.screenR - 1, psDroid->sDisplay.screenY + psDroid->sDisplay.screenR + 2, psDroid->sDisplay.screenX + psDroid->sDisplay.screenR + 1, psDroid->sDisplay.screenY + psDroid->sDisplay.screenR + 6, WZCOL_RELOAD_BACKGROUND), rectGroup); batchedMultiRectRenderer.addRect(PIERECT_DrawRequest(psDroid->sDisplay.screenX - psDroid->sDisplay.screenR, psDroid->sDisplay.screenY + psDroid->sDisplay.screenR + 3, psDroid->sDisplay.screenX - psDroid->sDisplay.screenR + damage, psDroid->sDisplay.screenY + psDroid->sDisplay.screenR + 4, powerCol), rectGroup); batchedMultiRectRenderer.addRect(PIERECT_DrawRequest(psDroid->sDisplay.screenX - psDroid->sDisplay.screenR, psDroid->sDisplay.screenY + psDroid->sDisplay.screenR + 4, psDroid->sDisplay.screenX - psDroid->sDisplay.screenR + damage, psDroid->sDisplay.screenY + psDroid->sDisplay.screenR + 5, powerColShadow), rectGroup); + batchedMultiRectRenderer.addRect(PIERECT_DrawRequest(psDroid->sDisplay.screenX - psDroid->sDisplay.screenR, psDroid->sDisplay.screenY + psDroid->sDisplay.screenR + 8, psDroid->sDisplay.screenX - psDroid->sDisplay.screenR + shields, psDroid->sDisplay.screenY + psDroid->sDisplay.screenR + 6, WZCOL_LBLUE), rectGroup); } static void queueDroidEnemyHealthBarsRects(DROID *psDroid, BatchedMultiRectRenderer& batchedMultiRectRenderer, size_t rectGroup) diff --git a/src/droid.cpp b/src/droid.cpp index e3e0ed75179..e17c439af01 100644 --- a/src/droid.cpp +++ b/src/droid.cpp @@ -911,6 +911,9 @@ void droidUpdate(DROID *psDroid) droidUpdateDroidSelfRepair(psDroid); } + if (bMultiPlayer) { + droidUpdateShields(psDroid); + } /* Update the fire damage data */ if (psDroid->periodicalDamageStart != 0 && psDroid->periodicalDamageStart != gameTime - deltaGameTime) // -deltaGameTime, since projectiles are updated after droids. @@ -953,6 +956,44 @@ void droidUpdate(DROID *psDroid) CHECK_DROID(psDroid); } +void droidUpdateShields(DROID *psDroid) { + if (hasCommander(psDroid) || psDroid->droidType == DROID_COMMAND) { + if (psDroid->shieldPoints < 0) { + psDroid->shieldPoints = 0; + psDroid->shieldRegenTime = gameTime; + psDroid->shieldInterruptRegenTime = gameTime; + + } else { + if (gameTime - psDroid->shieldInterruptRegenTime >= droidCalculateShieldInterruptRegenTime(psDroid)) { + if (gameTime - psDroid->shieldRegenTime >= droidCalculateShieldRegenTime(psDroid)) { + for (uint32_t i = 0; i < 4; i++) { + if (psDroid->shieldPoints < droidGetMaxShieldPoints(psDroid)) { + psDroid->shieldPoints += 1; + } + } + psDroid->shieldRegenTime = gameTime; + } + } + } + } else { + // unit has lost commander, shields are down! + psDroid->shieldPoints = -1; + } +} + +uint32_t droidCalculateShieldRegenTime(DROID *psDroid) { + return DROID_INITIAL_SHIELD_REGEN_TIME - (DROID_SHIELD_REGEN_TIME_DEC * getDroidLevel(psDroid)); +} + +uint32_t droidCalculateShieldInterruptRegenTime(DROID *psDroid) { + return DROID_INITIAL_SHIELD_INTERRUPT_REGEN_TIME - (DROID_SHIELD_INTERRUPT_REGEN_TIME_DEC * getDroidLevel(psDroid)); +} + +int32_t droidGetMaxShieldPoints(DROID *psDroid) { + double percent = static_cast(psDroid->originalBody) / 100.0f; + return std::round(percent * (DROID_INITIAL_SHILED_POINTS_PERCENT + DROID_ADDITVE_SHILED_POINTS_PERCENT * getDroidLevel(psDroid))); +} + /* See if a droid is next to a structure */ static bool droidNextToStruct(DROID *psDroid, STRUCTURE *psStruct) { @@ -1723,6 +1764,7 @@ DROID *reallyBuildDroid(const DROID_TEMPLATE *pTemplate, Position pos, UDWORD pl droid.experience = 0; } droid.kills = 0; + droid.shieldPoints = -1; droidSetBits(pTemplate, &droid); diff --git a/src/droid.h b/src/droid.h index 816b9a3b6b9..ced8cba3806 100644 --- a/src/droid.h +++ b/src/droid.h @@ -118,6 +118,18 @@ int32_t droidDamage(DROID *psDroid, unsigned damage, WEAPON_CLASS weaponClass, W /* The main update routine for all droids */ void droidUpdate(DROID *psDroid); +/* Update droid shields. */ +void droidUpdateShields(DROID *psDroid); + +/* Calculate the droid's shield regeneration step time */ +uint32_t droidCalculateShieldRegenTime(DROID *psDroid); + +/* Calculate the droid's shield interruption time */ +uint32_t droidCalculateShieldInterruptRegenTime(DROID *psDroid); + +/* Get droid maximum shield points */ +int32_t droidGetMaxShieldPoints(DROID *psDroid); + /* Set up a droid to build a structure - returns true if successful */ enum DroidStartBuild {DroidStartBuildFailed, DroidStartBuildSuccess, DroidStartBuildPending}; DroidStartBuild droidStartBuild(DROID *psDroid); diff --git a/src/droiddef.h b/src/droiddef.h index d84255fd1fe..9050f84c020 100644 --- a/src/droiddef.h +++ b/src/droiddef.h @@ -51,6 +51,13 @@ //defines how many times to perform the iteration on looking for a blank location #define LOOK_FOR_EMPTY_TILE 20 +#define DROID_INITIAL_SHILED_POINTS_PERCENT 5.0f +#define DROID_ADDITVE_SHILED_POINTS_PERCENT 2.5f +#define DROID_INITIAL_SHIELD_REGEN_TIME 32 +#define DROID_SHIELD_REGEN_TIME_DEC 2 +#define DROID_INITIAL_SHIELD_INTERRUPT_REGEN_TIME 2000 +#define DROID_SHIELD_INTERRUPT_REGEN_TIME_DEC 100 + typedef std::vector OrderList; struct DROID_TEMPLATE : public BASE_STATS @@ -150,6 +157,9 @@ struct DROID : public BASE_OBJECT UDWORD baseSpeed; ///< the base speed dependent on propulsion type UDWORD originalBody; ///< the original body points uint32_t experience; + int32_t shieldPoints; + UDWORD shieldRegenTime; + UDWORD shieldInterruptRegenTime; uint32_t kills; UDWORD lastFrustratedTime; ///< Set when eg being stuck; used for eg firing indiscriminately at map features to clear the way SWORD resistance; ///< used in Electronic Warfare