Team DukeMatch support

git-svn-id: https://svn.eduke32.com/eduke32@268 1a8010ca-5511-0410-912e-c29ae57300e0
This commit is contained in:
terminx 2006-08-18 23:52:26 +00:00
parent 929ab76c77
commit a7bad3d852
11 changed files with 195 additions and 49 deletions

View file

@ -890,6 +890,13 @@ short ifhitbyweapon(short sn)
ud.ffire == 0 )
return -1;
if( j >= 0 &&
sprite[j].picnum == APLAYER &&
(gametype_flags[ud.coop] & GAMETYPE_FLAG_TDM) &&
ps[p].team == ps[sprite[j].yvel].team &&
ud.ffire == 0 )
return -1;
npc->extra -= hittype[sn].extra;
if(j >= 0)

View file

@ -255,6 +255,7 @@ void CONFIG_SetDefaults( void )
ud.shadows = 1;
ud.statusbarmode = 0;
ud.statusbarscale = 100;
ud.team = 0;
ud.weaponswitch = 3; // new+empty
UseJoystick = 0;
UseMouse = 1;
@ -660,6 +661,8 @@ int32 CONFIG_ReadSetup( void )
SCRIPT_GetNumber( scripthandle, "Misc", "ShowFPS",&ud.tickrate);
SCRIPT_GetNumber( scripthandle, "Misc", "Color",&ud.color);
ps[0].palookup = ud.pcolor[0] = ud.color;
SCRIPT_GetNumber( scripthandle, "Misc", "Team",&ud.team);
ps[0].team = ud.pteam[0] = ud.team;
SCRIPT_GetNumber( scripthandle, "Misc", "MPMessageDisplayTime",&ud.msgdisptime);
SCRIPT_GetNumber( scripthandle, "Misc", "StatusBarMode",&ud.statusbarmode);
SCRIPT_GetNumber( scripthandle, "Misc", "AutoVote",&ud.autovote);
@ -762,6 +765,7 @@ void CONFIG_WriteSetup( void )
SCRIPT_PutNumber( scripthandle, "Misc", "ShowViewWeapon",ud.drawweapon,false,false);
SCRIPT_PutNumber( scripthandle, "Misc", "StatusBarMode",ud.statusbarmode,false,false);
SCRIPT_PutNumber( scripthandle, "Misc", "StatusBarScale",ud.statusbarscale,false,false);
SCRIPT_PutNumber( scripthandle, "Misc", "Team",ud.team,false,false);
SCRIPT_PutNumber( scripthandle, "Misc", "UsePrecache",useprecache,false,false);
SCRIPT_PutNumber( scripthandle, "Screen Setup", "Detail",ud.detail,false,false);

View file

