If you do not have a full team of five to ten people implementing (and maintaining) the code for these 3000 objects, you need definitely some declarative approach to describe / implement most of them. And I am pretty sure in 3000 objects, there will be all kind of repetitions/similarities in the behaviour. For example, I can imagine your example
"when you summon minion deal 1dmg to random enemy"
might occur often in the form
"when you summon <X> deal <Y> to enemies of type <Z>"
So what you finally need to store is
- the tabular input for your generator
- the implementation for the (hopefully few) objects which cannot be generated
The input data for your generator maybe stored in a spreadsheet, "DSL like" text, XML or JSON files, or in a (lightweight) database, depending on what you feel most comfortable with. If there is only one person at a time maintaining the rules, I would probably go for a spreadsheet, for many people I would probably try a database. In both cases it might be necessary to provide "template strings" or fields with code snippets in the table. Call this a "generator DSL", if you like. 3000 rows in a spreadsheet is quite manageable by one person, especially when you can make use of the filter and sorting capabilities. "name", "color", "rarity", "expansion", "type of enemy" or "business rule type" - with a spreadsheet program you can filter or sort your cards "ad hoc" according to these attributes, without having the need to invest too much thought beforehand into the hierarchies you might need.