In the next version of calibre (5.10 probably) add() and multiply() accept a variable number of arguments. Thus, once released your solution can be written as
Code:
program:
floor(add(field('#story'), field('#characters'), field('#writing'), field('#ending')))
To head off questions: I changed add() and multiply() because the operations are commutative, giving the same answer regardless of order of evaluation, while subtract and divide are not. I don't want to worry about guaranteeing the order of evaluation within the function.