]> git.xonotic.org Git - voretournament/voretournament.git/blobdiff - data/qcsrc/server/vore.qc
Predator progress causes your prey progress to drop more quickly and the other way...
[voretournament/voretournament.git] / data / qcsrc / server / vore.qc
index fa8f453e90f866adf89fd7d19d766e42aa32f5af..9e71f036aab10161cda9e93cdc29c33647de87c6 100644 (file)
@@ -209,30 +209,30 @@ void Vore_StomachLoad_Apply()
        self.stomach_load = final_load;\r
 \r
        // apply weight\r
-       self.gravity = 1 + (self.stomach_load / self.stomach_maxload) * cvar("g_balance_vore_load_pred_weight");\r
+       self.gravity = 1 * (cvar("g_healthsize") ? pow(self.scale, cvar("g_healthsize_weight")) : 1) + (self.stomach_load / self.stomach_maxload) * cvar("g_balance_vore_load_pred_weight");\r
        if(!self.gravity && self.stomach_load)\r
                self.gravity = 0.00001; // 0 becomes 1 for gravity, so do this to allow 0 gravity\r
 }\r
 \r
 .entity swallow_model;\r
-float Vore_SwallowModel_CustomizeEntityForClient()\r
+float Vore_GulletModel_CustomizeEntityForClient()\r
 {\r
        // use the same system as the weapon model\r
 \r
        self.viewmodelforclient = self.owner;\r
-       self.alpha = self.owner.cvar_cl_vore_swallowmodel;\r
+       self.alpha = self.owner.cvar_cl_vore_gulletmodel;\r
 \r
        if(other.classname == "spectator")\r
        if(other.enemy == self.owner)\r
        {\r
                self.viewmodelforclient = other;\r
-               self.alpha = other.cvar_cl_vore_swallowmodel;\r
+               self.alpha = other.cvar_cl_vore_gulletmodel;\r
        }\r
 \r
        return TRUE;\r
 }\r
 \r
-void Vore_SwallowModel_Think()\r
+void Vore_GulletModel_Think()\r
 {\r
        // update the position of the swallow model to match our swallow progress\r
        float dist;\r
@@ -253,7 +253,7 @@ void Vore_SwallowModel_Think()
        self.nextthink = time;\r
 }\r
 \r
-void Vore_SwallowModel_Update(entity prey, entity pred)\r
+void Vore_GulletModel_Update(entity prey, entity pred)\r
 {\r
        // if we don't have a swallow model already, spawn one\r
        if(!prey.swallow_model)\r
@@ -264,16 +264,16 @@ void Vore_SwallowModel_Update(entity prey, entity pred)
                //prey.swallow_model.effects |= EF_NOGUNBOB; // let it bob\r
                prey.swallow_model.effects |= EF_NODEPTHTEST; // don't hide behind walls\r
                prey.swallow_model.owner = prey;\r
-               prey.swallow_model.customizeentityforclient = Vore_SwallowModel_CustomizeEntityForClient;\r
-               prey.swallow_model.think = Vore_SwallowModel_Think;\r
+               prey.swallow_model.customizeentityforclient = Vore_GulletModel_CustomizeEntityForClient;\r
+               prey.swallow_model.think = Vore_GulletModel_Think;\r
                prey.swallow_model.nextthink = time;\r
        }\r
 \r
        // properties that should update whenever possible, but when the predator is available\r
-       string player_swallowmodel;\r
-       player_swallowmodel = strcat(substring(pred.playermodel, 0, strlen(pred.playermodel) - 4), "_swallow.md3"); // 4 is the extension length\r
-       if(prey.swallow_model.model != player_swallowmodel) // player model can be changed while the predator is active\r
-               setmodel(prey.swallow_model, player_swallowmodel);\r
+       string player_gulletmodel;\r
+       player_gulletmodel = strcat(substring(pred.playermodel, 0, strlen(pred.playermodel) - 4), "_gullet.iqm"); // 4 is the extension length\r
+       if(prey.swallow_model.model != player_gulletmodel) // player model can be changed while the predator is active\r
+               setmodel(prey.swallow_model, player_gulletmodel);\r
        if(prey.swallow_model.skin != pred.skin) // player skin can be changed while the predator is active\r
                prey.swallow_model.skin = pred.skin;\r
        if(cvar("g_healthsize"))\r
@@ -299,6 +299,7 @@ void Vore_Swallow(entity e)
        e.predator = self;\r
        setorigin(e, e.predator.origin);\r
        e.velocity = '0 0 0';\r
+       e.punchangle = '0 0 0';\r
        e.movetype = MOVETYPE_FOLLOW;\r
        e.solid = SOLID_NOT;\r
        e.aiment = e.predator; // follow the predator, automatically unset when regurgitated\r
