Browse Source

[changed] pain calculation formula

Lusticon 4 months ago
parent
commit
388699d059
1 changed files with 215 additions and 363 deletions
  1. 215 363
      locations/arousal.qsrc

+ 215 - 363
locations/arousal.qsrc

@@ -90,6 +90,50 @@ killvar 'orgasm_flag'
 
 if $ARGS[0] ! 'end' and $ARGS[0] ! 'checks' and $ARGS[0] ! 'count' and $ARGS[0] ! 'count2':
 
+	stim_time = max(1, iif(ARGS[1] >= 0, ARGS[1], ARGS[1]*-1))
+	$get_hole_pain = {
+		!! ARGS[0] hole size
+		!! ARGS[1] hole slippery
+		!! ARGS[2] current pain
+		!! ARGS[3] length of inserted object
+		!! ARGS[4] grange of inserted object
+		!! ARGS[5] skill (0-2) aka silavag
+		!! length and girth abilities of hole are not also separated
+		!! but I suppose that they are related although it is not propable
+		!! we can estimate difference in girth and length
+		grdif = (ARGS[4] - ARGS[0])/2
+		ltdif = (ARGS[3] - ARGS[0])/4
+		!! painful intercourse compensated with lube
+		if pain_coeff > 0:
+			grdif += rand(pain_coeff/max(1,ARGS[1]/2), pain_coeff/max(1,ARGS[1]))
+			ltdif += rand(pain_coeff/max(1,ARGS[1]/2), pain_coeff/max(1,ARGS[1]))
+		end
+		!! in pain compensated by skill
+		if ARGS[2] > 0:
+			grdif += rand(ARGS[2]/max(1,ARGS[5]*4), ARGS[2]/max(1,ARGS[5]*2))
+			ltdif += rand(ARGS[2]/max(1,ARGS[5]*4), ARGS[2]/max(1,ARGS[5]*2))
+		end
+		!! if there is any discomfort, check intercourse duration, compensated by skill
+		if stim_time > 0:
+			if grdif > rand(ARGS[5]*2): grdif += rand(stim_time/(max(1,ARGS[5])*10), stim_time/(max(1,ARGS[5])*5))
+			if ltdif > rand(ARGS[5]*2): ltdif += rand(stim_time/(max(1,ARGS[5])*10), stim_time/(max(1,ARGS[5])*5))
+		end
+		!! lube can compensate the difference a bit, or make it worse if there is no lube at all
+		if ARGS[1] > 0:
+			grdif -= rand(ARGS[1]/2, ARGS[1])
+		else
+			grdif += max(rand(ARGS[3], ARGS[4]), rand(grdif/2, grdif))
+		end
+		!! when skilled, it does not harm PC
+		if ARGS[5] > 0 and ltdif > 0: ltdif /= ARGS[5]
+
+		!! min\max
+		grdif = max(0, min(15-(ARGS[0]/4), grdif))
+		ltdif = max(0, min(15-(ARGS[0]/4), ltdif))
+
+		!{ 'hole size <<ARGS[0]>>; length: <<ARGS[3]>>; grange: <<ARGS[4]>>; hole slippery: <<ARGS[1]>>; current pain: <<ARGS[2]>>; stim_time: <<stim_time>>; skill: <<ARGS[5]>>; grdif: <<grdif>>; ltdif: <<ltdif>>' }
+	}
+
 	if arrpos('$ARGS', 'unaware') >= 0: temp_unaware = 1
 	if arrpos('$ARGS', 'no_orgasm_msg') >= 0: temp_text = 1
 	
@@ -149,6 +193,19 @@ if $ARGS[0] ! 'end' and $ARGS[0] ! 'checks' and $ARGS[0] ! 'count' and $ARGS[0]
 !!set a magnitude as a random
 	stim['mag'] = rand(0,3) + rand(0,3) + rand(0,3) 
 
+!! set up pain coefficient
+	pain_coeff = 0
+	if arrpos('$ARGS', 'rape') >= 0:         pain_coeff += 40
+	if arrpos('$ARGS', 'gangbang') >= 0:     pain_coeff += 30
+	if arrpos('$ARGS', 'rough') >= 0:        pain_coeff += 25
+	if arrpos('$ARGS', 'beast') >= 0:        pain_coeff += 20
+	if arrpos('$ARGS', 'BDSM') >= 0:         pain_coeff += 10
+	if arrpos('$ARGS', 'maso') >= 0:         pain_coeff += 7
+	if arrpos('$ARGS', 'bound') >= 0:        pain_coeff += 3
+	if arrpos('$ARGS', 'sub') >= 0:          pain_coeff += 2
+	if arrpos('$ARGS', 'prostitution') >= 0: pain_coeff += rand(0,5)
+	if arrpos('$ARGS', 'unknown') >= 0:      pain_coeff += rand(0,2)
+
 !!add count and effects due to action
 	if $ARGS[0] = 'clit_finger':
 		orgasm_flag['clit'] = 1
@@ -182,20 +239,25 @@ if $ARGS[0] ! 'end' and $ARGS[0] ! 'checks' and $ARGS[0] ! 'count' and $ARGS[0]
 		!! lose some milk
 		if lactation['active'] > 0 and lactation['breastmv'] > lactation['breastmm']*3/2:
 			stim['act'] += rand(10,20)
-			lactation['breastmv'] = max(0, lactation['breastmv'] - rand(lactation['breastmv']/10, lactation['breastmv']/4)*max(1,ARGS[1]/2))
+			lactation['breastmv'] = max(0, lactation['breastmv'] - rand(lactation['breastmv']/20, lactation['breastmv']/10)*max(1,stim_time/2))
+		end
+
+		if pain_coeff > 0:
+			gs 'pain', rand(pain_coeff)/2, 'breasts', 'twist'
+			gs 'pain', rand(pain_coeff)/2, 'nipples', 'pinch'
 		end
 
 		!! No idea where else to put this. This is used for breast stimulation which will eventually cause lactation in sveta without her knowledge. If anyone knows a better place for this, please let me know. - milky_boobs.
 		!! milkedvolume += func('lact_lib','$get_breastmilk', 8, ARGS[1])
 	elseif $ARGS[0] = 'massage':
-		pcs_sweat += rand(2,4)*max(1,ARGS[1]/5)
+		pcs_sweat += rand(2,4)*max(1,stim_time/5)
 		count['massage'] = 1
 		stim['act'] = 25
 	elseif $ARGS[0] = 'foreplay':
 		count['foreplay'] = 1
 		stim['act'] = 20
 	elseif $ARGS[0] = 'cuni':
-		pcs_sweat += rand(0,1)*max(1,ARGS[1]/5)
+		pcs_sweat += rand(0,1)*max(1,stim_time/5)
 		orgasm_flag['vaginal'] = 1
 		count['cuni'] = 1
 		stim['mag'] += 4
@@ -217,66 +279,7 @@ if $ARGS[0] ! 'end' and $ARGS[0] ! 'checks' and $ARGS[0] ! 'count' and $ARGS[0]
 		stim['mag'] += 3
 		stim['act'] = 70
 		stim_les = 1
