Игра,похожая на SCP

Написано: среда, 25 апреля 2012 г. автор st1x51
2

Один чувак с moddb с ником dr_mabuse1981,по ходу вдохновился нашим Untitled Project 038G-5 и решил сделать свою игру,только он хочет добавить туда монстров и оружие. Как он сказал,это будет что-то типа SCP и Silent Hill.Выглядит данная игра довольно впечатляюще.



Я думаю игра будет на PC,PSP и на Wii:)

Untitled Project v.1.1 и немного о Quartal 2.5

Написано: понедельник, 16 апреля 2012 г. автор st1x51
0

С небольшой задержкой,выкладываю UP 1.1.
ссылка будет во вкладке "Проекты"
Так же идет работа над Quartal 2.5,готово что то типа менюшки,работаем над персонажем(будем тестить MP)
Надеюсь,dimaflash сломает свою виту,и займется созданием карт)
тут еще пара наработок от Xavier:





P.S: скоро на moddb,Untitled Project
Да и Quartal 2.5 уже близко

Немного о изменениях и релизах

Написано: вторник, 10 апреля 2012 г. автор st1x51
0

И так,начну я с неизвестного проекта,версия 1.1 с исправленым багом и новыми звуками будет выложена послезавтра наверно,а вслед за ней дня через три выйдет квартал с 2.5.В нем,в основном будет слегка почищен код,будут изменены звуки,изображения,хотелось бы отвязать мод от кваки,дабы уменьшить размер игры.
На самом деле нужно еще много чего сделать....

Немного новостей

Написано: четверг, 5 апреля 2012 г. автор st1x51
0

Немного новостей
День как обычно выдался суровый,но часик на все можно отвести:)
Начнем с новости в плане Untitled Project:
Из-за того что я случайно удалил исходники этого мода,мне пришлось его заново переписывать и заодно исправить один баг,так что скоро можно увидеть Untitled Project 1.1

C Quartal дела обстоят как-то туго,самой главной проблемой являются турели,которые могут завалить игрока за пару секунд,их нужно исправлять..
Xavier с moddb предложил мне модельку портал гана,приближенную к реальной портальной пушке из Portal,только она была без текстур и мне пришлось самому разукрашивать и делать анимации(которые Xavier потом поправил и сделале ще нормальное расположение пушки в руках у игрока),а так же пришлось убирать дырки в модели.
Получилось что-то типа этого:

QuakeC:приседание

Написано: автор st1x51
0

Приседание[QuakeC]
Думал сегодня ничего не писать,ну да ладно.Начнем.

1)Создаем файл crouch.qc и попируем туда этот код:
.float crouch, attemptcrouch;
float (entity targ) crouchcheck =
{

makevectors (self.v_angle);
tracebox (self.origin, VEC_HULL_MIN, VEC_HULL_MAX, self.origin + '0 0 16', FALSE, self); 

 /*
vector VEC_HULL_MIN = '-16 -16 -24';
vector VEC_HULL_MAX = '16 16 32';
 */ 


if (trace_fraction == 1)            //hits nothing go ahead
 return TRUE;

if (!trace_ent.takedamage)      //hits world or nondamagable object
 return FALSE;

 return FALSE;

};

void() crouch_on =
{

if ((!self.crouch) && (!self.velocity_z)) //crouch down
{
setsize (self, '-16 -16 -8', '16 16 8');
self.crouch = 1;
self.view_ofs = '0 0 14';
self.attemptcrouch = 1;
return;
}
self.attemptcrouch = 0;
};

void() crouch_off =
{
if (self.crouch && (!self.velocity_z) && (crouchcheck(self)))  //get up
{
setsize (self, VEC_HULL_MIN, VEC_HULL_MAX);
self.crouch = 0;
self.origin_z = self.origin_z + 16;
self.view_ofs = '0 0 22';
self.attemptcrouch = 0;
return;
}
self.attemptcrouch = 1;
};

2) Добавляем эти строки в ImpulseCommands в weapons.qc:
 
if (self.impulse == 33)
crouch_on ();

if (self.impulse == 34)
crouch_off ();

3) Добавьте crouch.qc в progs.src после строки weapons.qc и можете компилировать.
 
