shithub: choc

Download patch

ref: bbb39c2906ab01b75e7959a0d07560a4a56c459a
parent: 3228ddb99f72d00c089fc7a87d1edfec2c4519fc
author: Samuel Villareal <svkaiser@gmail.com>
date: Wed Sep 15 00:41:10 EDT 2010

+ EV_DoDoor updated
+ New door types added to enum
+ T_VerticalDoor updated
+ Split Door mechanic implemented
+ Linetypes 40, 174, 183 implemented

Subversion-branch: /branches/strife-branch
Subversion-revision: 2088

--- a/src/strife/p_doors.c
+++ b/src/strife/p_doors.c
@@ -49,134 +49,163 @@
 //
 // T_VerticalDoor
 //
-void T_VerticalDoor (vldoor_t* door)
+void T_VerticalDoor(vldoor_t* door)
 {
-    result_e	res;
-	
+    result_e res1;
+    result_e res2;
+
     switch(door->direction)
     {
-      case 0:
-	// WAITING
-	if (!--door->topcountdown)
-	{
-	    switch(door->type)
-	    {
-	      case blazeRaise:
-		door->direction = -1; // time to go back down
-		S_StartSound(&door->sector->soundorg, sfx_bdcls);
-		break;
-		
-	      case normal:
-		door->direction = -1; // time to go back down
-		S_StartSound(&door->sector->soundorg, sfx_swish);   // villsa [STRIFE] TODO - fix sounds
-		break;
-		
-	      case close30ThenOpen:
-		door->direction = 1;
-		S_StartSound(&door->sector->soundorg, sfx_swish);   // villsa [STRIFE] TODO - fix sounds
-		break;
-		
-	      default:
-		break;
-	    }
-	}
-	break;
-	
-      case 2:
-	//  INITIAL WAIT
-	if (!--door->topcountdown)
-	{
-	    switch(door->type)
-	    {
-	      case raiseIn5Mins:
-		door->direction = 1;
-		door->type = normal;
-		S_StartSound(&door->sector->soundorg, sfx_swish);   // villsa [STRIFE] TODO - fix sounds
-		break;
-		
-	      default:
-		break;
-	    }
-	}
-	break;
-	
-      case -1:
-	// DOWN
-	res = T_MovePlane(door->sector,
-			  door->speed,
-			  door->sector->floorheight,
-			  false,1,door->direction);
-	if (res == pastdest)
-	{
-	    switch(door->type)
-	    {
-	      case blazeRaise:
-	      case blazeClose:
-		door->sector->specialdata = NULL;
-		P_RemoveThinker (&door->thinker);  // unlink and free
-		S_StartSound(&door->sector->soundorg, sfx_bdcls);
-		break;
-		
-	      case normal:
-	      case close:
-		door->sector->specialdata = NULL;
-		P_RemoveThinker (&door->thinker);  // unlink and free
-		break;
-		
-	      case close30ThenOpen:
-		door->direction = 0;
-		door->topcountdown = TICRATE*30;
-		break;
-		
-	      default:
-		break;
-	    }
-	}
-	else if (res == crushed)
-	{
-	    switch(door->type)
-	    {
-	      case blazeClose:
-	      case close:		// DO NOT GO BACK UP!
-		break;
-		
-	      default:
-		door->direction = 1;
-		S_StartSound(&door->sector->soundorg, sfx_swish);   // villsa [STRIFE] TODO - fix sounds
-		break;
-	    }
-	}
-	break;
-	
-      case 1:
-	// UP
-	res = T_MovePlane(door->sector,
-			  door->speed,
-			  door->topheight,
-			  false,1,door->direction);
-	
-	if (res == pastdest)
-	{
-	    switch(door->type)
-	    {
-	      case blazeRaise:
-	      case normal:
-		door->direction = 0; // wait at top
-		door->topcountdown = door->topwait;
-		break;
-		
-	      case close30ThenOpen:
-	      case blazeOpen:
-	      case open:
-		door->sector->specialdata = NULL;
-		P_RemoveThinker (&door->thinker);  // unlink and free
-		break;
-		
-	      default:
-		break;
-	    }
-	}
-	break;
+    case 0:
+        // WAITING
+        if (!--door->topcountdown)
+        {
+            switch(door->type)
+            {
+            case blazeRaise:
+                door->direction = -1; // time to go back down
+                S_StartSound(&door->sector->soundorg, sfx_bdcls);
+                break;
+
+            case normal:
+                door->direction = -1; // time to go back down
+                // villsa [STRIFE] closesound added
+                S_StartSound(&door->sector->soundorg, door->closesound);
+                break;
+
+                // villsa [STRIFE]
+            case shopClose:
+                door->direction = 1;
+                door->speed = (2*FRACUNIT);
+                S_StartSound(&door->sector->soundorg, door->opensound);
+                break;
+
+            case close30ThenOpen:
+                door->direction = 1;
+
+                // villsa [STRIFE] opensound added
+                S_StartSound(&door->sector->soundorg, door->opensound);
+                break;
+
+            default:
+                break;
+            }
+        }
+        break;
+
+    case 2:
+        //  INITIAL WAIT
+        if (!--door->topcountdown)
+        {
+            switch(door->type)
+            {
+            case raiseIn5Mins:
+                door->direction = 1;
+                door->type = normal;
+
+                // villsa [STRIFE] opensound added
+                S_StartSound(&door->sector->soundorg, door->opensound);
+                break;
+
+            default:
+                break;
+            }
+        }
+        break;
+
+        // villsa [STRIFE]
+    case -2:
+        // SPLIT
+        res1 = T_MovePlane(door->sector, door->speed, door->topheight, 0, 1, 1);
+        res2 = T_MovePlane(door->sector, door->speed, door->topwait, 0, 0, -1);
+
+        if(res1 == pastdest && res2 == pastdest)
+        {
+            door->sector->specialdata = NULL;
+            P_RemoveThinker(&door->thinker);  // unlink and free
+        }
+
+        break;
+
+    case -1:
+        // DOWN
+        res1 = T_MovePlane(door->sector, door->speed, door->sector->floorheight, false, 1, door->direction);
+        if(res1 == pastdest)
+        {
+            switch(door->type)
+            {
+            case normal:
+            case close:
+            case blazeRaise:
+            case blazeClose:
+                door->sector->specialdata = NULL;
+                P_RemoveThinker (&door->thinker);  // unlink and free
+                // villsa [STRIFE] no sounds
+                break;
+
+            case close30ThenOpen:
+                door->direction = 0;
+                door->topcountdown = TICRATE*30;
+                break;
+
+                // villsa [STRIFE]
+            case shopClose:
+                door->direction = 0;
+                door->topcountdown = TICRATE*120;
+                break;
+
+            default:
+                break;
+            }
+        }
+        else if(res1 == crushed)
+        {
+            switch(door->type)
+            {
+            case blazeClose:
+            case close:		// DO NOT GO BACK UP!
+            case shopClose:     // villsa [STRIFE]
+                break;
+
+            default:
+                door->direction = 1;
+                // villsa [STRIFE] opensound added
+                S_StartSound(&door->sector->soundorg, door->opensound);
+                break;
+            }
+        }
+        break;
+
+    case 1:
+        // UP
+        res1 = T_MovePlane(door->sector,
+            door->speed,
+            door->topheight,
+            false,1,door->direction);
+
+        if(res1 == pastdest)
+        {
+            switch(door->type)
+            {
+            case blazeRaise:
+            case normal:
+                door->direction = 0; // wait at top
+                door->topcountdown = door->topwait;
+                break;
+
+            case close30ThenOpen:
+            case blazeOpen:
+            case open:
+            case shopClose:     // villsa [STRIFE]
+                door->sector->specialdata = NULL;
+                P_RemoveThinker (&door->thinker);  // unlink and free
+                break;
+
+            default:
+                break;
+            }
+        }
+        break;
     }
 }
 