-	elseif $ARGS[0] = 'anal':
-		pcs_sweat += rand(1,4)*max(1,ARGS[1]/5)
-		stat['last_sex_day'] = daystart
-		orgasm_flag['anal'] = 1
-		if temp_unaware = 1:
-			count['hidden_anal'] = 1
-		else
-			count['anal'] = 1
-		end
-		if pcs_traits['buttslut_lvl'] = 1:
-			stim['mag'] += 1
-		elseif pcs_traits['buttslut_lvl'] >= 2:
-			stim['mag'] += 3
-		end
-		!! length and girth abilities of anus are not also separated , but I suppose that they are related although it is not propable
-		!! we can estimate difference in girth and length anal_girth_difference and anal_lenght_difference - names are shortened
-		altdif = temp_dick - pcs_ass
-		agrdif = grange - pcs_ass
-		!! negative influence of the difference can be reduced by sex skill and also by lubricant
-		!! I made it as simply as possible so you do not complain about reality, feel free to modify the algorithm
-		!! when the boy is skilled, he can compensate the difference partly
-		altdif = altdif / (temp_silavag+1)
-		agrdif = agrdif *(5/4 - 1/(4 - temp_silavag))
-		!! when the boy is skilled, he does not harm PC with his long dick
-		if (temp_silavag = 2) and (altdif > 0): altdif = 0
-		!! lube can compensate the difference a bit
-		if -agrdif > anal_slip: agrdif = agrdif + anal_slip else if agrdif < 0: agrdif = 0
-		if agrdif > anal_slip: agrdif = agrdif - anal_slip else if agrdif > 0: agrdif = 0
-
-		stim['act'] = 80 - (iif(altdif>0,altdif,-altdif) + iif(agrdif >0,agrdif,-agrdif)) + temp_silavag*8
-		!! if the dick is smaller, it cannot harm PC
-		if agrdif < 0: agrdif = 0
-		if altdif < 0: altdif = 0
-		!! rough sex always gives pain
-		if arrpos('$ARGS', 'rape') >= 0:             altdif += rand(temp_dick/7,temp_dick/4)   & agrdif += rand(grange/3,grange/2)
-		if arrpos('$ARGS', 'rough') >= 0:            altdif += rand(temp_dick/10,temp_dick/5)  & agrdif += rand(grange/5,grange/3)
-		if arrpos('$ARGS', 'gangbang') >= 0:         altdif += rand(temp_dick/12,temp_dick/6)  & agrdif += rand(grange/7,grange/5)
-		if arrpos('$ARGS', 'beast') >= 0:            altdif += rand(temp_dick/15,temp_dick/8)  & agrdif += rand(grange/10,grange/7)
-		if pain['asshole'] > rand(30,50):
-			!! if arrpos('$ARGS', 'group') >= 0:        altdif += rand(temp_dick/20,temp_dick/12) & agrdif += rand(grange/15,grange/10)
-			if arrpos('$ARGS', 'maso') >= 0:         altdif += rand(temp_dick/24,temp_dick/16) & agrdif += rand(grange/18,grange/12)
-		end
-		if pain['asshole'] > rand(40,60):
-			if arrpos('$ARGS', 'prostitution') >= 0: altdif += rand(temp_dick/28,temp_dick/20) & agrdif += rand(grange/20,grange/14)
-			!! if arrpos('$ARGS', 'unknown') >= 0:      altdif += rand(temp_dick/32,temp_dick/22) & agrdif += rand(grange/24,grange/17)
-			if arrpos('$ARGS', 'bound') >= 0:        altdif += rand(temp_dick/35,temp_dick/25) & agrdif += rand(grange/28,grange/20)
-			if arrpos('$ARGS', 'sub') >= 0:          altdif += rand(temp_dick/40,temp_dick/30) & agrdif += rand(grange/35,grange/25)
-		end
-		!! increase if already in pain
-		agrdif += rand(pain['asshole']/10, pain['asshole']/2)
-		altdif += rand(pain['asshole']/10, pain['asshole']/2)
-		!! calculate the harm
-		agape = iif((agrdif + altdif) > 10*agape,(agrdif + altdif)/10,agape)
-		!! the pain lover the pleasure
-		gs 'pain', (agrdif + altdif)/5*max(1,ARGS[1]/5), 'asshole', 'stretch'
-		stim['act'] = stim['act'] - (agrdif + altdif)
-		!! force cum leak
-		if ARGS[1] > 0 and cumvol[3] > rand(pcs_ass/2,pcs_ass): gs 'cum_manage', 'cum_decay', (temp_dick+grange)*max(1,ARGS[1]/5)
-		if pcs_ass < temp_dick:pcs_ass += 1
-		if pcs_ass*2 < temp_dick:pcs_ass += 1
+		if pain_coeff > 0:gs 'pain', rand(pain_coeff)/5, 'clitoris', 'twist'
 	elseif $ARGS[0] = 'anal_finger':
 		orgasm_flag['anal'] = 1
 		count['anal_finger'] = 1
@@ -288,6 +291,7 @@ if $ARGS[0] ! 'end' and $ARGS[0] ! 'checks' and $ARGS[0] ! 'count' and $ARGS[0]
 			stim['mag'] += 1
 			stim['act'] = 80
 		end
+		if pain_coeff > 0:gs 'pain', rand(pain_coeff), 'asshole', 'stretch'
 	elseif $ARGS[0] = 'anal_fist':
 		orgasm_flag['anal'] = 1
 		count['anal_fist'] = 1
@@ -297,11 +301,11 @@ if $ARGS[0] ! 'end' and $ARGS[0] ! 'checks' and $ARGS[0] ! 'count' and $ARGS[0]
 		elseif pcs_traits['buttslut_lvl'] >= 2:
 			stim['act'] = 70
 		end
-		if pcs_ass + anal_slip < 30:
-			pcs_ass = 30
-			gs 'pain', (6-agape)*max(1,ARGS[1]), 'asshole', 'stretch'
-			if agape < 3:agape = 3
-		end
+		dynamic $get_hole_pain, pcs_ass, anal_slip, pain['asshole'], rand(15,20), rand(35,40), rand(0,2)
+		stim['act'] -= grdif + ltdif
+		agape = min(4, iif((grdif + ltdif) > 3*agape,(grdif + ltdif)/3,agape))
+		gs 'pain', grdif+ltdif, 'asshole', 'stretch'
+		pcs_ass += 1
 	elseif $ARGS[0] = 'self_fisting_anal':
 		orgasm_flag['anal'] = 1
 		count['self_fisting_anal'] = 1
@@ -311,119 +315,124 @@ if $ARGS[0] ! 'end' and $ARGS[0] ! 'checks' and $ARGS[0] ! 'count' and $ARGS[0]
 		elseif pcs_traits['buttslut_lvl'] >= 2:
 			stim['act'] = 70
 		end
-		if pcs_ass + anal_slip < 30:
-			pcs_ass = 30
-			gs 'pain', (6-agape)*max(1,ARGS[1]), 'asshole', 'stretch'
-			if agape < 3:agape = 3
+		dynamic $get_hole_pain, pcs_ass, anal_slip, pain['asshole'], rand(10,15), rand(30,35), 2
+		stim['act'] -= grdif + ltdif
+		agape = min(4, iif((grdif + ltdif) > 3*agape,(grdif + ltdif)/3,agape))
+		gs 'pain', grdif+ltdif, 'asshole', 'stretch'
+		pcs_ass += 1
+	elseif $ARGS[0] = 'anal_vibe':
+		orgasm_flag['anal'] = 1
+		count['anal_vibe'] = 1
+		stim['mag'] += 1
+		stim['act'] = 60
+		if pcs_traits['buttslut_lvl'] = 1:
+			stim['mag'] += 1
+			stim['act'] = 70
+		elseif pcs_traits['buttslut_lvl'] >= 2:
+			stim['mag'] += 2
+			stim['act'] = 90
 		end
