seta sbar_ring1_alpha 0.75 "alpha of the first HUD ring"\r
seta sbar_ring1_info_voredelay 1 "show the first HUD ring for indicating vore delay"\r
seta sbar_ring1_info_kickdelay 1 "show the first HUD ring for indicating kick delay"\r
+seta sbar_ring1_info_swallowprogress_pred 1 "show the first HUD ring for indicating predator swallow progress"\r
seta sbar_ring2 1 "enables the second HUD ring"\r
seta sbar_ring2_scale 40 "scale of the second HUD ring"\r
seta sbar_ring2_text_scale 10 "scale of the text on the second HUD ring"\r
seta sbar_ring2_alpha 0.75 "alpha of the second HUD ring"\r
seta sbar_ring2_info_regurgitateprepare 1 "show the second HUD ring for indicating regurgitation preparing"\r
+seta sbar_ring2_info_swallowprogress_prey 1 "show the first HUD ring for indicating prey swallow progress"\r
seta sbar_vote_alreadyvoted_alpha 0.75 "alpha of the vote dialog after you have voted"\r
\r
// for menu server list (eventually make them have engine support?)\r
"ca","stormkeep2","4","10","17","bot_config_file maps/bots_campaign_voretournament_16.txt; g_campaign_forceteam 1","The great vore","You catch all of the knights and digest them. Suddenly, the castle door starts to open. You slowly enter the building, where the Vore Princess is waiting. The gate closes behind you, as you prepare for the great battle.\n\nYou and your team will attack the Vore Princess in waves. Catch her and try to defeat her."
"tdm","stormkeep2","1","10","23","bot_config_file maps/bots_campaign_voretournament_17.txt; g_campaign_forceteam 1; sv_autotaunt 0","Awakening","You helplessly watch as your team is eaten and digested by the Vore Princess. You remain alone with her, confronting her by your self. Finish her off and avenge your team!"
"tdm","stormkeep2","1","10","30","bot_config_file maps/bots_campaign_voretournament_18.txt; g_campaign_forceteam 1; g_vore_reversescoring 1; g_balance_vore_digestion_damage 2; g_balance_health_start 50; g_start_weapon_grabber 0; g_start_ammo_fuel 0; sv_autotaunt 0","Meal for the Princess","As the Vore Princess falls to the ground ready for your final strike, your memory comes back. You freeze in shock. The Vore Princess was right. You are her spirit half, and your fate is to unleash the power of vore and defeat the Destroyer (Guardian).\n\nOffer yourself to the Princess and let her eat you, so your spirits can merge and restore your true power."
-"tdm","farewell","4","10","50","bot_config_file maps/bots_campaign_voretournament_19.txt; g_campaign_forceteam 2; sv_maxspeed 460; sv_jumpvelocity 500; g_balance_falldamage_minspeed 1000; g_balance_grabber_speed_pull 4000; g_balance_grabber_speed_fly 8000; g_balance_grabber_secondary_damage 300; g_balance_grabber_secondary_refire 0.25; g_balance_health_limit 800; g_balance_health_start 800; g_balance_pause_health_regen 0; g_balance_health_regenlinear 50; g_balance_health_regenstable 800; g_balance_health_rotstable 800; g_balance_armor_start 300; g_balance_armor_limit 600; g_balance_pause_armor_regen_spawn 0; g_balance_pause_armor_regen 1; g_balance_armor_regenstable 600; g_balance_armor_rotstable 600; g_balance_armor_regenlinear 200; g_balance_fuel_limit 800; g_balance_fuel_regenstable 800; g_balance_fuel_rotstable 800; g_balance_fuel_regen 1; g_balance_pause_fuel_regen 0; g_start_ammo_fuel 800; g_balance_vore_digestion_damage 140; g_balance_vore_swallow_limit 6; g_balance_vore_teamheal 0; g_balance_vore_regurgitate_speedcap 3000; g_balance_vore_kick_delay 0.3; g_balance_vore_kick_damage_min 100; g_balance_vore_kick_damage_max 200; g_balance_vore_kick_escapeprobability 0; g_balance_vore_regurgitate_force 2500; g_balance_vore_regurgitate_predatorforce 0","Astral fusion","The Vore Princess gently swallows you. Her stomach locks you inside and begins digestion. Your body is soon broken, your spirit blending with hers and becoming one. Your true power is suddenly restored, as you become the Vore Princess.\n\nFight the Destroyer's guards outside of the castle, then make your way to his realm and defeat him."
-"tdm","brokenworld","7","10","80","bot_config_file maps/bots_campaign_voretournament_20.txt; g_campaign_forceteam 2; g_player_colisions 0; g_player_alpha 0.5; sv_maxspeed 460; sv_jumpvelocity 500; g_balance_falldamage_minspeed 1000; g_balance_grabber_speed_pull 4000; g_balance_grabber_speed_fly 8000; g_balance_grabber_secondary_damage 300; g_balance_grabber_secondary_refire 0.25; g_balance_health_limit 800; g_balance_health_start 800; g_balance_pause_health_regen 0; g_balance_health_regenlinear 50; g_balance_health_regenstable 800; g_balance_health_rotstable 800; g_balance_armor_start 300; g_balance_armor_limit 600; g_balance_pause_armor_regen_spawn 0; g_balance_pause_armor_regen 1; g_balance_armor_regenstable 600; g_balance_armor_rotstable 600; g_balance_armor_regenlinear 200; g_balance_fuel_limit 800; g_balance_fuel_regenstable 800; g_balance_fuel_rotstable 800; g_balance_fuel_regen 1; g_balance_pause_fuel_regen 0; g_start_ammo_fuel 800; g_balance_vore_digestion_damage 140; g_balance_vore_swallow_limit 6; g_balance_vore_teamheal 0; g_balance_vore_regurgitate_speedcap 3000; g_balance_vore_kick_delay 0.3; g_balance_vore_kick_damage_min 100; g_balance_vore_kick_damage_max 200; g_balance_vore_kick_escapeprobability 0; g_balance_vore_regurgitate_force 2500; g_balance_vore_regurgitate_predatorforce 0","Destroyer of the Destroyer","The nightmare guards in the castle fall to the ground. You use your magic to open a portal and get to the Destroyer's realm. Mystic Silver and Snack will materialize there and aid you.\n\nFight and defeat the Destroyer in this final battle. Order will be restored and everything will be as it should be."
\ No newline at end of file
+"tdm","farewell","4","10","50","bot_config_file maps/bots_campaign_voretournament_19.txt; g_campaign_forceteam 2; sv_maxspeed 460; sv_jumpvelocity 500; g_balance_falldamage_minspeed 1000; g_balance_vore_swallow_speed_fill 0; g_balance_grabber_speed_pull 4000; g_balance_grabber_speed_fly 8000; g_balance_grabber_secondary_damage 300; g_balance_grabber_secondary_refire 0.25; g_balance_health_limit 800; g_balance_health_start 800; g_balance_pause_health_regen 0; g_balance_health_regenlinear 50; g_balance_health_regenstable 800; g_balance_health_rotstable 800; g_balance_armor_start 300; g_balance_armor_limit 600; g_balance_pause_armor_regen_spawn 0; g_balance_pause_armor_regen 1; g_balance_armor_regenstable 600; g_balance_armor_rotstable 600; g_balance_armor_regenlinear 200; g_balance_fuel_limit 800; g_balance_fuel_regenstable 800; g_balance_fuel_rotstable 800; g_balance_fuel_regen 1; g_balance_pause_fuel_regen 0; g_start_ammo_fuel 800; g_balance_vore_digestion_damage 140; g_balance_vore_swallow_limit 6; g_balance_vore_teamheal 0; g_balance_vore_regurgitate_speedcap 3000; g_balance_vore_kick_delay 0.3; g_balance_vore_kick_damage_min 100; g_balance_vore_kick_damage_max 200; g_balance_vore_kick_escapeprobability 0; g_balance_vore_regurgitate_force 2500; g_balance_vore_regurgitate_predatorforce 0","Astral fusion","The Vore Princess gently swallows you. Her stomach locks you inside and begins digestion. Your body is soon broken, your spirit blending with hers and becoming one. Your true power is suddenly restored, as you become the Vore Princess.\n\nFight the Destroyer's guards outside of the castle, then make your way to his realm and defeat him."
+"tdm","brokenworld","7","10","80","bot_config_file maps/bots_campaign_voretournament_20.txt; g_campaign_forceteam 2; g_player_colisions 0; g_player_alpha 0.5; sv_maxspeed 460; sv_jumpvelocity 500; g_balance_falldamage_minspeed 1000; g_balance_vore_swallow_speed_fill 0; g_balance_grabber_speed_pull 4000; g_balance_grabber_speed_fly 8000; g_balance_grabber_secondary_damage 300; g_balance_grabber_secondary_refire 0.25; g_balance_health_limit 800; g_balance_health_start 800; g_balance_pause_health_regen 0; g_balance_health_regenlinear 50; g_balance_health_regenstable 800; g_balance_health_rotstable 800; g_balance_armor_start 300; g_balance_armor_limit 600; g_balance_pause_armor_regen_spawn 0; g_balance_pause_armor_regen 1; g_balance_armor_regenstable 600; g_balance_armor_rotstable 600; g_balance_armor_regenlinear 200; g_balance_fuel_limit 800; g_balance_fuel_regenstable 800; g_balance_fuel_rotstable 800; g_balance_fuel_regen 1; g_balance_pause_fuel_regen 0; g_start_ammo_fuel 800; g_balance_vore_digestion_damage 140; g_balance_vore_swallow_limit 6; g_balance_vore_teamheal 0; g_balance_vore_regurgitate_speedcap 3000; g_balance_vore_kick_delay 0.3; g_balance_vore_kick_damage_min 100; g_balance_vore_kick_damage_max 200; g_balance_vore_kick_escapeprobability 0; g_balance_vore_regurgitate_force 2500; g_balance_vore_regurgitate_predatorforce 0","Destroyer of the Destroyer","The nightmare guards in the castle fall to the ground. You use your magic to open a portal and get to the Destroyer's realm. Mystic Silver and Snack will materialize there and aid you.\n\nFight and defeat the Destroyer in this final battle. Order will be restored and everything will be as it should be."
\ No newline at end of file
// ring disabled\r
break;\r
case 1:\r
+ // ring shows predator swallow progress, fills with progress\r
+ if not(cvar("sbar_ring1_info_swallowprogress_pred"))\r
+ break;\r
+ ring1_color = '0.5 1 0.5';\r
+ text1_msg = "Swallowing...";\r
+ break;\r
+ case 2:\r
// ring shows vore system delay, empties with progress\r
if not(cvar("sbar_ring1_info_voredelay"))\r
break;\r
ring1_color = '0.5 0.5 1';\r
text1_msg = "Vore delay";\r
break;\r
- case 2:\r
+ case 3:\r
// ring shows stomach kick delay, empties with progress\r
if not(cvar("sbar_ring1_info_kickdelay"))\r
break;\r
// ring disabled\r
break;\r
case 1:\r
+ // ring shows prey swallow progress, fills with progress\r
+ if not(cvar("sbar_ring2_info_swallowprogress_prey"))\r
+ break;\r
+ ring2_color = '1 0.5 0.5';\r
+ text2_msg = "Being swallowed...";\r
+ break;\r
+ case 2:\r
// ring shows regurgitation preparing, fills with progress\r
if not(cvar("sbar_ring2_info_regurgitateprepare"))\r
break;\r
.float status_teamhealing; // 0 = can't team heal, 1 = can team heal, 2 = team healing right now
+.float hold_BUTTON_ATCK; // marks the bot holding the fire button after having decided on his prey
float Swallow_condition_check_bot(entity prey)
{
if not(prey.digesting) // if our team mate is digesting someone, he likely wouldn't want us ruining his frag
if not(prey.flagcarried) // don't eat the flag carrier and ruin his job
if not(prey.BUTTON_ATCK || prey.BUTTON_ATCK2) // our team mate wouldn't want us eating him while he's firing
- if(time > self.decide_swallow)
{
- if(skill >= random() * 10) // there are 10 bot skill steps
- self.BUTTON_ATCK = TRUE; // swallow the team mate
- self.decide_swallow = time + cvar("bot_ai_vore_decide_swallow") / self.bot_vorethinkpred; // this is needed to take a proper decision, otherwise the code would execute each frame and return TRUE quickly
+ if(time > self.decide_swallow)
+ {
+ if(skill >= random() * 10) // there are 10 bot skill steps
+ self.hold_BUTTON_ATCK = TRUE; // swallow the team mate
+ self.decide_swallow = time + cvar("bot_ai_vore_decide_swallow") / self.bot_vorethinkpred; // this is needed to take a proper decision, otherwise the code would execute each frame and return TRUE quickly
+ }
}
+ else
+ self.hold_BUTTON_ATCK = FALSE;
}
void Vore_AI()
fear += self.stomach_load; // the bigger our stomach, the less we want to put someone else in there
decide_pred_time = cvar("bot_ai_vore_decide_pred") / skill / self.bot_vorethinkpred;
- if(time > self.decide_swallow)
if(Swallow_condition_check_bot(prey))
{
- // the greater the skill, the higher the chance bots will swallow someone each attempt
- if(skill / fear >= randomtry)
- if not(teams_matter && prey.team == self.team)
+ if(time > self.decide_swallow)
{
- self.BUTTON_ATCK = TRUE; // swallow
- self.decide_pred = time + decide_pred_time; // time before the bot decides what to do with his prey
+ // the greater the skill, the higher the chance bots will swallow someone each attempt
+ if(skill / fear >= randomtry)
+ if not(teams_matter && prey.team == self.team)
+ {
+ self.hold_BUTTON_ATCK = TRUE; // swallow
+ self.decide_pred = time + decide_pred_time; // time before the bot decides what to do with his prey
+ }
+ self.decide_swallow = time + cvar("bot_ai_vore_decide_swallow") / self.bot_vorethinkpred; // this is needed to take a proper decision, otherwise the code would execute each frame and return TRUE quickly
}
- self.decide_swallow = time + cvar("bot_ai_vore_decide_swallow") / self.bot_vorethinkpred; // this is needed to take a proper decision, otherwise the code would execute each frame and return TRUE quickly
}
+ else
+ self.hold_BUTTON_ATCK = FALSE;
+
+ // if the bot is holding the firing button, apply that to the actual fire key
+ if(self.hold_BUTTON_ATCK)
+ self.BUTTON_ATCK = TRUE;
// deciding what to do with a victim:
// Prey bot behavior:
// --------------------------------
+ // while being swallowed, smart bots know to keep jumping to make it harder to be caught
+ // TODO: Don't do this if the predator is a team mate
+ if(self.swallow_progress_prey)
+ if(self.swallow_progress_prey * 10 >= 10 - skill) // 10 skill steps
+ self.BUTTON_JUMP = TRUE;
+
if(self.stat_eaten && time > self.decide_prey)
{
// all we can do in the stomach is kick and do some damage / try to escape, or leave if the circumstances allow it and we should
\r
Vore_DeadPrey_Detach(self);\r
self.fakeprey = FALSE; // clear the fakeprey status\r
+ self.swallow_progress_pred = self.swallow_progress_prey = 0;\r
\r
self.classname = "player";\r
self.wasplayer = TRUE;\r
maxspd_mod *= swampspd_mod; // only one common speed modder please!\r
if(cvar("g_balance_vore_weight_gravity") > 0)\r
maxspd_mod *= 1 - bound(0, self.stomach_load * cvar("g_balance_vore_weight_speed"), 1); // apply stomach weight\r
+ if(self.swallow_progress_prey && cvar("g_balance_vore_swallow_speed_cutspd"))\r
+ maxspd_mod *= 1 - (self.swallow_progress_prey * cvar("g_balance_vore_swallow_speed_cutspd")); // cut speed based on swallow progress\r
swampspd_mod = 1;\r
\r
// if dead, behave differently\r
\r
.entity predator;\r
.entity fakepredator;\r
+.float swallow_progress_prey, swallow_progress_pred;\r
.float digesting;\r
.float stomach_load;\r
.float weapon_delay;\r
e.stomachkick_delay = time + cvar("g_balance_vore_kick_delay"); // don't kick immediately after being swallowed\r
}\r
\r
+void Vore_SwallowStep(entity e)\r
+{\r
+ if(!cvar("g_balance_vore_swallow_speed_fill"))\r
+ {\r
+ Vore_Swallow(e);\r
+ return;\r
+ }\r
+\r
+ // increase the progress value until it reaches 1, then swallow the player\r
+ if(e.swallow_progress_prey < 1)\r
+ e.swallow_progress_prey += cvar("g_balance_vore_swallow_speed_fill") * frametime;\r
+ else\r
+ {\r
+ Vore_Swallow(e);\r
+ e.swallow_progress_prey = 0;\r
+ }\r
+\r
+ // the predator's progress is how much the prey got swallowed\r
+ self.swallow_progress_pred = e.swallow_progress_prey;\r
+}\r
+\r
void Vore_Regurgitate(entity e)\r
{\r
// this player is being regurgitated by their predator, apply the proper changes\r
{\r
if(time <= self.stomachkick_delay)\r
{\r
- self.stat_sbring1_type = 2; // ring shows stomach kick delay, empties with progress\r
+ self.stat_sbring1_type = 3; // ring shows stomach kick delay, empties with progress\r
self.stat_sbring1_clip = bound(0, (time / self.stomachkick_delay - 1) / ((self.stomachkick_delay - cvar("g_balance_vore_kick_delay")) / self.stomachkick_delay - 1), 1);\r
}\r
}\r
else\r
{\r
- if(time <= self.action_delay)\r
+ if(self.swallow_progress_pred)\r
{\r
- self.stat_sbring1_type = 1; // ring shows vore action delay, empties with progress\r
+ self.stat_sbring1_type = 1; // ring shows predator swallow progress, fills with progress\r
+ self.stat_sbring1_clip = bound(0, self.swallow_progress_pred, 1);\r
+ }\r
+ else if(time <= self.action_delay)\r
+ {\r
+ self.stat_sbring1_type = 2; // ring shows vore action delay, empties with progress\r
self.stat_sbring1_clip = bound(0, (time / self.action_delay - 1) / ((self.action_delay - cvar("g_balance_vore_action_delay")) / self.action_delay - 1), 1);\r
}\r
- if(time <= self.regurgitate_prepare)\r
+\r
+ if(self.swallow_progress_prey)\r
+ {\r
+ self.stat_sbring2_type = 1; // ring shows prey swallow progress, fills with progress\r
+ self.stat_sbring2_clip = bound(0, self.swallow_progress_prey, 1);\r
+ }\r
+ else if(time <= self.regurgitate_prepare)\r
{\r
- self.stat_sbring2_type = 1; // ring shows regurgitation preparing, fills with progress\r
+ self.stat_sbring2_type = 2; // ring shows regurgitation preparing, fills with progress\r
self.stat_sbring2_clip = 1 - bound(0, (time / self.regurgitate_prepare - 1) / ((self.regurgitate_prepare - cvar("g_balance_vore_regurgitate_delay")) / self.regurgitate_prepare - 1), 1);\r
}\r
}\r
}\r
}\r
\r
+ // the swallow progress of prey and preds idly decrease by this amount\r
+ if(cvar("g_balance_vore_swallow_speed_decrease"))\r
+ {\r
+ if(self.swallow_progress_pred)\r
+ {\r
+ self.swallow_progress_pred -= cvar("g_balance_vore_swallow_speed_decrease") * frametime;\r
+ if(self.swallow_progress_pred < 0)\r
+ self.swallow_progress_pred = 0;\r
+ }\r
+ if(self.swallow_progress_prey)\r
+ {\r
+ self.swallow_progress_prey -= cvar("g_balance_vore_swallow_speed_decrease") * frametime;\r
+ if(self.swallow_progress_prey < 0)\r
+ self.swallow_progress_prey = 0;\r
+ }\r
+ }\r
+\r
// apply delays and skip the vore system under some circumstances\r
if(time < game_starttime || (time < warmup && !inWarmupStage)) // don't allow vore before a round begins\r
{\r
self.stat_canswallow = 1;\r
\r
if(self.BUTTON_ATCK)\r
- Vore_Swallow(prey);\r
+ Vore_SwallowStep(prey);\r
}\r
else if(prey != world)\r
self.stat_canswallow = -1;\r