• Уважаемые гости и новички, приветствуем Вас на нашем форуме
    Здесь вы можете найти ответы практически на все свои вопросы о серии игр «Готика» (в том числе различных модах на нее), «Ведьмак», «Ризен», «Древние свитки», «Эра дракона» и о многих других играх. Можете также узнать свежие новости о разработке новых проектов, восхититься творчеством наших форумчан, либо самим показать, что вы умеете. Ну и наконец, можете обсудить общие увлечения или просто весело пообщаться с посетителями «Таверны».

    Чтобы получить возможность писать на форуме, оставьте сообщение в этой теме.
    Удачи!
  • Друзья, доброго времени суток! Спешите принять участие в конкурсе "Таинственные миры" 2024!
    Ждем именно вас!

    Ссылка на конкурсную тему - тык

Gothic ½ Сборник патчей

Slavemaster


Модостроитель
Регистрация
10 Июн 2019
Сообщения
1.034
Благодарности
1.798
Баллы
240
  • Первое сообщение
  • #1
Сборник патчей
Патч - это текстовый файл с расширением .patch, вносящий изменения в движок игры при использовании с пакетом Union. Для автоматической загрузки патча достаточно, чтобы он находился в папке <Путь до игры>\System\Autorun\.

Патчи-улучшения [Скачать: Google-Диск]