+	elseif $ARGS[0] = 'anal':
+		pcs_sweat += rand(1,4)*max(1,stim_time/5)
+		stat['last_sex_day'] = daystart
+		orgasm_flag['anal'] = 1
+		if temp_unaware = 1:
+			count['hidden_anal'] = 1
+		else
+			count['anal'] = 1
+		end
+		if pcs_traits['buttslut_lvl'] = 1:
+			stim['mag'] += 1
+		elseif pcs_traits['buttslut_lvl'] >= 2:
+			stim['mag'] += 3
+		end
+		dynamic $get_hole_pain, pcs_ass, anal_slip, pain['asshole'], temp_dick, grange, temp_silavag
+		stim['act'] = 80 - grdif + ltdif + temp_silavag*8
+		!! calculate the harm
+		agape = min(4, iif((grdif + ltdif) > 5*agape,(grdif + ltdif)/5, agape))
+		!! the pain lover the pleasure
+		gs 'pain', grdif + ltdif, 'asshole', 'stretch'
+		!! force cum leak
+		if ARGS[1] > 0 and cumvol[3] > rand(pcs_ass/2,pcs_ass): gs 'cum_manage', 'cum_decay', ((temp_dick+grange)/2)*max(1,stim_time/5)
+		if pcs_ass < temp_dick:pcs_ass += 1
+		if pcs_ass*2 < temp_dick:pcs_ass += 1
 	elseif $ARGS[0] = 'anal_dildo':
-		pcs_sweat += rand(0,2)*max(1,ARGS[1]/5)
+		pcs_sweat += rand(0,2)*max(1,stim_time/5)
 		orgasm_flag['anal'] = 1
 		count['anal_dildo'] = 1
 		!! the same as for 'anal'
-		altdif = temp_dick - pcs_ass
-		agrdif = grange - pcs_ass
-		altdif = altdif / (temp_silavag+1)
-		agrdif = agrdif *(5/4 - 1/(4 - temp_silavag))
-		if (temp_silavag = 2) and (altdif > 0): altdif = 0
-		if agrdif > anal_slip: agrdif = agrdif - anal_slip else if agrdif > 0: agrdif = 0
-		if -agrdif > anal_slip: agrdif = agrdif + anal_slip else if agrdif < 0: agrdif = 0
-		stim['act'] = 80 - (iif(altdif>0,altdif,-altdif) + iif(agrdif >0,agrdif,-agrdif)) + temp_silavag*8
+		dynamic $get_hole_pain, pcs_ass, anal_slip, pain['asshole'], temp_dick, grange, temp_silavag
+		stim['act'] = 80 - grdif + ltdif + temp_silavag*8
 		if pcs_traits['buttslut_lvl'] = 1:
 			stim['act'] += 10
 		elseif pcs_traits['buttslut_lvl'] >= 2:
 			stim['mag'] += 1
 		end
-		if agrdif < 0: agrdif = 0
-		if altdif < 0: altdif = 0
-		if arrpos('$ARGS', 'rape') >= 0:             altdif += rand(temp_dick/7,temp_dick/4)   & agrdif += rand(grange/3,grange/2)
-		if arrpos('$ARGS', 'rough') >= 0:            altdif += rand(temp_dick/10,temp_dick/5)  & agrdif += rand(grange/5,grange/3)
-		if arrpos('$ARGS', 'gangbang') >= 0:         altdif += rand(temp_dick/12,temp_dick/6)  & agrdif += rand(grange/7,grange/5)
-		if arrpos('$ARGS', 'beast') >= 0:            altdif += rand(temp_dick/15,temp_dick/8)  & agrdif += rand(grange/10,grange/7)
-		if pain['asshole'] > rand(30,50):
-			!! if arrpos('$ARGS', 'group') >= 0:        altdif += rand(temp_dick/20,temp_dick/12) & agrdif += rand(grange/15,grange/10)
-			if arrpos('$ARGS', 'maso') >= 0:         altdif += rand(temp_dick/24,temp_dick/16) & agrdif += rand(grange/18,grange/12)
-		end
-		if pain['asshole'] > rand(40,60):
-			if arrpos('$ARGS', 'prostitution') >= 0: altdif += rand(temp_dick/28,temp_dick/20) & agrdif += rand(grange/20,grange/14)
-			!! if arrpos('$ARGS', 'unknown') >= 0:      altdif += rand(temp_dick/32,temp_dick/22) & agrdif += rand(grange/24,grange/17)
-			if arrpos('$ARGS', 'bound') >= 0:        altdif += rand(temp_dick/35,temp_dick/25) & agrdif += rand(grange/28,grange/20)
-			if arrpos('$ARGS', 'sub') >= 0:          altdif += rand(temp_dick/40,temp_dick/30) & agrdif += rand(grange/35,grange/25)
-		end
-		agrdif += rand(pain['asshole']/10, pain['asshole']/2)
-		altdif += rand(pain['asshole']/10, pain['asshole']/2)
-		agape = iif((agrdif + altdif) > 10*agape,(agrdif + altdif)/10,agape)
-		gs 'pain', (agrdif + altdif)/5*max(1,ARGS[1]/5), 'asshole', 'stretch'
-		stim['act'] = stim['act'] - (agrdif + altdif)
-		if ARGS[1] > 0 and cumvol[3] > rand(pcs_ass/2,pcs_ass): gs 'cum_manage', 'cum_decay', (temp_dick+grange)*max(1,ARGS[1]/5)
+		agape = min(4, iif((grdif + ltdif) > 5*agape,(grdif + ltdif)/5, agape))
+		gs 'pain', grdif + ltdif, 'asshole', 'stretch'
+		if ARGS[1] > 0 and cumvol[3] > rand(pcs_ass/2,pcs_ass): gs 'cum_manage', 'cum_decay', ((temp_dick+grange)/2)*max(1,stim_time/5)
 		if pcs_ass < temp_dick:pcs_ass += 1
 		if pcs_ass*2 < temp_dick:pcs_ass += 1
 	elseif $ARGS[0] = 'anal_strap':
-		pcs_sweat += rand(1,2)*max(1,ARGS[1]/5)
+		pcs_sweat += rand(1,2)*max(1,stim_time/5)
 		stat['last_sex_day'] = daystart
 		orgasm_flag['anal'] = 1
 		count['anal_strap'] = 1
-		!! the same as for 'anal'
-		altdif = temp_dick - pcs_ass
-		agrdif = grange - pcs_ass
-		altdif = altdif / (temp_silavag+1)
-		agrdif = agrdif *(5/4 - 1/(4 - temp_silavag))
-		if (temp_silavag = 2) and (altdif > 0): altdif = 0
-		if agrdif > anal_slip: agrdif = agrdif - anal_slip else if agrdif > 0: agrdif = 0
-		if -agrdif > anal_slip: agrdif = agrdif + anal_slip else if agrdif < 0: agrdif = 0
-		stim['act'] = 80 - (iif(altdif>0,altdif,-altdif) + iif(agrdif >0,agrdif,-agrdif)) + temp_silavag*8
 		if pcs_traits['buttslut_lvl'] = 1:
 			stim['act'] += 10
 		elseif pcs_traits['buttslut_lvl'] >= 2:
 			stim['mag'] += 1
 		end
