Speaking as a programmer (ooh look at the PROGRAMMER), saying whether it's easy implementable or not hinges on looking at the source code.
Basically every card action (draw, meld, score, foreshadow, tuck, etc.) would have to call a function that checks if any figures perform an additional action or replace it.
Kinda like this pseudocode, for foreshadow:
function foreshadow(player, card)
{
if (figures_test_foreshadow(player, card)) return;
/* old foreshadow code here*/
}
function figures_test_foreshadow(player, card) // returns true if the action has been replaced (instead), false if action can continue
{
if (player_has_top_card("Shennong"))
{
if (card_value(card) in (map(all_cards_forecast(player)),|forecast_card| card_value(forecast_card)))
map(all_cards_forecast(player),|forecast_card| if (card_value(forecast_card) == card_value(card)) score(player, card));
return false;
}
if (player_has_top_card("Galileo Galilei"))
{
if (card_value(card) not in (map(all_cards_forecast(player)),|forecast_card| card_value(forecast_card)))
map(all_cards_forecast(player),|forecast_card| transfer_to_hand(forecast_card,player));
return false;
}
if (player_has_top_card("Christiaan Huygens"))
{
if (card_has_icon(card, "Lightbulb") and card_value(card) <= max(map(top_cards(player), |top_card| card_value(top_card))) + 2)
{ meld(player, card); return true; }
else return false;
}
if (player_has_top_card("H. G. Wells"))
{
meld(player, card);
execute_dogma_for_player_only(player, card);
if (is_top_card(card)) remove(card);
return true;
}
}
end
See? Simple. Plus, all actions -within- a Karma action can't trigger other Karma actions, so you need some extra code for that.