4) Добавьте в autoexec.cfg(если нету,то создать) в папке id1 / или в папке вашего мода
эти строки:

alias +crouch_on        "impulse 33"
alias -crouch_on        "impulse 34"


вы можете забиндить команду +crouch_on, например:
Добавив в autoexec.cfg
bind ctrl "+crouch_on"
 
  

QuakeC:рандомная загрузка уровней

Написано: вторник, 3 апреля 2012 г. автор st1x51
0

Рандомная загрузка уровней[QuakeC]
Открываем client.qc и видим такую вот картину:
void() NextLevel =
{
 local entity o;

 if (mapname == "start")
 {
  if (!cvar("registered"))
  {
   mapname = "e1m1";
  }
  else if (!(serverflags & 1))
  {
   mapname = "e1m1";
   serverflags = serverflags | 1;
  }
  else if (!(serverflags & 2))
  {
   mapname = "e2m1";
   serverflags = serverflags | 2;
  }
  else if (!(serverflags & 4))
  {
   mapname = "e3m1";
   serverflags = serverflags | 4;
  }
  else if (!(serverflags & 8))
  {
   mapname = "e4m1";
   serverflags = serverflags - 7;
  }

  o = spawn();
  o.map = mapname;
 }
 else
 {
  // find a trigger changelevel
  o = find(world, classname, "trigger_changelevel");

  // go back to start if no trigger_changelevel
  if (!o)
  {
   mapname = "start";
   o = spawn();
   o.map = mapname;
  }
 }

 nextmap = o.map;
 gameover = TRUE;
 
 if (o.nextthink < time)
 {
  o.think = execute_changelevel;
  o.nextthink = time + 0.1;
 }
};
 
Копируем NextLevel() функцию и меняем ей имя на NextRandomLevel.
Теперь,замените это:
 
if (mapname == "start")
 {
  if (!cvar("registered"))
  {
   mapname = "e1m1";
  }
  else if (!(serverflags & 1))
  {
   mapname = "e1m1";
   serverflags = serverflags | 1;
  }
  else if (!(serverflags & 2))
  {
   mapname = "e2m1";
   serverflags = serverflags | 2;
  }
  else if (!(serverflags & 4))
  {
   mapname = "e3m1";
   serverflags = serverflags | 4;
  }
  else if (!(serverflags & 8))
  {
   mapname = "e4m1";
   serverflags = serverflags - 7;
  }

  o = spawn();
  o.map = mapname;
 }
 else
 {
  // find a trigger changelevel
  o = find(world, classname, "trigger_changelevel");

  // go back to start if no trigger_changelevel
  if (!o)
  {
   mapname = "start";
   o = spawn();
   o.map = mapname;
  }
 } 
 
На это:

local float whichmap;
 
 whichmap = rint (random()*36 + 1);
 
 if (whichmap == 1)
  mapname = "start";
 else if (whichmap == 2)
  mapname = "e1m1";
 else if (whichmap == 3)
  mapname = "e1m2";
 else if (whichmap == 4)
  mapname = "e1m3";
 else if (whichmap == 5)
  mapname = "e1m4";
 else if (whichmap == 6)
  mapname = "e1m5";
 else if (whichmap == 7)
  mapname = "e1m6";
 else if (whichmap == 8)
  mapname = "e1m7";
 else if (whichmap == 9)
  mapname = "e1m8";
 else if (whichmap == 10)
  mapname = "e2m1";
 else if (whichmap == 11)
  mapname = "e2m2";
 else if (whichmap == 12)
  mapname = "e2m3";
 else if (whichmap == 13)
  mapname = "e2m4";
 else if (whichmap == 14)
  mapname = "e2m5";
 else if (whichmap == 15)
  mapname = "e2m6";
 else if (whichmap == 16)
  mapname = "e2m7";
 else if (whichmap == 17)
  mapname = "e3m1";
 else if (whichmap == 18)
  mapname = "e3m2";
 else if (whichmap == 19)
  mapname = "e3m3";
 else if (whichmap == 20)
  mapname = "e3m4";
 else if (whichmap == 21)
  mapname = "e3m5";
 else if (whichmap == 22)
  mapname = "e3m6";
 else if (whichmap == 23)
  mapname = "e3m7";
 else if (whichmap == 24)
  mapname = "e4m1";
 else if (whichmap == 25)
  mapname = "e4m2";
 else if (whichmap == 26)
  mapname = "e4m3";
 else if (whichmap == 27)
  mapname = "e4m4";
 else if (whichmap == 28)
  mapname = "e4m5";
 else if (whichmap == 29)
  mapname = "e4m6";
 else if (whichmap == 30)
  mapname = "e4m7";
 else if (whichmap == 31)
  mapname = "e4m8";
 else if (whichmap == 32)
  mapname = "dm1";
 else if (whichmap == 33)
  mapname = "dm2";
 else if (whichmap == 34)
  mapname = "dm3";
 else if (whichmap == 35)
  mapname = "dm4";
 else if (whichmap == 36)
  mapname = "dm5";
 else
  mapname = "dm6";
 
 o = spawn();
 o.map = mapname;
 
