I think for your case that you need to used different logic dependent in the specific user case/scenario the correct option could be use apex code = triggers, and might be use too object layouts to show to the user which specific fields are going to be always read only.
If you write all your logic in the triggers then you won't need to have validation rules (they will be a plus but not required), also for future you will be able to extend those triggers adding new functionality.
(***Take care where you create the triggers you wouldn't like to break the CRM ;) )
In addition to the trigger logic you could use layouts, then the user will be more aware about the read only fields. But remember don't use only layout validations because they won't stop the users to do any modifications by DML through developer console for example (Universal Required ). Also if the read only is optional , don't use layouts.
Logic in trigger would be something like this:
//You will need to implement the logic in insert and update, also before insert and before update if you would like to modify fields, the modifications can't be done in after trigger!! REMEMBER this tip : MODIFY BEFORE, VALIDATE AFTER :) ( when would the validation is posible in after of course )
If(checkbox is true)
{
update some other fields
}
else
{
update some other fields
}
//validation
if(scenario and user try to modify field)
{
throw error "You can't edit the field when scenario"
}
-----Related to your example :
AND
(
ISCHANGED(field_to_protect__c),
Trigger_set_read_only_c
)
"ISCHANGED" Function comes from a validation Rule, therefore if you don't want to use a Validation Rule this code won't be helpful.
However if you still would like to use a validation Rule, the code above is doing this :
- I guess that the whole code should be as follow :
NOT(AND(ISCHANGED(field_to_protect__c), Trigger_set_read_only__c) )
- what it does is : if the user try to change the field_to_protect__c value and Trigger_set_read_only__c is true, then an error will be thrown to don't allow to do that.
Hope it helps
I'll keep an eye on the question if I can help more :)