Патчи данной категории предназначены для исправления багов движка
  1. zSpellPropagationFix устраняет ошибки, из-за которых информация об уроне от заклинаний терялась при их распространении после основного удара. В частности, это приводило к тому, что заряжаемые заклинания не могли наносить повышенного урона вторичным целям. Только для Готики 2!
  2. zSpellCollisionFix устраняет ошибки, из-за которых логика работы заклинания зависела не от того объекта, в которого оно попало, а от изначальной цели. Так, можно было использовать заклинание Уничтожение нежити на живых существах, если не брать их в фокус. Только для Готики 2!
  3. zSetWeaponModeFix исправляет ошибку, при которой ускоренная смена боевого режима (например, при использовании карты с оружием в руках) не сопровождалась сменой режимов камеры и выделения интерактивных объектов.
  4. zSetFrameTimeFix исправляет ошибку, из-за которой время кадра не обнулялось корректно, что могло приводить к исчезновению диалоговых окон во время паузы.
  5. zSaveMenuItemLeakFix исправляет утечку памяти при создании элементов меню.
  6. zRemoveWeaponFix устраняет зависание персонажа при убирании оружия на ходу будучи по пояс в воде. К тому же, теперь убирание оружия стоя на месте с использованием цифровой клавиши запускает верную анимацию. Только для Готики 2!
  7. zMenuIgnorePlayerStatus устраняет ситуации, когда при закрытии меню показ внутриигрового интерфейса не восстанавливался.
  8. zExchangeInteractItemFix сбрасывает временные флаги при перемещении предмета из одного слота в другой посредством анимации. Без этого патча, например, используемые предметы исчезали в моде Легенды Ассуна после взаимодействия с печью.
  9. zDontInsertVarInstance блокирует автодополнение названий переменных в консоле разработчика, чтобы было сложней поймать вылет при использовании команды insert.
  10. zDoNotLoadFontName игнорирует названия шрифта, записанное в файл. Таким образом, именем шрифта всегда является имя содержащего его файла и утечек памяти и производительности, которые были при рассогласовании имён, больше не возникает.
  11. zDontEquipBestWeapon меняет проверку на игрока при вставке NPC таким образом, что она проходит и при завершении заклинания трансформации. Т.е. экипированное оружие не сменится на более лучшее.
  12. zDisableNextSpellSetup блокирует инициализацию заклинания, если заклинатель не находится в игровом мире. То есть, при использовании последнего свитка трансформации эффекты следующего заклинания не будут создаваться.
  13. zCloseConversationFix не позволяет находящимся в состоянии второстепенного разговора персонажам закрывать диалоговые окна.
  14. zCEventManager_DoFrameActivity_Fix устраняет две проблемы. Первая, когда персонажи могли поворачиваться во время паузы. Сделано это путём полного игнорирования ИИ в это время. Также устранены ситуации, когда команда ИИ могла быть пропущена. В частности, из-за этого эликсиры в руке могли оставаться после использования.
  15. zAlwaysSetFightAnis принудительно обновляет идентификаторы боевых анимаций при реинициализации контроллера анимаций. Таким образом, контроллер остаётся в согласованном состоянии даже если оверлеи применяются во время боевого режима.
  16. zInterruptInteractionItemDupeFix исправляет дублирование интерактивного предмета при прерывании взаимодействия с объектом. Например, когда NPC деспаунится при выполнении ремонта молотком.
  17. zFailedRunJumpFix принуждает движок обработать клавиши управления в случае, когда прыжок с разбега был отменён из-за наличия препятствия перед игроком. Без патча управление блокируется пока зажата клавиша прыжка.
  18. zEmitParticlesInstantly устанавливает внутренний таймер эффектов так, чтобы они излучали частицы сразу же. Благодаря этому, предотвращаются неудачные попытки запустить эффект при высоких значениях ФПС. Особенно актуально для эффектов горения, неудачный старт которых влияет на нанесение периодического урона.
  19. zDontDeleteMonsters исправляет баг с исчезновением монстров при первом входе в локацию, если при переходе менялось игровое время. Монстры навсегда удалялись в пределах SPAWN_INSERTRANGE.
  20. zNightMusicFix исправляет баг, когда дневная музыкальная тема не начинает воспроизводиться при загрузке ночного сохранения после игры днём (или после первой загрузки). Такое происходило, если ночная тема для загруженной локации отсутствовала (Башня Ксардаса как пример). Только для Готики 2!
  21. zRoughTurnings останавливает поворот персонажа, если его цель находится в двухградусном секторе. Таким образом, убираются подёргивания персонажей при их попытке повернуться к целям, которые уже перед ними.
  22. zWmodeInitFix исправляет ошибку в инициализации контроллера анимаций, в результате которой персонажи могли проигрывать неверную анимацию после загрузки. Например, после загрузки сидящие на земле NPC при первом диалоге могли резко вставать.
  23. zFallenTorchModeFix убирает отключение режима ношения факела после падения.
  24. zStartFlyDamageFix исправляет баг, когда получая по лицу от тролля персонаж иногда летел лицом вниз.
  25. zFreezeInterruptedCombo останавливает прогрессию анимации прерванной комбо-атаки, благодаря чему не будут выполнены события непроигранных кадров. К тому же, высокие значения blendOut не приведут к тому, что прерванная анимация комбо-атаки перейдёт в фазу следующего удара, вызывая неестественные подёргивания персонажа (в оригинальной Готике I не поможет из-за ошибок в скриптах анимаций).
  26. zComboExtraHitFix блокирует возможность после полной серии ударов "вперёд" нанести ещё один невидимый удар.
  27. zUseItemDissapearanceFix исправляет баг, когда модель используемого предмета исчезает из руки. Только для Готики 1!
  28. zStandOnSpellCast даёт приказ остановиться персонажу, кастующему заклинание, благодаря чему маги не будут зависать в режиме бега.
  29. zMagicMessageNameFix исправляет названия некоторых ИИ-сообщений, относящихся к атаке магией. Эти названия выводятся только в режиме Марвина. Только для Готики 1!
  30. zCheckWaterLevelFix заставляет одноимённую функцию движка задавать режим ходьбы при смене режима действия. В игре баг проявлялся как зависание персонажа при обнажении оружия после резкого выхода на сушу (youtube).
  31. zDisableMapHotkeyInDialogs блокирует возможность открывать карту во время диалога.
  32. zUniqueSoundHandle исправляет алгоритм назначения идентификаторов звуков, предотвращая вылеты из-за утечки дескрипторов. Только для Готики 1!
  33. zDontSetUninitializedBodyState устраняет предупреждения zSpy при проигрывании анимаций с неинициализированным параметром состояния тела.
  34. zStackMobItems позволяет новосозданным предметам (например, с помощью Mob_CreateItems) стакаться внутри сундуков и других контейнеров.
  35. zLocalizedHoursMinutes меняет формат времени (8h 42min) в меню сохранения/загрузки в зависимости от языка. Изменения применяются для русского (8ч 42мин), польского (8g 42min), румынского и итальянского (8o 42min) языков. Надеюсь, всё правильно перевёл.
  36. zPreserveShowVisual устраняет сброс свойства showVisual (эффект невидимости) у NPC при сохранении игры.
  37. zEndTransformPreserveHeading задаёт правильную ориентацию персонажа после выхода из трансформы. Только для Готики 1!
  38. zStopWorldOnSave немедленно обнуляет время кадра при открытии внутриигрового главного меню с активированной возможностью сохраниться и при отрисовке игры, когда создаётся мини-скриншот. В совокупности с патчем zCEventManager_DoFrameActivity_Fix устраняет критический баг при сохранении прямо перед диалогом, в результате которого диалоговая камера записывалась в сейв, делая его непригодным для нормальной игры.
  39. zCutBinSafeHash позволяет загружать большие сохранения с более чем 65535 переменными.
  40. zRefuseTalkG2ControlFix устраняет неограниченную отправку команд при попытке заговорить с персонажем не желающим разговора через зажимание кнопки действия. Только для Готики 1 Классической! Только с опцией SystemPack->PARAMETERS->Gothic2_Control = 1
  41. zInitConversationViewOnce сугубо технический патч, устраняющий перезапись уже инициализированного поля oCMsgConversation::f_yes.
  42. zViewOpenPosFix исправляет баг, когда вьюха (обычно диалоговое окно) при появлении кратковременно отображается в случайном месте на экране.
  43. zDropUnconsciousFix исправляет баг, когда при переходе в бессознательное состояние инвентарь игрока не закрывался (Готика 1). Также немедленно прерывается взаимодействие с интерактивным объектом (все движки).
