-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Abilities
+
+
@@ -2569,15 +2725,15 @@
-
-
+
+
-
-
+
+
@@ -2585,15 +2741,15 @@
-
-
+
+
-
-
+
+
@@ -2601,15 +2757,15 @@
-
-
+
+
-
-
+
+
@@ -2617,18 +2773,34 @@
+
+
+
COMBAT
@@ -2638,14 +2810,14 @@
-
-
+
+
-
+
@@ -2654,7 +2826,7 @@
-
+
-
-
+
+
+
@@ -3441,9 +3619,694 @@ var TAS = TAS || (function(){
log: logLog
};
}());
-
/* ---- END: TheAaronSheet.js ---- */
+on("change:repeating_army:ArmyStatus", function(eventInfo) {
+ let NewClass = eventInfo.newValue;
+ let OldClass = eventInfo.previousValue;
+ let Source = eventInfo.sourceAttribute;
+ console.log(" =-=- Change ArmyStatus: " + NewClass + " from " + OldClass + " source " + Source);
+ getAttrs(['repeating_army_ArmyStatus','repeating_army_ArmyDisorganizeMalus'], function (values) {
+ let Status = parseInt(values.repeating_army_ArmyStatus) || 0; // "1" Oraganize, "2" Disorganize, "3" Rally, "4" Routed
+ let DisorganizeMalus = parseInt(values.repeating_army_ArmyDisorganizeMalus) || 0;
+ console.log(" Army - Status: " + Status + " DisorganizeMalus " + DisorganizeMalus);
+
+ // The Logic:
+ // If ArmyStatus changed, if not Organized then DisorganizeMalus = 1
+
+ DisorganizeMalus = 0;
+ if (Status != 1) // If Army is not Organize, ArmyDisorganizeMalus TRUE which causes +3 Discipline(?) and a penalty die
+ {
+ DisorganizeMalus = 1; // ArmyDisorganizeMalus -> Discipline checks at +3 penalty
+ console.log(" Becomes Status: " + Status + " DisorganizeMalus " + DisorganizeMalus);
+ }
+
+ setAttrs({
+ repeating_army_ArmyDisorganizeMalus: String(DisorganizeMalus)
+ });
+ });
+});
+
+
+/* Calculate Army Defense */
+on("change:repeating_army:ArmyAgilite change:repeating_army:ArmyAthletisme change:repeating_army:ArmyVigilance change:repeating_army:ArmyMalarm", function(eventInfo) {
+ let NewFactor = eventInfo.newValue;
+ let OldFactor = eventInfo.previousValue;
+ let Source = eventInfo.sourceAttribute;
+ console.log(" =-=- Change Army Disicpline underlying factor: " + NewFactor + " from " + OldFactor + " source " + Source);
+
+ /* ArmyAgilite}+@{ArmyAthletisme}+@{ArmyVigilance}-@{ArmyMalarm */
+ getAttrs(['repeating_army_ArmyAgilite','repeating_army_ArmyAthletisme','repeating_army_ArmyVigilance','repeating_army_ArmyMalarm'], function (values) {
+
+ let Agility = parseInt(values.repeating_army_ArmyAgilite) || 0;
+ let Athletics = parseInt(values.repeating_army_ArmyAthletisme) || 0;
+ let Awareness = parseInt(values.repeating_army_ArmyVigilance) || 0;
+ let Bulk = parseInt(values.repeating_army_ArmyMalarm) || 0;
+ console.log(" Army: Agility " + Agility + " Athletics " + Athletics + " Awareness " + Awareness + " Bulk " + Bulk);
+
+ let Defense = Agility + Athletics + Awareness - Bulk;
+ console.log(" Defense becomes: " + Defense);
+
+ setAttrs({
+ repeating_army_ArmyDefense: String(Defense)
+ });
+ });
+});
+
+
+/* Calculate Army Discipline */
+on("change:repeating_army:ArmyTraining change:repeating_army:ArmyDisorganizeMalus change:repeating_army:ArmyHero", function(eventInfo) {
+ let NewFactor = eventInfo.newValue;
+ let OldFactor = eventInfo.previousValue;
+ let Source = eventInfo.sourceAttribute;
+ console.log(" =-=- Change Army Disicpline underlying factor: " + NewFactor + " from " + OldFactor + " source " + Source);
+
+ getAttrs(['repeating_army_ArmyTraining','repeating_army_ArmyDisorganizeMalus','repeating_army_ArmyHero','repeating_army_ArmyDiscipline'], function (values) {
+
+ let Training = parseInt(values.repeating_army_ArmyTraining) || 0;
+ let DisorganizeMalus = parseInt(values.repeating_army_ArmyDisorganizeMalus) || 0;
+ let Hero = parseInt(values.repeating_army_ArmyHero) || 0;
+ let curDiscipline = parseInt(values.repeating_army_ArmyDiscipline) || 0;
+ console.log(" Army: Training " + Training + " DisorganizeMalus " + DisorganizeMalus + " Hero " + Hero + " current Discipline " + curDiscipline);
+
+ let Discipline = (Training + DisorganizeMalus - Hero) * 3;
+ console.log(" Discipine becomes: " + Discipline);
+
+ setAttrs({
+ repeating_army_ArmyDiscipline: String(Discipline)
+ });
+ });
+});
+
+
+on("change:repeating_army:ArmySante", function(eventInfo) {
+ let NewHealth = eventInfo.newValue;
+ let OldHealth = eventInfo.previousValue;
+ let Source = eventInfo.sourceAttribute;
+ console.log(" =-=- Change ArmyHealth: " + NewHealth + " from " + OldHealth + " source " + Source);
+ getAttrs(['repeating_army_ArmyStatus','repeating_army_ArmySante','repeating_army_ArmyDisorganizeMalus'], function (values) {
+ let Status = parseInt(values.repeating_army_ArmyStatus) || 0; // "1" Oraganize, "2" Disorganize, "3" Rally, "4" Routed
+ let Health = NewHealth;
+ let DisorganizeMalus = parseInt(values.repeating_army_ArmyDisorganizeMalus) || 0;
+ console.log(" Army - Status: " + Status + " Health: " + Health + " DisorganizeMalus: " + DisorganizeMalus);
+
+ // The Logic:
+ // If Health <= 0, then if Status == Organize, Status = Disorganize
+
+ if ((Health <= 0) && (Status == 1)) // If Health is zero or less, army becomes, at least, ArmyDisorganizeMalus -> Disorganize with +3 Discipline(?) penalty
+ {
+ Status = 2; // Disorganize
+ DisorganizeMalus = 1; // ArmyDisorganizeMalus -> Discipline checks at +3 penalty and -1D penalty for all checks
+ console.log(" Become Disorganize: Status: " + Status + " Health: " + Health + " DisorganizeMalus " + DisorganizeMalus);
+ } else if ((Health > 0) && (DisorganizeMalus > 1)) {
+ //DisorganizeMalus = 0;
+ console.log(" ArmyStatus: " + Status + " don't know if Malus should be removed DisorganizeMalus: " + DisorganizeMalus);
+ }
+
+ setAttrs({
+ repeating_army_ArmyStatus: String(Status),
+ repeating_army_ArmyDisorganizeMalus: String(DisorganizeMalus)
+ });
+ });
+});
+
+/* Special Unit Overwatch - this function just ensures that no more than three abilities are selected for a special unit */
+
+on("change:repeating_army:special_agility change:repeating_army:special_fighting change:repeating_army:special_marksmanship change:repeating_army:special_endurance change:repeating_army:special_stealth change:repeating_army:special_survival change:repeating_army:special_warfare change:repeating_army:special_athletics change:repeating_army:special_animal_handling change:repeating_army:special_awareness change:repeating_army:special_healing", function(eventInfo) {
+ let NewFactor = eventInfo.newValue;
+ let OldFactor = eventInfo.previousValue;
+ let Source = eventInfo.sourceAttribute;
+ let position = Source.search("_special_") + 9; // 9 is length of '_special_'
+ /* Unmangle the last ability updated and capitalize it */
+ let nonCap = Source.substring(position);
+ let Ability = nonCap.charAt(0).toUpperCase() + nonCap.slice(1);
+ console.log(" =-=- Change Special Unit Training: " + NewFactor + " from " + OldFactor + " source " + Source + " Ability " + Ability);
+
+ getAttrs(['repeating_army_ArmyTrainingPhase', 'repeating_army_special_agility','repeating_army_special_fighting','repeating_army_special_marksmanship','repeating_army_special_endurance','repeating_army_special_stealth','repeating_army_special_survival','repeating_army_special_warfare','repeating_army_special_athletics','repeating_army_special_animal_handling','repeating_army_special_awareness','repeating_army_special_healing'], function (values) {
+
+ let ArmyTrainingPhase = parseInt(values.repeating_army_ArmyTrainingPhase) || 0; // Either 1 = First Phase or 2 = Second Phase
+ let Agility = parseInt(values.repeating_army_special_agility) || 0;
+ let Fighting = parseInt(values.repeating_army_special_fighting) || 0;
+ let Marksmanship = parseInt(values.repeating_army_special_marksmanship) || 0;
+ let Endurance = parseInt(values.repeating_army_special_endurance) || 0;
+ let Stealth = parseInt(values.repeating_army_special_stealth) || 0;
+ let Survival = parseInt(values.repeating_army_special_survival) || 0;
+ let Warfare = parseInt(values.repeating_army_special_warfare) || 0;
+ let Athletics = parseInt(values.repeating_army_special_athletics) || 0;
+ let Animal_handling = parseInt(values.repeating_army_special_animal_handling) || 0;
+ let Awareness = parseInt(values.repeating_army_special_awareness) || 0;
+ let Healing = parseInt(values.repeating_army_special_healing) || 0;
+
+ console.log(" Special Training: Agility " + Agility + " Marksmanship " + Marksmanship + " Endurance " + Endurance + " Stealth " + Stealth);
+ console.log(" Fighting " + Fighting + " Survival " + Survival + " Warfare " + Warfare + " Athletics " + Athletics);
+ console.log(" Animal Handling " + Animal_handling + " Awareness " + Awareness + " Healing " + Healing);
+
+ let MaxSkillCount = 3;
+ let CurrentSkillCount = Agility + Fighting + Marksmanship + Endurance + Stealth + Survival + Warfare + Athletics + Animal_handling + Awareness + Healing;
+ console.log(" CurrentSkillCount " + CurrentSkillCount);
+
+ if (CurrentSkillCount > MaxSkillCount) {
+ // Remove the last updated Ability to, poentially, reduce skill count
+ // Also, this could probably be handled with a clever literal, but that is beyond my ken at thi moment
+ switch (Ability) {
+ case "Agility": Agility = 0; break
+ case "Fighting": Fighting = 0; break
+ case "Marksmanship": Marksmanship = 0; break
+ case "Endurance": Endurance = 0; break
+ case "Stealth": Stealth = 0; break
+ case "Survival": Survival = 0; break
+ case "Warfare": Warfare = 0; break
+ case "Athletics": Athletics = 0; break
+ case "Animal_handling": Animal_handling = 0; break
+ case "Awareness": Awareness = 0; break
+ case "Healing": Healing = 0; break
+ }
+ }
+
+ let SkillCount = 0;
+ // Look for more than MaxSkillCount and suppress the later ones. This paranoid code is brought to you from the
+ // survivors of the Jumpgate Beta where occassional interrupts were lost so no state validity was guaranteed
+
+ if (Agility != 0) { if (SkillCount >= MaxSkillCount) { Agility = 0; } else { SkillCount += 1; } }
+ if (Fighting != 0) { if (SkillCount >= MaxSkillCount) { Fighting = 0; } else { SkillCount += 1; } }
+ if (Marksmanship != 0) { if (SkillCount >= MaxSkillCount) { Marksmanship = 0; } else { SkillCount += 1; } }
+ if (Endurance != 0) { if (SkillCount >= MaxSkillCount) { Endurance = 0; } else { SkillCount += 1; } }
+ if (Stealth != 0) { if (SkillCount >= MaxSkillCount) { Stealth = 0; } else { SkillCount += 1; } }
+ if (Survival != 0) { if (SkillCount >= MaxSkillCount) { Survival = 0; } else { SkillCount += 1; } }
+ if (Warfare != 0) { if (SkillCount >= MaxSkillCount) { Warfare = 0; } else { SkillCount += 1; } }
+ if (Athletics != 0) { if (SkillCount >= MaxSkillCount) { Athletics = 0; } else { SkillCount += 1; } }
+ if (Animal_handling != 0) { if (SkillCount >= MaxSkillCount) { Animal_handling = 0; } else { SkillCount += 1; } }
+ if (Awareness != 0) { if (SkillCount >= MaxSkillCount) { Awareness = 0; } else { SkillCount += 1; } }
+ if (Healing != 0) { if (SkillCount >= MaxSkillCount) { Healing = 0; } else { SkillCount += 1; } }
+ console.log(" final SkillCount " + SkillCount);
+
+ setAttrs({
+ repeating_army_special_agility: Agility,
+ repeating_army_special_fighting: Fighting,
+ repeating_army_special_marksmanship: Marksmanship,
+ repeating_army_special_endurance: Endurance,
+ repeating_army_special_stealth: Stealth,
+ repeating_army_special_survival: Survival,
+ repeating_army_special_warfare: Warfare,
+ repeating_army_special_athletics: Athletics,
+ repeating_army_special_animal_handling: Animal_handling,
+ repeating_army_special_awareness: Awareness,
+ repeating_army_special_healing: Healing
+ });
+ });
+});
+
+
+
+/* When Special Unit clicked, update the keys selected for the phase */
+on("clicked:specialunit", function() {
+ console.log(" clicked SpecialUnit");
+
+ getAttrs(['repeating_army_ArmyTrainingPhase', 'repeating_army_ArmySkillFirst', 'repeating_army_ArmySkillSecond', 'repeating_army_ArmyAgiliteKey','repeating_army_ArmyArtmilKey','repeating_army_ArmyCacKey','repeating_army_ArmyAthletismeKey','repeating_army_ArmyTirKey','repeating_army_ArmyDressageKey','repeating_army_ArmyEnduranceKey','repeating_army_ArmyVigilanceKey','repeating_army_ArmyDiscretionKey','repeating_army_ArmyGuerisonKey','repeating_army_ArmySurvieKey', 'repeating_army_special_agility','repeating_army_special_fighting','repeating_army_special_marksmanship','repeating_army_special_endurance','repeating_army_special_stealth','repeating_army_special_survival','repeating_army_special_warfare','repeating_army_special_athletics','repeating_army_special_animal_handling','repeating_army_special_awareness','repeating_army_special_healing' ], function (values) {
+
+ let ArmyTrainingPhase = parseInt(values.repeating_army_ArmyTrainingPhase) || 0; // Either 1 = First Phase or 2 = Second Phase
+
+ let AgiliteKey = values.repeating_army_ArmyAgiliteKey;
+ let ArtmilKey = values.repeating_army_ArmyArtmilKey;
+ let CacKey = values.repeating_army_ArmyCacKey;
+ let AthletismeKey = values.repeating_army_ArmyAthletismeKey;
+ let TirKey = values.repeating_army_ArmyTirKey;
+ let DressageKey = values.repeating_army_ArmyDressageKey;
+ let EnduranceKey = values.repeating_army_ArmyEnduranceKey;
+ let VigilanceKey = values.repeating_army_ArmyVigilanceKey;
+ let DiscretionKey = values.repeating_army_ArmyDiscretionKey;
+ let GuerisonKey = values.repeating_army_ArmyGuerisonKey;
+ let SurvieKey = values.repeating_army_ArmySurvieKey;
+
+ let Agility = parseInt(values.repeating_army_special_agility) || 0;
+ let Fighting = parseInt(values.repeating_army_special_fighting) || 0;
+ let Marksmanship = parseInt(values.repeating_army_special_marksmanship) || 0;
+ let Endurance = parseInt(values.repeating_army_special_endurance) || 0;
+ let Stealth = parseInt(values.repeating_army_special_stealth) || 0;
+ let Survival = parseInt(values.repeating_army_special_survival) || 0;
+ let Warfare = parseInt(values.repeating_army_special_warfare) || 0;
+ let Athletics = parseInt(values.repeating_army_special_athletics) || 0;
+ let Animal_handling = parseInt(values.repeating_army_special_animal_handling) || 0;
+ let Awareness = parseInt(values.repeating_army_special_awareness) || 0;
+ let Healing = parseInt(values.repeating_army_special_healing) || 0;
+
+ let ArmySkillFirst = values.repeating_army_ArmySkillFirst;
+ let ArmySkillSecond = values.repeating_army_ArmySkillSecond;
+ let Key = "";
+ if (ArmyTrainingPhase == 1) {
+ ArmySkillFirst = UnitType["Special"];
+ Key = "K";
+ } else {
+ Key = "&";
+ ArmySkillSecond = UnitType["Special"];
+ }
+ // Abilities: Agilite Artmil Cac Athletisme Tir Dressage Endurance Vigilance Discretion Guerison Survie
+ // Abilities: Agility Warfare Fighting Athletics Marksmanship AnimalHandling Endurance Awareness Stealth Healing Survival
+
+ if (Agility != 0) { AgiliteKey = Key; } else if (AgiliteKey == Key) { AgiliteKey = ""; }
+ if (Fighting != 0) { CacKey = Key; } else if (CacKey == Key) { CacKey = ""; }
+ if (Marksmanship != 0) { TirKey = Key; } else if (TirKey == Key) { TirKey = ""; }
+ if (Endurance != 0) { EnduranceKey = Key; } else if (EnduranceKey == Key) { EnduranceKey = ""; }
+ if (Stealth != 0) { DiscretionKey = Key; } else if (DiscretionKey == Key) { DiscretionKey = ""; }
+ if (Survival != 0) { SurvieKey = Key; } else if (SurvieKey == Key) { SurvieKey = ""; }
+ if (Warfare != 0) { ArtmilKey = Key; } else if (ArtmilKey == Key) { ArtmilKey = ""; }
+ if (Athletics != 0) { AthletismeKey = Key; } else if (AthletismeKey == Key) { AthletismeKey = ""; }
+ if (Animal_handling != 0) { DressageKey = Key; } else if (DressageKey == Key) { DressageKey = ""; }
+ if (Awareness != 0) { VigilanceKey = Key; } else if (VigilanceKey == Key) { VigilanceKey = ""; }
+ if (Healing != 0) { GuerisonKey = Key; } else if (GuerisonKey == Key) { GuerisonKey = ""; }
+
+
+ setAttrs({
+ repeating_army_ArmyAgiliteKey: AgiliteKey,
+ repeating_army_ArmyArtmilKey: ArtmilKey,
+ repeating_army_ArmyCacKey: CacKey,
+ repeating_army_ArmyAthletismeKey: AthletismeKey,
+ repeating_army_ArmyTirKey: TirKey,
+ repeating_army_ArmyDressageKey: DressageKey,
+ repeating_army_ArmyEnduranceKey: EnduranceKey,
+ repeating_army_ArmyVigilanceKey: VigilanceKey,
+ repeating_army_ArmyDiscretionKey: DiscretionKey,
+ repeating_army_ArmyGuerisonKey: GuerisonKey,
+ repeating_army_ArmySurvieKey: SurvieKey,
+ });
+ });
+});
+
+/* Perhaps Global Static Array? */
+let UnitType = ["None", "Archers", "Cavalry", "Criminals", "Crusaders", "Engineers", "Garrison", "Guerillas", "Infantry", "Mercenaries", "Peasant Levies", "Personal Guards", "Raiders", "Sailors", "Scouts", "Special", "Support", "Warship"];
+
+on("change:repeating_army:ArmyType", function(eventInfo) {
+ let NewClass = eventInfo.newValue;
+ let OldClass = eventInfo.previousValue;
+ let Source = eventInfo.sourceAttribute;
+ console.log(" =-=-=- Class ArmyType: " + NewClass + " from " + OldClass + " source " + Source);
+
+ getAttrs(['repeating_army_ArmyTrainingPhase', 'repeating_army_ArmySkillFirst', 'repeating_army_ArmySkillSecond', 'repeating_army_ArmyDegtirMod','repeating_army_ArmyDegcacMod','repeating_army_ArmyAthletisme','repeating_army_ArmyValarm','repeating_army_ArmyPenarm','repeating_army_ArmyMalarm','repeating_army_ArmySante', 'repeating_army_ArmyAgiliteKey','repeating_army_ArmyArtmilKey','repeating_army_ArmyCacKey','repeating_army_ArmyAthletismeKey','repeating_army_ArmyTirKey','repeating_army_ArmyDressageKey','repeating_army_ArmyEnduranceKey','repeating_army_ArmyVigilanceKey','repeating_army_ArmyDiscretionKey','repeating_army_ArmyGuerisonKey','repeating_army_ArmySurvieKey' ], function (values) {
+
+ let ArmyTrainingPhase = parseInt(values.repeating_army_ArmyTrainingPhase) || 0; // Either 1 = First Phase or 2 = Second Phase
+ let MarksmanDamageMod = parseInt(values.repeating_army_ArmyDegtirMod) || 0;
+ let FightDamageMod = parseInt(values.repeating_army_ArmyDegtirMod) || 0;
+ let Athletics = parseInt(values.repeating_army_ArmyAthletisme) || 0;
+ let ArmorRating = parseInt(values.repeating_army_ArmyValarm) || 0;
+ let ArmorPenalty = parseInt(values.repeating_army_ArmyPenarm) || 0;
+ let Bulk = parseInt(values.repeating_army_ArmyMalarm) || 0;
+ let Health = parseInt(values.repeating_army_ArmySante) || 0;
+
+ // Ability Keys Translation
+ // Abilities: Agilite Artmil Cac Athletisme Tir Dressage Endurance Vigilance Discretion Guerison Survie
+ // Abilities: Agility Warfare Fighting Athletics Marksmanship AnimalHandling Endurance Awareness Stealth Healing Survival
+ // Missing: Survival Healing Choose 3
+
+ let AgiliteKey = values.repeating_army_ArmyAgiliteKey;
+ let ArtmilKey = values.repeating_army_ArmyArtmilKey;
+ let CacKey = values.repeating_army_ArmyCacKey;
+ let AthletismeKey = values.repeating_army_ArmyAthletismeKey;
+ let TirKey = values.repeating_army_ArmyTirKey;
+ let DressageKey = values.repeating_army_ArmyDressageKey;
+ let EnduranceKey = values.repeating_army_ArmyEnduranceKey;
+ let VigilanceKey = values.repeating_army_ArmyVigilanceKey;
+ let DiscretionKey = values.repeating_army_ArmyDiscretionKey;
+ let GuerisonKey = values.repeating_army_ArmyGuerisonKey;
+ let SurvieKey = values.repeating_army_ArmySurvieKey;
+
+ let ArmySkillFirst = values.repeating_army_ArmySkillFirst;
+ let ArmySkillSecond = values.repeating_army_ArmySkillSecond;
+ let Key = "";
+ if (ArmyTrainingPhase == 1) {
+ ArmySkillFirst = UnitType[NewClass];
+ Key = "K";
+ } else {
+ Key = "&";
+ ArmySkillSecond = UnitType[NewClass];
+ }
+
+ console.log(" ArmyType: " + NewClass + " MarksmanDamageMod " + MarksmanDamageMod + " FightDamageMod " + FightDamageMod + " Athletics " + Athletics);
+ console.log(" ArmorRating: " + ArmorRating + " ArmorPenalty " + ArmorPenalty + " Bulk " + Bulk + " Health " + Health);
+ console.log(" Keys: " + Key + " ArmyTrainingPhase " + ArmyTrainingPhase + " ArmySkillFirst " + ArmySkillFirst + " ArmySkillSecond " + ArmySkillSecond);
+ console.log(" Agilite " + AgiliteKey + " Artmil " + ArtmilKey + " Cac " + CacKey + " Athletisme " + AthletismeKey + " Tir " + TirKey + " Dressage " + DressageKey);
+ console.log(" Endurance " + EnduranceKey + " Vigilance " + VigilanceKey + " Discretion " + DiscretionKey + " Guerison " + GuerisonKey + " Survie " + SurvieKey);
+
+ /* Go through all Keys and remove the ones for that phase */
+
+ if (AgiliteKey == Key) { AgiliteKey = ""; console.log(" removed " + Key + " AgiliteKey"); }
+ if (ArtmilKey == Key) { ArtmilKey = ""; console.log(" removed " + Key + " ArtmilKey"); }
+ if (CacKey == Key) { CacKey = ""; console.log(" removed " + Key + " CacKey"); }
+ if (AthletismeKey == Key) { AthletismeKey = ""; console.log(" removed " + Key + " AthletismeKey"); }
+ if (TirKey == Key) { TirKey = ""; console.log(" removed " + Key + " TirKey"); }
+ if (DressageKey == Key) { DressageKey = ""; console.log(" removed " + Key + " DressageKey"); }
+ if (EnduranceKey == Key) { EnduranceKey = ""; console.log(" removed " + Key + " EnduranceKey"); }
+ if (VigilanceKey == Key) { VigilanceKey = ""; console.log(" removed " + Key + " VigilanceKey"); }
+ if (DiscretionKey == Key) { DiscretionKey = ""; console.log(" removed " + Key + " DiscretionKey"); }
+ if (GuerisonKey == Key) { GuerisonKey = ""; console.log(" removed " + Key + " GuerisonKey"); }
+ if (SurvieKey == Key) { SurvieKey = ""; console.log(" removed " + Key + " SurvieKey"); }
+
+
+ switch (NewClass) {
+ case "1": //Archers
+ ArmorRating = 2;
+ ArmorPenalty = -1;
+ Bulk = 0;
+ FightDamageMod = -1;
+ MarksmanDamageMod = 2;
+ AgiliteKey = Key;
+ VigilanceKey = Key;
+ TirKey = Key;
+ break;
+ case "2": //Cavalry
+ ArmorRating = 5;
+ ArmorPenalty = -3;
+ Bulk = 2;
+ FightDamageMod = 3;
+ MarksmanDamageMod = 0;
+ AgiliteKey = Key;
+ DressageKey = Key;
+ CacKey = Key;
+ break;
+ case "3": //Criminals
+ ArmorRating = 1;
+ ArmorPenalty = 0;
+ Bulk = 0;
+ FightDamageMod = 1;
+ MarksmanDamageMod = 2;
+ EnduranceKey = Key;
+ CacKey = Key;
+ DiscretionKey = Key;
+ break;
+ case "4": //Crusaders
+ ArmorRating = 4;
+ ArmorPenalty = -1;
+ Bulk = 0;
+ FightDamageMod = -1;
+ MarksmanDamageMod = 0;
+ AthletismeKey = Key;
+ EnduranceKey = Key;
+ CacKey = Key;
+ case "5": //Engineers
+ ArmorRating = 2;
+ ArmorPenalty = -1;
+ Bulk = 0;
+ FightDamageMod = -1;
+ MarksmanDamageMod = 0;
+ EnduranceKey = Key;
+ CacKey = Key;
+ ArtmilKey = Key;
+ break;
+ case "6": //Garrison
+ ArmorRating = 3;
+ ArmorPenalty = -2;
+ Bulk = 0;
+ FightDamageMod = 1;
+ MarksmanDamageMod = 0;
+ VigilanceKey = Key;
+ EnduranceKey = Key;
+ CacKey = Key;
+ break;
+ case "7": //Guerillas
+ ArmorRating = 1;
+ ArmorPenalty = 0;
+ Bulk = 0;
+ FightDamageMod = 0;
+ MarksmanDamageMod = 1;
+ AthletismeKey = Key;
+ TirKey = Key;
+ DiscretionKey = Key;
+ break;
+ case "8": //Infantry
+ ArmorRating = 3;
+ ArmorPenalty = -2;
+ Bulk = 0;
+ FightDamageMod = 1;
+ MarksmanDamageMod = 0;
+ AthletismeKey = Key;
+ EnduranceKey = Key;
+ CacKey = Key;
+ break;
+ case "9": //Mercenaries
+ ArmorRating = 4;
+ ArmorPenalty = -2;
+ Bulk = 1;
+ FightDamageMod = 1;
+ MarksmanDamageMod = 0;
+ AthletismeKey = Key;
+ EnduranceKey = Key;
+ CacKey = Key;
+ break;
+ case "10": //Peasant Levies
+ ArmorRating = 0;
+ ArmorPenalty = 0;
+ Bulk = 0;
+ FightDamageMod = -1;
+ MarksmanDamageMod = -1;
+ DressageKey = Key;
+ VigilanceKey = Key;
+ SurvieKey = Key;
+ break;
+ case "11": //Personal Guards
+ ArmorRating = 6;
+ ArmorPenalty = -3;
+ Bulk = 2;
+ FightDamageMod = 1;
+ MarksmanDamageMod = 0;
+ AthletismeKey = Key;
+ EnduranceKey = Key;
+ CacKey = Key;
+ break;
+ case "12": //Raiders
+ ArmorRating = 2;
+ ArmorPenalty = -1;
+ Bulk = 0;
+ FightDamageMod = 1;
+ MarksmanDamageMod = 0;
+ AgiliteKey = Key;
+ EnduranceKey = Key;
+ CacKey = Key;
+ break;
+ case "14": //Sailors
+ ArmorRating = 0;
+ ArmorPenalty = 0;
+ Bulk = 0;
+ FightDamageMod = 1;
+ MarksmanDamageMod = 0;
+ AgiliteKey = Key;
+ VigilanceKey = Key;
+ CacKey = Key;
+ break;
+ case "15": //Scouts
+ ArmorRating = 2;
+ ArmorPenalty = -1;
+ Bulk = 0;
+ FightDamageMod = 0;
+ MarksmanDamageMod = 0;
+ VigilanceKey = Key;
+ EnduranceKey = Key;
+ DiscretionKey = Key;
+ break;
+ case "16": //Special
+ ArmorRating = 2;
+ ArmorPenalty = -1;
+ Bulk = 0;
+ FightDamageMod = 0;
+ MarksmanDamageMod = 0;
+ //Any Three Key Abilities - To Be Handled Later
+ break;
+ case "17": //Support
+ ArmorRating = 0;
+ ArmorPenalty = 0;
+ Bulk = 0;
+ FightDamageMod = -1;
+ MarksmanDamageMod = 0;
+ EnduranceKey = Key;
+ DressageKey = Key;
+ GuerisonKey = Key;
+ break;
+ case "18": //Warship
+ ArmorRating = 5;
+ ArmorPenalty = 0;
+ Bulk = 0;
+ FightDamageMod = 1;
+ MarksmanDamageMod = 1;
+ VigilanceKey = Key;
+ CacKey = Key;
+ TirKey = Key;
+ break;
+ default:
+ console.log(" Unknown Unit Tupe: " + String(NewClass));
+ }
+
+console.log(" Keys: Agility = " + AgiliteKey + " Warfare = " + ArtmilKey + " Fighting = " + CacKey + " Athletics = " + AthletismeKey + " Marksmanship = " + TirKey + " Animal Handling = " + DressageKey + " Endurance = " + EnduranceKey + " Awareness= " + VigilanceKey + " Stealth= " + DiscretionKey+ " Healing= " + GuerisonKey + " Stealth= " + SurvieKey);
+
+ setAttrs({
+ repeating_army_ArmyDegtirMod: MarksmanDamageMod,
+ repeating_army_ArmyDegtirMod: FightDamageMod,
+ repeating_army_ArmyAthletisme: Athletics,
+ repeating_army_ArmyValarm: ArmorRating,
+ repeating_army_ArmySkillFirst: ArmySkillFirst,
+ repeating_army_ArmySkillSecond: ArmySkillSecond,
+
+ repeating_army_ArmyAgiliteKey: AgiliteKey,
+ repeating_army_ArmyArtmilKey: ArtmilKey,
+ repeating_army_ArmyCacKey: CacKey,
+ repeating_army_ArmyAthletismeKey: AthletismeKey,
+ repeating_army_ArmyTirKey: TirKey,
+ repeating_army_ArmyDressageKey: DressageKey,
+ repeating_army_ArmyEnduranceKey: EnduranceKey,
+ repeating_army_ArmyVigilanceKey: VigilanceKey,
+ repeating_army_ArmyDiscretionKey: DiscretionKey,
+ repeating_army_ArmyGuerisonKey: GuerisonKey,
+ repeating_army_ArmySurvieKey: SurvieKey,
+
+ repeating_army_ArmyPenarm: ArmorPenalty,
+ repeating_army_ArmyMalarm: Bulk
+ });
+
+ });
+});
+
+on("change:repeating_army:ArmyEndurance", function(eventInfo) {
+ let NewEndurance = eventInfo.newValue;
+ let OldEndurance = eventInfo.previousValue;
+ let Source = eventInfo.sourceAttribute;
+ console.log(" =-=- Change ArmyEndurance: " + NewEndurance + " from " + OldEndurance + " source " + Source);
+
+ let ArmySanteMax = NewEndurance * 3;
+ console.log(" =-=- New ArmySanteMax: " + ArmySanteMax);
+ setAttrs({
+ repeating_army_ArmySanteMax: ArmySanteMax
+ });
+});
+
+/* Combat Calculations */
+on("change:awareness change:cunning change:status change:intrigueDefenseBonus change:will change:composureBonus change:agility change:athletics change:defenseBonus change:armorPenalty", function(eventInfo) {
+ let NewValue = eventInfo.newValue;
+ let OldValue = eventInfo.previousValue;
+ let Source = eventInfo.sourceAttribute;
+ console.log(" =-=- Change Combat Calculations: " + NewValue + " from " + OldValue + " source " + Source);
+
+ getAttrs(['awareness', 'cunning','status', 'intrigueDefenseBonus','will', 'composureBonus','agility', 'athletics', 'defenseBonus','armorPenalty'], function (values) {
+ let Awareness = parseInt(values.awareness) || 0;
+ let Cunning = parseInt(values.cunning) || 0;
+ let Status = parseInt(values.status) || 0;
+ let IntrigueDefenseBonus = parseInt(values.intrigueDefenseBonus) || 0;
+ let Will = parseInt(values.will) || 0;
+ let ComposureBonus = parseInt(values.composureBonus) || 0;
+ let Agility = parseInt(values.agility) || 0;
+ let Athletics = parseInt(values.athletics) || 0;
+ let DefenseBonus = parseInt(values.defenseBonus) || 0;
+ let ArmorPenalty = parseInt(values.armorPenalty) || 0;
+ let IntrigueDefense = Awareness + Cunning + Status + IntrigueDefenseBonus;
+ let ComposureMax = Will * 3 + ComposureBonus;
+ let FrustrationMax = Will;
+ let CombatDefense = Agility + Athletics + DefenseBonus + ArmorPenalty;
+
+ console.log(' IntrigueDefense ' + IntrigueDefense + ' ComposureMax ' + ComposureMax + ' FrustrationMax ' + FrustrationMax + ' CombatDefense ' + CombatDefense);
+ setAttrs({
+ intrigueDefense: IntrigueDefense, composureMax: ComposureMax, frustrationMax: FrustrationMax, combatDefense: CombatDefense
+ });
+ });
+});
+
+/* Movement Calculations */
+on("change:baseMovement change:athleticsRun change:bulk change:movementCalc change:movementMin change:movement change:sprintMulti change:sprintCalc change:sprintMin change:armorBulk change:totalWeaponBulk", function(eventInfo) {
+ let NewValue = eventInfo.newValue;
+ let OldValue = eventInfo.previousValue;
+ let Source = eventInfo.sourceAttribute;
+ console.log(" =-=- Change Movement Calculations: " + NewValue + " from " + OldValue + " source " + Source);
+
+ getAttrs(['baseMovement', 'athleticsRun', 'bulk', 'movementCalc', 'movementMin', 'movement', 'sprintMulti', 'sprintCalc', 'sprintMin', 'armorBulk', 'totalWeaponBulk'], function (values) {
+ let BaseMovement = parseInt(values.baseMovement) || 0;
+ let AthleticsRun = parseInt(values.athleticsRun) || 0;
+ let Bulk = parseInt(values.bulk) || 0;
+ let MovementCalc = parseInt(values.movementCalc) || 0;
+ let MovementMin = parseInt(values.movementMin) || 0; /* Always 1? */
+ let Movement = parseInt(values.movement) || 0;
+ let SprintMulti = parseInt(values.sprintMulti) || 0;
+ let SprintCalc = parseInt(values.sprintCalc) || 0;
+ let SprintMin = parseInt(values.sprintMin) || 0; /* Always 1? */
+ let ArmorBulk = parseInt(values.armorBulk) || 0;
+ let TotalWeaponBulk = parseInt(values.totalWeaponBulk) || 0;
+
+ MovementCalc = BaseMovement + Math.floor(AthleticsRun/2) - Math.floor(Bulk/2);
+ Movement = MovementCalc + MovementMin + Math.abs((MovementCalc - MovementMin) / 2);
+ SprintCalc = Movement + SprintMulti - Bulk;
+ let Sprint = SprintCalc + SprintMin + Math.abs((SprintCalc - SprintMin) / 2);
+ Bulk = ArmorBulk + TotalWeaponBulk;
+
+ console.log(' MovementCalc ' + MovementCalc + ' Movement ' + Movement + ' SprintCalc ' + SprintCalc + ' Sprint ' + Sprint + ' Bulk ' + Bulk);
+ setAttrs({
+ movementCalc: MovementCalc, movement: Movement, sprintCalc: SprintCalc, sprint: Sprint, bulk: Bulk
+ });
+ });
+});
+
+on("change:endurance change:healthbonus", function(eventInfo) {
+ let NewValue = eventInfo.newValue;
+ let OldValue = eventInfo.previousValue;
+ let Source = eventInfo.sourceAttribute;
+ console.log(" =-=- Change Endurance or HealthBonus: " + NewValue + " from " + OldValue + " source " + Source);
+
+ getAttrs(['endurance', 'healthbonus'], function (values) {
+ let Endurance = parseInt(values.endurance) || 0;
+ let HealthBonus = parseInt(values.healthbonus) || 0;
+ console.log(` Endurance ` + Endurance + " HealthBonus " + HealthBonus);
+ let HealthMax = Endurance * 3 + HealthBonus;
+ let FatigueMax = Endurance ;
+ let InjuriesMax = Endurance ;
+ let WoundsMax = Endurance ;
+ console.log(' healthMax ' + HealthMax + ' fatigueMax ' + FatigueMax + ' injuriesMax ' + InjuriesMax + ' woundsMax ' + WoundsMax);
+ setAttrs({
+ healthmax: HealthMax, fatiguemax: FatigueMax, injuriesmax: InjuriesMax, woundsmax: WoundsMax
+ });
+ });
+});
+
+/* Literals? */
+const int = score => parseInt(score, 10) || 0;
+
+const stats = ["agility", "animalhandling", "athletics", "awareness", "cunning", "deception", "endurance", "fighting", "healing", "custom1", "language", "knowledge", "marksmanship", "persuasion", "status", "stealth", "survival", "thievery", "warfare", "will", "custom2"];
+stats.forEach(stat => {
+ on(`change:${stat}`, () => {
+ getAttrs([stat], values => {
+
+ const stat_base = parseInt(values[stat]);
+ console.log(`${stat} ` + stat_base);
+ let stat_mod = stat_base * 4;
+ console.log(`${stat}-passive ` + stat_mod);
+ setAttrs({
+ [`${stat}-passive`]: stat_mod
+ });
+ });
+ });
+});
+
+
+/* Glory, Experience and Destiny Calculations */
+on("change:destinyBase change:destinyBonus change:destinyInvested change:exp change:expSpent change:glory change:glorySpent", function(eventInfo) {
+ let NewValue = eventInfo.newValue;
+ let OldValue = eventInfo.previousValue;
+ let Source = eventInfo.sourceAttribute;
+ console.log(" =-=- Change Glory,Experience,Destiny Calculations: " + NewValue + " from " + OldValue + " source " + Source);
+
+ getAttrs(['destinyBase', 'destinyBonus', 'destinyInvested', 'exp', 'expSpent', 'glory', 'glorySpent'], function (values) {
+ let DestinyBase = parseInt(values.destinyBase) || 0;
+ let DestinyBonus = parseInt(values.destinyBonus) || 0;
+ let DestinyInvested = parseInt(values.destinyInvested) || 0;
+ let Exp = parseInt(values.exp) || 0;
+ let ExpSpent = parseInt(values.expSpent) || 0; /* Always 1? */
+ let Glory = parseInt(values.glory) || 0;
+ let GlorySpent = parseInt(values.glorySpent) || 0;
+ let DestinyMax = DestinyBase + DestinyBonus - DestinyInvested;
+ let ExpAvail = Exp - ExpSpent;
+ let GloryAvail = Glory - GlorySpent;
+
+ console.log(' DestinyMax ' + DestinyMax + ' = DestinyBase ' + DestinyBase + ' + DestinyBonus ' + DestinyBonus + ' - DestinyInvested ' + DestinyInvested);
+ console.log(' ExpAvail ' + ExpAvail + ' = Exp ' + Exp +' + ExpSpent ' + ExpSpent);
+ console.log(' GloryAvail ' + GloryAvail + ' = Glory ' + Glory + ' + GlorySpent ' + GlorySpent);
+
+ setAttrs({
+ destinyMax: DestinyMax, expAvail: ExpAvail, gloryAvail: GloryAvail
+ });
+ });
+});
diff --git a/A Song of Ice and Fire/sheet.json b/A Song of Ice and Fire/sheet.json
index a820553842..9d4f109dee 100644
--- a/A Song of Ice and Fire/sheet.json
+++ b/A Song of Ice and Fire/sheet.json
@@ -4,6 +4,6 @@
"authors": "Alex Ott",
"roll20userid": "3241579",
"preview": "SIFRPNew.png",
- "instructions": "#A Song of Ice and Fire Roleplaying: Game of Thrones Edition\rAuto-calculated stats, fancy hideable sections, and more",
+ "instructions": "#A Song of Ice and Fire Roleplaying: Game of Thrones Edition\rAuto-calculated stats, fancy hideable sections, and more.\rTweaks by Vialmada 6055058 regarding armies and autocalc",
"legacy": true
}
\ No newline at end of file