# FFP

## Fortune Foundation Portable

Сделал pelmenka на IGDC#192

## Что

Игра представляет их себя клон Fortune Foundation из [Zachtronics Solitaire Collection](https://store.steampowered.com/app/1988540/The_Zachtronics_Solitaire_Collection/). Крайне хороший набор пасьянсов, кстати. Мне этот набор очень нравится, особенно Fortune Foundation. Пасьянс, который не так и просто сложить. Однако, несмотря на все свое великолепие, данный пасьянс, кмк, имеет набор недостатков, в основном связанных с управлением и медлительными анимациями.
Поверх этого наложилось управление с кнопок в данной версии. Большое поле и большое количество действий, в том числе не слишком очевидных, стало основным вызовом в реализации игры. Я надеюсь, что управление получилось достаточно удобным для игры на консоли. По крайней мере я тестировал несколько дней и в целом получившемся управлением остался доволен.

## Как

Здесь у нас в основе лежит уменьшенная колода карт таро. Из младших аркан убраны рыцари и тузы (номинально тузы есть, но лежат сразу в сбросе). Это дает расклад из 70 карт, которые надо сложить. В комплекте с игрой идет 0x10000 нагенерированных раскладов, чтобы хватило надолго. **Каждый** расклад можно сложить. Ради этого я написал отдельный солвер, который эти расклады и нагенерировал.

* На поле 11 колонок, 10 из которых с самого начала заполнены картами. Цель игры - переместить все карты в сброс.
* Карты идут в сброс автоматически, если могут
* Карты одинаковой масти можно ложить друг на друга в порядке возрастания либо убывания
* Карты так-же можно ложить в любую пустую колонку
* Дополнительно - одну карту можно положить поверх сброса младших аркан, но при этом сам сброс младших аркан станет недоступен
* Младшие арканы могут отправляться в сброс в порядке возрастания, от A до K
* Старшие арканы могут отправляться в сброс как в порядке от 0 к 21, так и в порядке 21 - 0. Причем одновременно восходящий и нисходящий порядок в сбросе могут быть одновременно.
* Старшие арканы могут отправиться в сброс, даже если лежат поверх сброса младших аркан

Дополнительные моменты описаны в картинках, более понятным языком.

Надо сразу прояснить, что пасьянс довольно сложен для расклада, даже с нормальным разрешением и управлением мышкой. Проиграть в него можно крайне просто и быстро, даже один неверный ход может похоронить всю партию. Да, здесь есть отмена последнего хода, но от неверно выбранной тактики она не спасёт.

## Управление

* Стрелки влево-вправо - перемещение курсора
* Стрелка вверх - выбрать пачку
* Стрелка вниз - выбрать только одну карту
* Крестик - взять/положить карту
* Кружок - отменить выбор карт
* Квадрат/треугольник - включить режим подсветки соседних карт
* R - достать/положить карту в запас поверх младших аркан.
* L - отмена последнего хода.
* select - Новая игра

В режиме подсветки карт между картами на поле можно перемещаться стрелками.

## Системные требования
Любое из:
* Sony Playstation Portable (работа проверена на psp 3008 с прошивкой 6.60)
* Sony Playstation Vita с adrenaline (работа проверена на psv 1008 с прошивкой 3.65 и adrenaline-7 )
* Любой совместимый эмулятор, например PPSSPP, который в комплекте с игрой

### Запуск на PSP
Скопировать содержимое папки `game` в корень флеш-карты. Запустить игру из меню.

### Запуск на PS Vita (Adrenaline)
Скопировать содержимое папки `game` в папку ux0:pspemu. Запустить игру из меню Adrenaline.

### Запуск на эмуляторе
Запустить эмулятор, который находится в папке `runtime`. Пройти в папку `game` и всем вложенным папкам, пока не появятся файлы. Перетащить `EBOOT.PBP` в окно эмулятора.

Из-за того, что структура папкок в папке `game` такая, какая должна быть на psp, эмулятор может выделываться и отказаться запускать игру, в этом случае файлы нужно перетащить в какую-нибудь отдельную папку.

### Управление на эмуляторе
* Стрелки на клавиатуре работают как стрелки
* Z - поднять/положить карту
* X - отменить выбор карт
* A - вкл/выкл подсветки карт
* S - подсветка карт при зажатии
* Q - отмена последнего хода
* W - достать/положить карту в запас поверх младших аркан.
* V - Новая игра

При управлении с геймпада на эмуляторе квадрат и треугольник могут быть перепутаны местами.







Ну раз кто-то до этого момента дочитал - то вот бонус. Приведение uint64_t к float приведет к зависанию процессора psp. А эмулятор не зависнет, эмулятору все равно.
Например, если сделать так 
```cpp

float tickResolution = (float) sceRtcGetTickResolution();
uint64_t currentTick = 0;

...

uint64_t currentTick = 0;
sceRtcGetCurrentTick(&currentTick);

uint64_t diff = currentTick - this->lastTick;
this->deltaTime = (float) (diff) / this->tickResolution;

```

То процессор зависнет, причем не сразу, и отладка этого действа получится довольно увлекательной. Кстати, внутри ps vita эмуляция psp используется отдельный mips процессор, так что, быть может, там тоже будет зависание, но я проверять не стал.