Специальные патчи [Скачать где-то здесь (сильно надо - найдёте): Google-Диск]
Технические патчи. В основном, для модостроителей. Не используйте, если не понимаете зачем.
  1. zSmoothAniTransitions - три патча, составляющих ядро одноимённого плагина.
  2. zStrictEventOrder устанавливает строгий порядок между сообщениями в менеджерах событий: высокоприоритетные оверлеи -> оверлеи -> высокоприоритетные сообщения -> остальные. Внутри каждой группы сообщения располагаются в порядке их добавления.
  3. zChangeParticlesLimit позволяет менять лимит одновременно обрабатываемых игрой частиц (по умолчанию, с 10'000 до 100'000). Каждая единица лимита увеличивает потребляемую память на 960 байт. Только для Готики 2!
  4. zPoleDimsUseWorldBBox заставляет движок для определения низа и верха персонажа в функции обработки коллизий использовать динамический bbox модели вместо статического. При расчёте bbox-а на основе расположения костей (такое внедрено только в плагине zElderGamer) исправляется неправильное позиционирование персонажа во время анимаций типа t_stand_2_sit, когда он мог временно зависнуть в воздухе, а затем резко приземлиться. Также, уменьшает вероятность падения гоблинов при спуске по наклонной поверхности.
  5. zOverlayOrderFix исправляет нарушение порядка применения оверлеев при сохранении (и последующей загрузке) и при удалении оверлея не из конца списка применённых оверлеев. По сути, это патч-улучшение, но требует от мода строгого соблюдения порядка применения оверлеев, ведь сохранение/загрузка с этим патчем не будет исправлять порядок их применения. Как пример, после увеличения навыка владения оружием следует переприменять оверлей акробатики, чтобы боковые перекаты с оружием в руках оставались возможными. Или настроить плагин zMisсUtils для этих целей.
  6. zTextViewPos позволяет задавать внутри себя положение и размер поля для вывода текста (имеется в виду функция Print и аналоги).
  7. zDisableWalkOnCaps блокирует переключение режима ходьбы клавишей Caps Lock.
  8. zDialogChoiceStartKey меняет стартовую клавишу для диалоговых опций с 0 на 1.
  9. zBowRelaxFix блокирует анимацию тетивы при доставании/убирании лука. Только для Готики 2!
  10. zCamOnTickNoTimeScale убирает принудительный сброс скорости мира в циклической функции камеры кат-сцены (то есть, во время диалога). Не для Готики I Сиквел!
  11. zDeadNeverCollide отключает динамические коллизии мёртвого NPC не дожидаясь завершения анимаций. Теперь помирающий враг не станет препятствием для стрел или магии.
  12. zLessWeaponTrails запрещает отрисовку воздушных следов удара, если этот удар уже не может нанести урон.
  13. zNoFadingEvents запрещает генерирование событий для рассеивающихся анимаций. Таким образом, при остановке комбо-атаки не будет слышно "вжухов", предназначавшихся для последующих взмахов.
  14. zMarvinTimeStep позволяет менять шаг времени при использовании клавиши F10 в режиме марвина. Значение в движке - 1.0 / 25.0, в патче - в 2 раза меньше.
  15. zDontRefreshMunition блокирует периодическое создание пятидесяти стрел у NPC.
  16. zRequiredAttributeDamage добавляет к урону от оружия только тот атрибут (сила или ловкость), который требуется для экипировки этого оружия. Если у оружия нет требований к силе/ловкости, то урон не изменится. Только для Готики 2!
  17. zLowHpIsNotThreat отключает переход в режим угрозы (невозможность сохраниться и т.д.) из-за низкого здоровья игрока.
  18. zDeadDoAIState заставляет мёртвых персонажей обрабатывать своё скриптовое состояние постоянно, а не только во время переходных анимаций. Спасает от потери опыта при убийстве монстров, находящихся в воде.
  19. zNoDayDot убирает точку после номера дня в дневнике.
  20. zRussianDaySuffix меняет формат даты в меню сохранения/загрузки для русского языка: вместо 1 - 10:44 будет 1й день, 10:44.
  21. zUnlockMotionFactor разблокирует влияние скорости игры на скорость поворота персонажа и на скорость анимаций интерактивных объектов. Только для Готики 2!
  22. zProgressBarPos позволяет менять положение полосы загрузки.
  23. zCollectFocusDelay позволяет менять переодичность, с которой обновляется фокус персонажа.
  24. zCollectFocusInStrafe включает обновление фокуса во время стрейфа.
  25. zInfinityDialogs не позволяет диалоговым сообщениям закрываться автоматически. Требуется патч zInitConversationViewOnce! Рекомендуется плагин zAllowSkipHeyYou, во избежание невозможности пропустить диалог!
  26. zCustomSubmeshLimit позволяет менять предельное количество подмешей для загружаемых объектовТолько для Готики 2 Ночь Ворона!
  27. zPlunderInState запрещает лутать персонажей, если они не находятся в валидном скриптовом состоянии смерти/бессознательности.