-		if agrdif < 0: agrdif = 0
-		if altdif < 0: altdif = 0
-		if arrpos('$ARGS', 'rape') >= 0:             altdif += rand(temp_dick/7,temp_dick/4)   & agrdif += rand(grange/3,grange/2)
-		if arrpos('$ARGS', 'rough') >= 0:            altdif += rand(temp_dick/10,temp_dick/5)  & agrdif += rand(grange/5,grange/3)
-		if arrpos('$ARGS', 'gangbang') >= 0:         altdif += rand(temp_dick/12,temp_dick/6)  & agrdif += rand(grange/7,grange/5)
-		if arrpos('$ARGS', 'beast') >= 0:            altdif += rand(temp_dick/15,temp_dick/8)  & agrdif += rand(grange/10,grange/7)
-		if pain['asshole'] > rand(30,50):
-			!! if arrpos('$ARGS', 'group') >= 0:        altdif += rand(temp_dick/20,temp_dick/12) & agrdif += rand(grange/15,grange/10)
-			if arrpos('$ARGS', 'maso') >= 0:         altdif += rand(temp_dick/24,temp_dick/16) & agrdif += rand(grange/18,grange/12)
-		end
-		if pain['asshole'] > rand(40,60):
-			if arrpos('$ARGS', 'prostitution') >= 0: altdif += rand(temp_dick/28,temp_dick/20) & agrdif += rand(grange/20,grange/14)
-			!! if arrpos('$ARGS', 'unknown') >= 0:      altdif += rand(temp_dick/32,temp_dick/22) & agrdif += rand(grange/24,grange/17)
-			if arrpos('$ARGS', 'bound') >= 0:        altdif += rand(temp_dick/35,temp_dick/25) & agrdif += rand(grange/28,grange/20)
-			if arrpos('$ARGS', 'sub') >= 0:          altdif += rand(temp_dick/40,temp_dick/30) & agrdif += rand(grange/35,grange/25)
-		end
-		agrdif += rand(pain['asshole']/10, pain['asshole']/2)
-		altdif += rand(pain['asshole']/10, pain['asshole']/2)
-		agape = iif((agrdif + altdif) > 10*agape,(agrdif + altdif)/10,agape)
-		gs 'pain', (agrdif + altdif)/5*max(1,ARGS[1]/5), 'asshole', 'stretch'
-		stim['act'] = stim['act'] - (agrdif + altdif)
+		!! the same as for 'anal'
+		dynamic $get_hole_pain, pcs_ass, anal_slip, pain['asshole'], temp_dick, grange, temp_silavag
+		stim['act'] = 80 - grdif + ltdif + temp_silavag*8
+		agape = min(4, iif((grdif + ltdif) > 5*agape,(grdif + ltdif)/5, agape))
+		gs 'pain', grdif + ltdif, 'asshole', 'stretch'
 		!! force cum leak
-		if ARGS[1] > 0 and cumvol[3] > rand(pcs_ass/2,pcs_ass): gs 'cum_manage', 'cum_decay', (temp_dick+grange)*max(1,ARGS[1]/5)
+		if ARGS[1] > 0 and cumvol[3] > rand(pcs_ass/2,pcs_ass): gs 'cum_manage', 'cum_decay', ((temp_dick+grange)/2)*max(1,stim_time/5)
 		if pcs_ass < temp_dick:pcs_ass += 1
 		if pcs_ass*2 < temp_dick:pcs_ass += 1
-	elseif $ARGS[0] = 'anal_vibe':
-		orgasm_flag['anal'] = 1
-		count['anal_vibe'] = 1
+	elseif $ARGS[0] = 'vaginal_finger':
+		orgasm_flag['vaginal'] = 1
+		count['vaginal_finger'] = 1
 		stim['mag'] += 1
-		stim['act'] = 60
-		if pcs_traits['buttslut_lvl'] = 1:
-			stim['mag'] += 1
-			stim['act'] = 70
-		elseif pcs_traits['buttslut_lvl'] >= 2:
-			stim['mag'] += 2
-			stim['act'] = 90
-		end
+		stim['act'] = 80
+		if pain_coeff > 0:gs 'pain', rand(pain_coeff), 'vaginal', 'stretch'
+	elseif $ARGS[0] = 'vaginal_fist':
+		pcs_sweat += rand(0,1)*max(1,stim_time/5)
+		orgasm_flag['vaginal'] = 1
+		count['vaginal_fist'] = 1
+		stim['act'] = 70
+		dynamic $get_hole_pain, pcs_vag, vaginal_slip, pain['vaginal'], rand(15,20), rand(35,40), rand(0,2)
+		stim['act'] -= grdif + ltdif
+		vgape = min(4, iif((grdif + ltdif) > 3*vgape,(grdif + ltdif)/3,vgape))
+		gs 'pain', grdif+ltdif, 'vaginal', 'stretch'
+		gs 'pain', rand(grdif), 'labia', 'stretch'
+		pcs_vag += 1
+	elseif $ARGS[0] = 'self_fisting':
+		orgasm_flag['vaginal'] = 1
+		count['self_fisting'] = 1
+		stim['act'] = 70
+		dynamic $get_hole_pain, pcs_vag, vaginal_slip, pain['vaginal'], rand(10,15), rand(30,35), 2
+		stim['act'] -= grdif + ltdif
+		vgape = min(4, iif((grdif + ltdif) > 3*vgape,(grdif + ltdif)/3,vgape))
+		gs 'pain', grdif+ltdif, 'vaginal', 'stretch'
+		gs 'pain', rand(grdif), 'labia', 'stretch'
+		pcs_vag += 1
+	elseif $ARGS[0] = 'vaginal_vibe':
+		orgasm_flag['vaginal'] = 1
+		count['vaginal_vibe'] = 1
+		stim['mag'] += 2
+		stim['act'] = 90
 	elseif $ARGS[0] = 'vaginal':
-		pcs_sweat += rand(1,3)*max(1,ARGS[1]/5)
+		pcs_sweat += rand(1,3)*max(1,stim_time/5)
 		orgasm_flag['vaginal'] = 1
 		!! pre-cum check
 		if rand(0,120) < ARGS[1]: cumprecheck = 1 & gs 'cum_manage'
-		
 		if temp_unaware = 1:
 			count['hidden_vaginal'] = 1
 		else
-			if stat['think_virgin'] = 1:
+			if virgin_stats['vaginal'] = 0 and (stat['think_virgin'] = 1 or pcs_vag = 0):
 				virgin_stats['day_lost'] = daystart
 				virgin_stats['age_lost'] = age
 				virgin_stats['vaginal'] = 1
@@ -435,169 +444,57 @@ if $ARGS[0] ! 'end' and $ARGS[0] ! 'checks' and $ARGS[0] ! 'count' and $ARGS[0]
 			stat['last_man_sex_day'] = daystart
 		end
 		stim['mag'] += 3
-		!! length and girth abilities of vagina are not separated , but I suppose that they are related
-		!! we can estimate difference in girth and length vaginal_girth_difference and vaginal_lenght_difference - names are shortened
-		vgrdif = grange - pcs_vag
-		vltdif = temp_dick - pcs_vag
-		!! negative influence of the difference can be reduced by sex skill and also by PCs horniness, using of a lubricant is not established yet
-		!! I made it as simply as possible so you do not complain about reality, feel free to modify the algorithm
-		!! when the boy is skilled, he can compensate the difference partly
-		vltdif = vltdif / (temp_silavag+1)
-		vgrdif = vgrdif *(5/4 - 1/(4 - temp_silavag))
-		!! when the boy is skilled, he does not harm PC with his long dick
-		if (temp_silavag = 2) and (vltdif > 0): vltdif = 0
-		!! even PC horniness can compensate the difference 
-		if vgrdif > vaginal_slip: vgrdif = vgrdif - vaginal_slip else if (vgrdif > 0): vgrdif = 0
-		if -1*vgrdif > vaginal_slip: vgrdif = vgrdif + vaginal_slip else if (vgrdif < 0): vgrdif = 0
-
-		stim['act'] = 80 - (iif(vltdif>0,vltdif,-vltdif) + iif(vgrdif >0,vgrdif,-vgrdif)) + temp_silavag*8
-		!! if the dick is smaller, it cannot harm PC
-		if vgrdif < 0: vgrdif = 0
-		if vltdif < 0: vltdif = 0
-		!! rough sex always gives pain
-		if arrpos('$ARGS', 'rape') >= 0:             vltdif += rand(temp_dick/9,temp_dick/6)   & vgrdif += rand(grange/5,grange/3)
-		if arrpos('$ARGS', 'rough') >= 0:            vltdif += rand(temp_dick/12,temp_dick/7)  & vgrdif += rand(grange/7,grange/5)
-		if arrpos('$ARGS', 'gangbang') >= 0:         vltdif += rand(temp_dick/15,temp_dick/9)  & vgrdif += rand(grange/10,grange/7)
-		if arrpos('$ARGS', 'beast') >= 0:            vltdif += rand(temp_dick/18,temp_dick/12) & vgrdif += rand(grange/13,grange/9)
-		if pain['vaginal'] > rand(30,50):
-			!! if arrpos('$ARGS', 'group') >= 0:        vltdif += rand(temp_dick/25,temp_dick/15) & vgrdif += rand(grange/18,grange/14)
-			if arrpos('$ARGS', 'maso') >= 0:         vltdif += rand(temp_dick/28,temp_dick/19) & vgrdif += rand(grange/21,grange/17)
-		end
-		if pain['vaginal'] > rand(40,60):
-			if arrpos('$ARGS', 'prostitution') >= 0: vltdif += rand(temp_dick/32,temp_dick/25) & vgrdif += rand(grange/24,grange/18)
-			!! if arrpos('$ARGS', 'unknown') >= 0:      vltdif += rand(temp_dick/34,temp_dick/26) & vgrdif += rand(grange/27,grange/22)
-			if arrpos('$ARGS', 'bound') >= 0:        vltdif += rand(temp_dick/38,temp_dick/29) & vgrdif += rand(grange/32,grange/26)
-			if arrpos('$ARGS', 'sub') >= 0:          vltdif += rand(temp_dick/45,temp_dick/35) & vgrdif += rand(grange/40,grange/32)
-		end
-		!! increase if already in pain
-		vgrdif += rand(pain['vaginal']/10, pain['vaginal']/2)
-		vltdif += rand(pain['vaginal']/10, pain['vaginal']/2)
+		dynamic $get_hole_pain, pcs_vag, vaginal_slip, pain['vaginal'], temp_dick, grange, temp_silavag
+		stim['act'] = 80 - grdif + ltdif + temp_silavag*8
 		!! calculate the harm
