Capitalization in CombatDamage methods

This commit is contained in:
Dan Crosby
2014-12-08 06:43:50 -08:00
parent c9dba71042
commit cd4cb52962
9 changed files with 109 additions and 57 deletions
@@ -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 {
+5 -5
View File
@@ -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;
+3
View File
@@ -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
+6
View File
@@ -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];
+32 -32
View File
@@ -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;
}
+47 -15
View File
@@ -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();
}
+4
View File
@@ -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);
}
+2 -1
View File
@@ -18,7 +18,8 @@ enum ShardokTerrain {
ShardokTerrain_castle,
ShardokTerrain_city,
ShardokTerrain_ocean,
ShardokTerrain_attacker
ShardokTerrain_attacker,
NUM_TERRAIN_TYPES
};
#endif /* defined(__eagle0__ShardokTerrain__) */