Данная тема признана лучшей по итогам 2023 года!
 
Последнее редактирование:

Xeдин


Модостроитель
Регистрация
3 Дек 2008
Сообщения
1.339
Благодарности
1.871
Баллы
335
Используй F9 один раз и F10 много раз в режиме Марвина, когда Харад подходит к наковальне.
Ага, ловится хорошо. Патч помогает насколько я успел проверить. Респект)) Надо с ним играть

1678366798528.png
 

Slavemaster


Модостроитель
Регистрация
10 Июн 2019
Сообщения
1.034
Благодарности
1.798
Баллы
240
Новый патч-улучшение:
zDeadDoAIState заставляет мёртвых персонажей обрабатывать своё скриптовое состояние постоянно, а не только во время переходных анимаций. Спасает от потери опыта при убийстве монстров, находящихся в воде.
 

Slavemaster


Модостроитель
Регистрация
10 Июн 2019
Сообщения
1.034
Благодарности
1.798
Баллы
240
Добавил новый патч-улучшение:
zFailedRunJumpFix принуждает движок обработать клавиши управления в случае, когда прыжок с разбега был отменён из-за наличия препятствия перед игроком. Без патча управление блокируется пока зажата клавиша прыжка.
 

Gratt


Модостроитель
Регистрация
14 Ноя 2014
Сообщения
3.276
Благодарности
4.579
Баллы
625
Оставлю пока тут. Позволяет использовать 32битные текстуры. Компилить, например, гоманом в RGBA8888. Если есть более гибкий софт, то нативный формат - BGRA8888.
В отличии от DXT3 не деградирует, вся картинка вместе с альфаканалом равномерная, без лесенок и шума.