В CheckRules() Функции найдите:
 
if (deathmatch && fraglimit && self.frags >= fraglimit)
{
 NextLevel ();
 return;
}  

Теперь замените NextLevel (); на:
NextRandomLevel ();
 
Все.Компилим.Теперь наши уровни загружаются рандомно

QuakeC:звук шагов

Написано: автор st1x51
0

Добавляем в Quake звук шагов[QuakeC]
Для начала,вы должны найти звуки шагов и положить их в папку
                        sound/player/,звуков должно быть 4.
 Ну что ж ,начнём.
Откройте world.qc и пролистайте до:
precache_sound ("misc/water2.wav");   // swimming


После той строки вставьте это:


      precache_sound ("player/foot1.wav");      
      precache_sound ("player/foot2.wav");      
      precache_sound ("player/foot3.wav");      
      precache_sound ("player/foot4.wav");


Теперь мы должны использовать наши звуки по назначению,
откройте player.qc
Найдите там:


void() player_run =[ $rockrun1, player_run ]
{


После фигурной скобки вставьте этот код:

        if (self.walkframe == 1 || self.walkframe == 4 )
        {
                if (checkbottom(self) == TRUE)
                {
                        if (self.waterlevel == 0)
    {
          local float r;
     r = rint(random() * 3);   
     if (r == 1)
             sound (self, CHAN_AUTO, "player/foot1.wav", 0.5, ATTN_NORM);
     else if (r == 2)
             sound (self, CHAN_AUTO, "player/foot2.wav", 0.5, ATTN_NORM);
     else if (r == 0)
             sound (self, CHAN_AUTO, "player/foot3.wav", 0.5, ATTN_NORM);
     else
            sound (self, CHAN_AUTO, "player/foot4.wav", 0.5, ATTN_NORM);
    }
                }
        }
 
 
Собственно все,можно все компилировать и наслаждаться звуками шагов. 

QuakeC: фонарик

Написано: понедельник, 2 апреля 2012 г. автор st1x51
0

 Как в Quake добавить фонарик[QuakeC]

Шаг 1
Создайте текстовый файл и назовите его flash.qc ,вставьте в этот файл то,что написано ниже, и положите flash.qc в папку со своими исходниками
void() W_SetCurrentAmmo;void() flash_update =
{
        // The Player is dead so turn the Flashlight off
        if (self.owner.deadflag != DEAD_NO)
                self.effects = 0;

        // The Player is alive so turn On the Flashlight
        else                                
                self.effects = EF_DIMLIGHT;  

        // Find out which direction player facing
        makevectors (self.owner.v_angle);

        // Check if there is any things infront of the flashlight
        traceline (self.owner.origin , (self.owner.origin+(v_forward * 500)) , FALSE , self);

        // Set the Flashlight's position

        setorigin (self, trace_endpos+(v_forward * -5));

        // Repeat it in 0.02 seconds...
        self.nextthink = time + 0.02;
};

void() flash_on =
{
        // Make a new entity to hold the Flashlight
        local entity myflash;

        // spawn flash
        myflash = spawn ();
        myflash.movetype = MOVETYPE_NONE;
        myflash.solid = SOLID_NOT;
        // this uses the s_bubble.spr, if you want it to be completly
        // invisible you need to create a one pixel trancparent spirit
        // and use it here...
        setmodel (myflash, "progs/s_bubble.spr"); 
        setsize (myflash, '0 0 0', '0 0 0');

        // Wire Player And Flashlight Together
        myflash.owner = self;
        self.flash = myflash;
        
        // give the flash a Name And Make It Glow
        myflash.classname = "flash";
        myflash.effects = EF_DIMLIGHT;
        
        // Set Start Position
        makevectors (self.v_angle);
        traceline (self.origin , (self.origin+(v_forward * 500)) , FALSE , self);
        setorigin (myflash, trace_endpos);

        // Start Flashlight Update
        myflash.think = flash_update;
        myflash.nextthink = time + 0.02;
};


void () flash_toggle =
{
        // If Off, Turn On
        if (self.flash_flag == FALSE)
        {       
                self.flash_flag = TRUE;
                flash_on();
        }

        // If On, Turn Off
        else
        {
                self.flash_flag = FALSE;
                W_SetCurrentAmmo ();
                self.flash.think = SUB_Remove;
                self.flash.nextthink = time + 0.1;
        }
};
Шаг 2
Откройте defs.qc и добавьте в конец следующие строки:
.float flash_flag; // On/off for the flashlight
.entity flash;   // flash entity
Шаг 3
Откройте weapons.qc и найдите строку ImpulseCommands (она почти в самом низу),после
self.impulse = 0;
добавьте:

if (self.impulse == 30) 
        flash_toggle();
Шаг 4
Теперь вы должны прописать flash.qc в файл progs.scr . Напишите flash.qc под defs.qc.
Шаг 5
Компилируем файлы и кидаем наш progs.dat в папку с нашим модом(игрой), напишите в консоле impulse 30 ии тадаам,фонарик :D
P.S: для полного удобства,чтобы не лазить все время в консоль,можно сделать так: bind "f" "impulse 30"
Автор кода:ShockMan


QuakeC:С чего начать

Написано: автор st1x51
0

Во-первых, позвольте мне дать вам краткое объяснение того, что же такое QC. QuakeC — интерпретируемый язык программирования, разработанный в 1996 году Джоном Кармаком (id Software) для написания части компьютерной игры Quake. Используя QuakeC, программист имеет возможность модифицировать игру: добавить оружие, изменить игровую логику и физику, написать сложный сценарий. Язык может использоваться для контроля за многими аспектами игры, такими как искусственный интеллект (противников), триггеры, изменения на карте.
QC записан в .qc файлах, которые компилируются QC компилятором в файл под названием progs.dat. Progs.dat читается движком Quake , и он принимает код игры оттуда.
QC код отвечает не на все в Quake. Часть кода обрабатывается движком Quake Engine. QC включает в себя: оружие, движения игроков и анимации, все элементов кода и т.д.
Первое, что вы должны сделать, это достать копию исходного кода QC . Последней версией, выпущенной Software ID была версия 1.06, но я рекомендую использовать QC исходник Джастина Тимьяна, который является очищенным вариантом версии оригинального исходного кода. Его можно скачать здесь: http://www.quaddicted.com/files/tools/Clean_v106qc.zip
Следующее, что вам нужно сделать, это создать новый каталог для нашего мода. Внутри вашей папки Quake нужно создать папку с вашим модом,например mymod. Далее вам нужно поместить QC код в эту папку. Распакуйте Clean_v106qc.zip ,или возьмите папку qc из архива и положите ее в папку с вашим модом(в нашем случае это mymod),должно получится такое: quake/mymod/qc
Теперь, когда QC файлы лежат в нужной папке, следующее, что нужно сделать,это найти компилятор. Это программа, предназначенная для компиляции текстовых. QC-файлов в файл progs.dat. QC компилятора от ID Software назывался QCC.EXE, но как и многие оригинальные инструменты Quake он был заменен более современным компилятором, улучшенной версии. Я рекомендую FTEQCC.(http://www.4shared.com/file/yHnxNE5M/fteqcc.html) или (http://www.quaddicted.com/files/tools/fteqccgui2770-win32.zip)
Распакуйте этот файл в quake/mymod/qc и запустите FTEQCC.EXE для компиляции кода. Появится командная строка DOS и покажет список qc файлов ,а затем остановится.Предположим,что ошибок у нас никаких нет и закроем DOS окно. В папке quake/mymod появится наш progs.dat . Вы можете запустить этот мод сейчас, но так как мы ничего не изменили,значит глупо запускать тот же квейк.
Итак, давайте вдаваться в код. Но для начала, что мы хотим сделать? Я думаю, что для этого урока я начну с очень простого. Давайте сделаем "Сообщение дня", сообщение, которое ненадолго появляется в центре экрана, когда игроки подключаются к серверу. Давайте сделаем это.
Открываем файл quake/mymod/qc/client.qc. Это QC файл отвечает за такие вещи как:спавн игроков, что делать когда игроки подключаются и отключаются и т.д. Это все относится к функциям клиента. QC файлы разбиваются на функции(functions), которые являются автономными участками кода. Простая функция выглядит следующим образом:

void() GotoNextMap =
{
        if (cvar("samelevel")) // if samelevel is set, stay on same level
               changelevel (mapname);
        else
               changelevel (nextmap);
};

Это довольно короткая функция. Я не буду перечислять все, что она делает сейчас, здесь показано что у функции есть имя (GotoNextMap). А тело функции раздела в фигурных скобках(это код, который запускается, когда эта функция вызывается)
Хорошо, теперь игнорируем эту функцию полностью, так как я просто показал как функция выглядит. Функция, которую мы ищем, называется ClientConnect и находится она на линии 1159. Выглядит это примерно так:
/*
===========
ClientConnect
called when a player connects to a server
============
*/
void() ClientConnect =
{
        bprint (self.netname);
        bprint (" entered the game\n");     
// a client connecting during an intermission can cause problems
        if (intermission_running)
               ExitIntermission ();
};
Раздел / * и * /, является комментарием. Комментарии игнорируются компилятором полностью, они нужны для того, чтобы сделать код более легким для чтения и понимания для людей, которые редактируют код. Строки, начинающиеся с / / тоже комментарий. Как отмечено в комментарии,в начале говорится о том что, эта функция вызывается, когда клиент соединяется с сервером. Это идеальное место чтобы написать наш код "Сообщение дня", так как мы хотим, чтобы сообщение писалось игроку, когда он присоединяется к серверу. В конце функции, как раз перед окончательным}; добавьте следующую строку:

centerprint(self, "Welcome To My Mod\n");

centerprint является функцией встроенной в движок и, используется для вывода сообщения в центре экрана игрока self является переменной, которая здесь указывает на игрока, который только что подключился к серверу, таким образом,движок знает, кому показать сообщение.(self на самом деле может относится к любому субъекту в игре) В функции стрельбы из оружия self будет относиться к игроку, который стрелял из оружия и т.д. Это очень полезная переменная для многих ситуаций, и вы будете использовать ее много раз. "Welcome To My Mod\ П", сообщение, которое мы хотим отобразить. \ П в этом сообщении-не будет показано на экране,так как это используется для того,чтобы сообщить движку,что это конец строки.
Вы, наверное, заметили, что большинство строк кода, кажется, заканчиваются точкой с запятой. Это говорит компилятору о том, что команда достигла конца, и он будет жаловаться/отказываться от компиляции, если ; стоит не правильно.
Говоря о компиляторах, сохраните client.qc и запустите FTEQCC.EXE. Предположим,что все скомпилировалось. Запускаем мод, и смотрим наше "Сообщение дня"

Welcome

Написано: автор st1x51
0

И так все мы уже давно знаем,что чуть ли не каждый человек,может сделать игру на движке quake1,ибо квейк настолько популярен,что свою игру можно будет портировать на PSP,DS,Android,Win Mobile,PC,Linux,Symbian и на другие платформы.В этом мини блоге я постараюсь собрать базу туториалов по обращению с quake,а так же игр сделанных на этом движке(в основном игры будут PSP/PC)

P.S:может года через два сюда кто-нибудь заглянет:)