Farm with Code / JavaScript
В этой игре ваша задача — запрограммировать дрон, чтобы он занимался сельским хозяйством и зарабатывал для вас деньги. Эпические сражения, сложные монстры, потрясающая графика, ностальгическая музыка - все это вы найдете в какой-нибудь другой игре. В этом вы будете писать код на JavaScript.
Эта игра не для всех: она требует от вас кодирования, что не каждый может (и, вероятно, не каждый хочет после 72 часов джема), и потребуется относительно большое (по масштабам джем-игры) количество времени, чтобы понять, как это работает, но если идея кодирования сельскохозяйственного дрона звучит интересно — попробуйте и дайте мне знать, что вы думаете в комментариях. Не стесняйтесь задавать вопросы - отвечу на все!
Прежде чем ты начнешьВставьте лучший начальный код: Gist в редактор. В основном это то же самое, но правильно зациклено (фармится и зарабатывается бесконечно).
Вам не нужно читать весь этот документ, прежде чем начать играть, но я предлагаю вам просмотреть заголовки, чтобы ознакомиться с содержанием документа на случай, если он понадобится вам позже. Основной геймплейДвигайтесь по карте с помощью WASD или клавиш со стрелками (вид карты должен быть сфокусирован — нажмите на нее). Нажмите "Центр", если вы когда-нибудь потеряете свой остров из виду (да, у меня было большое видение).
Нажмите "Исправить", чтобы обновить дрон с помощью текущей версии кода в редакторе.
Обязательно играйте в полноэкранном режиме, чтобы освободить место (кнопка Itch в правом нижнем углу игрового окна).
Вы также можете изменить вертикальное разделение левого/правые (карта/редактор) представления. В правом нижнем углу карты есть небольшой значок, который можно перетаскивать влево/вправо, чтобы настроить горизонтальные размеры.
ПредупреждениеИгра не сохраняет свое состояние, но код всегда сохраняется автоматически.
Вы можете попробовать регенерировать карту, если хотите, и повозиться с многочисленными параметрами, но имейте в виду, что любое крошечное движение любого ползунка (кроме группы «Влажность») сотрет текущее состояние (кроме кода) и регенерирует мир с нуля.
В частности, вы можете протестировать различные семена: Генерация карты => Остров => Сид
Как это было сделано (видео)Как видите, это довольно продвинутая игра. Если вас интересуют более продвинутые игровые разработки (в отличие от дневников разработчиков типа "Я добавил этот куб на сцену, это было очень сложно"), вам может понравиться мой канал на YouTube:
Видео требует много работы, поэтому я публикую нечасто (пока), но надеюсь, что мне удастся снять видео об этой игре, поэтому, если это звучит интересно и вам понравилось видео о лабиринте - подписывайтесь :)
Если вы переходите с C#/C++/Java, вы должны довольно быстро освоить JavaScript. Большинство то же самое:
a = b * c + d * e // Присваивание переменных и выражения if (cond) { } else { } // Условия while (cond) { } // Циклы array[20] // Индексация массива obj.x // Доступ к полю объекта Math.cos(0) // Вызов функцийВот наиболее заметные отличия, которые помогут вам быстро освоиться:
- В JavaScript нет ввода
- Вы определяете переменные с помощью `let` (обычная переменная) или `const` (константа):
- Определение функций отличается:
- Создание массивов отличается:
- Вы можете просто создавать объекты "из воздуха", не нужно предварительно определять классы, структуры и прочее:
Вы можете войти в консоль с помощью:
console.log(obj1, obj2, obj3) console.warn(1009, 'простое') console.error('что-то пошло не так', 5 * 9)Он будет выводиться в консоли вашего браузера (не в игровой консоли), откройте его с помощью "Щелкните правой кнопкой мыши на пустом месте -> Проверить элемент" или Ctrl+Shift+I. В начальном коде есть некоторые закомментированные отладочные файлы console.log.
В конце файла необходимо закодировать только две функции: "start" и "update".
Объект `drone` предоставляет вам очень простое управление, такое как установка силы двигателя, но если вы хотите лететь в какую-то точку, вам нужно запрограммировать его.себя, то же самое, если вы хотите упорядочить некоторые «работы» (например, долететь до (200, 160) затем посадить). В этом отношении это похоже на программирование ИИ для вашей игры: игровой движок предоставляет вам минимальное управление для каждого кадра , и ваша задача – следить за действиями ИИ, чтобы убедиться, что он завершает задания, а не переключает их. каждый кадр.
Стартовый код содержит эту функцию для управления дроном более высокого уровня с последовательностью заданий, но вам не обязательно ее использовать. Если вам кажется интересным внедрение системы задания/учета времени, вы можете удалить весь начальный код и начать с нуля:
запуск функции(дрон) { } функция обновления (дрон) { } Движущийся Долететь до заданной точки один раз flyToJob(100, 200) // Бесконечное патрулирование между заданными точками патрулирование ({x: 0, y: 10}, {x: 300, y: 20}, {x: 30, y: 400}) Покупать и продавать // Купить максимально возможное (по деньгам и по вместимости инвентаря) количество указанного предмета buyMaxJob('оранжевое семя') // Покупает до указанного количества указанного предмета buyUpToJob('оранжевое семя', 5) // Продает весь указанный предмет продатьMaxJob('оранжевый') // Обратите внимание, пример кода покупает 'orangeSeed', но продает 'апельсин' - это разные предметы Полив // Следующие два без параметров, // потому что они действуют на текущее местоположение inputWaterJob // забор воды до тех пор, пока контейнер waterContainer не заполнится outtakeWaterJob // выкачиваем воду до тех пор, пока контейнер waterContainer не станет пустым // летим в заданную точку и набираем воду потребление воды на работе (300, 400) //Поливайте растения во время патрулирования между двумя заданными точками WaterLineJob (новая точка (10, 40), новая точка (10, 200)) Посадка и извлечение plantJob('orangeSeed') // Растения с семенами на текущем тайле plantAtJob('orangeSeed', 10, 80) // Летим в указанную точку, затем сажаем ExtractJob // Извлекает все, что находится на текущей плитке ExtractAtJob(10, 80) // Летим в указанное место, затем извлекаем Комбинаторы вакансий // Следующие четыре задания могут иметь любое количество параметров // Выполняет все задания одновременно, завершается, когда завершается хотя бы одно из них anyJob(patrolJob(p1, p2), outtakeWaterJob) // То же самое, но завершается, когда все задания завершены, тем временем продолжая выполнять другие задания всеРабота(Работа1, Работа2, Работа3, РаботаN) // Выполняет предоставленные задания последовательно один раз последовательностьЗадание(задание1, задание2, задание3, задание4, заданиеN) // Выполняет задания последовательно, но зацикливается навсегда loopJob(задание1, задание2, заданиеN) // На менее абстрактном уровне у вас есть: выполнить AtJob (intakeWaterJob, x, y) // который создает задание, которое выполняет данное задание в заданном месте Примеры комбинаций из стартового кода const PerformAtJob = (задание, x, y) => { const destJob = flyToJob(x, y); return sequenceJob(destJob, allJob(destJob, job)); } const extractAtJob = (x, y) => PerformAtJob(extractJob, x, y); const patchJob = (...points) => loopJob( ...points.map(p => flyToJob(px, py)) ); Динамичный мирМир живет своей жизнью. В частности:
- влага распространяется на близлежащие плитки и испаряется
- растения растут или разлагаются и умирают (их здоровье увеличивается или уменьшается)
Влага возникает на берегах воды, распространяется на соседние плитки и испаряется с поверхности. Это влияет на здоровье растений.
Изменение здоровья растения пропорционально (хотя и ограничено):
плитка.влажность - 24это означает, что при влажности выше 24 растения растут, а при влажности ниже 24 растения загнивают.
Когда здоровье растения достигает нуля, оно автоматически умирает. Это относится как к траве по умолчанию, так и к растениям, которые сажает ваш дрон.
Я выбрал значение 24, чтобы оно было довольно простым на исходной карте по умолчанию, но если вам нужна более сложная карта, вы можете регенерировать карту с другим исходным числом (см. абзац «Предупреждение» выше).
В любом случае полив растений значительно увеличивает скорость их роста. Например, рост при `tile.moisture` = 72 по сравнению с `tile.moisture` = 30 будет в 8 раз быстрее ((72 - 24) / (30 - 24) = 48 / 6 = 8).
плиткаВсе плитки, кроме воды, функционируют по существу одинаково: вы можете посадить на любой плитке и извлечь любую плитку. Идея игры заключается в фермерстве, но ничто не мешает вам добывать камни и продавать их. Пример кода продает траву.
Интерфейс дронаВсе приведенные ниже методы (кроме установки `.motor.force`) работают только для одного кадра, поэтому, если вы хотите посадить семя, вам нужно вызывать `.plant` несколько раз, пока оно не будет посажено.
ПамятьЛюбой объект, который вы хотите сохранить между обновлениями дронов. Все, что здесь сохранено, останетсято же самое на протяжении всего прохождения, в отличие от переменных верхнего уровня, которые будут повторно инициализировать каждый патч.
Drone.memory = {Номер_заплаты: 4};Память подобна жесткому диску.
Переменные верхнего уровня - подобны ОЗУ.
Однако обновление страницы также приведет к очистке памяти.
GPSПредоставляет доступ к данным о местоположении и скорости дронов
дрон.gps.position.x дрон.gps.position.y Drone.gps.velocity.x Drone.gps.velocity.y ВремяПредоставляет доступ к дельта-времени кадра (в миллисекундах)
дрон.время.дельта МоторПозволяет управлять двигателем дрона, чтобы он двигался
дрон.мотор.сила = { х: 1000, г: 500, };Сила будет автоматически ограничена
дрон.мотор.maxForceПри необходимости вы также можете читать из `drone.motor.force`.
Емкость для водыПредоставляет информацию о состоянии хранилища воды дрона
Drone.waterContainer.currentAmount drone.waterContainer.volume // максимальное количество НасосНасос для подачи воды в контейнер для воды и из него.
Drone.pump.intakeСкорость Drone.pump.outtakeСкорость дрон.насос.впуск() дрон.насос.выпуск()`.intake()` и `.outtake()` влияют только на один кадр.
ЛопатаВаш основной инструмент, используйте его для посадки семян и сбора урожая. Высаживайте культуры с помощью:
drone.shovel.plant(item: строка | Item): логическое значениеОн принимает либо itemKey (строка), либо item (Item) семени в качестве параметра и возвращает, было ли семя посажено в этом кадре. Прежде чем семя можно будет посадить, необходимо уничтожить текущую плитку (подумайте о geизбавление от сорняков и/или подготовка почвы) = его здоровье должно достичь нуля. Это повреждение плитки произойдет автоматически, когда вы вызовете `.plant`, но вам нужно продолжать вызывать `.plant`, пока вы не получите `true`, что означает, что семя было посажено.
дрон.лопата.повреждение()Вы также можете просто `.damage()` плитки, не пытаясь ничего посадить, если вам это нужно по какой-либо причине.
Когда вы используете `.plant()` или `.damage()`, текущая (под дроном) плитка в конечном итоге уничтожается, независимо от того, что на ней было расположено. Как правило, вы хотите собирать урожай, а не уничтожать его. Для этого вы используете:
drone.shovel.extract(): логическое значениеТо же, что и `.plant()`, возвращает, была ли извлечена плитка (любая плитка) в этом кадре. И точно так же это не происходит мгновенно: твердость плитки должна достичь нуля, прежде чем извлечение, наконец, удастся. И снова то же самое, `.extract()` автоматически уменьшит твердость плитки.
ИнвентарьТо, что перевозит дрон. Некоторые свойства (надеюсь) не нуждаются в объяснении:
Drone.inventory.maxWeight Drone.inventory.totalWeight дрон.инвентарь.деньгиЕсть два способа получить информацию о конкретном предмете в вашем инвентаре:
drone.inventory.content.Вы также можете перечислить все элементы с помощью:
Drone.inventory.list`.list` имеет то же содержание, что и`.content`, но в форме массива, а не объекта
РынокМесто, где можно купить семена и продать урожай по дерьмовым ценам. Как именно хреново? Эти параметры сообщат вам:
drone.market.buyПенальти drone.market.sellШтрафПланировалось, что их можно будет улучшать (как и все остальное... Я имею в виду, что все остальное тоже планировалось улучшать), но пока они просто равны 2, что означает, что реальная цена покупки и продажи предмета составляет :
item.price * drone.market.buyPenalty item.price / drone.market.sellPenaltyВы можете получить доступ к информации о различных элементах с помощью:
drone.market.availableItems.Как и в случае с инвентарем, здесь есть поле для получения той же информации в виде массива:
Drone.market. AvailableItemsList ВещьИ `.inventory`, и `.market.availableItems` содержат объекты типа `Item` со следующими полями:
// предмет: Товар item.key // ключ для доступа к этому элементу item.name // удобочитаемое имя item.density // сколько весит каждая единица этого предмета item.price // за единицу item.quantity // если предмет есть в вашем инвентаре Полный список доступных методов Drone.memory (получить, установить) дрон.gps.позиция (.x, .y) Drone.gps.velocity (.x, .y) дрон.время.дельта Drone.motor.force (получить, установить) дрон.мотор.maxForce Drone.waterContainer.currentAmoдо Drone.waterContainer.volume Drone.pump.intakeСкорость Drone.pump.outtakeСкорость дрон.насос.впуск() дрон.насос.выпуск() дрон.лопата.повреждение() drone.shovel.plant(item: строка | Item): логическое значение drone.shovel.extract(): логическое значение Drone.inventory.maxWeight Drone.inventory.totalWeight дрон.инвентарь.деньги drone.inventory.content.Семя — это тоже предмет, но тот, который можно посадить
Семя дерева: 140 долларов, 80 кг // да, это "Семя дерева", ошибка OrangeSeed: $80, 30 кг КартофельСемя: $75, 40 кг roseSeed: $135, 250 кг Семена подсолнуха: $80, 120 кг семена пшеницы: 90 долларов, 25 кг whiteFlowerSeed: $105, 170 кгПоделитесь своими мыслямиВ такие необычные игры, как эта, сложно играть во время геймджемов. Это означает, что если вы добрались до реальной игры и попытались что-то закодировать, я был бы втройне рад услышать ваши мысли. Критика приветствуется :)
Я также понимаю, что, несмотря на такой длинный текст, в нем может быть большеиспользование, чем должно быть. Задайте любой вопрос, и я отвечу!
Увидимся в комментариях
Как скачать Farm with Code / JavaScript через торрент
Всего несколько простых шагов:
- Устанавливаем программу μTorrent, через которую мы будем скачивать торренты
- Выбираем и скачиваем подходящий торрент-файл репака Farm with Code / JavaScript
- Двойным кликом открываем скаченный файл, программа μTorrent запустится автоматически и предложит выбрать место для сохранения дистрибутива.
- После того как репак скачается, запускайте его. Начнется установка и... это все, приятной игры!