Union:
#engine [G1, G1A, G2, G2A]
    /*
     * This patch implements a 32bit texture
     * building process. Gothic engine may
     * support BGRA8888 pixel format.
     */
    #patch [BGRA 32bit pixel format builder]
        INT case = ZenDef(0x0071CE60, 0x007593D3, 0x00768C40, 0x006555A4)
        #assembler [case]
            mov eax, dword ptr[ebp+094h]          ; texFormat
            cmp eax, 3                            ; zRND_TEX_FORMAT_BGRA_8888
            jnz return
            lea eax, dword ptr[edi-020h]
            mov dword ptr[eax+004h], 0x00000041   ; dwFlags
            mov dword ptr[eax+00Ch], 32           ; dwRGBBitCount
            mov dword ptr[eax+010h], 0x00FF0000   ; dwRBitMask
            mov dword ptr[eax+014h], 0x0000FF00   ; dwGBitMask
            mov dword ptr[eax+018h], 0x000000FF   ; dwBBitMask
            mov dword ptr[eax+01Ch], 0xFF000000   ; dwRGBAlphaBitMask
        return:
            orgcode
        #/assembler
    #/patch
    
    /*
     * This patch is needed to make the engine understand
     * that BGRA8888 is the native supported pixel format. 
     */
    #patch [Support BGRA 32bit]
        INT case = ZenDef(0x0071AF84, 0x007572A4, 0x00766D84, 0x006536E4)
        #assembler [case]
            cmp eax, 3  ; zRND_TEX_FORMAT_BGRA_8888
            jnz return
            ret 4
        return:
            orgcode
        #/assembler
    #/patch

    /*
     * The game expected BGRA pixel format for the 32bit
     * textures, so the next best pixel format for the
     * all 32bit textures should be BGRA. Even when the
     * source format is different. Incompatible source
     * and destination textures will be converted. 
     */
    #patch [Next best pixel format is BGRA]
        INT enum = ZenDef(0x00842D24, 0x0088898C, 0x008988FC, 0x008A6ACC)
        INT @(enum + 0)  = 3
        INT @(enum + 4)  = 3
        INT @(enum + 8)  = 3
        INT @(enum + 12) = 3
    #/patch
    
    /*
     * Gothic engine supports BGRA pixel format, however
     * in the `conversion` and `copycontent` functions
     * it expected RGBA pixel format. Because of that
     * colors will be swapped by R and B channels. So this
     * patch will swap this channels in `ConvertTexture2`
     */
    #patch [Swap 32bit channels]
        INT jumptable = ZenDef(0x00722550, 0x0075EF80, 0x0076E600, 0x0065B130)
        
        // 1st pair RGBA <-> BGRA
        INT channelDataTemp      = INT @(jumptable + 6 * 4)
        INT @(jumptable + 6 * 4) = INT @(jumptable + 7 * 4)
        INT @(jumptable + 7 * 4) = channelDataTemp
        
        // 2nd pair ARGB <-> ABGR
        channelDataTemp           = INT @(jumptable + 10 * 4)
        INT @(jumptable + 10 * 4) = INT @(jumptable + 11 * 4)
        INT @(jumptable + 11 * 4) = channelDataTemp
    #/patch
    
    /*
     * The engine has conversion expression for RGBA
     * pixel format only. This patch will allow to
     * convert BGRA, ARGB and ABGR pixel formats too.
     */
    #patch [Enable all 32bit conversions]
        INT jumptable = ZenDef(0x00722594, 0x0075EFC4, 0x0076E644, 0x0065B174)
        INT jumpToRGB = ZenDef(0x00721F44, 0x0075E9B3, 0x0076DFF4, 0x0065AB24)
        
        INT @(jumptable + 7  * 4) = jumpToRGB // ABGR
        INT @(jumptable + 10 * 4) = jumpToRGB // RGBA
        INT @(jumptable + 11 * 4) = jumpToRGB // BGRA
    #/patch
#/engine

Пример лучшего качества для готики vs с патчем:
1. Фон DXT3, виньетка DXT3
1686446171111.png

2. Фон BGRA8888, виньетка BGRA8888
1686445862356.png
 

Вложения

  • zSurface32.zip
    1,2 KB · Просмотры: 13
  • STARTSCREEN example.zip
    982,1 KB · Просмотры: 12

Slavemaster


Модостроитель
Регистрация
10 Июн 2019
Сообщения
1.034
Благодарности
1.798
Баллы
240
zEmitParticlesInstantly устанавливает внутренний таймер эффектов так, чтобы они излучали частицы сразу же. Благодаря этому, предотвращаются неудачные попытки запустить эффект при высоких значениях ФПС. Особенно актуально для эффектов горения, неудачный старт которых влияет на нанесение периодического урона.
Новый патч-улучшение
 

