⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 te_team_victory.cpp

📁 空战游戏flacon源码
💻 CPP
📖 第 1 页 / 共 4 页
字号:
			ent->GetName(buffer,40,TRUE);
		else
			ent->GetName(buffer,40,FALSE);
		}
	// Target
	btn=new C_Button;
	btn->Setup(TARGET_VC,C_TYPE_NORMAL,0,0);
	if(ent)
		btn->SetText(0,buffer);
	else
		btn->SetText(0,TXT_ASSIGN);
	btn->SetFlagBitOn(C_BIT_USELINE);
	btn->SetCallback(VCSetTargetCB);
	btn->SetUserNumber(1,HELP_PICK_VC_TARGET);
	if(vc->get_type() == vt_destroy)
		btn->SetUserNumber(10,1);
	vcntrl->SetTarget(btn);

	// Arguments (other than target)
	lbox=new C_ListBox;
	lbox->Setup(4,0,gMainHandler);
	lbox->SetWH(gVCTree->GetUserNumber(14),fh);
	lbox->SetBgFill(0,0,0,0);
	lbox->SetBgColor(11370561); // 
	lbox->SetDropDown (BID_DROPDOWN);
	lbox->SetCallback(VCArgsCB);
	lbox->SetOpenCallback(VCArgsOpenCB);
	lbox->SetFlagBitOff(C_BIT_ENABLED);
	lbox->SetFlagBitOn(gVCTree->GetFlags() & C_BIT_ENABLED);

	if(vc->get_type() == vt_intercept)
		lbox->SetRoot(intercept_lbox);
	else
		lbox->SetRoot(percent_lbox);
	vcntrl->SetArgs(lbox);
	switch(vc->get_type())
	{
		case vt_attrit:
		case vt_intercept:
		case vt_degrade:
			lbox->SetFlagBitOff(C_BIT_INVISIBLE);
			break;
		default:
			lbox->SetFlagBitOn(C_BIT_INVISIBLE);
			break;
	}
	lbox->SetValue(vc->get_tolerance());
	if(!ent)
		lbox->SetFlagBitOn(C_BIT_INVISIBLE);

	// Points
	ebox=new C_EditBox;
	ebox->Setup(5,C_TYPE_INTEGER);
	ebox->SetMaxLen(6);
	ebox->SetWH(gVCTree->GetUserNumber(15),fh);
	ebox->SetMinInteger(-99999);
	ebox->SetMaxInteger(99999);
	ebox->SetInteger(vc->get_points());
	ebox->SetBgColor(11370561); // 
	ebox->SetFlagBitOn(C_BIT_USEOUTLINE|C_BIT_RIGHT);
	ebox->SetCallback(VCSetPointsCB);
	vcntrl->SetPoints(ebox);

	vcntrl->SetNumberX(static_cast<short>(gVCTree->GetUserNumber(0)));
	vcntrl->SetTeamX(static_cast<short>(gVCTree->GetUserNumber(1)));
	vcntrl->SetActionX(static_cast<short>(gVCTree->GetUserNumber(2)));
	vcntrl->SetTargetX(static_cast<short>(gVCTree->GetUserNumber(3)));
	vcntrl->SetArgsX(static_cast<short>(gVCTree->GetUserNumber(4)));
	vcntrl->SetPointsX(static_cast<short>(gVCTree->GetUserNumber(5)));
	vcntrl->SetFont(gVCTree->GetFont());
	vcntrl->SetWH(ebox->GetX()+ebox->GetW(),fh+1);
	vcntrl->SetState(0);
	return(vcntrl);
}