@ -54,7 +54,7 @@ extern int conversion, shareware, gametype;
#define BYTEVERSION_13 27
#define BYTEVERSION_14 116
#define BYTEVERSION_15 117
#define BYTEVERSION_JF 165 // increase by 3, because atomic GRP adds 1, and Shareware adds 2
#define BYTEVERSION_JF 168 // increase by 3, because atomic GRP adds 1, and Shareware adds 2
#define BYTEVERSION (BYTEVERSION_JF+(PLUTOPAK?1:(VOLUMEONE<<1))) // JBF 20040116: different data files give different versions
@ -342,6 +342,7 @@ struct user_defs {
int32 runkey_mode,statusbarscale,mouseaiming,weaponswitch,drawweapon; // JBF 20031125
int32 democams,color,pcolor[MAXPLAYERS],msgdisptime,statusbarmode;
int32 m_noexits,noexits,autovote,automsg,idplayers;
int32 team, pteam[MAXPLAYERS];
int32 entered_name,screen_tilting,shadows,fta_on,executions,auto_run;
int32 coords,tickrate,levelstats,m_coop,coop,screen_size,lockout,crosshair;
@ -415,7 +416,7 @@ struct player_struct {
char return_to_center, reloading;
long max_secret_rooms,secret_rooms,max_actors_killed,actors_killed;
long runspeed, movement_lock;
long runspeed, movement_lock, team;
short sbs, sound_pitch;
};
@ -541,7 +542,9 @@ enum gametypeflags {
GAMETYPE_FLAG_PLAYERSFRIENDLY = 4096,
GAMETYPE_FLAG_FIXEDRESPAWN = 8192,
GAMETYPE_FLAG_ACCESSATSTART = 16384,
GAMETYPE_FLAG_PRESERVEINVENTORYDEATH = 32768
GAMETYPE_FLAG_PRESERVEINVENTORYDEATH = 32768,
GAMETYPE_FLAG_TDM = 65536,
GAMETYPE_FLAG_TDMSPAWN = 131072
};
extern char level_file_names[MAXVOLUMES*11][BMAX_PATH];

View file

@ -765,6 +765,23 @@ if( !(ps[myconnectindex].gm&MODE_GAME) ) { OSD_DispatchQueued(); }
ps[other].auto_aim = packbuf[i++];
ps[other].weaponswitch = packbuf[i++];
ps[other].palookup = ud.pcolor[other] = packbuf[i++];
j = ps[other].team;
ps[other].team = ud.pteam[other] = packbuf[i++];
if(ps[other].team != j && sprite[ps[other].i].picnum == APLAYER)
hittype[ps[other].i].extra = 1000;
if(gametype_flags[ud.coop] & GAMETYPE_FLAG_TDM)
{
j = 0;
switch(ps[other].team)
{
case 0: j = 3; break;
case 1: j = 10; break;
}
ps[other].palookup = ud.pcolor[other] = j;
}
if(sprite[ps[other].i].picnum == APLAYER)
sprite[ps[other].i].pal = ud.pcolor[other];
break;
@ -8152,8 +8169,16 @@ void checkcommandline(int argc,char **argv)
ud.m_respawn_monsters = ud.respawn_monsters = 1;
ud.m_respawn_items = ud.respawn_items = 1;
ud.m_respawn_inventory = ud.respawn_inventory = 1;
{
char k = 1;
for(j=numplayers;j<ud.multimode;j++)
{
Bsprintf(ud.user_name[j],"PLAYER %d",j+1);
ps[j].team = ud.pteam[j] = k;
initprintf("p %d t %d\n",j,ps[j].team);
k = 1-k;
}
}
break;
case 'r':
case 'R':
@ -8727,6 +8752,23 @@ void syncnames(void)
buf[l++] = ps[myconnectindex].weaponswitch = ud.weaponswitch;
buf[l++] = ps[myconnectindex].palookup = ud.pcolor[myconnectindex] = ud.color;
i = ps[myconnectindex].team;
buf[l++] = ps[myconnectindex].team = ud.pteam[myconnectindex] = ud.team;
if(ps[myconnectindex].team != i && sprite[ps[myconnectindex].i].picnum == APLAYER)
hittype[ps[myconnectindex].i].extra = 1000;
if(gametype_flags[ud.coop] & GAMETYPE_FLAG_TDM)
{
i = 0;
switch(ps[myconnectindex].team)
{
case 0: i = 3; break;
case 1: i = 10; break;
}
ps[myconnectindex].palookup = ud.pcolor[myconnectindex] = i;
}
for(i=connecthead;i>=0;i=connectpoint2[i])
{
if (i != myconnectindex) sendpacket(i,&buf[0],l);
@ -8790,17 +8832,22 @@ void updatenames(void)
{
syncnames();
if(sprite[ps[myconnectindex].i].picnum == APLAYER)
sprite[ps[myconnectindex].i].pal = ud.color;
sprite[ps[myconnectindex].i].pal = ud.pcolor[myconnectindex];
}
else
{
int j;
ps[myconnectindex].aim_mode = ud.mouseaiming;
ps[myconnectindex].auto_aim = AutoAim;
ps[myconnectindex].weaponswitch = ud.weaponswitch;
ps[myconnectindex].palookup = ud.pcolor[myconnectindex] = ud.color;
j = ps[myconnectindex].team;
ps[myconnectindex].team = ud.pteam[myconnectindex] = ud.team;
if(sprite[ps[myconnectindex].i].picnum == APLAYER)
sprite[ps[myconnectindex].i].pal = ud.color;
sprite[ps[myconnectindex].i].pal = ud.pcolor[myconnectindex];
}
}
@ -9190,7 +9237,19 @@ MAIN_LOOP_RESTART:
ps[myconnectindex].aim_mode = ud.mouseaiming;
ps[myconnectindex].auto_aim = AutoAim;
ps[myconnectindex].weaponswitch = ud.weaponswitch;
ps[myconnectindex].palookup = ud.pcolor[myconnectindex] = ud.color;
ps[myconnectindex].team = ud.pteam[myconnectindex] = ud.team;
if(gametype_flags[ud.coop] & GAMETYPE_FLAG_TDM)
{
int k = 0;
switch(ps[myconnectindex].team)
{
case 0: k = 3; break;
case 1: k = 10; break;
}
ps[myconnectindex].palookup = ud.pcolor[myconnectindex] = k;
} else ps[myconnectindex].palookup = ud.pcolor[myconnectindex] = ud.color;
ud.warp_on = 0;
KB_KeyDown[sc_Pause] = 0; // JBF: I hate the pause key
@ -9383,12 +9442,15 @@ char opendemoread(char which_demo) // 0 = mine
if (kread(recfilep,(int32 *)&ps[i].weaponswitch,sizeof(int32)) != sizeof(int32)) goto corrupt;
if (kread(recfilep,(int32 *)&ud.pcolor[i],sizeof(int32)) != sizeof(int32)) goto corrupt;
ps[i].palookup = ud.pcolor[i];
if (kread(recfilep,(int32 *)&ud.pteam[i],sizeof(int32)) != sizeof(int32)) goto corrupt;
ps[i].team = ud.pteam[i];
if (kread(recfilep,(int32 *)&ud.m_noexits,sizeof(int32)) != sizeof(int32)) goto corrupt;
} else {
if (kread(recfilep,(int32 *)&ps[i].aim_mode,sizeof(char)) != sizeof(char)) goto corrupt;
OSD_Printf("aim_mode: %d\n",ps[i].aim_mode);
ps[i].auto_aim = 1;
ps[i].weaponswitch = 3;
ps[i].team = 0;
ud.m_noexits = 0;
}
}
@ -9439,6 +9501,7 @@ void opendemowrite(void)
fwrite((int32 *)&ps[i].auto_aim,sizeof(int32),1,frecfilep); // JBF 20031126
fwrite(&ps[i].weaponswitch,sizeof(int32),1,frecfilep);
fwrite(&ud.pcolor[i],sizeof(int32),1,frecfilep);
fwrite(&ud.pteam[i],sizeof(int32),1,frecfilep);
fwrite((int32 *)&ud.m_noexits,sizeof(int32),1,frecfilep);
}