-		vgape = iif((vgrdif + vltdif) > 10*vgape,(vgrdif + vltdif)/10,vgape)
+		vgape = min(4, iif((grdif + ltdif) > 3*vgape,(grdif + ltdif)/3,vgape))
 		!! the pain lover the pleasure
-		gs 'pain', (vgrdif + vltdif)/5*max(1,ARGS[1]/5), 'vaginal', 'stretch'
-		stim['act'] = stim['act'] - (vgrdif + vltdif)
+		gs 'pain', grdif+ltdif, 'vaginal', 'stretch'
+		if temp_dick/max(1, temp_silavag) > rand(pcs_vag/2,pcs_vag): gs 'pain', rand(ltdif), 'cervix', 'shock'
+		if grange/max(1, temp_silavag)    > rand(pcs_vag/2,pcs_vag): gs 'pain', rand(grdif), 'labia', 'stretch'
+		if pain_coeff > 0:gs 'pain', rand(pain_coeff)/5, 'clitoris', 'hit'
 		!! force cum leak
-		if ARGS[1] > 0 and cumvol[0] > rand(pcs_vag/2,pcs_vag): gs 'cum_manage', 'cum_decay', (temp_dick+grange)*max(1,ARGS[1]/5)
+		if ARGS[1] > 0 and cumvol[0] > rand(pcs_vag/2,pcs_vag): gs 'cum_manage', 'cum_decay', ((temp_dick+grange)/2)*max(1,stim_time/5)
 		if pcs_vag < temp_dick:pcs_vag += 1
 		if pcs_vag*2 < temp_dick:pcs_vag += 1
-	elseif $ARGS[0] = 'vaginal_finger':
-		orgasm_flag['vaginal'] = 1
-		count['vaginal_finger'] = 1
-		stim['mag'] += 1
-		stim['act'] = 80
-	elseif $ARGS[0] = 'vaginal_fist':
-		pcs_sweat += rand(0,1)*max(1,ARGS[1]/5)
-		orgasm_flag['vaginal'] = 1
-		count['vaginal_fist'] = 1
-		stim['act'] = 70
-		if pcs_vag + vaginal_slip < 30:
-			!! same as for 'vaginal'
-			pcs_vag += 3
-			gs 'pain', (5 - vgape)*max(1,ARGS[1]), 'vaginal', 'stretch'
-			if vgape < 3:vgape = 3
-		end
-	elseif $ARGS[0] = 'self_fisting':
-		orgasm_flag['vaginal'] = 1
-		count['self_fisting'] = 1
-		stim['act'] = 70
-		if pcs_vag + vaginal_slip < 30:
-			!! same as for 'vaginal'
-			pcs_vag += 3
-			gs 'pain', (5 - vgape)*max(1,ARGS[1]), 'vaginal', 'stretch'
-			if vgape < 3:vgape = 3
-		end
 	elseif $ARGS[0] = 'vaginal_dildo':
-		pcs_sweat += rand(0,2)*max(1,ARGS[1]/5)
+		pcs_sweat += rand(0,2)*max(1,stim_time/5)
 		orgasm_flag['vaginal'] = 1
 		count['vaginal_dildo'] = 1
 		stim['mag'] += 1
 		!! the same as for 'vaginal'
-		vgrdif = grange - pcs_vag
-		vltdif = temp_dick - pcs_vag
-		vltdif = vltdif / (temp_silavag+1)
-		vgrdif = vgrdif *(5/4 - 1/(4 - temp_silavag))
-		if (temp_silavag = 2) and (vltdif > 0): vltdif = 0
-		if vgrdif > vaginal_slip: vgrdif = vgrdif - vaginal_slip else if (vgrdif > 0): vgrdif = 0
-		if -1*vgrdif > vaginal_slip: vgrdif = vgrdif + vaginal_slip else if (vgrdif < 0): vgrdif = 0
-		stim['act'] = 80 - (iif(vltdif>0,vltdif,-vltdif) + iif(vgrdif >0,vgrdif,-vgrdif)) + temp_silavag*8
-		if vgrdif < 0: vgrdif = 0
-		if vltdif < 0: vltdif = 0
-		if arrpos('$ARGS', 'rape') >= 0:             vltdif += rand(temp_dick/9,temp_dick/6)   & vgrdif += rand(grange/5,grange/3)
-		if arrpos('$ARGS', 'rough') >= 0:            vltdif += rand(temp_dick/12,temp_dick/7)  & vgrdif += rand(grange/7,grange/5)
-		if arrpos('$ARGS', 'gangbang') >= 0:         vltdif += rand(temp_dick/15,temp_dick/9)  & vgrdif += rand(grange/10,grange/7)
-		if arrpos('$ARGS', 'beast') >= 0:            vltdif += rand(temp_dick/18,temp_dick/12) & vgrdif += rand(grange/13,grange/9)
-		if pain['vaginal'] > rand(30,50):
-			!! if arrpos('$ARGS', 'group') >= 0:        vltdif += rand(temp_dick/25,temp_dick/15) & vgrdif += rand(grange/18,grange/14)
-			if arrpos('$ARGS', 'maso') >= 0:         vltdif += rand(temp_dick/28,temp_dick/19) & vgrdif += rand(grange/21,grange/17)
-		end
-		if pain['vaginal'] > rand(40,60):
-			if arrpos('$ARGS', 'prostitution') >= 0: vltdif += rand(temp_dick/32,temp_dick/25) & vgrdif += rand(grange/24,grange/18)
-			!! if arrpos('$ARGS', 'unknown') >= 0:      vltdif += rand(temp_dick/34,temp_dick/26) & vgrdif += rand(grange/27,grange/22)
-			if arrpos('$ARGS', 'bound') >= 0:        vltdif += rand(temp_dick/38,temp_dick/29) & vgrdif += rand(grange/32,grange/26)
-			if arrpos('$ARGS', 'sub') >= 0:          vltdif += rand(temp_dick/45,temp_dick/35) & vgrdif += rand(grange/40,grange/32)
-		end
-		vgrdif += rand(pain['vaginal']/10, pain['vaginal']/2)
-		vltdif += rand(pain['vaginal']/10, pain['vaginal']/2)
-		vgape = iif((vgrdif + vltdif) > 10*vgape,(vgrdif + vltdif)/10,vgape)
-		gs 'pain', (vgrdif + vltdif)/5*max(1,ARGS[1]/5), 'vaginal', 'stretch'
-		stim['act'] = stim['act'] - (vgrdif + vltdif)
-		if ARGS[1] > 0 and cumvol[0] > rand(pcs_vag/2,pcs_vag): gs 'cum_manage', 'cum_decay', (temp_dick+grange)*max(1,ARGS[1]/5)
+		dynamic $get_hole_pain, pcs_vag, vaginal_slip, pain['vaginal'], temp_dick, grange, temp_silavag
+		stim['act'] = 80 - grdif + ltdif + temp_silavag*8
+		vgape = min(4, iif((grdif + ltdif) > 3*vgape,(grdif + ltdif)/3,vgape))
+		gs 'pain', grdif + ltdif, 'vaginal', 'stretch'
+		if temp_dick/max(1, temp_silavag) > rand(pcs_vag/2,pcs_vag): gs 'pain', rand(ltdif), 'cervix', 'shock'
+		if grange/max(1, temp_silavag)    > rand(pcs_vag/2,pcs_vag): gs 'pain', rand(grdif), 'labia', 'stretch'
+		if ARGS[1] > 0 and cumvol[0] > rand(pcs_vag/2,pcs_vag): gs 'cum_manage', 'cum_decay', ((temp_dick+grange)/2)*max(1,stim_time/5)
 		if pcs_vag < temp_dick:pcs_vag += 1
 		if pcs_vag*2 < temp_dick:pcs_vag += 1
 	elseif $ARGS[0] = 'vaginal_strap':
