Морской конёк-тряпичник
Видео Maryna.
Оператор знает как снять соревнование! )
Оператор знает толк в правильном ракурсе: женщина-гренадер из австралийской армии уделала американского морпеха блином весом в 15 кг
Делаю игрулю на Playdate на чистом C. Глава 3
Я пишу игру на игровую консоль Playdate на чистом C. Игра в жанре "выживальщик" наподобие Vampire Survivors. Так как в чистом C отсутствуют многие современные объектно-ориентированные удобства мне приходится по-всякому изворачиваться чтобы адаптировать свои идеи в код. В этих заметках ты узнаешь из первых уст как создаётся игруля с нуля от идеи до публикации.
В прошлой главе я описал как инициализирую сцену, как очищаю ресурсы, показал как заполняю сцену реквизитом и даже поэкспериментировал с генерацией этого самого реквизита. В этой главе я расскажу как работает самая важная функция GameUpdate, в частности, обработка ввода и процессинг данных.
GameUpdate это функция-колбэк, которая вызывается каждый тик. А значит её задача это реализовать святую троицу любой игры:
считать ввод от игрока
обновить состояние игры
отрисовать обновлённое состояние игры.
Если ты когда-нибудь был на собесе в геймдев контору, то 90% вероятность, что у тебя спрашивали про эти три шага. А ещё если ты когда-нибудь писал код для Arduino, то ты должно быть помнишь две функции, которые там всегда должны быть: setup и loop. Вот GameUpdate это как раз аналог loop.
На сцене есть машина, которая двигается от нажатия крестовины, и есть реквизит: кактусы, песчаные насыпи и перекати-поле. Перекати-поле двигается прям как в жизни. То есть, оно меняет позицию по-горизонтали (по оси X) и ещё прыгает вверх-вниз как бы отскакивая от земли. Чтобы реализовать движение нам нужно совладать со временем. Для этого нам в каждом тике нужно знать сколько точно прошло времени с прошлого тика. Из коробки этого параметра в событии Update нет, однако мы можем этот параметр высчитать при помощи функции API playdateApi->system->getElapsedTime();. Эта функция возвращает количество секунд прошедших с момента запуска игрули. Это не разница в тиках, но уже что-то. Для разницы времени в тиках надо ещё знать значение полученное из той же функции в прошлый тик. Потому в структуре Game есть поле float previousElapsedTime;. В конце функции GameUpdate мы сохраняем в это поле результат вызова getElapsedTime, а в начале GameUpdate мы вычитаем разницу между нынешним значением getElapsedTime и previousElapsedTime. Это значение и есть тот самый dt, который равняется количеству секунд прошедших с прошлого тика. Так как на старте игры в файле main.c в первой главе я установил FPS равный 30, то в среднем dt у меня равен 0.033 секунд.
Начало функции GameUpdate
Далее мы процессим инпут - собираем значения нажатых кнопок и в зависимости от них обновляем данные.
Процессинг инпута
PDButtons это битовая маска объявленая в Playdate SDK. Битовые маски в сишке реализуются либо как enum, либо просто как int в отличие от Свифта, где битовая маска это совершенно иной особый класс данных.
Описание битовой маски PDButtons
Битовая маска PDButtons содержит в себе список нажатых и ненажатых кнопок консоли.
Ещё, возможно, у тебя есть вопрос что за такая функция PlayerVehicleAngleCreateFromButtons на строке 72. Это способ определения одного из восьми направлений машины имея на руках нажатые кнопки девайса:
Реализация функции PlayerVehicleAngleCreateFromButtons
Зачем нужен параметр oldValue в ней? Дело в том, что нам надо что-то возвращать даже если ни одна кнопка не нажата. А что вернуть если ни одна кнопка не нажата? Какое направление? В Свифте/C++/C# я бы вернул зануляемое значение (Optional в Свифте, std::optional в C++ и Nullable в C#), но в сишке это не так удобно потому что нет дженериков/шаблонов, потому я решил передавать старое значение направления потому что в случае когда ни одна кнопка не нажата направление машины просто не меняется. Это логично потому что в жизни если ты не трогаешь руль, то направление автомобиля тоже не меняется. Вот потому мы передаём старое значение и возвращаем его тогда, когда в Свифте/C++/C# вернули бы null. Если бы я работал в корпорации с отжайл-митами, ретроспективами, эффективными менеджерами, тимбилдингами и код-ревью, то обязательно появился бы ревьювер, который мне рассказал, что аргумент oldValue, если посмотреть на ситуацию под определённым углом, переносит логику того как движется машина внутрь функции PlayerVehicleAngleCreateFromButtons, а это неправильно потому что если следовать SOLID, стремиться писать идеальный код, утром и вечером чистить зубы, ходить на йогу, участвовать в городских марафонах, отказаться от мяса, глютена, молока, сахара, соли, глутамата натрия и кока-колы, то эта функция должна отвечать исключительно за создание инстанса перечисления PlayerVehicleAngle и больше ничего, а логика передачи старого значения обязательно, прям кровь из носу, век воли не видать, без разговоров, обсуждений и переговоров, должна находиться за пределами функции PlayerVehicleAngleCreateFromButtons потому что чисто теоретически у нас может эта функция использоваться не только для машины, а для чего-либо другого, что имеет также 8 направлений, но в случае если ничего не нажато направление будет, например, сбрасываться вверх. И пофиг ревьюверу на то, что такое случится примерно когда рак на горе свистнет, в четверг после дождя и ровно в следующую секунду после второго пришествия.
Если отбросить иронию и сформулировать ответ для занудного воображаемого ревьювера, то он (ответ) будет таким: значение oldValue это прекрасный подход реализации кода очень схожий с построением электрических цепей. Значение словно ток по цепи идёт сквозь функцию, и при определённых условиях оно может измениться на выходе, а может остаться таким же. Вообще код в стиле электрических цепей популярен в сишке, и при этом не так популярен в объектно-ориентированных языках. Я, понятное дело, не призываю всех на сишке писать именно в такой парадигме, но за себя я отвечаю вот таким вот образом.
Фух. Далее. Есть ещё функция GameAnyArrowIsPressed. Она возвращает 1 если хотя бы одна кнопка на крестовине нажата и 0 в противном случае:
Реализация функции GameAnyArrowIsPressed (возможно, следовало разнести операторы & по отдельным строкам для красоты кода)
Штош, мы пришли к следующему невероятно важному шагу нашего жизненно-важного тика - обработка перекати-поле.
Процессинг перекати-поле в тике
Констанцията screenSize пока не нужна - она пригодится позже. Далее мы проходимся по массиву старым проверенным методом: достаём количество объектов в нём и описываем цикл for. Получив очередной объект перекати-поля на строке 118 я готов его менять (потому указатель на Tumbleweed неконстантный). Разминаю руки и говорю себе "делай красиво!". Первым делом процессим позицию потому что перекати-поле перекатывается по полю по-горизонтали. Каждый тик двигающийся объект сдвигается (вот это поворот!), а значит мы должны проделать нехитрые манипуляции с позицией. Это требует базовые знания раздела механики из физики (того самого про "скорость равняется пройденный пуць делить на время", а ещё я обожаю слово "пуць" которое я подцепил в Беларуси когда жил там три года. Я стараюсь говорить "пуць" везде вместо слова "путь" и рекомендую тебе тоже так делать так как от такого русский язык станет только краше!). Чтобы лучше понять как происходит процесс движения в коде в первую очередь надо понять что нам нужно в конце концов сделать за тик. За тик нам нужно изменить позицию каждого объекта перекати-поле. Точнее, понять насколько изменилась позиция объекта перекати-поле относительно старой позиции за тик. Это изменение как раз хранится в константе dTumbleweedPosition, которая создаётся на строке 121. Высчитывается она очень просто: скорость перекати-поле умножается на dt, то есть, скорость умножаем на прошедшее время за один тик. А далее изменение позиции dTumbleweedPosition просто прибавляется к позиции этого же перекати-поле.
Подобным образом движение работает у всего вообще везде, не только в моей игре, а во всех играх и не только играх - всякие плавно двигающиеся кнопки в пользовательском интерфейсе, прыгающая иконка загрузки в яблочном браузере Safari, всплывающее окно антивируса Avast, падающие пуш-уведомления на iOS и многое другое что можно перечислять тут ещё до полуночи.
Окэй, с движением мы разобрались. Идём далее. А далее мы процессим прыжок. Дело в том, что перекати-поле подпрыгивает в движении. Значит нам в нашем мире который мы создаём своей мыслью и кодом нужно запрограммировать аналогичные прыжки перекати-поле и желательно чтобы результат выглядел правдоподобно, а не топорно как анимация в Героях 4. Вот только как сделать подпрыгивания чтобы они выглядели достаточно правдоподобно? Просто линейно как движение? Но это будет обсосно так как в реальности в любом движении по-вертикали участвует ускорение свободного падения, а это делает функцию движения квадратичной, а значит линейное движение не подойдёт. Функция нужна точно квадратичная, то есть, аргумент в ней обязательно должен хотя бы в одном месте возводиться в квадрат. Самое банальное это парабола. Она самая подходящая тут потому что в реальной жизни всё падает по параболе (конечно если игнорировать ветер и вообще если экспериментировать на сферических цыплятах в вакууме). Но если перекати поле будет лениво лететь в сторону земли по параболе, то тогда при столкновении с землёй мне надо будет иметь реализованную логику этого самого столкновения для отскока. Тут я оценил-взвесил прям как Экшон-мэн (помнишь такого супергероя? я в детстве обожал мультик "Экшон-мэн", и особенно мне нравилась его трёхмерная компьютерная рисовка. Тогда мне казалось, что это лучшая графика на свете. Недавно я решил пересмотреть этот мультик и офигел от того какая оказывается ужасная графика там на самом деле! RDR2 меня разбаловала! В общем, Экшон-мэн в момент кульминации каждой серии произносил "оценить, взвесить", просчитывал свои движения до мельчайшей точности, а в следующие 10 секунд нагибал всех врагов ультой) и решил сделать проще: я использую уравнение окружности, точнее, уравнение косинуса (или суниса если угодно, потому что график синуса это график косинуса сдвинутый на 90 градусов).
График синуса собственной персоной y = sin(x)
Вот только для наших целей мы график синуса чуть модернизируем - засунем его в модуль. Засовывание любой функции в модуль делает с её визуальным отображением занимательный фокус - отображает нижнюю половину вверх словно ось x превратилась в зеркало.
График модуля синуса y = abs(sin(x))
И вот такой вариант прям идеально похож на траекторию движения перекати-поля, и при этом нам не нужно писать логику столкновения с землёй и последующего отскока. Это тот редкий случай когда та фигня, которой тебя пичкали в школе, тебе пригодилась в работе!
Для адаптации данного математического фокуса в код нам нужно чтобы каждый объект перекати-поля имел значение "поворота" прыжка, а также скорость этого поворота (на сколько радиан значение поворота изменится за 1 секунду). Почему поворот? Потому что график синуса принимает в качестве переменной именно направление. Для пущего понимания на это можно смотреть как на фазу, которая крутится. Таким образом, у структуры Tumbleweed есть поля jumpVelocity и jumpAngle. На строке 125 мы высчитываем значение dTumbleweedJumpAngle равное количеству радиан на которое изменился jumpAngle, на строке 126 прибавляем это значение к jumpAngle, а на строке 127 нормализуем jumpAngle. Нормализация направлений это вещь, которую иногда следует делать если работаешь с направлениями - примерно как убирать какашки за кошкой если ты живёшь с кошкой (или она с тобой, лол). Так как значение направления циклично (0 радиан и 2*π радиан это одно и то же значение, например), можно для чистоты кода, совести и кредитной истории после операций над направлением приводить его в диапазон [0; 2*π) если вдруг это направление вышло за пределы (если кошка покакала мимо лотка надо всё вытереть, потому что сама кошка это вряд ли сделает).
Реализация функции normalizeAngle
Вообще будь у нас С++ я, возможно, нормализацию бы засунул прям внутрь класса Angle в оператор присваивания, который можно невозбранно перегружать. А может и нет - неявности порой делают код хуже. Как бы там ни было, именно таким образом мы процессим прыжки перекати-поля.
Итого, мы разобрались с процессингом позиции перекати-поля, прыжков (на самом деле процессить прыжки это лишь полдела, надо ещё их кошерно отрисовать, а это я покажу далее), осталось запроцесить кадр. Да, перекати-поле в моей игруле имеют несколько кадров для красивости. Я так сделал так как иначе если бы у перекати-поля был бы один кадр это выглядело бы обсосно. А я не хочу чтобы моя игруля выглядела обсосно. Вот для процессинга кадра я в структуру Tumbleweed добавил поле frameIndex. Вообще в игре у много чего будет такое поле и подобная логика. Ну и скорость изменения frameIndex тоже есть: это поле frameIndexVelocity. Да, это поле есть у каждого объекта Tumbleweed, хотя у всех объектов оно имеет одинаковое значение. Можно было бы не добавлять это поле потому что вроде как оно избыточно, но пусть будет - вдруг я решу сделать скорость разной у разных инстансов перекати-поля (а такие мысли в момент написания кода у меня были), а экономить память на спичках это путь в сумасшедший дом. Всего кадров у перекати-поля сделано 4. В одной из прошлых глав ты видел константу TumbleweedSpritesCount = 4 - вот это про это. frameIndex - это число с плавающей точкой, которое меняется в диапазоне [0; 4) со скорость указанной в frameIndexVelocity. Логика строк 130 - 134 осуществляет именно это.
Вот так устроен процессинг перекати-поля. Как тебе? Меня лично вставляет. Идём дальше.
Порой надо создавать перекати-поле, а не только процесить. Для этого надо решить по какой логике оно будет создаваться. Когда я усердно играл в Minecraft я частенько читал вики по нему. И в вики по Майнкрафту рассказывали каким образом спаунятся различные сущности. И логика спауна примерно такая: шанс один из десяти тысяч что в конкретном тике заспаунится сущность. Вот такую же логику я решил впиндюрить потому что это просто и понятно.
Создание перекати-поля
Строка 139 говорит нам, что с шансом 1 к 100 (tumbleweedSpawnChangePercentage равна 1) создастся новое перекати-поле в тике. На строке 154 создаётся инстанс перкати-поля функцией TumbleweedCreate, а на следующей строке этот инстанс отправляется (на самом деле копируется) в массив game->tumbleweeds.
Для создания перекати-поле нам нужно 4 аргумента: позиция на карте, скорость передвижения, скорость подпрыгивания и скорость изменения кадра. Позиция на карте высчитывается суперхитрым образом - новое перекати-поле появляется просто ровно за границей экрана левой либо правой. И едет в сторону машины игрока по-горизонтали. Можно, конечно спаунить "по-честному" в случайной точке достаточно большого игрового поля, но тогда игрок просто будет редко видеть перекати-поле, особенно в начале игры, а это ухудшает пользовательский опыт. Скорость подпрыгивания это количество радиан прошедших за секунду для значения от которого мы считаем синус график которого я ранее показывал. А про скорость изменения кадра ты уже и так знаешь: у перекати-поля 4 кадра, как я говорил ранее, и их надо с определённой скоростью менять.
Далее на строке 158 смещению камеры присваивается позиция машины чтобы машина всегда была в центре экрана куда бы она не ехала. А на строке 160 вызывается функция GameDraw, которая весь описываемый мной тут балаган отрисовывает чтобы игрок видел что происходит, иначе зачем всё это?
Ответ на пост «Современная Австралийская ипотека 2024»
Купили вы дом, замечательно.
Через год-два потребуется сменить работу и окажется, что дом ооооочень далеко расположен от работы. Надо переезжать.
Появляется ребенок и оказывается местная школа - отстой, нужно переезжать.
Начальнвя школа ОК, но вот переходит ребенок в школу со старшими классами и выясняется, что она оооочень слабенькая в плане математики и физики (хотя и замечательно преподают историю и английский). Опять надо бы переехать.
Ребенок вырос, вам этот район с прекрасной школой уже не нужен, есть куча других, где жить приятнее, дешевле и ближе до работы. Надо бы переехать.
Вышли на пенсию. Опять нужно менять место жительства.
А стоит ли покупать дом, если можно арендовать?
Думаете что-то на этом заработать? - посчитайте с учетом кредита, налогов, стоимости поддержания. Вот что у меня для примера получается
Зачем трупы динго на деревья вешают
Динго — это не обычный пес блохастый, а вторично одичавшая особь. Еще зверек уникален тем, что является единственным не завезенным европейцами хищником Австралии. В небольших количествах обитает еще и в Юго-Восточной Азии (Таиланд, Мьянма, Филиппины, Лаос, Борнео, Индонезия, Юго-Восток Китая, Малайзия и Новая Гвинея).
Когда точно динго попали в Австралию — не известно, ходят споры и догадки, что это могло произойти 3,5 тысячи лет назад, а есть версии, что и все 12. Официальной все же является первая датировка, и привезли их в Австралию древние индонезийские охотники-собиратели с острова Сулавеси.
Динго — преимущественно ночные животные. Основные места их обитания в Австралии — опушки влажных лесов, сухие эвкалиптовые заросли, засушливые полупустыни в глубине материка. Логова они устраивают в пещерах, пустых норах, среди корней деревьев, обычно неподалёку от водоёмов.
Основная пища — крысы, сумчатые мыши, сумчатые барсуки. Могут даже охотиться на кенгуру и валлаби, иногда даже на акулу позариться пытаются. Если совсем уж с едой проблемы — могут перебиться птицами, рептилиями, насекомыми и падалью. Динго не переносит крахмал, да и растительную пищу в целом.
Не могу не рассказать об устройстве стаи динго. Живут в них обычно 10-15 особей. Стая строится вокруг доминантной пары, она же имеет право на размножение. Если у самки более низкого ранга рождаются детёныши, доминантная самка их убивает. Низкоранговые самки и самцы проявляют заботу о детёнышах главной самки. Иерархия динго строится на запугивании и периодических драках, у каждого в стае есть свой ряд обязанностей.
В отличие от обычной собаки, динго размножаются раз в год, срок беременности 63 дня. Малыши рождаются в логове и там же за ними ухаживают оба моногамных родителя (альфа-пара).
В жизни этих собак есть две проблемы: люди и бродячие псы. Бродячие собаки, смешиваясь с динго, приводят к тому, что стая становится более агрессивной, и размножаются там куда чаще и больше. Чистокровные динго человеческой жизни не угрожают, а вот "грязнокровки" — еще как. Случаи нападения редки, но все же имеют место. Однако гибридизация — это куда меньшая проблема, так как соотношение гибридов динго и обычной собаки не превышает и 20%.
А теперь поговорим об отношениях человека и собаках, которые не смогли простить предательства. Когда в Австралии стали разводить овец, для динго появился новый объект охоты. Стаи диких собак динго стали нападать на стада. Конечно, людям это не понравилось, и животных стали истреблять. Динго, охотившихся на овец, ловили капканами, отстреливали и травили ядами. В конце XIX века в одном Новом Южном Уэльсе фермеры ежегодно расходовали на борьбу с дикими собаками несколько тонн стрихнина.
В 1880-х построили целую ограду, названную "собачьим забором". Она охраняет скот от динго, а места выпаса от кроликов. Сейчас ограда имеет протяженность более 5 тыс. км и отделяет засушливую часть Австралии от плодородной. Ограду ежегодно поддерживают, а вдоль нее находятся патрули, которые восстанавливают повреждения в заборе и уничтожают проникших за ограду животных.
Фермеры убивают динго и вешают их на деревья вдоль туристической дороги для того, чтобы показать, насколько остро стоит проблема диких собак, и выращивание скота здесь — дело сложное и должно хорошо оплачиваться. Более того, это еще и является неким средством коммуникации между соседями, мол смотрите, сюда нежданные гости заглядывают, а мы это не игнорируем. Доггеры же вешают собак, чтобы показать, что работу свою они выполнили — деньги на бочку, пожалуйста. Скотоводы не считают эти показательные меры чем-то ужасным и жестоким, и один из фермеров даже сказал как-то:
"Я знаю, что трудно понять, почему мы делаем это время от времени <...> это мера, которую мы принимаем, чтобы выжить здесь, в этой стране."
Зоологи тщательно изучили трупы несчастных динго и выясняли, что страдают от рук фермеров не гибриды, а чистокровные особи, и если убийства будут продолжаться, то это будет грозить резким сокращением популяции диких собак. Более того, если убить альфа пару, то это будет чревато тем, что стая подростков без "мамы и папы" будет делать все, что им вдумается, и вреда скотоводам явно будет куда больше.
Проблема в том, что динго за все время, что обитают на территории Австралии, смогли прекрасно приспособиться к местной фауне, и несмотря на то, что пару вялых видов они, может, и изничтожили, сейчас дикие собаки скорее регулируют баланс экосистемы континента, и их исчезновение спровоцирует кучу проблем для других зверей. Развешивание трупов выглядит довольно жутко и негуманно, но при этом является отличным туристическим объектом, который привлекает много внимания со стороны.
Спасибо за прочтение, буду очень рада, если подпишитесь - это мотивирует продолжать писать дальше.
Современная Австралийская ипотека 2024
Почитал про мытарства людей с недвижимостью в России и решил поделиться своим опытом из страны антипода, тем более что воспоминания свежи - сделка завершилась в середине прошлого месяца.
Времена когда дом с хорошим участком можно было купить за $60.000 прошли, и нынешняя Австралийская молодежь, также как и наша, вовсю жалуется на то что цены стали не доступны для молодых семей. На это несколько причин - одна из которых массовая миграция, которую правительство поддерживает на стабильно высоком уровне, чтобы не страна не впала в экономическую рецессию (людей все равно стабильно не хватает делать основные работы в ключевых отраслях). Другая - это то что строят тут очень мало для растущих нужд (нехватка строительных рабочих рук опять же). Спрос в итоге стабильно превышает предложение на протяжение многих лет.
Также нужно заметить что у местной молодежи губа не дура и жить они хотят у моря в Мельбурне/Сиднее/Брисбене или Перте и чтобы кусочек земли свой, а вот квартиры это не то. Одержимость Австралийцев домами с землей и пренебрежение квартирами почти как в США.
Я в России никогда не покупал себе недвижимость, поэтому покупка тут была первая для меня и для супруги. Мы оба мигранты и покупали без помощи банка Мам и Пап.
Вот вам свежие цифры по ипотечным ставкам:
В среднем от 6 до 7.5%
Они сильно скакнули за последние 2 года из-за борьбы резервного банка с инфляцией. До этого было 1-2%. В 80е ипотека тут была двузначной долгое время и доходила до 17% в 89-90 годах, но и людей тогда было меньше, цены на недвижку были стабильные и не росли с такой скоростью как сейчас, когда каждый месяц видишь как цена на дома поднимается на $10-20.000. Это похоже на гонку, которую невозможно выиграть.
Также важно заметить что ставка ипотеки тут плавающая, а не как в США, где можно было взять 2% фикс на 30 лет гарантировано (сейчас тоже повысили). Тут как только центробанк повысил резервную ставку, так через месяц банки повысили ипотечную ставку всем. Максимальный срок на который можно зафиксировать ставку это 1-3 года чаще всего, но и fixed ставка будет выше чем переменная variable, поэтому раньше люди не часто фиксировали ставку даже на 3 года, поскольку ситуация в экономике была стабильнее, а инфляция ниже.
В итоге, у многих заемщиков в последние два года ипотечный стресс - то ты платил, предположим, $3000 в месяц а теперь в 3 раза больше. Ипотечный стресс тут расчитывается из расчета ежемесячный платеж к месячному доходу. Если ваша ипотечный платеж выше 30% от вашей месячной зарплаты, то вы в группе риска. Банки обычно не одобряют суммы по которым платежи будут выше 30% месячного дохода (до вычета налогов - pre-tax).
Много людей вынуждены продавать дома которые им стали не по средствам. Но в целом рынок все равно продолжает стабильно расти из-за прироста населения во всех крупных городах. Людей с деньгами тут полно, и есть семьи с целым портфолио по 20-30 домов которые они сдают в аренду. Если ты коренной Австралиец, у которого семья из Сиднея хотя бы поколения 2-3, то накопление капитала происходит органично. Тебе и делать ничего не надо, как вдруг домик бабушки стоит $5 млн. Нам же мигрантам приходится строить "империю" с нуля. Надеюсь дети спасибо скажут (нет).
Много тут и тех кто за бортом жизни и живет в социальном жилье типа такого, почти как в США:
Public housing в Мельбурне - для беженцев, матерей одиночек, малоимущих семей
Мы живем в небольшом городе около 400.000 человек, но с развитой инфраструктурой и красивой природой. В целом, тут попроще с недвижкой, чем в больших городах, но ситуация с ростом цен та же. Мы, как и многие тут, надеялись что с окончанием Ковида цены просядут (ага ща). Мы следили за рынком с прошлого года и хотели купить что-то в начале 2024.
В начале 2024 одновременно совпало много факторов и медлить было нельзя. Чтобы нам одобрили ипотеку а также включили в гос программу поддержки молодых семей (First Home Buyers) мне нужен был вид на жительство, который я ждал 3 года и получил в середине 2023. Тогда денег на взнос еще не хватало - нужно было еще 6 мес поднажать. Я усиленно копил все 3 года и продвигался по карьере чтобы увеличить доход. Самый быстрый способ нарастить доход по моему опыту - менять работодателя, не смотря на хорошие отношения с начальством, местоположение, дружный коллектив или бесплатные печенья на кухне. За 4 года я сменил 4 места работы - по году на каждом) и зп выросла с $55.000 до $120.000 в год, плюс переезд в другой штат улучшил перспективы для нас обоих, так что уверен что за 2-3 года выйду на $200.000, ocoбенно, если получить местное образование какое (у меня никакого местного нет). Это позволило постепенно накопить на первый взнос к концу 2023. Государственная программа поддержки, которую я упоминал, включает в себя возможность взять ипотеку на 30 лет всего с 5% взносом без дополнительных страховых пени (вообще стандарт для взноса тут 20%, но наших накоплений не хватало). Также тех кто покупает свою первую недвижимость обычно избавляют от гос налога (stamp duty). К примеру, на мой дом этот налог равен $19.000, но мы его не платили.
Программа для тех кто покупает впервые - места на год ограничены
Гос программа поддержки имеет два условия - цена объекта не должна превышать $750.000 (в разных регионах разный уровень), а уровень совместного дохода для пары не должен быть более $180.000 (также разные цифры для разных штатов). Доход считается местной налоговой службой усреднено по итогам финансового года, который равен 12 мес и заканчивается в Июне. По итогам 22-23 фин.года мы с женой проходили по условиям, а вот в 23-24 мы понимали, что наш доход перевалит за планку и мы потеряем место в программе, поскольку мы оба получили повышения зарплат. Поэтому наша цель была купить до Июня 2024, когда идет перерасчет.
Вообще, в процессе покупки приходилось узнавать кучу нюансов и тонкостей, что мигранту иногда не легко дается. У молодых австралийцев хотя бы есть опытные родители чтобы подсказать. Процесс очень стрессовый и ситуация на рынке это только усугубляет. Кажется, что каждый месяц все меньше объектов которые нам подходят и укладываются в цену (помните нам нельзя покупать выше $750.000, чтобы можно было воспользоваться гос поддержкой). Вот, к примеру, график роста цен на недвижимость в Австралии. Надеюсь так легче понять почему молодое поколение жалуется:
Если пытаться купить хату в одиночку, то вообще туго. У пар преимущество.
По поводу ипотеки.
Многие тут берут ее через ипотечного брокера, который имеет доступ к десяткам банков одновременно. Они могут существенно помочь если ситуация сложная, к примеру, если вы самозаняты без официальной зарплаты или другое что. Вы ничего брокеру не платите и никаких договоров не заключаете. Они берут свою долю с банков. Нам порекомендовали брокера который, к сожалению, не смог найти устраивающую нас ставку. В итоге, я сам вышел на небольшой местный банк, у которого была акция для молодых семей. Одна сложность была - они не горели желанием давать ипотеку, пока я был на испытательном сроке на новой работе. Испытательный срок мой 6 мес. Они сказали приходить после, но так долго я ждать не мог. Я не отчаялся и нашел другой небольшой банк, где все одобрили с хорошим процентом %5,50 fixed на 2 года.
Сначала нам нужно было получить так называемый pre-approval letter от банка, которое они выдают после проверки все документов, зарплаты, расходов по карте и статус резидента. Они также проверяют если ваш доход позволяет участвовать в программе гос поддержки, иначе они не дадут ипотеку в 95% от стоимости. Это письмо - гарантия, что вы допущены к программе, а также там указывается макс сумма которую они готовы вам дать. В нашем случае мы им сказали что при макс цене объекта $750.000 готовы на взнос 5% т.е. около $40.000. В письме они так и написали - дадим остальные $710.000. Если вам приглянулся отличный дом, но выше той цены, что вы обсуждали с банком, то они начнут проверку по новой, что займет время, которое часто критично.
Как только пред-одобрение на руках - вперед на открытый рынок.
Мы к тому моменту (Фев.24) уже много чего посмотрели чисто как зеваки. Весь Октябрь-Декабрь ездили, приценивались, смотрели районы города. Сначала думали о просторной квартире двушке ближе к центру чтобы можно было пешком везде. Мы оба городские и жить на отшибе в часе езды от работы, без общественного транспорта мы не хотели. Тут есть очень унылые сонные районы, где ни магазина, ни кафе в пешей доступности и часто даже тротуаров нет гулять.Вот пример того как развивают тут новые районы - крыша к крыше, ни одного деревца, но зато такой желанный дом.
Гулять по таким районам не приятно и не куда, поэтому все ездят на машинах.
Вот, для сравнения, двушка что мы смотрели на 104 кв.м. с подземным паркингом за $720.000. Центральней не бывает - считай Тверская - даже на работу можно пешком.
Две отдельных ванны это шик. Вид из окна так себе. Плюс шумная улица.
Современные квартиры тут идут с 1-2 парковочными местами обычно в подвале, а также с отделкой включенными в стоимость. Никто дворы и газоны не забивает машинами ночью. На специальных сайтах можно проследить историю покупки/аренды квартиры с момента постройки, что очень удобно и позволяет проследить реальный рост цен в конкретном районе, а также опознать мутные хаты, если ее продают через полгода после покупки, или продают каждый год, то может что-то не то - соседи, управ компания, шум, течь, плесень. Тут есть отвратные квартиры с ужасным качеством. Нужно смотреть каждый вариант внимательно.
История одной из квартир
Можно, еще найти квартиру старого фонда если денег совсем в притык - для начального жилья не дурно. Вот внизу дом 1965 года постройки, в котором мы снимали квартиру во время ковида. Однушка, уютная, без пафоса, с тонкими стенам без центрального отопления (зимой бывало до +7 ночью на улице). Там продавали в 2020 такую за $150.000. Место отличное было - центральное, недалеко от реки, супермаркета и ресторанов. Но тогда я был только что понаехавшим и нищим. Сейчас там продают уже за $240.000. Вот так вот. Главное быть в нужное время в нужном месте и с деньгами.
Все квартиры тут однушки. Стоянка внизу.
Посмотрев на квартиры и на цены, мы вдруг осознали, что чуть подальше от центра мы можем позволить себе за схожие деньги небольшой дом с участком со всеми сопутствующими ништяками - свой сад, веранда, гамак, тишина, нет соседей сверху, земля на которой можно расширить дом или построить бассейн. Вообще, я был удивлен, что квартиры не отличаются в цене радикально от домов, если смотреть не прям убитые хаты на окраине. К тому же тут очень мало строят квартир на 3-4 спальни в силу специфики спроса, поскольку большая семья скоре всего будет ориентироваться на дом с участком для детей. Поэтому цены на большие 3-4 комнатные квартиры неадекватно высокие, почти как на дома, из-за того то их очень мало.
Основное же преимущество частных домов - отсутствие управляющих компаний с ежемесячными поборами и головняком. Тут с ними та же ситуация, что и в России. В той двушке, что я выложил выше, к примеру, сборы управляющей компании (strata) равны $7200 в год. И они постоянно растут с инфляцией и выше. Особенно высоки сборы в современных комплексах со всякими плюшками типа бассейна, тренажерного зала, лифтов, внутреннего сада, подземной парковки - все то, что требует постоянного обслуживания, даже если ты не пользуешься. В своем доме ты можешь либо нанять мастера на единичные работы - починить трубу там, либо делаешь все сам не требуя одобрения управ компании.
Взвесив все за и против мы принялись искать дома, полностью забросив идею с квартирой. Так мы поняли, что стали Австралийцами.
Для новичков, кто покупает дома, главная сложность - понять как работают аукционы недвижимости, потому что в отличие от квартир, 95% домов продаются через аукцион. Вот он внизу. Иногда бывает дом продается до аукциона, если кто-то из покупателей сделал хорошее предложение устроившее продавца, и он решил не тянуть.
Все в куче перед домой выкрикивают ставки - необычное зрелище
После первичного просмотра, и проверки контракта юристом, вы приходите к назначенному времени к дому который покупаете. Таких как вы еще человек 30-50. Новичку очень легко потерять уверенность. Акулы-инвесторы у которых за плечами десяток объектов это видят и скупают все у вас из-под носа. Также есть агенты покупателя которые пойдут на аукцион заместо вас, если вы заняты или вы знаменитость не желающая светиться/смешиваться с простым людом. Обычно агент покупателя нанимается для дорогих покупок.
Секрет успеха - быть при бабле и трезво оценивать рынок не тратя время впустую на аукционы, где у тебя заведомо нет шанса и не переплачивать в толпе, следя за своим бюджетом. Очень часто агентства пишут в объявлениях низкую стартовую цену аукциона (от 500,000), чтобы привлечь больше народу. Я таких научился за версту видеть. Если видите большой красивый дом с начальной ценой ниже рынка - значит они нагоняют толпу. Чем больше народу, тем больше возможности взвинтить цену - в толпе люди перестают мыслить трезво и часто переплачивают. В итоге дом уходит за 100-200.000 выше ориентировочной цены из объявления.
Вот дом, который нам рекламировали за цену от 700.000, Аукцион закончился в итоге выше нашего бюджета в 750,000.
Приходить на аукцион нужно только если у вас есть письмо от банка подтверждающее, что они вам дают взаймы, либо приходить с чемоданом кэша. Таких тоже достаточно. К примеру, много пожилых людей, так называемых downsizer - кто прожил всю жизнь на огромной ферме с огромным домом, который они купили за $30.000 в 1963, а как старость настала и здоровья осталось мало за хозяйством смотреть, то они это все продают за 3-5 миллионов и покупают дом в хорошем районе города или квартиру, которая не требует ухода, зато находится в пешей доступности от кафе. У них после этого еще пара лимонов остается на спокойную старость по Европам путешествовать. Недвижимость для многих это гарантия безбедной старости.
В итоге мы реалистично оценили возможности и решили брать потрепанный дом на ремонт, но в хорошем районе. Как любят повторять местные - location location location.
В ту же Субботу было одновременно 3 аукциона по трем домам которые были нам интересны и которые рекламировались по цене от 700,000-720,0000. Разделяться мы не захотели, поэтому изучив состояние и другие параметры, мы решили сосредоточиться на одном варианте, где были выше шансы. Позже мы узнали, что те два дома, что мы пропустили, оба продались выше 750,000, что значит, мы бы никак там не выиграли. Good call как говорят местные. Чуйка нас не подвела.
На нашем аукционе было много народу - много семей, но на удивление торговались только трое семей, включая нас. Я читал, что хорошая стратегия это быть агрессивным в пределах своего ценового диапазона и не увлекаться. Ставки нужно называть уверенно, без промедления и не мямлить, чтобы у остальных создалось впечатление, что вы можете идти выше и соревноваться с вами бесполезно. Так и вышло, я четко и без промедления бил каждую ставку и в итоге выиграл со ставкой $699.000, что даже ниже нашего бюджета. Наша ситуация не стандартная, потому что это фактически был первый наш аукцион, который сразу закончился успехом. Я знаю людей кто ходит по рынку и пробует в аукционы по году и больше. Мы же провели буквально один месяц серьезной подготовки и сразу получили что хотели. Главное - трезвость ума и четкий расчет. Правда мы потом ходили еще недели две задавая друг другу вопрос - Мы что реально купили дом? - Ага, прикинь.
Договор подписали в самом же дома сразу после аукциона, сразу перевели на счет агентства 5% депозит (стремно немного, но это обязательное условие всех аукционов) и дальше за работу вступили юристы. Тут их обязательно нужно нанимать - стоит что-то около $2000-3000. Через 45 дней все формальности утряслись, собственность перешла нам, банк дал заем и агент продавца встретил нас передать все ключи. Если по каким-то причинам банк отказал в займе не смотря на предыдущие договоренности, и вы не можете полностью войти в сделку, то вы теряете депозит 5-10%. Поэтому в случае если ваш банк отказался вас поддержать, вам остается бегать по ипотечным брокерам в попытке найти хоть кого-то другого кто быстро даст денег. Такие займы будут часто на гораздо худших для вас условиях. Вообще, это главный минус аукционов - покупку невозможно отозвать или передумать. Для других вариантов покупки есть условия, при которых вы спокойно можете выйти из сделки и есть даже cooling off period - время чтобы охладить трахание и отменить уже подписанную сделку в течение недели после заключения сделки..
Оценить реальную стоимость дома чтобы не переплатить можно по историям продаж в том же районе и на специальных сайтах, где собирается и анализируется куча информации. Можно заплатить за специальный отчет по конкретному району, где вам напишут прогноз по росту цен, криминальную ситуацию и потенциальный арендный доход. Инвесторы тут имеют много инструментов прогнозирования прибыли. Вот, к примеру, что этот сайт показывает по нашему дому:
Можно считать цену, что мы заплатили, справедливой $699.000
По местным мерках наш дом - крохотный, всего на 100 кв.м с участком в 6,5 соток - 3 спальни, 1 ванная, 1 туалет и задний двор. Вместо гаража - крытое место. Этот тип домов называется ex-Government House, поскольку такие дома строило правительство по типовому проекту и выдавало массово народу в новых микрорайонах. Вообщем, это Австралийская хрущевка. Но как говорят местные, у таких домов - good bones т.е хорошая основа, а внутрянку можно какую душе угодно. Если вы спросите, как узнать про состояние дома до покупки, то для этого продавец или покупатель нанимает специальную инженерную компанию которая проводит осмотр дома и пишет отчет о найденных недостатках, жуках /термитах (дома тут из дерева часто) и состоянии крыши. Этого чаще всего достаточно, чтобы понять стоит ли брать. Отчет по нашему дому был удовлетворительный для его года постройки: не было следов течи, гнили, термитов, жуков и тп.
Они все выглядят похоже. Наш дом имеет точно такую же планировку.
В доме жил пожилой человек. который по словам соседей не часто тут бывал и большую часть времени проводил в пабе, поэтому внутри все аскетично и с момента постройки в 1969 мало изменилось. Последний раз наш дом продавали в 1991 году, и он не видел большого ремонта последние лет 15. Вот так он выглядит изнутри.
Старые газовые обогреватели, старые полы и картонные внутренние стены. Зато есть земля.
Пока что мы избавились от позорных ковров от стены до стены и обнажили деревянные полы. Впереди дофига работы, но ощущение что ты вкладываешься в свое место, это особое чувство которого у меня не было никогда прежде.
Главный плюс - это отличное местоположение. Дом на достаточно спокойной зеленой улице без интенсивного движения, рядом автобусная остановка до центра/работы, что занимает 35 мин на автобусе/15 на машине. 20-25 минут пешком до крупного торгового центра с кучей магазов, а также озера с вело дорожками. Ну и остальная инфраструктура развита - сады и школы. Старые и новые микрорайоны отличаются кардинально по духу. Сравните с фото нового района выше.
Конечно, новые районы постепенно обживаются, открываются магазины и деревья растут понемногу, но на это может уйти лет 10-15. У меня знакомый живет в новом районе уже 5 лет и там до сих пор нет ни супермаркета, ни тренажерного зала, ни школы рядом. Одноэтажная застройка малой плотности очень плохая для открытия бизнеса - людей на кв.м мало, и они все сидят по домам. Районы со смешанной застройкой и многоэтажками намного живее. Наш район - смешанный. Дальше по улице многоквартирные дома в 3 этажа, а через дорогу минутах в 20 ходьбы есть высотки по 7-10 и даже 20 этажей. Поэтому и бизнесов в районе полно, есть макдак и бары.
Очень часто покупатели первого дома пишут про buyer's regret - сожаление о покупке которая не оправдала ожиданий. Это нормально и проходит через некоторое время, или нет. Могу сказать, что у нас, несмотря на всю волокиту с ремонтом, такого сожаления нет. Мы уже очень любим свой новый дом.
Впереди активное утепление стен, перепланировка, новые двойные стеклопакеты, солнечные батареи, новые полы, задняя веранда, расширение. Дома тут раньше строили погано и без учета климата. Поверить не могу, что без центрального отопления они не утепляли стены, крышу и пол. Ночи тут до -5. Жуть.
А вот тут мы черпаем вдохновение - примеры подобных нашему типовых старых домов после ремонта.
Итоговые цифры для удобства сравнения:
- Цена дома: 699,000 AUD = 453,000 USD = 42,300.000 RUB
- Депозит в итоге мы вложили 10% потому что была возможность: 70,000 AUD
- Ипотека: 630.000 AUD
- Ежемесячный платеж по ипотеке - $3600 AUD
- Ежемесячный доход на двоих - до вычета налогов 19,000 AUD, после вычета налогов около 14,000 AUD
- Отношение ипотеки к ЗП: около 19% (до налогов)/ 26% (если после налогов). В целом комфортный уровень долга. Главное, чтобы ставка не росла дальше. У нас фиксированная ставка на 2 года. Надеюсь к тому времени, как она истечет и перейдет в плавающую, ставки на рынке пойдут вниз. Об этом много разговоров.
По ремонту напишу может через годик как получилось или не получилось.