// ================================================================
// Official capture the flag game mode coding, reworked by Samual
-// Last updated: March 30th, 2012
+// Last updated: September, 2012
// ================================================================
-float ctf_ReadScore(string parameter) // make this obsolete
-{
- //if(g_ctf_win_mode != 2)
- return cvar(strcat("g_ctf_personal", parameter));
- //else
- // return cvar(strcat("g_ctf_flag", parameter));
-}
-
void ctf_FakeTimeLimit(entity e, float t)
{
msg_entity = e;
ctf_EventLog("dropped", player.team, player);
// scoring
- PlayerTeamScore_AddScore(player, -ctf_ReadScore("penalty_drop"));
+ PlayerTeamScore_AddScore(player, -autocvar_g_ctf_score_penalty_drop);
PlayerScore_Add(player, SP_CTF_DROPS, 1);
// waypoints
entity sender = flag.pass_sender;
// transfer flag to player
- flag.ctf_carrier = player;
flag.owner = player;
flag.owner.flagcarried = flag;
flag.movetype = MOVETYPE_NONE;
flag.takedamage = DAMAGE_NO;
flag.solid = SOLID_NOT;
- flag.ctf_carrier = player;
flag.ctf_status = FLAG_CARRY;
// messages and sounds
sound(player, CH_TRIGGER, flag.snd_flag_pass, VOL_BASE, ATTN_NORM);
- ctf_EventLog("recieve", flag.team, player);
+ ctf_EventLog("receive", flag.team, player);
FOR_EACH_REALPLAYER(tmp_player)
{
if(tmp_player == sender)
centerprint(tmp_player, strcat("You passed the ", flag.netname, " to ", player.netname));
else if(tmp_player == player)
- centerprint(tmp_player, strcat("You recieved the ", flag.netname, " from ", sender.netname));
+ centerprint(tmp_player, strcat("You received the ", flag.netname, " from ", sender.netname));
else if(!IsDifferentTeam(tmp_player, sender))
centerprint(tmp_player, strcat(sender.netname, " passed the ", flag.netname, " to ", player.netname));
}
sender.throw_antispam = time + autocvar_g_ctf_pass_wait;
player.throw_antispam = sender.throw_antispam;
-
+
flag.pass_sender = world;
flag.pass_target = world;
}
-void ctf_Handle_Throw(entity player, entity reciever, float droptype)
+void ctf_Handle_Throw(entity player, entity receiver, float droptype)
{
entity flag = player.flagcarried;
- vector targ_origin;
+ vector targ_origin, flag_velocity;
if(!flag) { return; }
- if((droptype == DROP_PASS) && !reciever) { return; }
+ if((droptype == DROP_PASS) && !receiver) { return; }
if(flag.speedrunning) { ctf_RespawnFlag(flag); return; }
flag.owner.flagcarried = world;
flag.owner = world;
flag.solid = SOLID_TRIGGER;
+ flag.ctf_dropper = player;
flag.ctf_droptime = time;
flag.flags = FL_ITEM | FL_NOTARGET; // clear FL_ONGROUND for MOVETYPE_TOSS
{
case DROP_PASS:
{
- WarpZone_RefSys_MakeSameRefSys(flag, player);
- targ_origin = WarpZone_RefSys_TransformOrigin(reciever, flag, (0.5 * (reciever.absmin + reciever.absmax)));
+ WarpZone_RefSys_Copy(flag, receiver);
+ targ_origin = WarpZone_RefSys_TransformOrigin(receiver, flag, (0.5 * (receiver.absmin + receiver.absmax)));
flag.velocity = (normalize(targ_origin - player.origin) * autocvar_g_ctf_pass_velocity);
break;
}
case DROP_THROW:
{
makevectors((player.v_angle_y * '0 1 0') + (player.v_angle_x * '0.5 0 0'));
- flag.velocity = W_CalculateProjectileVelocity(player.velocity, ('0 0 200' + (v_forward * autocvar_g_ctf_drop_velocity)), FALSE);
+ flag_velocity = ('0 0 200' + ((v_forward * autocvar_g_ctf_drop_velocity) * ((player.items & IT_STRENGTH) ? autocvar_g_ctf_drop_strengthmultiplier : 1)));
+ flag.velocity = W_CalculateProjectileVelocity(player.velocity, flag_velocity, FALSE);
break;
}
flag.movetype = MOVETYPE_FLY;
flag.takedamage = DAMAGE_NO;
flag.pass_sender = player;
- flag.pass_target = reciever;
+ flag.pass_target = receiver;
flag.ctf_status = FLAG_PASSING;
// other
{
entity enemy_flag = ((capturetype == CAPTURE_NORMAL) ? toucher.flagcarried : toucher);
entity player = ((capturetype == CAPTURE_NORMAL) ? toucher : enemy_flag.ctf_dropper);
+ float old_time, new_time;
if not(player) { return; } // without someone to give the reward to, we can't possibly cap
}
// scoring
- PlayerTeamScore_AddScore(player, ctf_ReadScore("score_capture"));
+ PlayerTeamScore_AddScore(player, autocvar_g_ctf_score_capture);
PlayerTeamScore_Add(player, SP_CTF_CAPS, ST_CTF_CAPS, 1);
+ old_time = PlayerScore_Add(player, SP_CTF_CAPTIME, 0);
+ new_time = TIME_ENCODE(time - enemy_flag.ctf_pickuptime);
+ if(!old_time || new_time < old_time)
+ PlayerScore_Add(player, SP_CTF_CAPTIME, new_time - old_time);
+
// effects
if(autocvar_g_ctf_flag_capture_effects)
{
{
WaypointSprite_Kill(player.wps_flagcarrier);
if(flag.speedrunning) { ctf_FakeTimeLimit(player, -1); }
+
+ if((enemy_flag.ctf_dropper) && (player != enemy_flag.ctf_dropper))
+ { PlayerTeamScore_AddScore(enemy_flag.ctf_dropper, autocvar_g_ctf_score_capture_assist); }
}
// reset the flag
ctf_EventLog("return", flag.team, player);
// scoring
- PlayerTeamScore_AddScore(player, ctf_ReadScore("score_return")); // reward for return
+ PlayerTeamScore_AddScore(player, autocvar_g_ctf_score_return); // reward for return
PlayerScore_Add(player, SP_CTF_RETURNS, 1); // add to count of returns
- TeamScore_AddToTeam(flag.team, ST_SCORE, -ctf_ReadScore("penalty_returned")); // punish the team who was last carrying it
+ TeamScore_AddToTeam(flag.team, ST_SCORE, -autocvar_g_ctf_score_penalty_returned); // punish the team who was last carrying it
if(flag.ctf_dropper)
{
- PlayerScore_Add(flag.ctf_dropper, SP_SCORE, -ctf_ReadScore("penalty_returned")); // punish the player who dropped the flag
+ PlayerScore_Add(flag.ctf_dropper, SP_SCORE, -autocvar_g_ctf_score_penalty_returned); // punish the player who dropped the flag
ctf_CaptureShield_Update(flag.ctf_dropper, 0); // shield player from picking up flag
flag.ctf_dropper.next_take_time = time + autocvar_g_ctf_flag_collect_delay; // set next take time
}
flag.takedamage = DAMAGE_NO;
flag.solid = SOLID_NOT;
flag.angles = '0 0 0';
- flag.ctf_carrier = player;
flag.ctf_status = FLAG_CARRY;
switch(pickuptype)
{
case PICKUP_BASE:
{
- PlayerTeamScore_AddScore(player, ctf_ReadScore("score_pickup_base"));
+ PlayerTeamScore_AddScore(player, autocvar_g_ctf_score_pickup_base);
break;
}
case PICKUP_DROPPED:
{
pickup_dropped_score = (autocvar_g_ctf_flag_return_time ? bound(0, ((flag.ctf_droptime + autocvar_g_ctf_flag_return_time) - time) / autocvar_g_ctf_flag_return_time, 1) : 1);
- pickup_dropped_score = floor((ctf_ReadScore("score_pickup_dropped_late") * (1 - pickup_dropped_score) + ctf_ReadScore("score_pickup_dropped_early") * pickup_dropped_score) + 0.5);
+ pickup_dropped_score = floor((autocvar_g_ctf_score_pickup_dropped_late * (1 - pickup_dropped_score) + autocvar_g_ctf_score_pickup_dropped_early * pickup_dropped_score) + 0.5);
print("pickup_dropped_score is ", ftos(pickup_dropped_score), "\n");
PlayerTeamScore_AddScore(player, pickup_dropped_score);
break;
flag.owner = world;
flag.pass_sender = world;
flag.pass_target = world;
- flag.ctf_carrier = world;
flag.ctf_dropper = world;
flag.ctf_pickuptime = 0;
flag.ctf_droptime = 0;
{
switch(flag.ctf_status)
{
+ case FLAG_PASSING:
case FLAG_CARRY:
{
- if(flag.owner == self)
+ if((flag.owner == self) || (flag.pass_sender == self))
self.items |= ((flag.items & IT_KEY2) ? IT_RED_FLAG_CARRYING : IT_BLUE_FLAG_CARRYING); // carrying: self is currently carrying the flag
else
self.items |= ((flag.items & IT_KEY2) ? IT_RED_FLAG_TAKEN : IT_BLUE_FLAG_TAKEN); // taken: someone on self's team is carrying the flag
}
else if(frag_target.flagcarried && (frag_target.deadflag == DEAD_NO) && IsDifferentTeam(frag_target, frag_attacker)) // if the target is a flagcarrier
{
- // healtharmor_maxdamage(player.health, player.armorvalue, autocvar_g_balance_armor_blockpercent)
- if(autocvar_g_ctf_flagcarrier_auto_helpme_when_damaged > frag_target.health)
+ if(autocvar_g_ctf_flagcarrier_auto_helpme_when_damaged > ('1 0 0' * healtharmor_maxdamage(frag_target.health, frag_target.armorvalue, autocvar_g_balance_armor_blockpercent)))
WaypointSprite_HelpMePing(frag_target.wps_flagcarrier); // TODO: only do this if there is a significant loss of health?
}
return 0;
{
if((frag_attacker != frag_target) && (frag_attacker.classname == "player") && (frag_target.flagcarried))
{
- PlayerTeamScore_AddScore(frag_attacker, ctf_ReadScore("score_kill"));
+ PlayerTeamScore_AddScore(frag_attacker, autocvar_g_ctf_score_kill);
PlayerScore_Add(frag_attacker, SP_CTF_FCKILLS, 1);
}