-		pcs_sweat += rand(1,2)*max(1,ARGS[1]/5)
+		pcs_sweat += rand(1,2)*max(1,stim_time/5)
 		orgasm_flag['vaginal'] = 1
 		count['vaginal_strap'] = 1
-		if stat['think_virgin'] = 1:
+		if virgin_stats['strapon'] = 0 and (stat['think_virgin'] = 1 or pcs_vag = 0):
 			virgin_stats['day_lost'] = daystart
 			virgin_stats['age_lost'] = age
 			virgin_stats['strapon'] = 1
 			$virgin_stats['virgin_taker_ID'] = $boy
-			if birthday = day and birthmonth = month:
-				virgin_stats['birthday'] = 1
-			end
+			if birthday = day and birthmonth = month: virgin_stats['birthday'] = 1
 			!! if dont_know_npc_name
 		end
 		stim['mag'] += 1
 		!! the same as for 'vaginal'
-		vgrdif = grange - pcs_vag
-		vltdif = temp_dick - pcs_vag
-		vltdif = vltdif / (temp_silavag+1)
-		vgrdif = vgrdif *(5/4 - 1/(4 - temp_silavag))
-		if (temp_silavag = 2) and (vltdif > 0): vltdif = 0
-		if vgrdif > vaginal_slip: vgrdif = vgrdif - vaginal_slip else if (vgrdif > 0): vgrdif = 0
-		if -1*vgrdif > vaginal_slip: vgrdif = vgrdif + vaginal_slip else if (vgrdif < 0): vgrdif = 0
-		stim['act'] = 80 - (iif(vltdif>0,vltdif,-vltdif) + iif(vgrdif >0,vgrdif,-vgrdif)) + temp_silavag*8
-		if vgrdif < 0: vgrdif = 0
-		if vltdif < 0: vltdif = 0
-		if arrpos('$ARGS', 'rape') >= 0:             vltdif += rand(temp_dick/9,temp_dick/6)   & vgrdif += rand(grange/5,grange/3)
-		if arrpos('$ARGS', 'rough') >= 0:            vltdif += rand(temp_dick/12,temp_dick/7)  & vgrdif += rand(grange/7,grange/5)
-		if arrpos('$ARGS', 'gangbang') >= 0:         vltdif += rand(temp_dick/15,temp_dick/9)  & vgrdif += rand(grange/10,grange/7)
-		if arrpos('$ARGS', 'beast') >= 0:            vltdif += rand(temp_dick/18,temp_dick/12) & vgrdif += rand(grange/13,grange/9)
-		if pain['vaginal'] > rand(30,50):
-			!! if arrpos('$ARGS', 'group') >= 0:        vltdif += rand(temp_dick/25,temp_dick/15) & vgrdif += rand(grange/18,grange/14)
-			if arrpos('$ARGS', 'maso') >= 0:         vltdif += rand(temp_dick/28,temp_dick/19) & vgrdif += rand(grange/21,grange/17)
-		end
-		if pain['vaginal'] > rand(40,60):
-			if arrpos('$ARGS', 'prostitution') >= 0: vltdif += rand(temp_dick/32,temp_dick/25) & vgrdif += rand(grange/24,grange/18)
-			!! if arrpos('$ARGS', 'unknown') >= 0:      vltdif += rand(temp_dick/34,temp_dick/26) & vgrdif += rand(grange/27,grange/22)
-			if arrpos('$ARGS', 'bound') >= 0:        vltdif += rand(temp_dick/38,temp_dick/29) & vgrdif += rand(grange/32,grange/26)
-			if arrpos('$ARGS', 'sub') >= 0:          vltdif += rand(temp_dick/45,temp_dick/35) & vgrdif += rand(grange/40,grange/32)
-		end
-		vgrdif += rand(pain['vaginal']/10, pain['vaginal']/2)
-		vltdif += rand(pain['vaginal']/10, pain['vaginal']/2)
-		vgape = iif((vgrdif + vltdif) > 10*vgape,(vgrdif + vltdif)/10,vgape)
-		gs 'pain', (vgrdif + vltdif)/5*max(1,ARGS[1]/5), 'vaginal', 'stretch'
-		stim['act'] = stim['act'] - (vgrdif + vltdif)
-		if ARGS[1] > 0 and cumvol[0] > rand(pcs_vag/2,pcs_vag): gs 'cum_manage', 'cum_decay', (temp_dick+grange)*max(1,ARGS[1]/5)
+		dynamic $get_hole_pain, pcs_vag, vaginal_slip, pain['vaginal'], temp_dick, grange, temp_silavag
+		stim['act'] = 80 - grdif + ltdif + temp_silavag*8
+		vgape = min(4, iif((grdif + ltdif) > 3*vgape,(grdif + ltdif)/3,vgape))
+		gs 'pain', grdif + ltdif, 'vaginal', 'stretch'
+		if temp_dick/max(1, temp_silavag) > rand(pcs_vag/2,pcs_vag): gs 'pain', rand(ltdif), 'cervix', 'shock'
+		if grange/max(1, temp_silavag)    > rand(pcs_vag/2,pcs_vag): gs 'pain', rand(grdif), 'labia', 'stretch'
+		if ARGS[1] > 0 and cumvol[0] > rand(pcs_vag/2,pcs_vag): gs 'cum_manage', 'cum_decay', ((temp_dick+grange)/2)*max(1,stim_time/5)
 		if pcs_vag < temp_dick:pcs_vag += 1
 		if pcs_vag*2 < temp_dick:pcs_vag += 1
-	elseif $ARGS[0] = 'vaginal_vibe':
-		orgasm_flag['vaginal'] = 1
-		count['vaginal_vibe'] = 1
-		stim['mag'] += 2
-		stim['act'] = 90
 	elseif $ARGS[0] = 'flashlite':
 		count['flashlite'] = 1
 		stim['act'] = 10
@@ -611,14 +508,14 @@ if $ARGS[0] ! 'end' and $ARGS[0] ! 'checks' and $ARGS[0] ! 'count' and $ARGS[0]
 		count['pee'] = 1
 		stim['act'] = 10
 	elseif $ARGS[0] = 'massage_give':