@@ -243,101 +272,172 @@
 }
 
 
-int
-EV_DoDoor
-( line_t*	line,
-  vldoor_e	type )
+int EV_DoDoor(line_t* line, vldoor_e type)
 {
-    int		secnum,rtn;
-    sector_t*	sec;
-    vldoor_t*	door;
-	
+    int         secnum, rtn;
+    sector_t*   sec;
+    vldoor_t*   door;
+
     secnum = -1;
     rtn = 0;
-    
-    while ((secnum = P_FindSectorFromLineTag(line,secnum)) >= 0)
+
+    while((secnum = P_FindSectorFromLineTag(line,secnum)) >= 0)
     {
-	sec = &sectors[secnum];
-	if (sec->specialdata)
-	    continue;
-		
-	
-	// new door thinker
-	rtn = 1;
-	door = Z_Malloc (sizeof(*door), PU_LEVSPEC, 0);
-	P_AddThinker (&door->thinker);
-	sec->specialdata = door;
+        sec = &sectors[secnum];
+        if(sec->specialdata)
+            continue;
+
+
+        // new door thinker
+        rtn = 1;
+        door = Z_Malloc (sizeof(*door), PU_LEVSPEC, 0);
+        P_AddThinker (&door->thinker);
+        sec->specialdata = door;
+
+        door->thinker.function.acp1 = (actionf_p1)T_VerticalDoor;
+        door->sector = sec;
+        door->type = type;
+        door->topwait = VDOORWAIT;
+        door->speed = VDOORSPEED;
+        R_SoundNumForDoor(door);    // villsa [STRIFE] set door sounds
+
+        switch(type)
+        {
+            // villsa [STRIFE] new door type
+        case splitOpen:
+            door->direction = -2;
+            door->topheight = P_FindLowestCeilingSurrounding(sec);
+            door->topheight -= 4*FRACUNIT;
+            door->speed = FRACUNIT;
+            // yes, it using topwait to get the floor height
+            door->topwait = P_FindLowestFloorSurrounding(sec);
+            if(door->topheight == sec->ceilingheight)
+                continue;
 
-	door->thinker.function.acp1 = (actionf_p1) T_VerticalDoor;
-	door->sector = sec;
-	door->type = type;
-	door->topwait = VDOORWAIT;
-	door->speed = VDOORSPEED;
-		
-	switch(type)
-	{
-	  case blazeClose:
-	    door->topheight = P_FindLowestCeilingSurrounding(sec);
-	    door->topheight -= 4*FRACUNIT;
-	    door->direction = -1;
-	    door->speed = VDOORSPEED * 4;
-	    S_StartSound(&door->sector->soundorg, sfx_bdcls);
-	    break;
-	    
-	  case close:
-	    door->topheight = P_FindLowestCeilingSurrounding(sec);
-	    door->topheight -= 4*FRACUNIT;
-	    door->direction = -1;
-	    S_StartSound(&door->sector->soundorg, sfx_swish);   // villsa [STRIFE] TODO - fix sounds
-	    break;
-	    
-	  case close30ThenOpen:
-	    door->topheight = sec->ceilingheight;
-	    door->direction = -1;
-	    S_StartSound(&door->sector->soundorg, sfx_swish);   // villsa [STRIFE] TODO - fix sounds
-	    break;
-	    
-	  case blazeRaise:
-	  case blazeOpen:
-	    door->direction = 1;
-	    door->topheight = P_FindLowestCeilingSurrounding(sec);
-	    door->topheight -= 4*FRACUNIT;
-	    door->speed = VDOORSPEED * 4;
-	    if (door->topheight != sec->ceilingheight)
-		S_StartSound(&door->sector->soundorg, sfx_bdopn);
-	    break;
-	    
-	  case normal:
-	  case open:
-	    door->direction = 1;
-	    door->topheight = P_FindLowestCeilingSurrounding(sec);
-	    door->topheight -= 4*FRACUNIT;
-	    if (door->topheight != sec->ceilingheight)
-		S_StartSound(&door->sector->soundorg, sfx_swish);   // villsa [STRIFE] TODO - fix sounds
-	    break;
-	    
-	  default:
-	    break;
-	}
-		
+            S_StartSound(&sec->soundorg, door->opensound);
+            break;
+
+            // villsa [STRIFE] new door type
+        case splitRaiseNearest:
+            door->direction = -2;
+            door->topheight = P_FindLowestCeilingSurrounding(sec);
+            door->topheight -= 4*FRACUNIT;
+            door->speed = FRACUNIT;
+            // yes, it using topwait to get the floor height
+            door->topwait = P_FindHighestFloorSurrounding(sec);
+            if(door->topheight == sec->ceilingheight)
+                continue;
+
+            S_StartSound(&sec->soundorg, door->opensound);
+            break;
+
+        case blazeClose:
+        case shopClose:     // villsa [STRIFE]
+            door->topheight = P_FindLowestCeilingSurrounding(sec);
+            door->topheight -= 4*FRACUNIT;
+            door->direction = -1;
+            door->speed = VDOORSPEED * 4;
+            S_StartSound(&door->sector->soundorg, sfx_bdcls);
+            break;
+
+        case close:
+            door->topheight = P_FindLowestCeilingSurrounding(sec);
+            door->topheight -= 4*FRACUNIT;
+            door->direction = -1;
+
+            // villsa [STRIFE] set door sounds
+            S_StartSound(&door->sector->soundorg, door->opensound);
+            break;
+
+        case close30ThenOpen:
+            door->topheight = sec->ceilingheight;
+            door->direction = -1;
+
+            // villsa [STRIFE] set door sounds
+            S_StartSound(&door->sector->soundorg, door->closesound);
+            break;
+
+        case blazeRaise:
+        case blazeOpen:
+            door->direction = 1;
+            door->topheight = P_FindLowestCeilingSurrounding(sec);
+            door->topheight -= 4*FRACUNIT;
+            door->speed = VDOORSPEED * 4;
+            if (door->topheight != sec->ceilingheight)
+                S_StartSound(&door->sector->soundorg, sfx_bdopn);
+            break;
+
+        case normal:
+        case open:
+            door->direction = 1;
+            door->topheight = P_FindLowestCeilingSurrounding(sec);
+            door->topheight -= 4*FRACUNIT;
+
+            if(door->topheight != sec->ceilingheight)
+                S_StartSound(&door->sector->soundorg, door->opensound);
+            break;
+
+        default:
+            break;
+        }
+
     }
     return rtn;
 }
 
