2010-10-07 13:22:03 +00:00
|
|
|
/*Based on rajh's, Redix's & Sushi Tee's, Race mod stuff and tweaked byt btd and GreYFoX@GTi with STL to fit our DDRace needs*/
|
2010-07-29 05:21:18 +00:00
|
|
|
#include <engine/server.h>
|
|
|
|
#include <game/mapitems.h>
|
|
|
|
#include <game/server/entities/character.h>
|
|
|
|
#include <game/server/player.h>
|
|
|
|
#include <game/server/gamecontext.h>
|
2010-07-29 14:53:25 +00:00
|
|
|
#include "DDRace.h"
|
2010-07-29 05:21:18 +00:00
|
|
|
|
2010-10-04 18:37:39 +00:00
|
|
|
CGameControllerDDRace::CGameControllerDDRace(class CGameContext *pGameServer) : IGameController(pGameServer), m_Teams(pGameServer), m_SDoors(50)
|
2010-07-29 05:21:18 +00:00
|
|
|
{
|
|
|
|
m_pGameType = "DDRace";
|
2010-09-06 11:37:20 +00:00
|
|
|
|
2010-08-10 04:28:17 +00:00
|
|
|
InitTeleporter();
|
2010-10-04 19:17:56 +00:00
|
|
|
InitSwitcher();
|
2010-07-29 05:21:18 +00:00
|
|
|
}
|
|
|
|
|
2010-08-10 04:28:17 +00:00
|
|
|
CGameControllerDDRace::~CGameControllerDDRace()
|
|
|
|
{
|
2010-10-07 13:22:03 +00:00
|
|
|
//Nothing to clean
|
2010-08-10 04:28:17 +00:00
|
|
|
}
|
2010-07-29 05:21:18 +00:00
|
|
|
|
2010-07-29 14:53:25 +00:00
|
|
|
void CGameControllerDDRace::Tick()
|
2010-07-29 05:21:18 +00:00
|
|
|
{
|
|
|
|
IGameController::Tick();
|
|
|
|
}
|
2010-08-10 04:28:17 +00:00
|
|
|
|
|
|
|
void CGameControllerDDRace::InitTeleporter()
|
|
|
|
{
|
2010-10-04 19:17:56 +00:00
|
|
|
if(!GameServer()->Collision()->Layers()->TeleLayer()) return;
|
|
|
|
int Width = GameServer()->Collision()->Layers()->TeleLayer()->m_Width;
|
|
|
|
int Height = GameServer()->Collision()->Layers()->TeleLayer()->m_Height;
|
2010-10-07 13:22:03 +00:00
|
|
|
|
2010-10-04 07:59:16 +00:00
|
|
|
for(int i = 0; i < Width*Height; i++)
|
2010-09-27 03:15:56 +00:00
|
|
|
{
|
2010-10-04 18:37:39 +00:00
|
|
|
if(GameServer()->Collision()->TeleLayer()[i].m_Number > 0
|
|
|
|
&& GameServer()->Collision()->TeleLayer()[i].m_Type == TILE_TELEOUT)
|
2010-09-27 03:15:56 +00:00
|
|
|
{
|
2010-10-04 19:17:56 +00:00
|
|
|
m_TeleOuts[GameServer()->Collision()->TeleLayer()[i].m_Number-1].push_back(vec2(i % GameServer()->Collision()->Layers()->TeleLayer()->m_Width*32+16,
|
|
|
|
i/GameServer()->Collision()->Layers()->TeleLayer()->m_Width*32+16));
|
2010-09-27 03:15:56 +00:00
|
|
|
}
|
2010-08-10 04:28:17 +00:00
|
|
|
}
|
2010-08-27 23:30:50 +00:00
|
|
|
}
|
2010-09-06 11:37:20 +00:00
|
|
|
|
|
|
|
void CGameControllerDDRace::InitSwitcher()
|
|
|
|
{
|
2010-10-04 19:17:56 +00:00
|
|
|
if(!GameServer()->Collision()->SwitchLayer()) return;
|
2010-09-06 11:37:20 +00:00
|
|
|
CMapItemLayerTilemap *pTileMap = GameServer()->Layers()->GameLayer();
|
2010-10-07 13:22:03 +00:00
|
|
|
for(int y = 0; y < pTileMap->m_Height; y++) // Count Doors and push them to m_SDoors
|
2010-09-06 11:37:20 +00:00
|
|
|
{
|
2010-10-07 13:22:03 +00:00
|
|
|
for(int x = 0; x < pTileMap->m_Width; x++)
|
2010-10-04 18:37:39 +00:00
|
|
|
{
|
2010-10-07 13:22:03 +00:00
|
|
|
if(GameServer()->Collision()->SwitchLayer()[y*pTileMap->m_Width+x].m_Type == (ENTITY_DOOR + ENTITY_OFFSET))
|
2010-09-06 11:37:20 +00:00
|
|
|
{
|
2010-10-07 13:22:03 +00:00
|
|
|
int sides[8][2];
|
|
|
|
sides[0][0]=GameServer()->Collision()->SwitchLayer()[(x)+pTileMap->m_Width*(y+1)].m_Type - ENTITY_OFFSET;
|
|
|
|
sides[1][0]=GameServer()->Collision()->SwitchLayer()[(x+1)+pTileMap->m_Width*(y+1)].m_Type - ENTITY_OFFSET;
|
|
|
|
sides[2][0]=GameServer()->Collision()->SwitchLayer()[(x+1)+pTileMap->m_Width*(y)].m_Type - ENTITY_OFFSET;
|
|
|
|
sides[3][0]=GameServer()->Collision()->SwitchLayer()[(x+1)+pTileMap->m_Width*(y-1)].m_Type - ENTITY_OFFSET;
|
|
|
|
sides[4][0]=GameServer()->Collision()->SwitchLayer()[(x)+pTileMap->m_Width*(y-1)].m_Type - ENTITY_OFFSET;
|
|
|
|
sides[5][0]=GameServer()->Collision()->SwitchLayer()[(x-1)+pTileMap->m_Width*(y-1)].m_Type - ENTITY_OFFSET;
|
|
|
|
sides[6][0]=GameServer()->Collision()->SwitchLayer()[(x-1)+pTileMap->m_Width*(y)].m_Type - ENTITY_OFFSET;
|
|
|
|
sides[7][0]=GameServer()->Collision()->SwitchLayer()[(x-1)+pTileMap->m_Width*(y+1)].m_Type - ENTITY_OFFSET;
|
|
|
|
sides[0][1]=GameServer()->Collision()->SwitchLayer()[(x)+pTileMap->m_Width*(y+1)].m_Number;
|
|
|
|
sides[1][1]=GameServer()->Collision()->SwitchLayer()[(x+1)+pTileMap->m_Width*(y+1)].m_Number;
|
|
|
|
sides[2][1]=GameServer()->Collision()->SwitchLayer()[(x+1)+pTileMap->m_Width*(y)].m_Number;
|
|
|
|
sides[3][1]=GameServer()->Collision()->SwitchLayer()[(x+1)+pTileMap->m_Width*(y-1)].m_Number;
|
|
|
|
sides[4][1]=GameServer()->Collision()->SwitchLayer()[(x)+pTileMap->m_Width*(y-1)].m_Number;
|
|
|
|
sides[5][1]=GameServer()->Collision()->SwitchLayer()[(x-1)+pTileMap->m_Width*(y-1)].m_Number;
|
|
|
|
sides[6][1]=GameServer()->Collision()->SwitchLayer()[(x-1)+pTileMap->m_Width*(y)].m_Number;
|
|
|
|
sides[7][1]=GameServer()->Collision()->SwitchLayer()[(x-1)+pTileMap->m_Width*(y+1)].m_Number;
|
|
|
|
for(int i = 0; i < 8; i++) {
|
|
|
|
if ((sides[i][0] >= ENTITY_LASER_SHORT && sides[i][0] <= ENTITY_LASER_LONG)
|
|
|
|
&& GameServer()->Collision()->SwitchLayer()[y*pTileMap->m_Width+x].m_Number == sides[i][1]) {
|
|
|
|
vec2 Pos(x*32.0f+16.0f, y*32.0f+16.0f);
|
|
|
|
SDoors tmp;
|
|
|
|
tmp.m_Pos = Pos;
|
|
|
|
tmp.m_Address = new CDoor(
|
|
|
|
&GameServer()->m_World,
|
|
|
|
Pos,
|
|
|
|
pi/4*i,
|
|
|
|
(32*3 + 32*(sides[i][0] - ENTITY_LASER_SHORT)*3),
|
|
|
|
false);
|
|
|
|
tmp.m_Number = GameServer()->Collision()->SwitchLayer()[y*pTileMap->m_Width+x].m_Number;
|
|
|
|
m_SDoors.push_back(tmp);
|
2010-10-04 18:37:39 +00:00
|
|
|
}
|
2010-10-07 13:22:03 +00:00
|
|
|
}
|
2010-09-06 11:37:20 +00:00
|
|
|
}
|
2010-10-04 18:37:39 +00:00
|
|
|
}
|
2010-10-07 13:22:03 +00:00
|
|
|
}
|
|
|
|
for(int y = 0; y < pTileMap->m_Height; y++)//Create Switch for each Door in m_SDoors
|
|
|
|
{
|
|
|
|
for(int x = 0; x < pTileMap->m_Width; x++)
|
2010-09-06 11:37:20 +00:00
|
|
|
{
|
2010-10-07 13:22:03 +00:00
|
|
|
if(GameServer()->Collision()->SwitchLayer()[y*pTileMap->m_Width+x].m_Type - ENTITY_OFFSET == ENTITY_TRIGGER) {
|
|
|
|
for(int i = 0; i < m_SDoors.size(); ++i) {
|
|
|
|
if(m_SDoors[i].m_Number == GameServer()->Collision()->SwitchLayer()[y*pTileMap->m_Width+x].m_Number) {
|
|
|
|
new CTrigger(
|
|
|
|
&GameServer()->m_World,
|
|
|
|
vec2(x*32.0f+16.0f, y*32.0f+16.0f),
|
|
|
|
m_SDoors[i].m_Address);
|
2010-09-06 11:37:20 +00:00
|
|
|
}
|
2010-10-04 18:37:39 +00:00
|
|
|
}
|
|
|
|
}
|
2010-09-06 11:37:20 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|