Писал в тему 'Разные портреты?', но, пока набивал ответ, автор уже нашел решение (я считаю, более удачное, чем то, о котором пойдет речь ниже). Тем не менее, мне показалось, что этот материал может быть многим интересен. В самом 'ответе' ничего не менял - возможно, так даже лучше - представлено решение конкретной проблемы, а не только абстрактная теория.

(Администрация, извините, не нашел лучшего раздела чтобы это опубликовать, хотя по формату, конечно, не совсем статья)

Холось бы предупредить - я не работаю с мейкером очень давно (прекратил еще до выхода XP). Прошу отнестись с пониманием, если я где-то что-то напутал (возможно, очень сильно) или то, о чем я пишу, напрямую не применимо к современным версиям конструктора. Извините, что не поставил себе мейкер, не посмотрел правильные названия команд, не проверил работоспособность и не приложил демку (это не сарказм - мне следовало бы так поступить, раз взялся писать столь развернутый ответ). Мне хотелось донести саму концепцию (более абстрактную, чем заданный вопрос; вообще, в программировании (и не только) ОЧЕНЬ полезно решать задачу на один или несколько уровней абстракции выше, чем она была сформулирована).

Насколько я понял суть вопроса:

Есть функционал, который должен быть одинаковым для разных эвентов. (в случае, если тебе нужно изменить этот функционал, он должен быть изменен у всех эвентов).
Было бы удобно, если бы этот функционал был реализован только в одном месте, а все эвенты, которым он необходим, использовали единственную имеющуюся реализацию.

Приходим к простейшей концепции программирования - вынесению общего функционала в отдельную функцию.
Не сомневаюсь, что в 'новых' мейкерах, поддерживающих RGSS, это делается очень просто и в лоб (нужно написать функцию - значит, пишешь функцию).

В старых (2000 и 2003) мейкерах (т.е. используя эвенты) вместо функций используются Common Event (ближе всего по смыслу мне кажется перевод "часто встречающееся событие").

Пример:
Требуется создать собственную функцию, отвечающую за отображение фейса:

(безбожно перевираю названия команд, но, думаю, смысл ясен)

Стандартный вариант отображения сообщения:
SetMessageFace(нужное лицо)
ShowMessage(текст сообщения)

Собственный вариант:
CallCommonEvent(MySetFaceFunction) //Собственная функция, отвечающая за выбор портрета
ShowMessage(текст сообщения)

Нужно понять, что принципиально SetMessageFace() и MySetFaceFunction() ничем не отличаюся:

//реализация (код) нашей функции (Common Event'a)
MySetFaceFunction()
{
SetMessageFace(нужное лицо) //ВООБЩЕ ничем не отличаются
}

Но, скажем, вместо скучного квадратика в текстовом окне мы захотели красиваю картинку позади сообщения.
Просто переписываем тело (код) нашей функции:
MySetFaceFunction()
{
ShowPicture(наша красивая картинка-портрет)
}

И больше ничего не нужно - во всех эвентах, использующих MySetFaceFunction() вместо стандартной SetMessageFace() сообщения будут выводиться с красивой картинкой.

Если сказанное выше понятно, можно переходить дальше.

Проблема (правильно говорить не проблема, а задача:-)): у разных персонажей портреты разные, плюс у одного персонажа могут быть разные эмоции, а функция у нас одна.

Можно создать много функций:
MyShowHero1FaceAngry()
MyShowHero1FaceSad()
MyShowHero2FaceAngry()
...и т.д.

Но можно поступить интереснее:
В 'нормальном' программировании функции принимают аргументы. (Входящие) аргументы функции это та информация, в зависимости от которой меняется результат действия функции.
Насколько я помню, в эвентах на мейкере никакой передачи аргументов нет, поэтому нам придется придумать ее самим:
Давайте введем переменную, которая будет отвечать за эмоцию, которую должно выражать лицо персонажа, и назовем нашу переменную varFaceEmotion.
Составим список эмоций в зависимости от значения переменной varFaceEmotion:
varFaceEmotion = 1 - Злость
varFaceEmotion = 2 - Грусть
... 3 - Радость
...и т.д.

Теперь в нашем эвенте (обычном, не коммон) пишем:
SetVariable(varFaceEmotion = 1)
CallCommonEvent(MyShowHero1Face)
ShowMessage(текст сообщения)

А в коде нашего коммон ивента
MyShowHero1Face()
{
case varFaceEmotion
{
1: { // Если varFaceEmotion была установлена в 1
ShowPicture(картинка-портрет на которой изображен злой Алекс (герой №1))
}
2: { // Если varFaceEmotion была установлена в 2
ShowPicture(картинка-портрет на которой изображен грустный герой №1)
}
3:...и т.д.
}
}

Можно также создать переменную для номера героя (или оставить для каждого героя собственный коммон ивент).

Всё.

Так вот, таким образом на эвентах можно реализовывать смену дня и ночи и погоды (и копировать на каждую карту эвент не с кучей кода а с MyFuncWeatherChange()), проигрывание анимации у персонажа, проигрывание постоянно встречающихся звуков (MyFuncPlaySoundQuestComplete() вместо PlaySound(звук колокольчика)) и другие 'часто встречающиеся события' (в данном случае 'события' это русское слово, а не мейкерский термин :-)).

Опять таки, ТОЛЬКО если всё сказанное выше абсолютно понятно, можно подумать на тему использования команды SetVarByVarNumber(varVarNumber, значение переменной), которая позволяет менять значение не конкретной переменной, а переменной, заданной параметрически (с помощью другой переменной).

Пытался объяснить максимально понятно, поэтому намешал мейкерской и не-мейкерской (относящейся к общему программированию) терминологии. По той же самой причине объяснение некорректно с точки зрения теории программирования.

Так вот, понятно, что если в начале был выбор портрета (номер выборанного портрета был заненсен в переменную), то наша функция будет выглядеть так:
MyShowHero1Face()
{
case varChosenPortrait
{
1: { //был выбран портрет №1
case varFaceEmotion
{
1: {
ShowPicture(злой портрет №1)
}
2: {
ShowPicture(грустный портрет №1)
}
...
}
2: { //был выбран портрет №2
case varFaceEmotion
{
1: {
ShowPicture(злой портрет №1)
}
2: {
ShowPicture(грустный портрет №1)
}
...
}
}
}