int dogma_add_module_sc(dogma_context_t* ctx, dogma_typeid_t id, dogma_key_t* index, dogma_state_t s, dogma_typeid_t charge) { DOGMA_ASSUME_OK(dogma_add_module(ctx, id, index)); DOGMA_ASSUME_OK(dogma_set_module_state(ctx, *index, s)); return dogma_add_charge(ctx, *index, charge); }
int main(void) { double v; dogma_init(); dogma_init_context(&ctx); /* Source: Pyfa-a4d72ca (Oct 7 2013) */ /* Let's test a whole implant set (which has bonuses affecting the * set as a whole), and see how it reacts with stacking penalized * modules. */ dogma_add_implant(ctx, TYPE_HighgradeCrystalAlpha, &impslot0); dogma_add_implant(ctx, TYPE_HighgradeCrystalBeta, &impslot1); dogma_add_implant(ctx, TYPE_HighgradeCrystalGamma, &impslot2); dogma_add_implant(ctx, TYPE_HighgradeCrystalDelta, &impslot3); dogma_add_implant(ctx, TYPE_HighgradeCrystalEpsilon, &impslot4); dogma_add_implant(ctx, TYPE_HighgradeCrystalOmega, &impslot5); dogma_set_ship(ctx, TYPE_Venture); dogma_add_module(ctx, TYPE_SmallShieldBoosterII, &slot0); dogma_add_module(ctx, TYPE_ShieldBoostAmplifierII, &slot1); dogma_add_module(ctx, TYPE_ShieldBoostAmplifierII, &slot2); dogma_set_module_state(ctx, slot0, DOGMA_STATE_Active); dogma_set_module_state(ctx, slot1, DOGMA_STATE_Online); dogma_set_module_state(ctx, slot2, DOGMA_STATE_Online); dogma_get_module_attribute(ctx, slot0, ATT_ShieldBonus, &v); assertf(96.0105996145, v, 0.0000000005); dogma_free_context(ctx); dogma_init_context(&ctx); /* Source: Pyfa-42efa48 (Jun 13 2013) */ /* Source: EFT 2.19.1 */ /* Some sources say the Snake set is stacking penalized. This is * not the case (unless both Pyfa and EFT are wrong). */ dogma_add_implant(ctx, TYPE_HighgradeSnakeAlpha, &impslot0); dogma_add_implant(ctx, TYPE_HighgradeSnakeBeta, &impslot1); dogma_add_implant(ctx, TYPE_HighgradeSnakeGamma, &impslot2); dogma_add_implant(ctx, TYPE_HighgradeSnakeDelta, &impslot3); dogma_add_implant(ctx, TYPE_HighgradeSnakeEpsilon, &impslot4); dogma_add_implant(ctx, TYPE_HighgradeSnakeOmega, &impslot5); dogma_set_ship(ctx, TYPE_Venture); dogma_add_module(ctx, TYPE_OverdriveInjectorSystemII, &slot0); dogma_add_module(ctx, TYPE_SmallPolycarbonEngineHousingI, &slot1); dogma_add_module(ctx, TYPE_SmallPolycarbonEngineHousingI, &slot2); dogma_add_module(ctx, TYPE_SmallPolycarbonEngineHousingI, &slot3); dogma_set_module_state(ctx, slot0, DOGMA_STATE_Online); dogma_set_module_state(ctx, slot1, DOGMA_STATE_Online); dogma_set_module_state(ctx, slot2, DOGMA_STATE_Online); dogma_set_module_state(ctx, slot3, DOGMA_STATE_Online); dogma_get_ship_attribute(ctx, ATT_MaxVelocity, &v); assertf(644.929066501, v, 0.0000000005); dogma_free_context(ctx); dogma_init_context(&ctx); /* Source: EFT 2.20.3 */ dogma_add_implant(ctx, TYPE_StrongBluePillBooster, &impslot0); dogma_set_ship(ctx, TYPE_Venture); dogma_add_module(ctx, TYPE_SmallShieldBoosterII, &slot0); dogma_set_module_state(ctx, slot0, DOGMA_STATE_Active); const dogma_location_t imploc0 = { .type = DOGMA_LOC_Implant, .implant_index = impslot0, }; dogma_get_chance_based_effect_chance(ctx, imploc0, EFFECT_BoosterShieldCapacityPenalty, &v); assertf(0.3, v, 0.05); dogma_get_chance_based_effect_chance(ctx, imploc0, EFFECT_BoosterCapacitorCapacityPenalty, &v); assertf(0.3, v, 0.05); dogma_get_module_attribute(ctx, slot0, ATT_ShieldBonus, &v); assertf(45.5, v, 0.5); dogma_get_ship_attribute(ctx, ATT_ShieldCapacity, &v); assertf(281.25, v, 0.005); dogma_get_ship_attribute(ctx, ATT_CapacitorCapacity, &v); assertf(312.5, v, 0.05); dogma_toggle_chance_based_effect(ctx, imploc0, EFFECT_BoosterShieldCapacityPenalty, true); dogma_get_module_attribute(ctx, slot0, ATT_ShieldBonus, &v); assertf(45.5, v, 0.5); dogma_get_ship_attribute(ctx, ATT_ShieldCapacity, &v); assertf(217.96875, v, 0.000005); dogma_get_ship_attribute(ctx, ATT_CapacitorCapacity, &v); assertf(312.5, v, 0.05); dogma_toggle_chance_based_effect(ctx, imploc0, EFFECT_BoosterCapacitorCapacityPenalty, true); dogma_get_module_attribute(ctx, slot0, ATT_ShieldBonus, &v); assertf(45.5, v, 0.5); dogma_get_ship_attribute(ctx, ATT_ShieldCapacity, &v); assertf(217.96875, v, 0.000005); dogma_get_ship_attribute(ctx, ATT_CapacitorCapacity, &v); assertf(242.1875, v, 0.00005); dogma_toggle_chance_based_effect(ctx, imploc0, EFFECT_BoosterShieldCapacityPenalty, false); dogma_get_module_attribute(ctx, slot0, ATT_ShieldBonus, &v); assertf(45.5, v, 0.5); dogma_get_ship_attribute(ctx, ATT_ShieldCapacity, &v); assertf(281.25, v, 0.005); dogma_get_ship_attribute(ctx, ATT_CapacitorCapacity, &v); assertf(242.1875, v, 0.00005); dogma_toggle_chance_based_effect(ctx, imploc0, EFFECT_BoosterCapacitorCapacityPenalty, false); dogma_get_module_attribute(ctx, slot0, ATT_ShieldBonus, &v); assertf(45.5, v, 0.5); dogma_get_ship_attribute(ctx, ATT_ShieldCapacity, &v); assertf(281.25, v, 0.005); dogma_get_ship_attribute(ctx, ATT_CapacitorCapacity, &v); assertf(312.5, v, 0.05); dogma_free_context(ctx); return 0; }