-		pcs_sweat += rand(3,6)*max(1,ARGS[1]/5)
+		pcs_sweat += rand(3,6)*max(1,stim_time/5)
 		count['massage_give'] = 1
 		stim['act'] = 10
 	elseif $ARGS[0] = 'foreplay_give':
 		count['foreplay_give'] = 1
 		stim['act'] = 20
 	elseif $ARGS[0] = 'cuni_give':
-		pcs_sweat += rand(0,1)*max(1,ARGS[1]/5)
+		pcs_sweat += rand(0,1)*max(1,stim_time/5)
 		count['cuni_give'] = 1
 		stim['act'] = 30
 		stim_les = 1
@@ -632,14 +529,14 @@ if $ARGS[0] ! 'end' and $ARGS[0] ! 'checks' and $ARGS[0] ! 'count' and $ARGS[0]
 		count['anal_fist_give'] = 1
 		stim['act'] = 30
 	elseif $ARGS[0] = 'anal_dildo_give':
-		pcs_sweat += rand(0,1)*max(1,ARGS[1]/5)
+		pcs_sweat += rand(0,1)*max(1,stim_time/5)
 		count['anal_dildo_give'] = 1
 		stim['act'] = 40
 	elseif $ARGS[0] = 'anal_vibe_give':
 		count['anal_vibe_give'] = 1
 		stim['act'] = 40
 	elseif $ARGS[0] = 'anal_strap_give':
-		pcs_sweat += rand(2,4)*max(1,ARGS[1]/5)
+		pcs_sweat += rand(2,4)*max(1,stim_time/5)
 		count['anal_strap_give'] = 1
 		stim['act'] = 40
 	elseif $ARGS[0] = 'vaginal_finger_give':
@@ -655,12 +552,12 @@ if $ARGS[0] ! 'end' and $ARGS[0] ! 'checks' and $ARGS[0] ! 'count' and $ARGS[0]
 		stim['act'] = 50
 		stim_les = 1
 	elseif $ARGS[0] = 'vaginal_dildo_give':
-		pcs_sweat += rand(0,1)*max(1,ARGS[1]/5)
+		pcs_sweat += rand(0,1)*max(1,stim_time/5)
 		count['vaginal_dildo_give'] = 1
 		stim['act'] = 60
 		stim_les = 1
 	elseif $ARGS[0] = 'vaginal_strap_give':
-		pcs_sweat += rand(2,4)*max(1,ARGS[1]/5)
+		pcs_sweat += rand(2,4)*max(1,stim_time/5)
 		count['vaginal_strap_give'] = 1
 		stim['act'] = 70
 		stim_les = 1
@@ -669,7 +566,7 @@ if $ARGS[0] ! 'end' and $ARGS[0] ! 'checks' and $ARGS[0] ! 'count' and $ARGS[0]
 		stim['act'] = 60
 		stim_les = 1
 	elseif $ARGS[0] = 'hj':
-		pcs_sweat += rand(0,3)*max(1,ARGS[1]/5)
+		pcs_sweat += rand(0,3)*max(1,stim_time/5)
 		if temp_unaware = 1:
 			count['hidden_hj'] = 1
 		else
@@ -677,51 +574,28 @@ if $ARGS[0] ! 'end' and $ARGS[0] ! 'checks' and $ARGS[0] ! 'count' and $ARGS[0]
 		end
 		stim['act'] = 25
 	elseif $ARGS[0] = 'bj':
-		pcs_sweat += rand(0,1)*max(1,ARGS[1]/5)
+		pcs_sweat += rand(0,1)*max(1,stim_time/5)
 		if temp_unaware = 1:
 			count['hidden_bj'] = 1
 		else
 			count['bj'] = 1
 		end
 		stim['act'] = 45
+		if pain_coeff > 0:gs 'pain', rand(pain_coeff), 'mouth', 'stretch'
 		if pcs_lipbalm > 0:
-			pcs_lipbalm = max(0, pcs_lipbalm - 1*max(1,ARGS[1]/5))
+			pcs_lipbalm = max(0, pcs_lipbalm - 1*max(1,stim_time/5))
 			if arrpos('$ARGS', 'rape') >= 0 _ 
 			or arrpos('$ARGS', 'rough') >= 0 _ 
 			or arrpos('$ARGS', 'gangbang') >= 0 _ 
 			or arrpos('$ARGS', 'beast') >= 0:
-				pcs_lipbalm = max(0, pcs_lipbalm - 1*max(1,ARGS[1]/5))
+				pcs_lipbalm = max(0, pcs_lipbalm - 1*max(1,stim_time/5))
 			end
 		end
 		if arrpos('$ARGS', 'deepthroat') >= 0:
-			tgrdif = grange - pcs_throat
-			tltdif = temp_dick - pcs_throat
-			tltdif = tltdif / (temp_silavag+1)
-			tgrdif = tgrdif *(5/4 - 1/(4 - temp_silavag))
-			if (temp_silavag = 2) and (tltdif > 0): tltdif = 0
-			if tgrdif > pcs_hydra/10: tgrdif = tgrdif - pcs_hydra/10 else if (tgrdif > 0): tgrdif = 0
-			if -1*tgrdif > pcs_hydra/10: tgrdif = tgrdif + pcs_hydra/10 else if (tgrdif < 0): tgrdif = 0
-
-			stim['act'] = 80 - (iif(tltdif>0,tltdif,-tltdif) + iif(tgrdif >0,tgrdif,-tgrdif)) + temp_silavag*8
-			if tgrdif < 0: tgrdif = 0
-			if tltdif < 0: tltdif = 0
-			if arrpos('$ARGS', 'rape') >= 0:             tltdif += rand(temp_dick/8,temp_dick/5)   & tgrdif += rand(grange/4,grange/2)
-			if arrpos('$ARGS', 'rough') >= 0:            tltdif += rand(temp_dick/10,temp_dick/6)  & tgrdif += rand(grange/6,grange/4)
-			if arrpos('$ARGS', 'gangbang') >= 0:         tltdif += rand(temp_dick/13,temp_dick/8)  & tgrdif += rand(grange/8,grange/6)
-			if arrpos('$ARGS', 'beast') >= 0:            tltdif += rand(temp_dick/16,temp_dick/10) & tgrdif += rand(grange/10,grange/8)
-			if pain['throat'] > rand(30,50):
-				!! if arrpos('$ARGS', 'group') >= 0:        tltdif += rand(temp_dick/23,temp_dick/13) & tgrdif += rand(grange/16,grange/13)
-				if arrpos('$ARGS', 'maso') >= 0:         tltdif += rand(temp_dick/25,temp_dick/16) & tgrdif += rand(grange/19,grange/15)
-			end
-			if pain['throat'] > rand(40,60):
-				if arrpos('$ARGS', 'prostitution') >= 0: tltdif += rand(temp_dick/30,temp_dick/19) & tgrdif += rand(grange/21,grange/17)
-				!! if arrpos('$ARGS', 'unknown') >= 0:      tltdif += rand(temp_dick/32,temp_dick/23) & tgrdif += rand(grange/24,grange/19)
-				if arrpos('$ARGS', 'bound') >= 0:        tltdif += rand(temp_dick/35,temp_dick/26) & tgrdif += rand(grange/29,grange/23)
-				if arrpos('$ARGS', 'sub') >= 0:          tltdif += rand(temp_dick/38,temp_dick/33) & tgrdif += rand(grange/35,grange/28)
-			end
-			tgrdif += rand(pain['throat']/10, pain['throat']/2)
-			tltdif += rand(pain['throat']/10, pain['throat']/2)
-			gs 'pain', (tgrdif + tltdif)/5*max(1,ARGS[1]/5), 'throat', 'stretch'
+			dynamic $get_hole_pain, pcs_throat, pcs_hydra/10, pain['throat'], temp_dick, grange, temp_silavag
+			stim['act'] = 80 - ltdif + grdif + temp_silavag*8
+			gs 'pain', grdif + ltdif, 'throat', 'stretch'
+			gs 'pain', grdif, 'jaw', 'stretch'
 			if pcs_throat < temp_dick:pcs_throat += 1
 			if pcs_throat*2 < temp_dick:pcs_throat += 1
 		end