Slavemaster


Модостроитель
Регистрация
10 Июн 2019
Сообщения
1.034
Благодарности
1.798
Баллы
240
zDontDeleteMonsters исправляет баг с исчезновением монстров при первом входе в локацию, если при переходе менялось игровое время. Монстры навсегда удалялись в пределах SPAWN_INSERTRANGE.
Новый патч-улучшение
 

Slavemaster


Модостроитель
Регистрация
10 Июн 2019
Сообщения
1.034
Благодарности
1.798
Баллы
240
Актуально ли это для оригинальных Г2/Г2НВ?
Ну, если только игрок увеличит параметр SPAWN_INSERTRANGE, тогда при переходе в Яркендар или Долину Рудников монстры пропадут в этом радиусе от входа.
 

Mr.Ermieλ

Участник форума
Регистрация
13 Фев 2022
Сообщения
293
Благодарности
30
Баллы
75
ничего страшного не будет, если я скачаю все эти патчи и перекину их в AutoRun, а потом начну игру в ModFix?
 

MEG@VOLT

★★★★★★★★★
ТехАдмин
Регистрация
24 Мар 2006
Сообщения
9.161
Благодарности
6.142
Баллы
1.565

Slavemaster


Модостроитель
Регистрация
10 Июн 2019
Сообщения
1.034
Благодарности
1.798
Баллы
240
ничего страшного не будет, если я скачаю все эти патчи и перекину их в AutoRun, а потом начну игру в ModFix?
Патчи из категории "патчи-улучшения" не должны вызывать проблем.
 

Mr.Ermieλ

Участник форума
Регистрация
13 Фев 2022
Сообщения
293
Благодарности
30
Баллы
75
6. zDeadNeverCollide отключает динамические коллизии мёртвого NPC не дожидаясь завершения анимаций. Теперь помирающий враг не станет препятствием для стрел или магии
Есть аналог, но только для оружий ближнего боя?
 

Mr.Ermieλ

Участник форума
Регистрация
13 Фев 2022
Сообщения
293
Благодарности
30
Баллы
75
С ближнем боем и так всё в порядке.
Таргет остаётся на мёртвом НПС(моб, персонаж), а другой на тебя нападает и ты на него прицелиться не можешь. Пример: видишь стаю волков, подбегаешь, убиваешь одного, а остальные нападают и ты ничего не можешь сделать несколько секунд, т.к таргет стоит на трёпе волка. Вот как быть с этим то?
 

Slavemaster


Модостроитель
Регистрация
10 Июн 2019
Сообщения
1.034
Благодарности
1.798
Баллы
240
Таргет остаётся на мёртвом НПС(моб, персонаж), а другой на тебя нападает и ты на него прицелиться не можешь. Пример: видишь стаю волков, подбегаешь, убиваешь одного, а остальные нападают и ты ничего не можешь сделать несколько секунд, т.к таргет стоит на трёпе волка. Вот как быть с этим то?
Я не знаю как такое воспроизвести. У меня в бою фокус мгновенно переключается.
 

N1kX


Модостроитель
Регистрация
13 Ноя 2009
Сообщения
5.843
Благодарности
5.268
Баллы
910
У ванильного фокуса есть куча проблем, например слишком долгий опрос фокуса. В АБ/НБ разрабы вместо 200мс сделали мгновенный опрос фокуса, также убрали возможность привязки фокуса, когда идешь стрейфом (Можно забирать предметы из домов, ибо фокус остается в кадре, пока бежишь в сторону) ит.д.
 

Mr.Ermieλ

Участник форума
Регистрация
13 Фев 2022
Сообщения
293
Благодарности
30
Баллы
75
У меня фокус в боевом режиме работает на всевозможных трупах, пока я не перейду на обычный режим, а потом снова в боевой и фокус на трупах не работает. ТО есть после убийства моба, таргет на его труп есть(во время боевого режима), а после "смены режима" два раза (из боевого в обычный и в боевой) таргет на трупах не работает. Может это из-за 20-30 модиков плагинов? :{
 

Slavemaster


Модостроитель
Регистрация
10 Июн 2019
Сообщения
1.034
Благодарности
1.798
Баллы
240
Mr.Ermieλ, ты пользуешься чит-режимом и F8?
 
Сверху Снизу