#if !defined _MAIN_H_
#define _MAIN_H_
//==============================================================================
#include <a_samp> //Явная зависимость
//==============================================================================
#endif
#include <stdafx.h> //Предварительно откомпилированный заголовок
//==============================================================================
#if !defined _MAIN_PWN_
#define _MAIN_PWN_
//==============================================================================
main(){}
//==============================================================================
#endif
#if !defined _CALLBACK_H_
#define _CALLBACK_H_
//==============================================================================
//==============================================================================
#endif
#if !defined _CALLBACK_PWN_
#define _CALLBACK_PWN_
//==============================================================================
public OnGameModeInit()
{
LoadHouse(); //Загрузим дома
LoadBiznes(); //Загрузим бизнесы
reutrn 1;
}
//==============================================================================
public OnGameModeExit()
{
UnLoadHouse(); //Выгрузим дома
UnLoadBiznes(); //Выгрузим бизнесы
return 1;
}
//==============================================================================
#endif
#if !defined _HOUSE_H_
#define _HOUSE_H_
//==============================================================================
#define MAX_HOUSE 5
//==============================================================================
new House_Count = 0; //Счетчик количества домов
new House_DB_ID[MAX_HOUSE]; //Каждый дом запоминает ИД в Базе Данных
new House_Type[MAX_HOUSE]; //Каждый дом запоминает тип
//==============================================================================
forward LoadHouse();
forward UnLoadHouse();
//==============================================================================
#endif
#if !defined _HOUSE_PWN_
#define _HOUSE_PWN_
//==============================================================================
public LoadHouse()
{
for(new i = 0; i < MAX_HOUSE; i++) //Побежим по всем домам
{
House_DB_ID[House_Count] = i; //Запомним ид БД
House_Type[House_Count] = random(2); //Запомним тип дома
if(House_Type[House_Count] == 0) //Если тип дома равен 0
{
House_Create_Type_0(); //Вызвать создание 0 типа
}
else if(House_Type[House_Count] == 1) //Если тип дома равен 1
{
House_Create_Type_1(); //Вызвать создание 1 типа
}
House_Count++; //Количество домов увеличилось
}
return 1;
}
public UnLoadHouse()
{
for(new i = 0; i < House_Count; i++) //Бежим по всем домам
{
if(House_Type[i] == 0) //Если тип дома равен 0
{
House_Destroy_Type_0(); //Вызвать разрушение 0 типа
}
else if(House_Type[i] == 1) //Если тип дома равен 1
{
House_Destroy_Type_1(); //Вызвать разрушение 1 типа
}
}
return 1;
}
//==============================================================================
#endif
#if !defined _HOUSE_TYPE_0_H_
#define _HOUSE_TYPE_0_H_
//==============================================================================
new House_Type_0_Count = 0;
//==============================================================================
#endif
#if !defined _HOUSE_TYPE_0_PWN_
#define _HOUSE_TYPE_0_PWN_
//==============================================================================
stock House_Create_Type_0()
{
House_Type_0_Count++;
printf("Дом тип 0, Меня уже: %d", House_Type_0_Count);
}
stock House_Destroy_Type_0()
{
House_Type_0_Count--;
printf("Дом тип 0, Меня осталось: %d", House_Type_0_Count);
}
//==============================================================================
#endif
#if !defined _stdafx_h_
#define _stdafx_h_
//==============================================================================
#include "C:\TestProject\_main.h"
#include "C:\TestProject\Source\Callback.h"
#include "C:\TestProject\Source\Biznes\Biznes.h"
#include "C:\TestProject\Source\Biznes\Type_0\Biznes_Type_0.h"
#include "C:\TestProject\Source\Biznes\Type_1\Biznes_Type_1.h"
#include "C:\TestProject\Source\House\House.h"
#include "C:\TestProject\Source\House\Type_0\House_Type_0.h"
#include "C:\TestProject\Source\House\Type_1\House_Type_1.h"
//==============================================================================
#include "C:\TestProject\_main.pwn"
#include "C:\TestProject\Source\Callback.pwn"
#include "C:\TestProject\Source\Biznes\Biznes.pwn"
#include "C:\TestProject\Source\Biznes\Type_0\Biznes_Type_0.pwn"
#include "C:\TestProject\Source\Biznes\Type_1\Biznes_Type_1.pwn"
#include "C:\TestProject\Source\House\House.pwn"
#include "C:\TestProject\Source\House\Type_0\House_Type_0.pwn"
#include "C:\TestProject\Source\House\Type_1\House_Type_1.pwn"
//==============================================================================
#endif
#if !defined _MAIN_H_
#define _MAIN_H_
//==============================================================================
#include <a_samp> //Явная зависимость
//==============================================================================
#include "C:\TestProject\Source\Biznes\Biznes.h"
#include "C:\TestProject\Source\Callback.h" // Callback.h явно зависит от Biznes.h и теперь всё в порядке, Такие зависимости могут вызывать макросы
//==============================================================================
#endif
@rem Нужно указать расширения файлов:
@rem header - заголовочный файл, хранит переменные и forward-ы
@rem source - файл кода, хранит код программы, stock-и и public-и
@rem stdafx - предкомпилированный заголовок, в нём собираются все header и source файлы
@rem move_to - переместит скомпилированный файл в указанную директорию.
@set header=h
@set source=pwn
@set stdafx=stdafx
@set move_to=\
@chcp 65001>nul
@rem Запоминаем и выводим время старта компиляции
@setlocal EnableDelayedExpansion
@set t0=!time!
@echo Время запуска: !t0!
@setlocal DisableDelayedExpansion
@rem Автоматические переменные
@set name=Created_by_White_116
@set old_path_to_code=v1.0
@set path_to_code=%CD%
@set path_to_pawn=%0
@rem Вырежем путь до компилятора
@for %%i in (%path_to_pawn%) do @(set path_to_pawn=%%~dpi)
@rem Ищем корневой каталог по главному файлу компиляции
:back1
@if exist %path_to_code%\_*.%source% goto next1
@for %%i in ("%path_to_code%\..") do @(set path_to_code=%%~fi)
@if %path_to_code% == %old_path_to_code% (
@echo Ошибка: Не найден корневой каталог для этого проекта!
@goto next2
) else (
@set old_path_to_code=%path_to_code%
)
@goto back1
:next1
@rem Ищем имя главного файла компиляции
@for %%i in ("%path_to_code%\_*.%source%") do @(set name=%%~ni)
@rem Заполняем Precompiled Headers
@(
@(echo.#if !defined _stdafx_h_)
@(echo.#define _stdafx_h_)
@(echo.//==============================================================================)
@for /F "delims=" %%i in ('dir /s /b %path_to_code%\*.%header%') do @(echo.#include "%%i")
@(echo.//==============================================================================)
@for /F "delims=" %%i in ('dir /s /b %path_to_code%\*.%source%') do @(echo.#include "%%i")
@(echo.//==============================================================================)
@(echo.#endif)
)>%path_to_pawn%\include\%stdafx%.%header%
@rem Компилируем проект
@%path_to_pawn%pawncc.exe -;+ -(+ %path_to_code%\%name%.%source% -o%path_to_code%\%name%.amx %1 %2 %3 %4 %5 %6 %7 %8 %9
@rem Если не нужно перемещать файл то перепрыгиваем, иначе перемещаем
@if %move_to% == \ goto next2
@rem Если существует файл переместить его
@if exist %path_to_code%\%name%.amx ^
move %path_to_code%\%name%.amx %move_to%
@rem Выводим время завершения и затраченное время на компиляцию
:next2
@setlocal EnableDelayedExpansion
@set t1=!time!
@for /F "tokens=1-8 delims=:.," %%a in ("!t0: =0!:!t1: =0!") do @(set /a "a=(((1%%e-1%%a)*60)+1%%f-1%%b)*6000+1%%g%%h-1%%c%%d, a+=(a>>31) & 8640000")
@echo Время завершения: !t1! Затрачено времени: !a!0 мс.
@setlocal DisableDelayedExpansion
@rem Покинем, всё OK!
@exit /b 1
-Засекать время компиляции проекта. -При редактировании любого файла проекта и при нажатии кнопки компилирования, автоматически находить главный файл проекта который и будет компилироваться, главный файл проекта должен иметь формат _*.pwn -Создавать предкомпилированный заголовок, создаётся автоматически в папке с инклудами, чтобы не мудрить с подключением в проекте. -Перемещать скомпилированный файл в указанный каталог. -Передавать параметры компилятору. |
cd $(CURRENT_DIRECTORY) "P:\Сompiler.bat" -O2 |
cd $(CURRENT_DIRECTORY) -указывает текущий каталог компилируемого файла. "P:\Сompiler.bat" -путь до нашего батника, который должен лежать рядом с компилятором. -O2 - параметр компиляции передаваемый компилятору. |
![]() Зачем так усложнять себе жизнь? Что это вообще? Это утопия языка "С" и логика прошлого века. |
../gamemode.pwn
|- houses.pwn
|- houses
| - house-1.pwn
| - house-2.pwn
#include <a_samp>
#include "houses.pwn"
#include "/houses/house-1.pwn"
#include "/houses/house-2.pwn"
Жесткой привязки к файловой системе (#include "C:\TestProject\Source\Biznes\Type_0\Biznes_Ty pe_0 .h"). |
Количество подключаемых файлов сократилось в 2 раза. |
Зависимость можно регулировать вынесение отдельных общих функции в файл, который будем подключать сразу после <a_samp> |
#if !defined _HOUSE_PWN_
#define _HOUSE_PWN_
#endif
../gamemode.pwn
|- Some_Func.pwn
|- houses.pwn
|- houses
| - house-1.pwn
| - house-2.pwn
../gamemode.pwn (forward some_func();)
|- Some_Func.pwn (call some_func();)
|- houses.pwn
|- houses
| - house-1.pwn (public some_func() {return 1;} )
| - house-2.pwn
Проблема решена. Собственно это единственное верное решение указать компилятору что функция существует и может быть использована в коде. И неважно в каком она файле, главное что бы существовала.
Ваш метод хорош по своему, и в чем то конечно удобен, но через чур избыточен. |
А зачем нам использовать переменные которые непосредственно относятся к какому-либо файлу? Глобальные переменные тоже можно выносить в заголовки, а с локальными работать через отдельные функции.
|