Descent3/editor/selectedroom.cpp
2024-06-15 20:12:48 +02:00

214 lines
5.7 KiB
C++

/*
* Descent 3
* Copyright (C) 2024 Parallax Software
*
* 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 3 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.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
--- HISTORICAL COMMENTS FOLLOW ---
* $Logfile: /DescentIII/Main/editor/selectedroom.cpp $
* $Revision: 1.1.1.1 $
* $Date: 2003-08-26 03:57:39 $
* $Author: kevinb $
*
* Functions for dealing with selected list
*
* $Log: not supported by cvs2svn $
*
* 10 4/16/99 5:18p Matt
* Don't free selected list memory if none was allocated.
*
* 9 4/11/99 2:41a Jeff
* had to include stdafx.h for neweditor
*
* 8 4/07/99 7:07p Gwar
* added #define NEWEDITOR checks
*
* 7 1/21/99 11:15p Jeff
* pulled out some structs and defines from header files and moved them
* into seperate header files so that multiplayer dlls don't require major
* game headers, just those new headers. Side effect is a shorter build
* time. Also cleaned up some header file #includes that weren't needed.
* This affected polymodel.h, object.h, player.h, vecmat.h, room.h,
* manage.h and multi.h
*
* 6 10/08/98 4:24p Kevin
* Changed code to comply with memory library usage. Always use mem_malloc
* , mem_free and mem_strdup
*
* 5 12/23/97 1:33p Samir
* Added pserror.h
*
* 4 9/04/97 4:39p Matt
* Added includes needed as a result of removing includes from d3edit.h
*
* 3 8/29/97 5:26p Matt
* Fixed name of ClearRoomSelectedList()
*
* 2 7/31/97 3:31p Jason
* added functions to rotate portal rooms
*
* 1 7/31/97 10:35a Jason
*
* $NoKeywords: $
*/
#include "selectedroom.h"
#ifdef NEWEDITOR
#include "../neweditor/stdafx.h"
#include "../neweditor/globals.h"
#else
#include "d3edit.h"
#endif
#include "room.h"
#include "pserror.h"
#include "mem.h"
// Returns true if a room is in the selected list
int IsRoomSelected(int roomnum) {
int i;
for (i = 0; i < N_selected_rooms; i++)
if (Selected_rooms[i] == roomnum)
return 1;
return 0;
}
// Adds a room to the selected list, if it's not already there
void AddRoomToSelectedList(int roomnum) {
if (!IsRoomSelected(roomnum)) {
Selected_rooms[N_selected_rooms++] = roomnum;
State_changed = 1;
}
}
// Removes a room from the selected list, if it's there
void RemoveRoomFromSelectedList(int roomnum) {
int i;
for (i = 0; i < N_selected_rooms; i++)
if (Selected_rooms[i] == roomnum) {
int j;
for (j = i; j < N_selected_rooms - 1; j++)
Selected_rooms[j] = Selected_rooms[j + 1];
N_selected_rooms--;
State_changed = 1;
return;
}
}
// Empties the selected list
void ClearRoomSelectedList() {
N_selected_rooms = 0;
State_changed = 1;
}
// Adds to selected list if not already in there, else removes from list
// Returns: 1 if room was selected, 0 if un-selected
int ToggleRoomSelectedState(int roomnum) {
int i;
State_changed = 1;
for (i = 0; i < N_selected_rooms; i++)
if (Selected_rooms[i] == roomnum) {
int j;
for (j = i; j < N_selected_rooms - 1; j++)
Selected_rooms[j] = Selected_rooms[j + 1];
N_selected_rooms--;
return 0; // room was un-selected
}
// not found, so add to list
Selected_rooms[N_selected_rooms++] = roomnum;
return 1; // room was selected
}
// Add all the connected room to the selected list
// Parameters: room - the starting room
// Returns: the number of rooms added to the list
int SelectConnectedRooms(int roomnum) {
int count;
int s;
if (IsRoomSelected(roomnum)) // this room already selected?
return 0;
// Add this rooom to selected list
Selected_rooms[N_selected_rooms++] = roomnum;
count = 1;
State_changed = 1;
// Now add this room's children
for (s = 0; s < Rooms[roomnum].num_portals; s++) {
if (Rooms[roomnum].portals[s].croom != -1)
count += SelectConnectedRooms(Rooms[roomnum].portals[s].croom);
}
return count;
}
static int *Save_selected_rooms;
static int N_save_selected_rooms = -1; //-1 means empty list
// Save the (user's) selected list so that an internal function can use it
// You must call RestoreSelectedList() when you're done with the selected list
void SaveRoomSelectedList() {
int i;
if (N_save_selected_rooms != -1) { // already have saved list?
Int3(); //..yes, error
return;
}
N_save_selected_rooms = N_selected_rooms;
if (!N_save_selected_rooms) // are there any rooms in the list?
return; //..no, so don't bother to save them
Save_selected_rooms = (int *)mem_malloc(N_save_selected_rooms * sizeof(*Save_selected_rooms));
ASSERT(Save_selected_rooms != NULL);
for (i = 0; i < N_selected_rooms; i++)
Save_selected_rooms[i] = Selected_rooms[i];
}
// Restore a previously-saved selected list. You must have previously called SaveSelectedList()
void RestoreRoomSelectedList() {
int i;
if (N_save_selected_rooms == -1) { // no save list?
Int3(); //..then generate error
return;
}
N_selected_rooms = N_save_selected_rooms;
N_save_selected_rooms = -1; // say no saved list
if (!N_selected_rooms) // are there any rooms in the list?
return; //..no, so don't restore them
for (i = 0; i < N_selected_rooms; i++)
Selected_rooms[i] = Save_selected_rooms[i];
mem_free(Save_selected_rooms); // free up memory
}