int advance_team (int team, int state)
{
	int
		ok,
		test,
		loop;

	for (test = 1; test < NUM_COUNS; test ++)
	{
		state ++; if (state > 8) state = 1;

		ok = TRUE;

		for (loop = 1; loop < NUM_TEAMS; loop ++)
		{
			if
			(
				(loop != team) &&
				(TeamInfo[loop]) &&
				(TeamInfo[loop]->GetFlag () == state)
			)
			{
				ok = FALSE;
				break;
			}
		}

		if (ok)
		{
			return state;
		}
	}

	return FALSE;
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////

long VCFlagIDs[NUM_TEAMS][4]=
{
	{ COLOR_1, FLAG_1, TEAM_01, CURRENT_PTS_01 },
	{ COLOR_2, FLAG_2, TEAM_02, CURRENT_PTS_02 },
	{ COLOR_3, FLAG_3, TEAM_03, CURRENT_PTS_03 },
	{ COLOR_4, FLAG_4, TEAM_04, CURRENT_PTS_04 },
	{ COLOR_5, FLAG_5, TEAM_05, CURRENT_PTS_05 },
	{ COLOR_6, FLAG_6, TEAM_06, CURRENT_PTS_06 },
	{ COLOR_7, FLAG_7, TEAM_07, CURRENT_PTS_07 },
	{ COLOR_8, FLAG_8, TEAM_08, CURRENT_PTS_08 },
};

long GetCurrentVCScore(long teamno)
{
	victory_condition *vc;
	long value;

	value=0;
	vc=current_tactical_mission->get_first_unfiltered_victory_condition();
	while(vc)
	{
		if(vc->get_team() == teamno && vc->get_active())
			value+=vc->get_points();
		vc=current_tactical_mission->get_next_unfiltered_victory_condition();
	}
	return(value);
}

long GetPossibleVCScore(long teamno)
{
	victory_condition *vc;
	long value;

	value=0;
	vc=current_tactical_mission->get_first_unfiltered_victory_condition();
	while(vc)
	{
		if(vc->get_team() == teamno && vc->get_points() > 0)
			value+=vc->get_points();
		vc=current_tactical_mission->get_next_unfiltered_victory_condition();
	}
	return(value);
}

void UpdateVCScoring(long WinID,short mode)
{
	long sortindex[NUM_TEAMS],points[NUM_TEAMS];
	long i,j,line,tmp;
	C_Window *win;
	C_EditBox *ebox;
	C_Bitmap *bmp;
	C_Box *box;

	memset(sortindex,0,sizeof(sortindex));
	memset(points,0,sizeof(points));

	line=0;
	for(i=0;i<NUM_TEAMS;i++)
	{
		if(TeamInfo[i] && (TeamInfo[i]->flags & TEAM_ACTIVE))
		{
			sortindex[line]=i;
			if(!mode) // Show current score for this team
			{
				points[line]=GetCurrentVCScore(i);
			}
			else // Show possible score for this team
			{
				points[line]=GetPossibleVCScore(i);
			}
			line++;
		}
	}
	if(!mode)
	{
		for(i=1;i<line;i++)
		{
			for(j=0;j<i;j++)
			{
				if(points[sortindex[j]] > points[sortindex[i]])
				{
					tmp=sortindex[i];
					sortindex[i]=sortindex[j];
					sortindex[j]=tmp;
					tmp=points[i];
					points[i]=points[j];
					points[j]=tmp;
				}
			}
		}
	}

	win=gMainHandler->FindWindow (WinID);
	if(win)
	{
		ebox=(C_EditBox*)win->FindControl(PTS_REQ_VICTORY);
		if(ebox)
		{
			ebox->SetInteger(current_tactical_mission->get_points_required());
			ebox->Refresh();
		}
		for(i=0;i<line;i++)
		{
			if(TeamInfo[sortindex[i]])
			{
				box=(C_Box*)win->FindControl(VCFlagIDs[i][0]);
				if(box)
				{
					box->SetColor(TeamColorList[TeamInfo[sortindex[i]]->GetColor()]);
					box->Refresh();
				}
				bmp=(C_Bitmap*)win->FindControl(VCFlagIDs[i][1]);
				if(bmp)
				{
					bmp->SetImage(FlagImageID[TeamInfo[sortindex[i]]->GetFlag()][BIG_HORIZ]);
					bmp->Refresh();
				}
				ebox=(C_EditBox*)win->FindControl(VCFlagIDs[i][2]);
				if(ebox)
				{
					ebox->SetText(TeamInfo[sortindex[i]]->GetName());
					ebox->Refresh();
				}
				ebox=(C_EditBox*)win->FindControl(VCFlagIDs[i][3]);
				if(ebox)
				{
					ebox->SetInteger(points[i]);
					ebox->Refresh();
				}

				win->UnHideCluster (i+1);
			}
		}
		while (i <= NUM_TEAMS)
		{
			win->HideCluster (i+1);

			i ++;
		}
	}
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////

void update_team_victory_window (void)
{
	if(gMainHandler)
	{
		if(TheCampaign.Flags & CAMP_TACTICAL_EDIT)
			UpdateVCScoring(TAC_VC_WIN,1);
		else
			UpdateVCScoring(TAC_VC_WIN,0);
	}
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////

static void evaluate_filter (void)
{
	victory_condition_filter
		vcf;
#if 0
	if (show_team_button->GetState ())
	{
		if (show_achieved_button->GetState ())
		{
			vcf = vcf_team_achieved;
		}
		else if (show_remaining_button->GetState ())
		{
			vcf = vcf_team_remaining;
		}
		else
		{
			vcf = vcf_team;
		}
	}
	else
	{
		if (show_achieved_button->GetState ())
		{
			vcf = vcf_all_achieved;
		}
		else if (show_remaining_button->GetState ())
		{
			vcf = vcf_all_remaining;
		}
		else
		{
			vcf = vcf_all;
		}
	}
#endif
	vcf = vcf_all;

	if (current_tactical_mission)
	{
		current_tactical_mission->set_victory_condition_filter (vcf);
		current_tactical_mission->set_victory_condition_team_filter (1);
	}
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////


static void delete_current_vc (long, short hittype, C_Base *)
{
	TREELIST *item;
	C_Victory *vctrl;
	victory_condition *vc;

	if(hittype != C_TYPE_LMOUSEUP)
		return;

	if(!gVCTree)
		return;

	SelectToolTypeCB(0,C_TYPE_LMOUSEUP,NULL);
	item=gVCTree->GetLastItem();
	if(item)
	{
		vctrl=(C_Victory*)item->Item_;
		if(vctrl)
		{
			vc=(victory_condition*)vctrl->GetPtr();
			if(vc)
			{
				gMapMgr->RemoveVC(vc->get_team(),vc->get_number());
				gVCTree->DeleteItem(item->ID_);
				delete vc;
				gVCTree->RecalcSize();
				gVCTree->Parent_->RefreshClient(gVCTree->GetClient());
			}
		}
	}
	update_team_victory_window ();
}

static void new_victory_condition (long, short hittype, C_Base *)
{
	victory_condition *vc;
	TREELIST *item;

	if (hittype != C_TYPE_LMOUSEUP)
		return;

	//MonoPrint ("New Victory Condition\n");

	if(!gVCTree)
		return;

	vc = new victory_condition (current_tactical_mission);
	vc->set_team (1);
	vc->control=MakeVCControl(vc);
	
	item=gVCTree->CreateItem(vc->get_number(),C_TYPE_ITEM,vc->control);
	if(item)
	{
		gVCTree->AddItem(gVCTree->GetRoot(),item);
		((C_Victory*)vc->control)->SetOwner(item);
		vc->control->SetReady(1);
		vc->control->SetClient(gVCTree->GetClient());
		vc->control->SetParent(gVCTree->Parent_);
		vc->control->SetSubParents(gVCTree->Parent_);
		gVCTree->RecalcSize();
		if(gVCTree->Parent_)
			gVCTree->Parent_->RefreshClient(gVCTree->GetClient());
	}

	if (gMapMgr)
	{
		gMapMgr->AddVC (vc);
	}
	UpdateVCOptions(vc);

	evaluate_filter ();

	update_team_victory_window ();
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
#if 0
static void change_vc_team_name (long ID, short hittype, C_Base *ctrl)
{
	victory_condition
		*vc;

	C_ListBox
		*listbox;

	int
		id,
		old_team,
		new_team;

	if (hittype != C_TYPE_SELECT)
	{
		return;
	}

	listbox = (C_ListBox *) ctrl;

	vc = (victory_condition *) listbox->GetUserNumber (0);
	
	old_team = vc->get_team ();
	new_team = listbox->GetTextID ();

	vc->set_team (new_team);

	if
	(
		((old_team > 0) && (new_team > 0)) ||
		((new_team < 0) && (old_team < 0))
	)
	{
		// don't need to do anything else, cos the team hasn't changed type.
		return;
	}

	id = ctrl->GetID ();

	listbox = (C_ListBox *) ctrl->Parent_->FindControl (id + 1);

	if (listbox)
	{
		listbox->RemoveAllItems ();

		listbox->AddItem (vt_occupy, C_TYPE_ITEM, "Occupy");
		listbox->AddItem (vt_destroy, C_TYPE_ITEM, "Destroy");
		listbox->AddItem (vt_attrit, C_TYPE_ITEM, "Attrit");
		listbox->AddItem (vt_intercept, C_TYPE_ITEM, "Intercept");
		listbox->AddItem (vt_degrade, C_TYPE_ITEM, "Degrade");

/*
		if (new_team == -1)
		{
			listbox->AddItem (vt_kills, C_TYPE_ITEM, "Kills");
			listbox->AddItem (vt_frags, C_TYPE_ITEM, "Frags");
			listbox->AddItem (vt_deaths, C_TYPE_ITEM, "Deaths");
			listbox->AddItem (vt_landing, C_TYPE_ITEM, "Landing");
		}

		listbox->AddItem (vt_tos, C_TYPE_ITEM, "Tos");
		listbox->AddItem (vt_airspeed, C_TYPE_ITEM, "Airspeed");
		listbox->AddItem (vt_altitude, C_TYPE_ITEM, "Altitude");
		listbox->AddItem (vt_position, C_TYPE_ITEM, "Position");
*/
	}
	gMapMgr->RemoveVC(old_team,vc->get_number());
	gMapMgr->AddVC(vc);
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////

static void change_vc_team_action (long ID, short hittype, C_Base *ctrl)
{
	victory_condition
		*vc;

	C_ListBox
		*listbox;

	C_Window
		*win;

	if (hittype != C_TYPE_SELECT)
	{
		return;
	}

	win = ctrl->GetParent ();

	listbox = (C_ListBox *) ctrl;

	vc = (victory_condition *) listbox->GetUserNumber (0);
	
	vc->set_type ((victory_type) listbox->GetTextID ());

	if (vc->arg1_control)
	{
		vc->arg1_control->SetFlagBitOn (C_BIT_INVISIBLE);
	}

	if (vc->arg2_control)
	{
		vc->arg2_control->SetFlagBitOn (C_BIT_INVISIBLE);
	}

	if (vc->arg3_control)
	{
		vc->arg3_control->SetFlagBitOn (C_BIT_INVISIBLE);
	}

	team_victory_id = add_team_args (vc->team_control->GetY (), win, vc, team_victory_id);

	win->ScanClientAreas ();
	win->RefreshClient (2);
	win->RefreshWindow ();
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////

static void change_vc_tolerance (long ID, short hittype, C_Base *ctrl)
{
	victory_condition
		*vc;

	C_ListBox
		*listbox;

	C_Window
		*win;

	if (hittype != C_TYPE_SELECT)
	{
		return;
	}

	win = ctrl->GetParent ();

	listbox = (C_ListBox *) ctrl;

	vc = (victory_condition *) listbox->GetUserNumber (0);
	
	vc->set_tolerance (listbox->GetTextID ());
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////

static void change_vc_steerpoint (long ID, short hittype, C_Base *ctrl)
{
	victory_condition
		*vc;

	C_ListBox
		*listbox;

	C_Window
		*win;

	if (hittype != C_TYPE_SELECT)
	{
		return;
	}

	win = ctrl->GetParent ();

	listbox = (C_ListBox *) ctrl;

	vc = (victory_condition *) listbox->GetUserNumber (0);
	
	vc->set_steerpoint (listbox->GetTextID ());
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////

static void set_vc_points (long ID, short hittype, C_Base *ctrl)
{
	C_EditBox
		*editbox;

	victory_condition
		*vc;

	editbox = (C_EditBox *) ctrl;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -