mirror of
https://github.com/nolen777/eagle0.git
synced 2026-07-29 03:05:43 +00:00
Capitalization in CombatDamage methods
This commit is contained in:
@@ -461,7 +461,8 @@
|
||||
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
|
||||
CLANG_WARN_UNREACHABLE_CODE = YES;
|
||||
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
||||
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
|
||||
CODE_SIGN_IDENTITY = "iOS Development: Daniel Crosby (AJ28LCLQQ8)";
|
||||
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iOS Development: Daniel Crosby (AJ28LCLQQ8)";
|
||||
COPY_PHASE_STRIP = NO;
|
||||
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
||||
GCC_C_LANGUAGE_STANDARD = gnu99;
|
||||
@@ -481,6 +482,7 @@
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 8.1;
|
||||
MTL_ENABLE_DEBUG_INFO = YES;
|
||||
ONLY_ACTIVE_ARCH = YES;
|
||||
PROVISIONING_PROFILE = "94c39bd0-c06d-48bb-b6fc-d4cdcfbb8f81";
|
||||
SDKROOT = iphoneos;
|
||||
TARGETED_DEVICE_FAMILY = "1,2";
|
||||
};
|
||||
@@ -503,7 +505,8 @@
|
||||
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
|
||||
CLANG_WARN_UNREACHABLE_CODE = YES;
|
||||
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
||||
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
|
||||
CODE_SIGN_IDENTITY = "iOS Development: Daniel Crosby (AJ28LCLQQ8)";
|
||||
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iOS Development: Daniel Crosby (AJ28LCLQQ8)";
|
||||
COPY_PHASE_STRIP = YES;
|
||||
ENABLE_NS_ASSERTIONS = NO;
|
||||
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
||||
@@ -516,6 +519,7 @@
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 8.1;
|
||||
MTL_ENABLE_DEBUG_INFO = NO;
|
||||
PROVISIONING_PROFILE = "94c39bd0-c06d-48bb-b6fc-d4cdcfbb8f81";
|
||||
SDKROOT = iphoneos;
|
||||
TARGETED_DEVICE_FAMILY = "1,2";
|
||||
VALIDATE_PRODUCT = YES;
|
||||
|
||||
@@ -77,14 +77,16 @@ typedef std::shared_ptr<Hero> HeroSharedPtr;
|
||||
TBinaryProtocol *protocol = [[TBinaryProtocol alloc] initWithTransport:transport strictRead:YES strictWrite:YES];
|
||||
server = [[ShardokClient alloc] initWithProtocol:protocol];
|
||||
|
||||
GetHeroByIDResponse *response = [server GetHeroByID:8675309];
|
||||
NSArray* heroIDs = [server GetHeroIDs];
|
||||
|
||||
GetHeroByIDResponse *response = [server GetHeroByID:[heroIDs[0] longLongValue]];
|
||||
if ([response responseType] == GetHeroByIDResponseType_GetHeroByIDResponseType_HeroFound) {
|
||||
hero1 = HeroSharedPtr(new Hero(HeroFromHeroInfo([response hero])));
|
||||
} else {
|
||||
NSLog(@"Hero not found!");
|
||||
}
|
||||
|
||||
response = [server GetHeroByID:1234567];
|
||||
response = [server GetHeroByID:[heroIDs[1] longLongValue]];
|
||||
if ([response responseType] == GetHeroByIDResponseType_GetHeroByIDResponseType_HeroFound) {
|
||||
hero2 = HeroSharedPtr(new Hero(HeroFromHeroInfo([response hero])));
|
||||
} else {
|
||||
|
||||
@@ -40,7 +40,7 @@ CombatDamage Battalion::GiveMeleeDamage(double randPercentile) const {
|
||||
|
||||
if (damagePerTroop < 0.0) damagePerTroop = 0.0;
|
||||
|
||||
cdBuilder.setDamageByType((DamageType)i, damagePerTroop * this->troops);
|
||||
cdBuilder.SetDamageByType((DamageType)i, damagePerTroop * this->troops);
|
||||
}
|
||||
|
||||
return cdBuilder.Build();
|
||||
@@ -50,10 +50,10 @@ const Battalion Battalion::TakeDamage(const CombatDamage& damage, ShardokTerrain
|
||||
double braveryAdjustment = commander
|
||||
? 1.0 / factorIntoAdjustment(commander->GetBravery(), type->braverySwing)
|
||||
: 1.0;
|
||||
(terrain);
|
||||
(direction);
|
||||
double terrainAdjustment = 1.0; // TODO: terrain adjustment
|
||||
double flankingAdjustment = 1.0; // TODO: flanking adjustment
|
||||
double terrainAdjustment = type->damageTakenMultiplierForTerrain[terrain];
|
||||
double flankingAdjustment = 1.0;
|
||||
if (direction == ShardokAttackDirection_flank) flankingAdjustment = type->flankDamageMultiplier;
|
||||
else if (direction == ShardokAttackDirection_rear) flankingAdjustment = type->rearDamageMultiplier;
|
||||
|
||||
double totalSwing = braveryAdjustment * flankingAdjustment * terrainAdjustment;
|
||||
|
||||
|
||||
@@ -20,6 +20,9 @@ BattalionType* lightInfantry = new BattalionType {
|
||||
50.0, // swing in effectiveness due to morale
|
||||
50.0, // swing in effectiveness due to charisma
|
||||
20.0, // swing in effectiveness due to leader bravery
|
||||
1.25, // damage multiplier when flanked
|
||||
1.50, // damage multiplier for rear attack
|
||||
{1.0, 0.75, 0.85, 0.00, 1.5, 0.5, 0.5, 2.0, 1.0}, // damage multipliers by terrain
|
||||
{10.0, 0.0, 0.0, 5.0, 5.0, 0.0, 0.0, 0.0, 0.0, 0.0}, // base melee damage by type
|
||||
{50.0, 0.0, 2.0, 25.0, 20.0, 0.0, 0.0, 0.0, 0.0, 1.0}, // training augment melee damage by type
|
||||
{10.0, 0.0, 0.0, 5.0, 5.0, 0.0, 0.0, 0.0, 0.0, 0.0}, // base missile damage by type
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
#include <string>
|
||||
#include <map>
|
||||
#include "CombatDamage.h"
|
||||
#include "ShardokTerrain.h"
|
||||
|
||||
const int kMaxMissileRange = 5;
|
||||
|
||||
@@ -31,6 +32,11 @@ struct BattalionType {
|
||||
const double charismaSwing;
|
||||
const double braverySwing;
|
||||
|
||||
const double flankDamageMultiplier;
|
||||
const double rearDamageMultiplier;
|
||||
|
||||
const double damageTakenMultiplierForTerrain[NUM_TERRAIN_TYPES];
|
||||
|
||||
const double baseMeleeDamageByType[NUM_DAMAGE_TYPES];
|
||||
const double maxAugmentMeleeDamageByType[NUM_DAMAGE_TYPES];
|
||||
|
||||
|
||||
@@ -70,31 +70,31 @@ public:
|
||||
|
||||
CombatDamage operator+(const CombatDamage& add) const {
|
||||
return Builder()
|
||||
.setSlashing(damageByType[DamageType_slashing] + add.damageByType[DamageType_slashing])
|
||||
.setPuncturing(damageByType[DamageType_puncturing] + add.damageByType[DamageType_puncturing])
|
||||
.setPenetrating(damageByType[DamageType_penetrating] + add.damageByType[DamageType_penetrating])
|
||||
.setStabbing(damageByType[DamageType_stabbing] + add.damageByType[DamageType_stabbing])
|
||||
.setCrushing(damageByType[DamageType_crushing] + add.damageByType[DamageType_crushing])
|
||||
.setFire(damageByType[DamageType_fire] + add.damageByType[DamageType_fire])
|
||||
.setCold(damageByType[DamageType_cold] + add.damageByType[DamageType_cold])
|
||||
.setLightning(damageByType[DamageType_lightning] + add.damageByType[DamageType_lightning])
|
||||
.setÆssence(damageByType[DamageType_æssence] + add.damageByType[DamageType_æssence])
|
||||
.setImpact(damageByType[DamageType_impact] + add.damageByType[DamageType_impact])
|
||||
.SetSlashing(damageByType[DamageType_slashing] + add.damageByType[DamageType_slashing])
|
||||
.SetPuncturing(damageByType[DamageType_puncturing] + add.damageByType[DamageType_puncturing])
|
||||
.SetPenetrating(damageByType[DamageType_penetrating] + add.damageByType[DamageType_penetrating])
|
||||
.SetStabbing(damageByType[DamageType_stabbing] + add.damageByType[DamageType_stabbing])
|
||||
.SetCrushing(damageByType[DamageType_crushing] + add.damageByType[DamageType_crushing])
|
||||
.SetFire(damageByType[DamageType_fire] + add.damageByType[DamageType_fire])
|
||||
.SetCold(damageByType[DamageType_cold] + add.damageByType[DamageType_cold])
|
||||
.SetLightning(damageByType[DamageType_lightning] + add.damageByType[DamageType_lightning])
|
||||
.SetÆssence(damageByType[DamageType_æssence] + add.damageByType[DamageType_æssence])
|
||||
.SetImpact(damageByType[DamageType_impact] + add.damageByType[DamageType_impact])
|
||||
.Build();
|
||||
}
|
||||
|
||||
CombatDamage operator*(double factor) const {
|
||||
return Builder()
|
||||
.setSlashing(damageByType[DamageType_slashing] * factor)
|
||||
.setPuncturing(damageByType[DamageType_puncturing] * factor)
|
||||
.setPenetrating(damageByType[DamageType_penetrating] * factor)
|
||||
.setStabbing(damageByType[DamageType_stabbing] * factor)
|
||||
.setCrushing(damageByType[DamageType_crushing] * factor)
|
||||
.setFire(damageByType[DamageType_fire] * factor)
|
||||
.setCold(damageByType[DamageType_cold] * factor)
|
||||
.setLightning(damageByType[DamageType_lightning] * factor)
|
||||
.setÆssence(damageByType[DamageType_æssence] * factor)
|
||||
.setImpact(damageByType[DamageType_impact] * factor)
|
||||
.SetSlashing(damageByType[DamageType_slashing] * factor)
|
||||
.SetPuncturing(damageByType[DamageType_puncturing] * factor)
|
||||
.SetPenetrating(damageByType[DamageType_penetrating] * factor)
|
||||
.SetStabbing(damageByType[DamageType_stabbing] * factor)
|
||||
.SetCrushing(damageByType[DamageType_crushing] * factor)
|
||||
.SetFire(damageByType[DamageType_fire] * factor)
|
||||
.SetCold(damageByType[DamageType_cold] * factor)
|
||||
.SetLightning(damageByType[DamageType_lightning] * factor)
|
||||
.SetÆssence(damageByType[DamageType_æssence] * factor)
|
||||
.SetImpact(damageByType[DamageType_impact] * factor)
|
||||
.Build();
|
||||
}
|
||||
|
||||
@@ -113,18 +113,18 @@ public:
|
||||
|
||||
public:
|
||||
Builder() {}
|
||||
Builder& setSlashing (double sl) { slashing = sl; return *this; }
|
||||
Builder& setPuncturing (double pu) { puncturing = pu; return *this; }
|
||||
Builder& setPenetrating (double pe) { penetrating = pe; return *this; }
|
||||
Builder& setStabbing (double st) { stabbing = st; return *this; }
|
||||
Builder& setCrushing (double cr) { crushing = cr; return *this; }
|
||||
Builder& setFire (double fi) { fire = fi; return *this; }
|
||||
Builder& setCold (double co) { cold = co; return *this; }
|
||||
Builder& setLightning (double li) { lightning = li; return *this; }
|
||||
Builder& setÆssence (double æs) { æssence = æs; return *this; }
|
||||
Builder& setImpact (double im) { impact = im; return *this; }
|
||||
Builder& SetSlashing (double sl) { slashing = sl; return *this; }
|
||||
Builder& SetPuncturing (double pu) { puncturing = pu; return *this; }
|
||||
Builder& SetPenetrating (double pe) { penetrating = pe; return *this; }
|
||||
Builder& SetStabbing (double st) { stabbing = st; return *this; }
|
||||
Builder& SetCrushing (double cr) { crushing = cr; return *this; }
|
||||
Builder& SetFire (double fi) { fire = fi; return *this; }
|
||||
Builder& SetCold (double co) { cold = co; return *this; }
|
||||
Builder& SetLightning (double li) { lightning = li; return *this; }
|
||||
Builder& SetÆssence (double æs) { æssence = æs; return *this; }
|
||||
Builder& SetImpact (double im) { impact = im; return *this; }
|
||||
|
||||
Builder& setDamageByType(DamageType type, double amt) {
|
||||
Builder& SetDamageByType(DamageType type, double amt) {
|
||||
switch (type) {
|
||||
case DamageType_slashing:
|
||||
slashing = amt;
|
||||
@@ -182,7 +182,7 @@ public:
|
||||
Builder ToBuilder() {
|
||||
Builder builder = Builder();
|
||||
for (int i=0; i<(int)NUM_DAMAGE_TYPES; i++) {
|
||||
builder.setDamageByType((DamageType)i, this->damageByType[i]);
|
||||
builder.SetDamageByType((DamageType)i, this->damageByType[i]);
|
||||
}
|
||||
return builder;
|
||||
}
|
||||
|
||||
@@ -9,25 +9,38 @@
|
||||
#include "Hero.h"
|
||||
|
||||
#define HERO_DAMAGE_FACTOR ((10.0))
|
||||
#define HERO_BRAVERY_SWING ((25.0))
|
||||
#define HERO_DEADLINESS_FACTOR ((0.02))
|
||||
#define HERO_VIGOR_COMBAT_MINIMUM ((20.0))
|
||||
|
||||
|
||||
inline double factorIntoAdjustment(double factorPercentile, double swingPercentile) {
|
||||
return 1.0 + ((factorPercentile - 50.0) * swingPercentile / 100.0) / 100.0;
|
||||
}
|
||||
|
||||
CombatDamage Hero::GiveMeleeDamage(double randPercentile) {
|
||||
CombatDamage unitDamage = battalion.GiveMeleeDamage(randPercentile);
|
||||
double heroDamageAmt = strength * HERO_DAMAGE_FACTOR;
|
||||
double heroDamageAmt;
|
||||
bool canFight = (vigor >= HERO_VIGOR_COMBAT_MINIMUM);
|
||||
|
||||
CombatDamage::Builder heroDamageBuilder = CombatDamage::Builder();
|
||||
|
||||
if (IsMage()) {
|
||||
heroDamageBuilder.setLightning(heroDamageAmt);
|
||||
heroDamageBuilder.setCold(heroDamageAmt);
|
||||
heroDamageBuilder.setFire(heroDamageAmt);
|
||||
heroDamageBuilder.setImpact(heroDamageAmt);
|
||||
heroDamageBuilder.setÆssence(heroDamageAmt);
|
||||
} else {
|
||||
heroDamageBuilder.setSlashing(heroDamageAmt);
|
||||
heroDamageBuilder.setPenetrating(heroDamageAmt);
|
||||
heroDamageBuilder.setCrushing(heroDamageAmt);
|
||||
heroDamageBuilder.setStabbing(heroDamageAmt);
|
||||
heroDamageBuilder.setPuncturing(heroDamageAmt);
|
||||
if (canFight) {
|
||||
if (IsMage()) {
|
||||
heroDamageAmt = intelligence * HERO_DAMAGE_FACTOR;
|
||||
heroDamageBuilder.SetLightning(heroDamageAmt);
|
||||
heroDamageBuilder.SetCold(heroDamageAmt);
|
||||
heroDamageBuilder.SetFire(heroDamageAmt);
|
||||
heroDamageBuilder.SetImpact(heroDamageAmt);
|
||||
heroDamageBuilder.SetÆssence(heroDamageAmt);
|
||||
} else {
|
||||
heroDamageAmt = strength * HERO_DAMAGE_FACTOR;
|
||||
heroDamageBuilder.SetSlashing(heroDamageAmt);
|
||||
heroDamageBuilder.SetPenetrating(heroDamageAmt);
|
||||
heroDamageBuilder.SetCrushing(heroDamageAmt);
|
||||
heroDamageBuilder.SetStabbing(heroDamageAmt);
|
||||
heroDamageBuilder.SetPuncturing(heroDamageAmt);
|
||||
}
|
||||
}
|
||||
// TODO: equipment
|
||||
|
||||
@@ -35,9 +48,28 @@ CombatDamage Hero::GiveMeleeDamage(double randPercentile) {
|
||||
}
|
||||
|
||||
Hero Hero::TakeDamage(const CombatDamage& damage, ShardokTerrain terrain, ShardokAttackDirection direction) {
|
||||
Battalion newBattalion = battalion.TakeDamage(damage, terrain, direction);
|
||||
double braveryAdjustment = factorIntoAdjustment(bravery, HERO_BRAVERY_SWING);
|
||||
|
||||
double heroDamageRatio = braveryAdjustment / (battalion.GetSize() + 1);
|
||||
if (heroDamageRatio > 1.0) heroDamageRatio = 1.0;
|
||||
if (heroDamageRatio < 0.0) heroDamageRatio = 0.0;
|
||||
|
||||
Builder newBuilder = this->ToBuilder().SetBattalion(&newBattalion);
|
||||
CombatDamage heroDamage = heroDamageRatio * damage;
|
||||
CombatDamage remainingDamage = (1.0-heroDamageRatio) * damage;
|
||||
|
||||
Battalion newBattalion = battalion.TakeDamage(remainingDamage, terrain, direction);
|
||||
|
||||
double vigorHit = 0.0;
|
||||
for (int i=0; i<NUM_DAMAGE_TYPES; i++) {
|
||||
vigorHit += heroDamage.GetDamageOfType(DamageType(i)) * HERO_DEADLINESS_FACTOR;
|
||||
// TODO: hero should have adjustments for damage types too
|
||||
}
|
||||
|
||||
if (vigorHit > vigor) vigorHit = vigor;
|
||||
|
||||
Builder newBuilder = this->ToBuilder()
|
||||
.SetVigor(vigor - vigorHit)
|
||||
.SetBattalion(&newBattalion);
|
||||
|
||||
return newBuilder.Build();
|
||||
}
|
||||
|
||||
@@ -20,6 +20,10 @@ ShardokMeleeActionResult ShardokMeleeAction::perform() const {
|
||||
CombatDamage attackerDamage = att.GiveMeleeDamage(TEST_ROLL);
|
||||
CombatDamage defenderDamage = def.GiveMeleeDamage(TEST_ROLL);
|
||||
|
||||
if (defenderDamage.GetDamageOfType(DamageType_slashing) < 0) {
|
||||
throw 1;
|
||||
}
|
||||
|
||||
att = att.TakeDamage(defenderDamage, ShardokTerrain_attacker, ShardokAttackDirection_frontal);
|
||||
def = def.TakeDamage(attackerDamage, ShardokTerrain_plains, ShardokAttackDirection_frontal);
|
||||
}
|
||||
|
||||
@@ -18,7 +18,8 @@ enum ShardokTerrain {
|
||||
ShardokTerrain_castle,
|
||||
ShardokTerrain_city,
|
||||
ShardokTerrain_ocean,
|
||||
ShardokTerrain_attacker
|
||||
ShardokTerrain_attacker,
|
||||
NUM_TERRAIN_TYPES
|
||||
};
|
||||
|
||||
#endif /* defined(__eagle0__ShardokTerrain__) */
|
||||
|
||||
Reference in New Issue
Block a user