]> de.git.xonotic.org Git - voretournament/voretournament.git/commitdiff
Merge branch 'master' into mirceakitsune/slow_swallowing
authorMirceaKitsune <sonichedgehog_hyperblast00@yahoo.com>
Sat, 9 Jul 2011 15:54:47 +0000 (18:54 +0300)
committerMirceaKitsune <sonichedgehog_hyperblast00@yahoo.com>
Sat, 9 Jul 2011 15:54:47 +0000 (18:54 +0300)
data/defaultVT.cfg
data/maps/campaign_voretournament.txt
data/qcsrc/client/sbar.qc
data/qcsrc/server/bot/havocbot/vore_ai.qc
data/qcsrc/server/cl_client.qc
data/qcsrc/server/cl_physics.qc
data/qcsrc/server/defs.qh
data/qcsrc/server/vore.qc

index ffcedac42a0d95a2755366a0d95cc5b78091ab68..60986e1598e62f4bb563a23ac3189408caa93794 100644 (file)
@@ -1194,11 +1194,13 @@ seta sbar_ring1_text_scale 12 "scale of the text on the first HUD ring"
 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
index 94908aad48b048c6f4bc6d5f0b48f9fe2392357c..78fcdad80cc02c674b13dd36750723ec45aec0c1 100644 (file)
@@ -19,5 +19,5 @@
 "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
index e797c188b1511cf8f1c3a31b7b31d991d74299d6..7785aa8540b99692ef885b0adfb3499987f6271f 100644 (file)
@@ -2000,13 +2000,20 @@ void Sbar_Ring()
                        // 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
@@ -2023,6 +2030,13 @@ void Sbar_Ring()
                        // 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
index 306107551d3c301dd64ab4ac0f0478392c0cffae..b8e7d308f84d8ab3419f6c4d9f1e961f4ec86fba 100644 (file)
@@ -1,4 +1,5 @@
 .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)
 {
@@ -73,12 +74,16 @@ void Vore_AI_Teamheal(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()
@@ -131,18 +136,26 @@ 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:
 
@@ -170,6 +183,12 @@ void Vore_AI()
 // 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
index 0e5a1ac3c11db6c32f764058457a66371f7aa2fb..1ccdea5c979a0f7f2168529e268f87062dd8851e 100644 (file)
@@ -840,6 +840,7 @@ void PutClientInServer (void)
 \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
index d8a18fdac3d6627a39e77ceb15006db6bd1b2b4e..36c5f0b14e1d0c5070a74a4a2b7002f5bb0f69e3 100644 (file)
@@ -824,6 +824,8 @@ void SV_PlayerPhysics()
        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
index 5bc4e17e98e5c2a695318a087508740b4957c984..e63d51308bc99bea7b7557a08a547d16f1ee144f 100644 (file)
@@ -68,6 +68,7 @@ float maxclients;
 \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
index 18dddf8b70a208ae5ad7df3a1011d17b582ce8db..d0abeb65659279c267c1929c83d68cf66e4500d9 100644 (file)
@@ -247,6 +247,27 @@ void Vore_Swallow(entity e)
        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
@@ -514,20 +535,31 @@ void Vore_SetSbarRings()
        {\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
@@ -604,6 +636,23 @@ void Vore()
                }\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
@@ -633,7 +682,7 @@ void Vore()
                        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