@@ -729,50 +603,27 @@ if $ARGS[0] ! 'end' and $ARGS[0] ! 'checks' and $ARGS[0] ! 'count' and $ARGS[0]
 	elseif $ARGS[0] = 'dildo_suck':
 		count['dildo_suck'] = 1
 		stim['act'] = 30
+		if pain_coeff > 0:gs 'pain', rand(pain_coeff), 'mouth', 'stretch'
 		if pcs_lipbalm > 0:
-			pcs_lipbalm = max(0, pcs_lipbalm - 1*max(1,ARGS[1]/5))
+			pcs_lipbalm = max(0, pcs_lipbalm - 1*max(1,stim_time/5))
 			if arrpos('$ARGS', 'rape') >= 0 _ 
 			or arrpos('$ARGS', 'rough') >= 0 _ 
 			or arrpos('$ARGS', 'gangbang') >= 0 _ 
 			or arrpos('$ARGS', 'beast') >= 0:
-				pcs_lipbalm = max(0, pcs_lipbalm - 1*max(1,ARGS[1]/5))
+				pcs_lipbalm = max(0, pcs_lipbalm - 1*max(1,stim_time/5))
 			end
 		end
 		if arrpos('$ARGS', 'deepthroat') >= 0:
-			tgrdif = grange - pcs_throat
-			tltdif = temp_dick - pcs_throat
-			tltdif = tltdif / (temp_silavag+1)
-			tgrdif = tgrdif *(5/4 - 1/(4 - temp_silavag))
-			if (temp_silavag = 2) and (tltdif > 0): tltdif = 0
-			if tgrdif > pcs_hydra/10: tgrdif = tgrdif - pcs_hydra/10 else if (tgrdif > 0): tgrdif = 0
-			if -1*tgrdif > pcs_hydra/10: tgrdif = tgrdif + pcs_hydra/10 else if (tgrdif < 0): tgrdif = 0
-
-			stim['act'] = 80 - (iif(tltdif>0,tltdif,-tltdif) + iif(tgrdif >0,tgrdif,-tgrdif)) + temp_silavag*8
-			if tgrdif < 0: tgrdif = 0
-			if tltdif < 0: tltdif = 0
-			if arrpos('$ARGS', 'rape') >= 0:             tltdif += rand(temp_dick/8,temp_dick/5)   & tgrdif += rand(grange/4,grange/2)
-			if arrpos('$ARGS', 'rough') >= 0:            tltdif += rand(temp_dick/10,temp_dick/6)  & tgrdif += rand(grange/6,grange/4)
-			if arrpos('$ARGS', 'gangbang') >= 0:         tltdif += rand(temp_dick/13,temp_dick/8)  & tgrdif += rand(grange/8,grange/6)
-			if arrpos('$ARGS', 'beast') >= 0:            tltdif += rand(temp_dick/16,temp_dick/10) & tgrdif += rand(grange/10,grange/8)
-			if pain['throat'] > rand(30,50):
-				!! if arrpos('$ARGS', 'group') >= 0:        tltdif += rand(temp_dick/23,temp_dick/13) & tgrdif += rand(grange/16,grange/13)
-				if arrpos('$ARGS', 'maso') >= 0:         tltdif += rand(temp_dick/25,temp_dick/16) & tgrdif += rand(grange/19,grange/15)
-			end
-			if pain['throat'] > rand(40,60):
-				if arrpos('$ARGS', 'prostitution') >= 0: tltdif += rand(temp_dick/30,temp_dick/19) & tgrdif += rand(grange/21,grange/17)
-				!! if arrpos('$ARGS', 'unknown') >= 0:      tltdif += rand(temp_dick/32,temp_dick/23) & tgrdif += rand(grange/24,grange/19)
-				if arrpos('$ARGS', 'bound') >= 0:        tltdif += rand(temp_dick/35,temp_dick/26) & tgrdif += rand(grange/29,grange/23)
-				if arrpos('$ARGS', 'sub') >= 0:          tltdif += rand(temp_dick/38,temp_dick/33) & tgrdif += rand(grange/35,grange/28)
-			end
-			tgrdif += rand(pain['throat']/10, pain['throat']/2)
-			tltdif += rand(pain['throat']/10, pain['throat']/2)
-			gs 'pain', (tgrdif + tltdif)/5*max(1,ARGS[1]/5), 'throat', 'stretch'
+			dynamic $get_hole_pain, pcs_throat, pcs_hydra/10, pain['throat'], temp_dick, grange, temp_silavag
+			stim['act'] = 80 - ltdif + grdif + temp_silavag*8
+			gs 'pain', grdif + ltdif, 'throat', 'stretch'
+			gs 'pain', grdif, 'jaw', 'stretch'
 			if pcs_throat < temp_dick:pcs_throat += 1
 			if pcs_throat*2 < temp_dick:pcs_throat += 1
 		end
 		if pcs_throat*3 < temp_dick:pcs_throat += 1
 	elseif $ARGS[0] = 'footjob':
-		pcs_sweat += rand(0,2)*max(1,ARGS[1]/5)
+		pcs_sweat += rand(0,2)*max(1,stim_time/5)
 		if temp_unaware = 1:
 			count['hidden_footjob'] = 1
 		else
@@ -781,7 +632,7 @@ if $ARGS[0] ! 'end' and $ARGS[0] ! 'checks' and $ARGS[0] ! 'count' and $ARGS[0]
 		stim['act'] = 25
 		stim_foot = 1
 	elseif $ARGS[0] = 'titjob':
-		pcs_sweat += rand(3,5)*max(1,ARGS[1]/5)
+		pcs_sweat += rand(3,5)*max(1,stim_time/5)
 		if temp_unaware = 1:
 			count['hidden_titjob'] = 1
 		else
@@ -789,8 +640,9 @@ if $ARGS[0] ! 'end' and $ARGS[0] ! 'checks' and $ARGS[0] ! 'count' and $ARGS[0]
 		end
 		stim['act'] = 45
 		stim_titjob = 1
+		if pain_coeff > 0:gs 'pain', rand(pain_coeff), 'breasts', 'pull'
 	elseif $ARGS[0] = 'BDSM_give':
-		pcs_sweat += rand(0,3)*max(1,ARGS[1]/5)
+		pcs_sweat += rand(0,3)*max(1,stim_time/5)
 		count['BDSM_give'] = 1
 		stim['act'] = 20
 	elseif $ARGS[0] = 'pee_give':
@@ -1119,8 +971,11 @@ if $ARGS[0] ! 'end' and $ARGS[0] ! 'checks' and $ARGS[0] ! 'count' and $ARGS[0]
 	killvar '$orgasm_txt'
 	killvar '$stim_les'
 	killvar '$stim_foot'
-	killvar 'temp_gape'
-	
+	killvar 'stim_time'
+	killvar 'pain_coeff'
+	killvar '$get_hole_pain'
+	killvar 'grdif' & killvar 'ltdif'
+
 	gs 'nichUtil','onArouse',$ARGS[0]
 	
 end
@@ -1204,9 +1059,6 @@ if $ARGS[0] = 'end':
 	killvar 'vaginal_slip'
 	killvar 'ar_vag_lube'
 	killvar '$orgasm_or'
-	killvar 'vgrdif' & killvar 'vltdif'
-	killvar 'agrdif' & killvar 'altdif'
-	killvar 'tgrdif' & killvar 'tltdif'
 
 !!Updating fetish exp for acts carried out and clearing data
 	gs 'arousal', 'checks', 'maso'