+//
+// EV_ClearForceFields
+//
+// villsa [STRIFE] new function
+//
+int EV_ClearForceFields(line_t* line)
+{
+    int         secnum;
+    int         rtn;
+    sector_t*   sec;
+    int         i;
+    line_t*     secline;
 
+    secnum = -1;
+    rtn = 0;
+
+    while((secnum = P_FindSectorFromLineTag(line,secnum)) >= 0)
+    {
+        sec = &sectors[secnum];
+        rtn = 1;
+
+        line->special = 0;
+
+        if(!sec->linecount)
+            return;
+
+        for(i = 0; i < sec->linecount; i++)
+        {
+            secline = sec->lines[i];
+            if(!(secline->flags & ML_TWOSIDED))
+                continue;
+            if(secline->special != 148)
+                continue;
+
+            secline->flags &= ~ML_BLOCKING;
+            secline->special = 0;
+            sides[secline->sidenum[0]].midtexture = 0;
+            sides[secline->sidenum[1]].midtexture = 0;
+        }
+    }
+}
+
+
 //
 // EV_VerticalDoor : open a door manually, no tag value
 //
-void
-EV_VerticalDoor
-( line_t*	line,
-  mobj_t*	thing )
+void EV_VerticalDoor(line_t* line, mobj_t* thing)
 {
-    player_t*	player;
-    int		secnum;
-    sector_t*	sec;
-    vldoor_t*	door;
-    int		side;
+    player_t*   player;
+    int         secnum;
+    sector_t*   sec;
+    vldoor_t*   door;
+    int         side;
 	
     side = 0;	// only front sides can be used
 
@@ -573,85 +673,85 @@
 {
     // SIGLDR
     {
-        { "SIGLDR01" },  // frame1
-        { "SIGLDR02" },  // frame2
-        { "SIGLDR03" },  // frame3
-        { "SIGLDR04" },  // frame4
-        { "SIGLDR05" },  // frame5
-        { "SIGLDR06" },  // frame6
-        { "SIGLDR07" },  // frame7
-        { "SIGLDR08" }   // frame8
+        "SIGLDR01",  // frame1
+        "SIGLDR02",  // frame2
+        "SIGLDR03",  // frame3
+        "SIGLDR04",  // frame4
+        "SIGLDR05",  // frame5
+        "SIGLDR06",  // frame6
+        "SIGLDR07",  // frame7
+        "SIGLDR08"   // frame8
     },
     // DORSTN
     {
-        { "DORSTN01" },  // frame1
-        { "DORSTN02" },  // frame2
-        { "DORSTN03" },  // frame3
-        { "DORSTN04" },  // frame4
-        { "DORSTN05" },  // frame5
-        { "DORSTN06" },  // frame6
-        { "DORSTN07" },  // frame7
-        { "DORSTN08" }   // frame8
+        "DORSTN01",  // frame1
+        "DORSTN02",  // frame2
+        "DORSTN03",  // frame3
+        "DORSTN04",  // frame4
+        "DORSTN05",  // frame5
+        "DORSTN06",  // frame6
+        "DORSTN07",  // frame7
+        "DORSTN08"   // frame8
     },
 
     // DORQTR
     {
-        { "DORQTR01" },  // frame1
-        { "DORQTR02" },  // frame2
-        { "DORQTR03" },  // frame3
-        { "DORQTR04" },  // frame4
-        { "DORQTR05" },  // frame5
-        { "DORQTR06" },  // frame6
-        { "DORQTR07" },  // frame7
-        { "DORQTR08" }   // frame8
+        "DORQTR01",  // frame1
+        "DORQTR02",  // frame2
+        "DORQTR03",  // frame3
+        "DORQTR04",  // frame4
+        "DORQTR05",  // frame5
+        "DORQTR06",  // frame6
+        "DORQTR07",  // frame7
+        "DORQTR08"   // frame8
     },
 
     // DORCRG
     {
-        { "DORCRG01" },  // frame1
-        { "DORCRG02" },  // frame2
-        { "DORCRG03" },  // frame3
-        { "DORCRG04" },  // frame4
-        { "DORCRG05" },  // frame5
-        { "DORCRG06" },  // frame6
-        { "DORCRG07" },  // frame7
-        { "DORCRG08" }   // frame8
+        "DORCRG01",  // frame1
+        "DORCRG02",  // frame2
+        "DORCRG03",  // frame3
+        "DORCRG04",  // frame4
+        "DORCRG05",  // frame5
+        "DORCRG06",  // frame6
+        "DORCRG07",  // frame7
+        "DORCRG08"   // frame8
     },
 
     // DORCHN
     {
-        { "DORCHN01" },  // frame1
-        { "DORCHN02" },  // frame2
-        { "DORCHN03" },  // frame3
-        { "DORCHN04" },  // frame4
-        { "DORCHN05" },  // frame5
-        { "DORCHN06" },  // frame6
-        { "DORCHN07" },  // frame7
-        { "DORCHN08" }   // frame8
+        "DORCHN01",  // frame1
+        "DORCHN02",  // frame2
+        "DORCHN03",  // frame3
+        "DORCHN04",  // frame4
+        "DORCHN05",  // frame5
+        "DORCHN06",  // frame6
+        "DORCHN07",  // frame7
+        "DORCHN08"   // frame8
     },
 
     // DORIRS
     {
-        { "DORIRS01" },  // frame1
-        { "DORIRS02" },  // frame2
-        { "DORIRS03" },  // frame3
-        { "DORIRS04" },  // frame4
-        { "DORIRS05" },  // frame5
-        { "DORIRS06" },  // frame6
-        { "DORIRS07" },  // frame7
-        { "DORIRS08" }   // frame8
+        "DORIRS01",  // frame1
+        "DORIRS02",  // frame2
+        "DORIRS03",  // frame3
+        "DORIRS04",  // frame4
+        "DORIRS05",  // frame5
+        "DORIRS06",  // frame6
+        "DORIRS07",  // frame7
+        "DORIRS08"   // frame8
     },
 
     // DORALN
     {
-        { "DORALN01" },  // frame1
-        { "DORALN02" },  // frame2
-        { "DORALN03" },  // frame3
-        { "DORALN04" },  // frame4
-        { "DORALN05" },  // frame5
-        { "DORALN06" },  // frame6
-        { "DORALN07" },  // frame7
-        { "DORALN08" }   // frame8
+        "DORALN01",  // frame1
+        "DORALN02",  // frame2
+        "DORALN03",  // frame3
+        "DORALN04",  // frame4
+        "DORALN05",  // frame5
+        "DORALN06",  // frame6
+        "DORALN07",  // frame7
+        "DORALN08"   // frame8
     },
 
     {"\0","\0","\0","\0","\0","\0","\0","\0"}
--- a/src/strife/p_enemy.c
+++ b/src/strife/p_enemy.c
@@ -2342,7 +2342,7 @@
     line_t junk;
 
     junk.tag = 999;
-    //EV_DoDoor(&junk, 8);  // villsa [STRIFE] TODO - identify vldoor_e enum
+    EV_DoDoor(&junk, shopClose);
 
     if(actor->target && actor->target->player)
         P_NoiseAlert(actor->target, actor); // inlined in asm
--- a/src/strife/p_spec.c
+++ b/src/strife/p_spec.c
@@ -757,12 +757,12 @@
 	line->special = 0;
 	break;
 
-      case 40:
+      /*case 40:
 	// RaiseCeilingLowerFloor
 	EV_DoCeiling( line, raiseToHighest );
 	EV_DoFloor( line, lowerFloorToLowest );
 	line->special = 0;
-	break;
+	break;*/
 	
       case 44:
 	// Ceiling Crush
@@ -1042,6 +1042,18 @@
 	// Raise Floor Turbo
 	EV_DoFloor(line,raiseFloorTurbo);
 	break;
+
+      case 174:
+          // villsa [STRIFE] Split Open
+        EV_DoDoor(line, splitOpen);
+        line->special = 0;
+        break;
+
+      case 183:
+        // villsa [STRIFE] Split Raise Nearest
+        EV_DoDoor(line, splitRaiseNearest);
+        line->special = 0;
+        break;
     }
 }
 
--- a/src/strife/p_spec.h
+++ b/src/strife/p_spec.h
@@ -132,9 +132,9 @@
 // SPECIAL
 //
 int EV_DoDonut(line_t* line);
+int EV_ClearForceFields(line_t* line);  // villsa [STRIFE]
 
 
-
 //
 // P_LIGHTS
 //
@@ -352,7 +352,10 @@
     raiseIn5Mins,
     blazeRaise,
     blazeOpen,
-    blazeClose
+    blazeClose,
+    shopClose,          // villsa [STRIFE]
+    splitRaiseNearest,  // villsa [STRIFE]
+    splitOpen           // villsa [STRIFE]
 
 } vldoor_e;
 
--- a/src/strife/p_switch.c
+++ b/src/strife/p_switch.c
@@ -571,6 +571,11 @@
 	if (EV_DoDoor(line,normal))
 	    P_ChangeSwitchTexture(line,0);
 	break;
+
+      case 40:
+      // villsa [STRIFE] Split Open Door
+        if(EV_DoDoor(line, splitOpen))
+            P_ChangeSwitchTexture(line, 0);
 	
       case 41:
 	// Lower Ceiling to Floor