Skip to content

Commit

Permalink
Merge branch 'update'
Browse files Browse the repository at this point in the history
  • Loading branch information
unshame committed Jan 7, 2024
2 parents 240e162 + 88d8aa7 commit 32356b7
Show file tree
Hide file tree
Showing 14 changed files with 11,565 additions and 2,206 deletions.
33 changes: 33 additions & 0 deletions .github/workflows/deploy.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
name: Deploy to Google App Engine

on:
push:
branches:
- master

jobs:
deploy:
runs-on: ubuntu-latest

permissions:
contents: 'read'
id-token: 'write'

steps:
- uses: actions/checkout@v4

- uses: actions/setup-node@v4
with:
node-version: 20.10.0
- run: npm install
- run: npm run build

- uses: google-github-actions/auth@v2
with:
project_id: 'sinuous-crow-410507'
credentials_json: ${{ secrets.GCLOUD_ACCOUNT_KEY }}

- uses: google-github-actions/deploy-appengine@v2
with:
working_directory: prod
deliverables: app.yaml
3 changes: 0 additions & 3 deletions .gitmodules

This file was deleted.

84 changes: 15 additions & 69 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,28 +1,20 @@
Мультиплеерная карточная игра на [Phaser.js](https://phaser.io/), [Node.js](https://nodejs.org/) и [Eureca.io](http://eureca.io/).
Тестовая версия - [durak.herokuapp.com](https://durak.herokuapp.com/).
Тестовая версия - [https://sinuous-crow-410507.ew.r.appspot.com/](https://sinuous-crow-410507.ew.r.appspot.com/).
Документация (WIP) - [клиент](https://durak.herokuapp.com/doc/client), [сервер](https://durak.herokuapp.com/doc/server).
[Правила игры (примерные)](http://www.gambiter.ru/durak/item/69-igra-durak-pravila.html). Реализован переводной и подкидной варианты.

## Установка

1. Клонировать `git clone https://github.com/unshame/Cardgame2017.git`
3. Установить [node.js](https://nodejs.org/en/)
4. Установить необходимые библиотеки через Node.js command prompt в папку с репозиторием:
* `cd директорияУстановкиРепозитория`
* `npm i`
9. Установить модули для разработки: `npm run dev`
Это установит gulp, jsdoc и plato (об этом далее).
5. Запустить сервер через Node.js command prompt: `node server`
7. В браузере открыть `localhost:5000`
8. Должно быть так:
![Menu](https://i.imgur.com/kKb8Hfr.png "Menu")
![Gameplay](https://i.imgur.com/CkgYyii.jpg "Gameplay")
И если нажать F12:
![DevConsole](https://i.imgur.com/HyQXwbl.png "F12 Developer Console")
2. Установить [node.js 20](https://nodejs.org/en/)
3. Установить зависимости: `npm i`
4. Запустить сервер: `npm run dev`
5. В браузере открыть `localhost:5000`

## Отладка и тестирование

### Параметры запуска сервера

`node server -param1 value -param2 -param3` и т.д.
Параметры:
* `--debug [string]`, `-d [string]` - включает дебаг сообщения в консоли, опционально можно указать уровень сообщений (`silly, debug, info, notice, warn, error`, по умолчанию `debug` с флагом и `notice` без флага)
Expand All @@ -39,6 +31,7 @@
* `--freeforall`, `--ffa` - все атакующие игроки ходят одновременно

### Тестирование сервера

Тесты очень примитивные, все, что они делают, это прогоняют игру с ботами без задержки.
При тестах проверяется две вещи: кол-во карт у защищающегося при атаке и корректность прохождения перевода.
В данный момент оба эти теста всегда проходят. Иногда при тестировании возникают предупреждения о неверных ходах ботов,
Expand All @@ -47,6 +40,7 @@
Если поставить тест на 10-20 секунд, большая часть веток алгоритма будут пройдены.

### Отладка сервера

Для более направленной отладки лучше использовать дебаггер.
Для этого нужно запустить node со специальным флагом: `node --inspect server`.
Перед запуском сервера можно указать точки остановки прямо в коде при помощи ключевого слова `debugger`.
Expand All @@ -56,7 +50,8 @@
Также из консоли есть доступ к серверу и всем его элементам: `server`.
И если запущены тесты, есть доступ к тестовой игре: `game`.

### Серверные логи
### Серверные логи

В папке \logs создаются логи сервера. Каждая игра, игрок и очередь создают свои логи.
Логи именуются по шаблону `Type-DATEtTIME.log`.
Нужный лог можно найти по сообщениям в консоли. Например:
Expand All @@ -65,6 +60,7 @@
Для создания логов и вывода сообщений в консоль используется [winston](https://github.com/winstonjs/winston).

### Полезные для отладки фичи

* Кнопка D в правом нижнем углу открывает меню переключения режима отладки отдельных элементов игры
* Кнопка S пропускает все запланированные анимации
* Глобально доступные модули: `game, gameOptions, gameInfo, actionHandler, ui, skinManager, cardControl, connection, fieldManager, cardEmitter, cardManager`
Expand All @@ -75,10 +71,11 @@
## Разработка

### Пакетная обработка

Есть несколько скриптов для облегчения разработки и загрузки игры на сервер при помощи [gulp](http://gulpjs.com/).
`gulp addtags` добавляет `<script>` теги с адресами .js файлов из public\js в index.html для облегчения локального теста игры.
`gulp build` создает копию игры в папке prod, минифицируя .js файлы из public\js.
Также туда копируются файлы для загрузки игры на сервер heroku.
Также туда копируются файлы для деплоя.
`gulp buildall` в дополнению ко всему вышеперечисленному копирует документацию и отчеты в prod\public.
`gulp buildsafe` и `gulp buildallsafe` делает тоже самое, только убирает все игровые модули клиента из глобального доступа
(предотвращает модифицирование поведения клиента игры через консоль)
Expand All @@ -88,60 +85,9 @@
Если файл уже указан в index.js, в нем можно указывать имена других файлов и т.д.

### Документация

`npm run doc` генерирует документацию из комментариев в папке doc при помощи [JSDoc](http://usejsdoc.org/).
Тестовая версия загружена на [durak.herokuapp.com/doc/client/](https://durak.herokuapp.com/doc/client/).
Шаблон документации классов на сервере:

```javascript
'use strict';

class Example extends OtherClass{

/**
* Описание класса.
* @extends {OtherClass}
* @param {type} param
*/
constructor(param){
super();

/**
* Описание свойства
* @type {type}
*/
this.param = param
}


/**
* Описание getterSetter.
* @type {type}
*/
get getterSetter(){

}
set getterSetter(value){

}

/**
* Описание readOnlyParam.
* @type {type}
* @readonly
*/
get readOnlyParam(){

}
}

/**
* {@link Example}
* @module
*/
module.exports = Example;
```

`@module` ставится внизу, чтобы заставить генератор добавить файл в список модулей, но не представлять класс, как свойство модуля (класс это и есть модуль).
Тестовая версия загружена на [https://sinuous-crow-410507.ew.r.appspot.com/doc/client/](https://sinuous-crow-410507.ew.r.appspot.com/doc/client/).
В корне репозитория лежит модифицированный файл подсветки синтаксиса для Sublime 3 с подсветкой документации (с этим она значительно более читабильна в коде).

### Валидация кода
Expand Down
6 changes: 6 additions & 0 deletions app.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
runtime: nodejs20
build_env_variables:
GOOGLE_NODE_RUN_SCRIPTS: ''
env_variables:
PROD: '1'
entrypoint: 'node server.js --port 8080'
19 changes: 8 additions & 11 deletions gulpfile.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
// jshint node:true
'use strict';

const
const
fs = require('fs'),
path = require('path'),
gulp = require('gulp'),
Expand All @@ -22,14 +22,13 @@ const reportPath = './report';
const prodPath = './prod';
const otherPaths = [
'./server.js',
'./app.json', // для heroku
'./package.json', // информация о приложении
'./package-lock.json',
'./app.yaml',
'./logs/.gitkeep', // нужно сохранить папку с логами, но без самих логов
'./.gitignore', // для heroku
'./Procfile', // для heroku
path.join(publicPath, 'style.css'),
path.join(publicPath, 'favicon.ico'),
path.join(publicPath, '/assets/**/*'),
path.join(publicPath, '/assets/**/*'),
path.join(serverPath, '/**/*') // серверные скрипты
];

Expand Down Expand Up @@ -71,7 +70,7 @@ function includeReferenced(dir, fileName, tags, base, addSelf){

// Находим либо dir/fileName.js, либо dir/fileName/fileName.js
if(fs.existsSync(filePath)){
content = fs.readFileSync(filePath, "utf8");
content = fs.readFileSync(filePath, "utf8");
}
else if(fs.existsSync(dirPath) && fs.existsSync(fileAltPath)){
content = fs.readFileSync(fileAltPath, "utf8");
Expand Down Expand Up @@ -171,7 +170,7 @@ function build(includeDocs, safeBuild, callback){
let jsFile = newFile(path.join(publicPath, minifiedPath), jsContent);

// заменяем пути к скриптам в index.html
let tags = addLibraryTags('', [packPath, minifiedPath]);
let tags = addLibraryTags('', [packPath, minifiedPath]);
let indexContent = replaceDevCode(publicPath, indexName + '.html', null, tags, true);
let indexFile = newFile(path.join(publicPath, indexName + '.html'), indexContent);

Expand Down Expand Up @@ -199,17 +198,15 @@ function build(includeDocs, safeBuild, callback){
path.join(docPath, '/server/**/*'),
path.join(reportPath, '/client/**/*'),
path.join(reportPath, '/server/**/*')
], base)
], base)
.pipe(gulp.dest(path.join(prodPath, publicName)));
}
}

// Таск создания версии для heroku
gulp.task('build', (callback) => {
build(false, false, callback);
});

// Таск создания версии для heroku с обновлением документации
gulp.task('buildall', (callback) => {
build(true, false, callback);
});
Expand All @@ -228,7 +225,7 @@ gulp.task('buildallsafe', (callback) => {
gulp.task('addtags', (callback) => {

// Добавляем библиотеки к тегам
let libs = addLibraryTags('', libraryPaths);
let libs = addLibraryTags('', libraryPaths);

// Создаем теги из скриптов
let tags = includeReferenced(path.join(publicPath, jsPath), indexName, true, publicName + '\\');
Expand Down
Loading

0 comments on commit 32356b7

Please sign in to comment.