15 #include "CampaignTreeView.h"
16 #include "CampaignEditorDlg.h"
17 #include "CampaignTreeWnd.h"
22 static char THIS_FILE[] = __FILE__;
70 #define LEVEL_HEIGHT 75
71 #define CELL_WIDTH 150
72 #define CELL_TEXT_WIDTH 130
76 if (CScrollView::OnCreate(lpCreateStruct) == -1)
89 CPen black_pen, white_pen, red_pen, blue_pen, green_pen;
94 pDC->SetTextAlign(TA_TOP | TA_CENTER);
95 pDC->SetTextColor(RGB(0, 0, 0));
96 pDC->SetBkMode(TRANSPARENT);
99 r = pDC->GetTextMetrics(&tm);
102 By = tm.tmHeight + 4;
104 r = gray_brush.CreateSolidBrush(RGB(192, 192, 192));
109 r = black_pen.CreatePen(PS_SOLID, 1, RGB(0, 0, 0));
111 r = white_pen.CreatePen(PS_SOLID, 1, RGB(255, 255, 255));
113 r = red_pen.CreatePen(PS_SOLID, 1, RGB(192, 0, 0));
115 r = blue_pen.CreatePen(PS_SOLID, 1, RGB(0, 0, 192));
117 r = green_pen.CreatePen(PS_SOLID, 1, RGB(0, 192, 0));
120 pDC->SelectObject(&black_pen);
123 pDC->MoveTo(0, i * LEVEL_HEIGHT - 1);
124 pDC->LineTo(
total_width * CELL_WIDTH, i * LEVEL_HEIGHT - 1);
127 pDC->SelectObject(&white_pen);
129 pDC->MoveTo(0, i * LEVEL_HEIGHT);
130 pDC->LineTo(
total_width * CELL_WIDTH, i * LEVEL_HEIGHT);
135 pDC->SelectObject(&black_pen);
136 pDC->MoveTo(0, total_levels * LEVEL_HEIGHT);
137 pDC->LineTo(
total_width * CELL_WIDTH, total_levels * LEVEL_HEIGHT);
145 Elements[
i].
box.left = x -
Bx / 2;
146 Elements[
i].
box.right = Elements[
i].
box.left +
Bx;
147 Elements[
i].
box.top = y -
By / 2;
148 Elements[
i].
box.bottom = Elements[
i].
box.top +
By;
151 str[strlen(str) - 4] = 0;
152 GetTextExtentPoint32(pDC->m_hDC, str, strlen(str), &size);
154 strcpy(str + strlen(str) - 1,
"...");
155 GetTextExtentPoint32(pDC->m_hDC, str, strlen(str), &size);
157 strcpy(str + strlen(str) - 4,
"...");
158 GetTextExtentPoint32(pDC->m_hDC, str, strlen(str), &size);
163 pDC->SetTextColor(RGB(192, 0, 0));
164 pDC->Draw3dRect(x -
Bx / 2, y -
By / 2,
Bx,
By, RGB(0, 0, 0), RGB(255, 255, 255));
167 pDC->SetTextColor(RGB(0, 0, 0));
168 pDC->Draw3dRect(x -
Bx / 2, y -
By / 2,
Bx,
By, RGB(255, 255, 255), RGB(0, 0, 0));
171 pDC->TextOut(x, y -
By / 2 + 2, str, strlen(str));
182 Links[
i].
p1.y = Elements[
f].
box.bottom;
184 Links[
i].
p2.y = Elements[
t].
box.top;
187 if (Links[i].is_mission_loop || Links[i].is_mission_fork) {
188 pDC->SelectObject(&blue_pen);
193 if (Links[i].is_mission_loop || Links[i].is_mission_fork) {
194 pDC->SelectObject(&green_pen);
196 pDC->SelectObject(&red_pen);
202 if ( (f != t) && ( t != -1) ) {
203 pDC->MoveTo(Links[i].
p1);
204 pDC->LineTo(Links[i].p2);
208 pDC->SelectObject(&black_pen);
211 pDC->SelectObject(&black_pen);
218 void campaign_tree_view::AssertValid()
const
220 CScrollView::AssertValid();
223 void campaign_tree_view::Dump(CDumpContext& dc)
const
225 CScrollView::Dump(dc);
234 CScrollView::OnInitialUpdate();
235 SetScrollSizes(MM_TEXT, CSize(320, 320));
240 int j, node, node2, node3;
249 Links[*link_idx].
from = mission_num;
250 Links[*link_idx].
sexp =
CAR(node2);
264 Links[(*link_idx)++].
to = j;
269 }
else if ( !
stricmp(
CTEXT(node3),
"end-of-campaign") ) {
270 Links[(*link_idx)++].
to = -1;
376 if (Links[j].to == z) {
406 int i, j, k,
z, to_count, from_count, swap;
412 to_count = from_count = 0;
414 if ((Links[j].to == i) && (Links[j].from == i))
416 if (Links[j].to == i)
417 to_list[to_count++] = j;
418 if (Links[j].from == i)
419 from_list[from_count++] = j;
423 for (j=0; j<to_count-1; j++)
424 for (k=j+1; k<to_count; k++) {
449 to_list[j] = to_list[k];
455 for (j=0; j<to_count; j++)
456 Links[to_list[j]].to_pos = j + 1;
459 for (j=0; j<from_count-1; j++)
460 for (k=j+1; k<from_count; k++) {
484 from_list[j] = from_list[k];
490 for (j=0; j<from_count; j++)
491 Links[from_list[j]].from_pos = j + 1;
505 if (nFlags & MK_CONTROL) {
507 i = listbox->GetCurSel();
526 if (strlen(buffer)) {
539 if (strlen(buffer)) {
552 if (strlen(buffer)) {
563 if (Elements[i].box.PtInRect(point)) {
577 box->SetWindowText(str);
595 CScrollView::OnLButtonDown(nFlags, point);
608 if (GetCapture() !=
this) {
616 if (Elements[i].box.PtInRect(point))
620 draw_size = CSize(4, 4);
621 rect = Elements[
i].
box;
626 if ((level < 0) || (pos < 0)) {
627 draw_size = CSize(0, 0);
631 draw_size = CSize(2, 2);
640 rect.SetRect(x, y, x +
Bx, y +
By);
653 CScrollView::OnMouseMove(nFlags, point);
666 if (GetCapture() ==
this) {
678 if (GetCapture() ==
this) {
683 if (Elements[i].box.PtInRect(point)) {
688 if ((Links[j].from == z) && (Links[j].
to ==
i))
692 MessageBox(
"Too many links exist. Can't add any more.");
697 MessageBox(
"A branch can only be set to a mission on a lower level");
708 if ((level < 0) || (pos < 0))
712 MessageBox(
"Can't move mission to this level. There is already a top level mission");
723 if (Links[i].to == z)
725 MessageBox(
"Can't move mission to that level, as it would be\n"
726 "above a parent mission",
"Error");
742 CScrollView::OnLButtonUp(nFlags, point);
1003 Assert((level >= 0) && (pos >= 0));
1006 item = listbox->GetCurSel();
1007 if (item == LB_ERR) {
1008 MessageBox(
"Select a mission from listbox to add.",
"Error");
1021 listbox->GetText(item, name);
1024 MessageBox(
"Too many missions. Can't add more to Campaign.",
"Error");
1029 MessageBox(
"Only 1 mission may be in the top level");
1040 sprintf(buf,
"Mission \"%s\" is not a multiplayer mission", name);
1060 cm->
name = strdup(name);
1084 listbox->DeleteString(item);
1099 for (j=i-1; j>=0; j--) {
1122 if (Links[i].from == num) {
1153 if (!z || (z == -1)) {
1159 if (!z || (z == 1)) {
1171 if (Links[num].from != Links[num].to) {
1179 Links[
num] = Links[num + 1];
1213 if (Elements[i].box.PtInRect(p))
1219 popup = menu.GetSubMenu(0);
1221 popup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y,
this);
1228 popup = menu.GetSubMenu(0);
1230 popup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y,
this);
1260 if ((Links[i].from == m) || (Links[i].to == m))
1262 if (Links[i].from == z)
1264 if (Links[i].to == z)
1268 Elements[
m] = Elements[
z];
1274 box->SetWindowText(
"");
1334 MessageBox(
"Too many links exist. Can't add any more.");
1342 MessageBox(
"Too many links exist. Cannot add any more.");
#define CAMPAIGN_TYPE_SINGLE
campaign_tree_element Elements[MAX_CAMPAIGN_MISSIONS]
LOCAL CRect Dragging_rect
void delete_link(int num)
afx_msg void OnRemoveMission()
int add_link(int from, int to)
void correct_position(int num)
afx_msg void OnDeleteRow()
int query_alternate_pos(const CPoint &p)
int free_one_sexp(int num)
campaign_editor * Campaign_tree_formp
char * mission_branch_desc
afx_msg void OnLButtonDown(UINT nFlags, CPoint point)
LOCAL int Mission_dropping
#define IDC_LOOP_BRIEF_SOUND
void initialize(int init_files=1)
char briefing_cutscene[NAME_LENGTH]
#define MISSION_TYPE_MULTI
virtual void OnInitialUpdate()
char * mission_branch_brief_anim
#define IDC_MISSISON_LOOP_DESC
GLenum GLuint GLenum GLsizei const GLchar * buf
int query_level(const CPoint &p)
afx_msg void OnContextMenu(CWnd *pWnd, CPoint point)
int Sorted[MAX_CAMPAIGN_MISSIONS]
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct)
campaign_tree_view * Campaign_tree_viewp
void mission_selected(int num)
void sexp_mark_persistent(int n)
void convert_multiline_string(CString &dest, const SCP_string &src)
GLdouble GLdouble GLdouble r
sprintf(buf,"(%f,%f,%f)", v3->xyz.x, v3->xyz.y, v3->xyz.z)
void sexp_unmark_persistent(int n)
#define IDR_CPGN_VIEW_OFF
int Level_counts[MAX_LEVELS]
virtual void OnDraw(CDC *pDC)
#define MISSION_DESC_LENGTH
char * mission_branch_brief_anim
GLint GLint GLint GLint GLint x
int get_mission_info(const char *filename, mission *mission_p, bool basic)
char * mission_branch_brief_sound
#define IDC_LOOP_BRIEF_ANIM
#define CMISSION_FLAG_HAS_FORK
#define ID_END_OF_CAMPAIGN
GLuint const GLchar * name
LOCAL int Context_mission
char * mission_branch_brief_sound
LOCAL CSize Last_draw_size
char * mission_branch_txt
#define MB_ICONEXCLAMATION
void remove_mission(int m)
void read_mission_goal_list(int num)
int MessageBox(HWND h, const char *s1, const char *s2, int i)
#define ID_REMOVE_MISSION
afx_msg void OnInsertRow()
campaign_filelist_box m_filelist
LOCAL int Mission_dragging
afx_msg void OnAddRepeat()
#define MAX_CAMPAIGN_MISSIONS
virtual ~campaign_tree_view()
afx_msg void OnEndOfCampaign()
afx_msg void OnLButtonUp(UINT nFlags, CPoint point)
void horizontally_align_mission(int num, int dir)
void drop_mission(int m, CPoint point)
#define CMISSION_FLAG_HAS_LOOP
#define MAX_CAMPAIGN_TREE_LINKS
cmission missions[MAX_CAMPAIGN_MISSIONS]
void stuff_link_with_formula(int *link_idx, int formula, int mission_num)
afx_msg void OnMouseMove(UINT nFlags, CPoint point)
void load_tree(int save=1)
campaign_tree_link Links[MAX_CAMPAIGN_TREE_LINKS]
int query_pos(const CPoint &p)