1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166
|
/*
* 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 ---
ObjectClipboard.cpp
This file contains the cut,copy,paste, and delete routines used when you right click in the view
*/
#include "stdafx.h"
#include "TextureGrWnd.h"
#include "editor.h"
#include "render.h"
#include "manage.h"
#include "gr.h"
#include "gameloop.h"
#include "descent.h"
#include "terrain.h"
#include "HTexture.h"
#include "terraindialog.h"
#include "room.h"
#include <string.h>
#include <assert.h>
#include "mono.h"
#include "3d.h"
#include "gr.h"
#include "gamepath.h"
#include "ObjectClipboard.h"
#include "HObject.h"
object ClipBoardObject;
bool ObjectInBuffer;
// Returns the number if OBJ_PLAYER in the Objects list
int GetNumberPlayerObjs() {
int count;
int i;
count = 0;
for (i = 0; i <= Highest_object_index; i++) {
if (Objects[i].type == OBJ_PLAYER)
count++;
}
mprintf(0, "GetNumberPlayerObjs returns %d\n", count);
return count;
}
// Makes a copy of the current object to the clipboard object, then deletes this object
// Returns true on success
bool ObjectCut() {
mprintf(0, "ObjectCut()\n");
if (Cur_object_index != -1) {
int objnum = Cur_object_index;
int num_player_objects = GetNumberPlayerObjs();
if ((num_player_objects == 1) && Objects[objnum].type == OBJ_PLAYER) {
mprintf(0, "Oops, Can't delete the only player...sorry\n");
return false;
}
mprintf(0, "Attempting to cut object #%d into buffer...", objnum);
memcpy(&ClipBoardObject, &Objects[objnum], sizeof(object));
mprintf(0, "Done!\n");
ObjectInBuffer = true;
HObjectDelete();
return true;
}
return false;
}
// Makes a copy of the current object to the clipboard object
// Returns true on success
bool ObjectCopy() {
mprintf(0, "ObjectCopy()\n");
if (Cur_object_index != -1) {
int objnum = Cur_object_index;
mprintf(0, "Attempting to copy object #%d into buffer...", objnum);
memcpy(&ClipBoardObject, &Objects[objnum], sizeof(object));
mprintf(0, "Done!\n");
ObjectInBuffer = true;
return true;
}
return false;
}
// Just deletes the current object
// Returns true on success
bool ObjectDelete() {
mprintf(0, "ObjectDelete()\n");
if (Cur_object_index != -1) {
int objnum = Cur_object_index;
int num_player_objects = GetNumberPlayerObjs();
if ((num_player_objects == 1) && Objects[objnum].type == OBJ_PLAYER) {
mprintf(0, "Oops, Can't delete the only player...sorry\n");
return false;
}
HObjectDelete();
return true;
}
return false;
}
// Pastes the object in the Clipboard to the middle of the current segment
// Returns true on success
bool ObjectPaste() {
mprintf(0, "ObjectPaste()\n");
Int3(); // I'm not so sure about this routine -- by copying everything over, it may copy
// some data it shouldn't, such as script info.
if (!ObjectInBuffer)
return false;
int16_t next, prev;
int roomnum;
vector pos;
matrix orient;
vector last_pos;
float creation_time;
int handle;
if (!HObjectPlace(ClipBoardObject.type, ClipBoardObject.id)) {
return false;
}
mprintf(0, "Saving data...\n");
handle = Objects[Cur_object_index].handle;
next = Objects[Cur_object_index].next;
prev = Objects[Cur_object_index].prev;
roomnum = Objects[Cur_object_index].roomnum;
pos = Objects[Cur_object_index].pos;
orient = Objects[Cur_object_index].orient;
last_pos = Objects[Cur_object_index].last_pos;
creation_time = Objects[Cur_object_index].creation_time;
mprintf(0, "Overwriting with buffer data\n");
memcpy(&Objects[Cur_object_index], &ClipBoardObject, sizeof(object));
mprintf(0, "Restoring data...\n");
Objects[Cur_object_index].handle = handle;
Objects[Cur_object_index].next = next;
Objects[Cur_object_index].prev = prev;
Objects[Cur_object_index].roomnum = roomnum;
Objects[Cur_object_index].pos = pos;
ObjSetOrient(&Objects[Cur_object_index], &orient);
Objects[Cur_object_index].last_pos = last_pos;
Objects[Cur_object_index].creation_time = creation_time;
return true;
}
|