@@ -341,7 +342,7 @@ void Vore_Swallow(entity e)
 \r
 void Vore_SwallowStep(entity e)\r
 {\r
-       if(!cvar("g_balance_vore_swallow_speed_fill"))\r
+       if(!cvar("g_balance_vore_swallow_speed_fill_player"))\r
        {\r
                Vore_Swallow(e);\r
                return;\r
@@ -351,15 +352,22 @@ void Vore_SwallowStep(entity e)
        if(!self.swallow_progress_pred)\r
                PlayerSound(self, playersound_grab, CHAN_PAIN, VOICETYPE_PLAYERSOUND);\r
 \r
-       Vore_SwallowModel_Update(e, self);\r
+       // apply prey orientation\r
+       if(cvar("g_balance_vore_swallow_prey_orient"))\r
+       {\r
+               e.punchangle = self.angles - e.angles;\r
+               e.punchangle_speed = cvar("g_balance_vore_swallow_prey_orient_speed") * (1 - e.swallow_progress_prey);\r
+       }\r
+\r
+       Vore_GulletModel_Update(e, self);\r
 \r
        // increase the progress value until it reaches 1, then swallow the player\r
        if(e.swallow_progress_prey < 1)\r
        {\r
                float fill;\r
-               fill = cvar("g_balance_vore_swallow_speed_fill") * frametime;\r
-               if(cvar("g_healthsize") && cvar("g_balance_vore_swallow_speed_fill_scalediff")) // fill rate depends on predator size compared to prey size\r
-                       fill *= pow(self.scale / e.scale, cvar("g_balance_vore_swallow_speed_fill_scalediff"));\r
+               fill = cvar("g_balance_vore_swallow_speed_fill_player") * frametime;\r
+               if(cvar("g_healthsize") && cvar("g_balance_vore_swallow_speed_fill_scalediff_player")) // fill rate depends on predator size compared to prey size\r
+                       fill *= pow(self.scale / e.scale, cvar("g_balance_vore_swallow_speed_fill_scalediff_player"));\r
                if(cvar("g_balance_vore_swallow_speed_fill_stomachload") && e.stomach_load) // fill rate is influenced by the prey's stomach load\r
                        fill *= (1 - ((e.stomach_load / e.stomach_maxload) * bound(0, cvar("g_balance_vore_swallow_speed_fill_stomachload"), 1)));\r
 \r
@@ -415,15 +423,22 @@ void Vore_Regurgitate(entity e)
        e.pusher = e.predator; // allows us to frag players by regurgitating them in deadly pits\r
        e.pushltime = time + cvar("g_maxpushtime");\r
 \r
+       // apply prey orientation\r
+       if(cvar("g_balance_vore_swallow_prey_orient"))\r
+       {\r
+               e.punchangle = e.predator.angles - e.angles;\r
+               e.punchangle_speed = cvar("g_balance_vore_swallow_prey_orient_speed") * (1 - e.swallow_progress_prey);\r
+       }\r
+\r
        // if the dead body of the prey is below gibbing health, gib it\r
        e.stat_eaten = 0; // necessary for gibs to show\r
        PlayerGib(e, e.predator);\r
 \r
        // regurgitated prey is given this amount of swallow progress, to simulate being more vulnerable\r
-       if(cvar("g_balance_vore_swallow_speed_fill") && cvar("g_balance_vore_regurgitate_swallowprogress"))\r
+       if(cvar("g_balance_vore_swallow_speed_fill_player") && cvar("g_balance_vore_regurgitate_swallowprogress"))\r
        {\r
                e.swallow_progress_prey = cvar("g_balance_vore_regurgitate_swallowprogress");\r
-               Vore_SwallowModel_Update(e, e.predator);\r
+               Vore_GulletModel_Update(e, e.predator);\r
        }\r
 \r
        // apply regurgitation damage to the predator\r
@@ -763,15 +778,17 @@ void Vore()
        {\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
+                       float speed = cvar("g_balance_vore_swallow_speed_decrease");\r
+                       if(cvar("g_balance_vore_swallow_speed_decrease_even"))\r
+                               speed += self.swallow_progress_prey * cvar("g_balance_vore_swallow_speed_decrease_even");\r
+                       self.swallow_progress_pred = max(0, self.swallow_progress_pred - speed * frametime);\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
+                       float speed = cvar("g_balance_vore_swallow_speed_decrease");\r
+                       if(cvar("g_balance_vore_swallow_speed_decrease_even"))\r
+                               speed += self.swallow_progress_pred * cvar("g_balance_vore_swallow_speed_decrease_even");\r
+                       self.swallow_progress_prey = max(0, self.swallow_progress_prey - cvar("g_balance_vore_swallow_speed_decrease") * frametime);\r
                }\r
        }\r
 \r
@@ -941,4 +958,4 @@ void Vore()
 \r
        // always position camera at the center of the stomach, to reduce probability of the view poking out\r
        self.view_ofs_z = PL_PREY_VIEW_OFS_z * self.predator.scale;\r
-}
\ No newline at end of file
+}\r