View file

@ -688,6 +688,7 @@ LABELS playerlabels[]= {
{ "movement_lock", PLAYER_MOVEMENT_LOCK, 0, 0 },
{ "sound_pitch", PLAYER_SOUND_PITCH, 0, 0 },
{ "weaponswitch", PLAYER_WEAPONSWITCH, 0, 0 },
{ "team", PLAYER_TEAM, 0, 0 },
{ "", -1, 0, 0 } // END OF LIST
};
@ -811,6 +812,7 @@ LABELS userdefslabels[]= {
{ "autovote", USERDEFS_AUTOVOTE, 0, 0 },
{ "automsg", USERDEFS_AUTOMSG, 0, 0 },
{ "idplayers", USERDEFS_IDPLAYERS, 0, 0 },
{ "team", USERDEFS_TEAM, 0, 0 },
{ "", -1, 0, 0 } // END OF LIST
};

View file

@ -203,7 +203,8 @@ enum playerlabels {
PLAYER_AUTO_AIM,
PLAYER_MOVEMENT_LOCK,
PLAYER_SOUND_PITCH,
PLAYER_WEAPONSWITCH
PLAYER_WEAPONSWITCH,
PLAYER_TEAM
};
enum userdefslabels {
@ -289,7 +290,8 @@ enum userdefslabels {
USERDEFS_NOEXITS,
USERDEFS_AUTOVOTE,
USERDEFS_AUTOMSG,
USERDEFS_IDPLAYERS
USERDEFS_IDPLAYERS,
USERDEFS_TEAM
};
enum sectorlabels {

View file

@ -649,6 +649,13 @@ void DoUserDef(char bSet, long lLabelID, long lVar2, short sActor, short sPlayer
SetGameVarID((int)lVar2, ud.idplayers, sActor, sPlayer);
break;
case USERDEFS_TEAM:
if(bSet)
ud.team = lValue;
else
SetGameVarID((int)lVar2, ud.team, sActor, sPlayer);
break;
default:
break;
}
@ -1889,6 +1896,13 @@ void DoPlayer(char bSet, long lVar1, long lLabelID, long lVar2, short sActor, sh
SetGameVarID((int)lVar2, ps[iPlayer].weaponswitch, sActor, sPlayer);
break;
case PLAYER_TEAM:
if(bSet)
ps[iPlayer].team=lValue;
else
SetGameVarID((int)lVar2, ps[iPlayer].team, sActor, sPlayer);
break;
default:
break;
}

View file

@ -58,9 +58,9 @@ long partime[MAXVOLUMES*11],designertime[MAXVOLUMES*11];
char volume_names[MAXVOLUMES][33] = { "L.A. MELTDOWN", "LUNAR APOCALYPSE", "SHRAPNEL CITY" };
char skill_names[5][33] = { "PIECE OF CAKE", "LET'S ROCK", "COME GET SOME", "DAMN I'M GOOD" };
char gametype_names[MAXGAMETYPES][33] = { "DUKEMATCH (SPAWN)","COOPERATIVE PLAY","DUKEMATCH (NO SPAWN)"};
int gametype_flags[MAXGAMETYPES] = {4+8+16+1024+2048+16384,1+2+32+64+128+256+512+4096+8192+32768,2+4+8+16+16384};
char num_gametypes = 3;
char gametype_names[MAXGAMETYPES][33] = { "DUKEMATCH (SPAWN)","COOPERATIVE PLAY","DUKEMATCH (NO SPAWN)","TEAM DUKEMATCH"};
int gametype_flags[MAXGAMETYPES] = {4+8+16+1024+2048+16384,1+2+32+64+128+256+512+4096+8192+32768,2+4+8+16+16384,4+8+16+1024+2048+16384+65536+131072};
char num_gametypes = 4;
long soundsiz[NUM_SOUNDS];

View file

@ -657,10 +657,17 @@ void menus(void)
case 20003:
rotatesprite(160<<16,19<<16,65536L,0,MENUBAR,16,0,10,0,0,xdim-1,ydim-1);
menutext(160,24,0,0,"PLAYER SETUP");
rotatesprite((280)<<16,(37+(tilesizy[APLAYER]>>1))<<16,49152L,0,1441-((((4-(totalclock>>4)))&3)*5),0,ud.color,10,0,0,xdim-1,ydim-1);
if(probey == 2)
{
switch(ud.team) {
case 0: x = 3; break;
case 1: x = 10; break;
}
} else x = ud.color;
rotatesprite((280)<<16,(37+(tilesizy[APLAYER]>>1))<<16,49152L,0,1441-((((4-(totalclock>>4)))&3)*5),0,x,10,0,0,xdim-1,ydim-1);
if (current_menu == 20002) {
x = probe(40,50,16,6);
x = probe(40,50,16,7);
switch(x) {
case -1:
cmenu(202);
@ -686,19 +693,24 @@ void menus(void)
break;
case 2:
AutoAim = (AutoAim == 2) ? 0 : AutoAim+1;
ud.team = 1-ud.team;
updatenames();
break;
case 3:
AutoAim = (AutoAim == 2) ? 0 : AutoAim+1;
updatenames();
break;
case 4:
ud.weaponswitch = (ud.weaponswitch == 3) ? 0 : ud.weaponswitch+1;
updatenames();
break;
case 4:
case 5:
ud.mouseaiming = !ud.mouseaiming;
updatenames();
break;
case 5:
case 6:
cmenu(20004);
break;
}
@ -731,35 +743,40 @@ void menus(void)
menutext(40,50+16,MENUHIGHLIGHT(1),0,"COLOR");
{
int ud_color = -1, aaim = -1, ud_weaponswitch = -1, ud_maim = -1;
int ud_color = -1, aaim = -1, ud_weaponswitch = -1, ud_maim = -1, ud_team = -1;
ud_color = ud.color;
aaim = AutoAim;
ud_weaponswitch = ud.weaponswitch;
ud_maim = ud.mouseaiming;
ud_team = ud.team;
modval(0,23,(int *)&ud.color,1,probey==1);
modval(0,2,(int *)&AutoAim,1,probey==2);
modval(0,3,(int *)&ud.weaponswitch,1,probey==3);
modval(0,1,(int *)&ud.mouseaiming,1,probey==4);
modval(0,1,(int *)&ud.team,1,probey==2);
modval(0,2,(int *)&AutoAim,1,probey==3);
modval(0,3,(int *)&ud.weaponswitch,1,probey==4);
modval(0,1,(int *)&ud.mouseaiming,1,probey==5);
check_player_color((int *)&ud.color,ud_color);
if(ud_color != ud.color || aaim != AutoAim || ud_weaponswitch != ud.weaponswitch || ud_maim != ud.mouseaiming)
if(ud_color != ud.color || aaim != AutoAim || ud_weaponswitch != ud.weaponswitch || ud_maim != ud.mouseaiming || ud_team != ud.team)
updatenames();
}
menutext(40,50+16+16,MENUHIGHLIGHT(2),0,"AUTO AIM");
menutext(40,50+16+16+16,MENUHIGHLIGHT(3),0,"WEAPON SWITCH");
menutext(40,50+16+16+16+16,MENUHIGHLIGHT(4),0,"AIMING TYPE");
menutext(40,50+16+16+16+16+16,MENUHIGHLIGHT(5),0,"MACRO SETUP");
menutext(40,50+16+16,MENUHIGHLIGHT(2),0,"TEAM");
menutext(40,50+16+16+16,MENUHIGHLIGHT(3),0,"AUTO AIM");
menutext(40,50+16+16+16+16,MENUHIGHLIGHT(4),0,"WEAPON SWITCH");
menutext(40,50+16+16+16+16+16,MENUHIGHLIGHT(5),0,"AIMING TYPE");
menutext(40,50+16+16+16+16+16+16,MENUHIGHLIGHT(6),0,"MACRO SETUP");
if (current_menu == 20002) {
gametext(200,50-9,myname,MENUHIGHLIGHT(0),2+8+16); }
{ char *s[] = { "Auto","","","","","","","","","Blue","Dk red","Green","Gray","Dk gray","Dk green","Brown",
"Dk blue","","","","","Red","","Yellow","","" };
gametext(200,50+16-9,s[ud.color],MENUHIGHLIGHT(1),2+8+16); }
{ char *s[] = { "Blue", "Red" };
gametext(200,50+16+16-9,s[ud.team],MENUHIGHLIGHT(2),2+8+16); }
{ char *s[] = { "Off", "Full", "Hitscan" };
gametext(200,50+16+16-9,s[AutoAim],MENUHIGHLIGHT(2),2+8+16); }
gametext(200,50+16+16+16-9,s[AutoAim],MENUHIGHLIGHT(3),2+8+16); }
{ char *s[] = { "Off", "On pickup", "When empty", "Both" };
gametext(200,50+16+16+16-9,s[ud.weaponswitch],MENUHIGHLIGHT(3),2+8+16); }
gametext(200,50+16+16+16+16-9,ud.mouseaiming?"Held":"Toggle",MENUHIGHLIGHT(4),2+8+16);
gametext(200,50+16+16+16+16-9,s[ud.weaponswitch],MENUHIGHLIGHT(4),2+8+16); }
gametext(200,50+16+16+16+16+16-9,ud.mouseaiming?"Held":"Toggle",MENUHIGHLIGHT(5),2+8+16);
break;
@ -774,7 +791,7 @@ void menus(void)
if(x == -1)
{
cmenu(20002);
probey = 5;
probey = 6;
}
else if(x >= 0 && x <= 9)
{
@ -806,6 +823,7 @@ void menus(void)
gametext(160,144,"UP/DOWN = SELECT MACRO",0,2+8+16);
gametext(160,144+9,"ENTER = MODIFY",0,2+8+16);
gametext(160,144+9+9,"ACTIVATE IN GAME WITH SHIFT-F#",0,2+8+16);
break;
@ -4110,7 +4128,7 @@ VOLUME_ALL_40x:
if((gametype_flags[ud.m_coop] & GAMETYPE_FLAG_MARKEROPTION))
modval(0,1,(int *)&ud.m_marker,1,probey==4);
if((gametype_flags[ud.m_coop] & GAMETYPE_FLAG_PLAYERSFRIENDLY))
if((gametype_flags[ud.m_coop] & (GAMETYPE_FLAG_PLAYERSFRIENDLY|GAMETYPE_FLAG_TDM)))
modval(0,1,(int *)&ud.m_ffire,1,probey==5);
else modval(0,1,(int *)&ud.m_noexits,1,probey==5);
@ -4168,7 +4186,7 @@ VOLUME_ALL_40x:
break;
case 5:
if((gametype_flags[ud.m_coop] & GAMETYPE_FLAG_PLAYERSFRIENDLY))
if((gametype_flags[ud.m_coop] & (GAMETYPE_FLAG_PLAYERSFRIENDLY|GAMETYPE_FLAG_TDM)))
ud.m_ffire = !ud.m_ffire;
else ud.m_noexits = !ud.m_noexits;
break;
@ -4226,7 +4244,7 @@ VOLUME_ALL_40x:
if(gametype_flags[ud.m_coop] & GAMETYPE_FLAG_MARKEROPTION)
gametext(c+70,57+16+16+16+16-7-9,ud.m_marker?"ON":"OFF",MENUHIGHLIGHT(4),2+8+16);
if(gametype_flags[ud.m_coop] & GAMETYPE_FLAG_PLAYERSFRIENDLY)
if(gametype_flags[ud.m_coop] & (GAMETYPE_FLAG_PLAYERSFRIENDLY|GAMETYPE_FLAG_TDM))
gametext(c+70,57+16+16+16+16+16-7-9,ud.m_ffire?"ON":"OFF",MENUHIGHLIGHT(5),2+8+16);
else gametext(c+70,57+16+16+16+16+16-7-9,ud.m_noexits?"OFF":"ON",MENUHIGHLIGHT(5),2+8+16);
@ -4252,7 +4270,7 @@ VOLUME_ALL_40x:
else
menutext(c,57+16+16+16+16-9,MENUHIGHLIGHT(4),1,"MARKERS");
if(gametype_flags[ud.m_coop] & GAMETYPE_FLAG_PLAYERSFRIENDLY)
if(gametype_flags[ud.m_coop] & (GAMETYPE_FLAG_PLAYERSFRIENDLY|GAMETYPE_FLAG_TDM))
menutext(c,57+16+16+16+16+16-9,MENUHIGHLIGHT(5),0,"FR. FIRE");
else menutext(c,57+16+16+16+16+16-9,MENUHIGHLIGHT(5),0,"MAP EXITS");

View file

@ -314,7 +314,7 @@ short aim(spritetype *s,short aang,short atwith)
{
if( PN == APLAYER &&
// ud.ffire == 0 &&
(gametype_flags[ud.coop]& GAMETYPE_FLAG_PLAYERSFRIENDLY ) &&
(gametype_flags[ud.coop]& GAMETYPE_FLAG_PLAYERSFRIENDLY || ((gametype_flags[ud.coop] & GAMETYPE_FLAG_TDM) && ps[sprite[i].yvel].team == ps[s->yvel].team)) &&
s->picnum == APLAYER &&
s != &sprite[i])
continue;
@ -735,7 +735,7 @@ short shoot(short i,short atwith)
if(hitspr >= 0)
{
checkhitsprite(hitspr,k);
if( sprite[hitspr].picnum == APLAYER && (!(gametype_flags[ud.coop] & GAMETYPE_FLAG_PLAYERSFRIENDLY) || ud.ffire == 1) )
if( sprite[hitspr].picnum == APLAYER && (ud.ffire == 1 || (!(gametype_flags[ud.coop] & GAMETYPE_FLAG_PLAYERSFRIENDLY) && (gametype_flags[ud.coop] & GAMETYPE_FLAG_TDM) && ps[sprite[hitspr].yvel].team != ps[sprite[i].yvel].team)))
{
l = spawn(k,JIBS6);
sprite[k].xrepeat = sprite[k].yrepeat = 0;
@ -1241,7 +1241,7 @@ DOSKIPBULLETHOLE:
if(hitspr >= 0)
{
checkhitsprite(hitspr,k);
if( sprite[hitspr].picnum == APLAYER && (!(gametype_flags[ud.coop]&GAMETYPE_FLAG_PLAYERSFRIENDLY ) || ud.ffire == 1) )
if( sprite[hitspr].picnum == APLAYER && (ud.ffire == 1 || (!(gametype_flags[ud.coop] & GAMETYPE_FLAG_PLAYERSFRIENDLY) && (gametype_flags[ud.coop] & GAMETYPE_FLAG_TDM) && ps[sprite[hitspr].yvel].team != ps[sprite[i].yvel].team)))
{
l = spawn(k,JIBS6);
sprite[k].xrepeat = sprite[k].yrepeat = 0;
@ -3500,7 +3500,7 @@ void processinput(short snum)
{
char name1[32],name2[32];
if(gametype_flags[ud.coop] & GAMETYPE_FLAG_PLAYERSFRIENDLY)
if(gametype_flags[ud.coop] & GAMETYPE_FLAG_PLAYERSFRIENDLY || (gametype_flags[ud.coop] & GAMETYPE_FLAG_TDM && ps[snum].team == ps[p->frag_ps].team))
i = 9;
else
{

View file

@ -410,12 +410,30 @@ void vscrn(void)
void pickrandomspot(short snum)
{
struct player_struct *p;
short i;
short i=0,j,k;
unsigned long dist,pdist = -1;
p = &ps[snum];
if( ud.multimode > 1 && !(gametype_flags[ud.coop] & GAMETYPE_FLAG_FIXEDRESPAWN))
i = TRAND%numplayersprites;
{
if(gametype_flags[ud.coop] & GAMETYPE_FLAG_TDMSPAWN)
{
for(j=0;j<ud.multimode;j++)
{
if(j != snum && ps[j].team == ps[snum].team && sprite[ps[j].i].extra > 0)
{
for(k=0;k<numplayersprites;k++)
{
dist = FindDistance2D(ps[j].posx-po[k].ox,ps[j].posy-po[k].oy);
if(dist < pdist)
i = k, pdist = dist;
}
break;
}
}
} else i = TRAND%numplayersprites;
}
else i = snum;
p->bobposx = p->oposx = p->posx = po[i].ox;
@ -1205,7 +1223,7 @@ void resetpspritevars(char g)
s->yvel = j;
if(!ud.pcolor[j] && ud.multimode > 1)
if(!ud.pcolor[j] && ud.multimode > 1 && !(gametype_flags[ud.coop] & GAMETYPE_FLAG_TDM))
{
if(s->pal == 0)
{
@ -1224,7 +1242,22 @@ void resetpspritevars(char g)
which_palookup = 9;
}
else ps[j].palookup = s->pal;
} else s->pal = ps[j].palookup = ud.pcolor[j];
}
else
{
int k = ud.pcolor[j];
if(gametype_flags[ud.coop] & GAMETYPE_FLAG_TDM)
{
switch(ud.pteam[j])
{
case 0: k = 3; break;
case 1: k = 10; break;
}
ps[j].team = ud.pteam[j];
}
s->pal = ps[j].palookup = k;
}
ps[j].i = i;
ps[j].frag_ps = j;