I may have found a workaround...
Firstly, I dont understand why Price Factor uses the Base Price, because this will be the lowest attribute price which is not applicable if you choose a higher costing attribute, rendering price factor useless when priced by attributes.
So I thought maybe I could change this bit of code, so instead of the Price Factor using the Base Price, it uses the price of the attribute chosen.
So in classes/shopping_cart.php and /includes/functions/functions_prices.php, I found reference to:
function zen_get_attributes_price_factor()
I altered this to instead of calling the base price, to call the attribute price.
I changed all references but the one that worked for my situation was line 906 on shopping_cart.php:-
Code:
$added_charge = zen_get_attributes_price_factor($chk_price, $chk_special, $attribute_price->fields['attributes_price_factor'], $attribute_price->fields['attributes_price_factor_offset']);
to
Code:
$added_charge = zen_get_attributes_price_factor($attributes_price, $chk_special, $attribute_price->fields['attributes_price_factor'], $attribute_price->fields['attributes_price_factor_offset']);
This is not fully tested and probably does not work when you do use a product price and not priced by attributes (so it would need more code to get it to work on all cases) but this works for my setup.
This means I can now add an extra Checkbox attribute called Price Factor, or Extra 10% or whatever, using only a 0.1 price factor. Then using Javascript when someone chooses a certain attribute that will add the 10% it will check this box, and if they change away from this selection, remove the checkbox. PHP could also be used server side after submission to cater for non-JS, but JS is easier for now.
So this way, if it continues to work with no consequences, I can add on 10% or any percent onto a chosen attribute.