shithub: choc

ref: 3c61049f58009f3bc2c78a84285a5e1919ca5cf2
dir: /src/hexen/p_switch.c/

View raw version
//
// Copyright(C) 1993-1996 Id Software, Inc.
// Copyright(C) 1993-2008 Raven Software
// Copyright(C) 2005-2014 Simon Howard
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License
// as published by the Free Software Foundation; either version 2
// of the License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
//


#include "h2def.h"
#include "i_system.h"
#include "p_local.h"
#include "s_sound.h"

//==================================================================
//
//      CHANGE THE TEXTURE OF A WALL SWITCH TO ITS OPPOSITE
//
//==================================================================
switchlist_t alphSwitchListDemo[] = {
    {"SW_1_UP", "SW_1_DN", SFX_SWITCH1},
    {"SW_2_UP", "SW_2_DN", SFX_SWITCH1},
    {"SW52_OFF", "SW52_ON", SFX_SWITCH2},
    {"\0", "\0", 0}
};

switchlist_t alphSwitchListFull[] = {
    {"SW_1_UP", "SW_1_DN", SFX_SWITCH1},
    {"SW_2_UP", "SW_2_DN", SFX_SWITCH1},
    {"VALVE1", "VALVE2", SFX_VALVE_TURN},
    {"SW51_OFF", "SW51_ON", SFX_SWITCH2},
    {"SW52_OFF", "SW52_ON", SFX_SWITCH2},
    {"SW53_UP", "SW53_DN", SFX_ROPE_PULL},
    {"PUZZLE5", "PUZZLE9", SFX_SWITCH1},
    {"PUZZLE6", "PUZZLE10", SFX_SWITCH1},
    {"PUZZLE7", "PUZZLE11", SFX_SWITCH1},
    {"PUZZLE8", "PUZZLE12", SFX_SWITCH1},
    {"\0", "\0", 0}
};

switchlist_t *alphSwitchList = NULL;

int switchlist[MAXSWITCHES * 2];
int numswitches;
button_t buttonlist[MAXBUTTONS];

/*
===============
=
= P_InitSwitchList
=
= Only called at game initialization
=
===============
*/

void P_InitSwitchList(void)
{
    int i;
    int index;

    if (!alphSwitchList)
    {
        if (gamemode == shareware)
        {
            alphSwitchList = alphSwitchListDemo;
        }
        else
        {
            alphSwitchList = alphSwitchListFull;
        }
    }

    for (index = 0, i = 0; i < MAXSWITCHES; i++)
    {
        if (!alphSwitchList[i].soundID)
        {
            numswitches = index / 2;
            switchlist[index] = -1;
            break;
        }
        switchlist[index++] = R_TextureNumForName(alphSwitchList[i].name1);
        switchlist[index++] = R_TextureNumForName(alphSwitchList[i].name2);
    }
}

//==================================================================
//
//      Start a button counting down till it turns off.
//
//==================================================================
void P_StartButton(line_t * line, bwhere_e w, int texture, int time)
{
    int i;

    for (i = 0; i < MAXBUTTONS; i++)
    {
        if (!buttonlist[i].btimer)
        {
            buttonlist[i].line = line;
            buttonlist[i].where = w;
            buttonlist[i].btexture = texture;
            buttonlist[i].btimer = time;
            buttonlist[i].soundorg = (mobj_t *) & line->frontsector->soundorg;
            return;
        }
    }
    I_Error("P_StartButton: no button slots left!");
}

//==================================================================
//
//      Function that changes wall texture.
//      Tell it if switch is ok to use again (1=yes, it's a button).
//
//==================================================================
void P_ChangeSwitchTexture(line_t * line, int useAgain)
{
    int texTop;
    int texMid;
    int texBot;
    int i;

    texTop = sides[line->sidenum[0]].toptexture;
    texMid = sides[line->sidenum[0]].midtexture;
    texBot = sides[line->sidenum[0]].bottomtexture;

    for (i = 0; i < numswitches * 2; i++)
    {
        if (switchlist[i] == texTop)
        {
            S_StartSound((mobj_t *) & line->frontsector->soundorg,
                         alphSwitchList[i / 2].soundID);
            sides[line->sidenum[0]].toptexture = switchlist[i ^ 1];
            if (useAgain)
            {
                P_StartButton(line, SWTCH_TOP, switchlist[i], BUTTONTIME);
            }
            return;
        }
        else if (switchlist[i] == texMid)
        {
            S_StartSound((mobj_t *) & line->frontsector->soundorg,
                         alphSwitchList[i / 2].soundID);
            sides[line->sidenum[0]].midtexture = switchlist[i ^ 1];
            if (useAgain)
            {
                P_StartButton(line, SWTCH_MIDDLE, switchlist[i], BUTTONTIME);
            }
            return;
        }
        else if (switchlist[i] == texBot)
        {
            S_StartSound((mobj_t *) & line->frontsector->soundorg,
                         alphSwitchList[i / 2].soundID);
            sides[line->sidenum[0]].bottomtexture = switchlist[i ^ 1];
            if (useAgain)
            {
                P_StartButton(line, SWTCH_BOTTOM, switchlist[i], BUTTONTIME);
            }
            return;
        }
    }
}