# body

!!vhips = derived from salo in body_shape
!!vhtmp = slows the change to vhips in body_shape
!!wratio = waist to hips ratio set in body_shape
!!bratio = band to waist ratio set in body_shape
!!hratio = hip to height ratio set in body_shape
!!vofat = used as a place to put extra salo at extreme high values (i.e. really, really fat) set in body_shape
!!nbsize = starts at a set genetic bust size, but can be adjusted down if salo drops too low
!!magicf2b = set in body_shape for the fat moved to bust
!!genbsize = the set genetic bust size
!!salocatnow = the current category of salo
!!salocatlast = the previous category of salo
!!magf2bdo = flag for magic bust increase; 0, ready; 1, do it; 2, ask; 3, no
!!mgf2bnocnt = used to count the number of times a bust increase was turned down and stop asking after 3
!!magtarcup = set in the dream code as the target cup size 
!!btwarn = used to flag if to display the gaining/losing weight message when bathing
!!salolast = used when doing a soft rest to control the cycling of the main code
!!sftrstflag = used to prevent a code chunk from firing on a soft reset
!!Image set variables
!! bodset = body image and descriptor control variable, used to indicate which image and descriptor set is in use
!! $bodimgsets[x] = body shape descriptors, tens place is the set (using bodset), 0 - 7 the descriptors (using salocatnow), 8 filler, 9 is the folder name
!! bdsetlock = flag to indicate set control override, 0 is use the formula to pick a set, 1 is use a fixed set
!! fixbodset = the identification number of the fixed image set
!! bodsetcnt = the number of sets present
!! imgset6ovr[x] and imgset7ovr[x] = a flag to indicate that an image set (x) has its own image 6 and/or 7
!! extended lash functionality; pcs_lashes = n are: {2, largest natural size}, {3, with temporary false lashes on or basic 2D lash extensions}, {4, with ornate false lashes on or lavish 4D extensions}, {5, with extremely ornate, 6D-style extensions} - xerya

$this = 'body'

if $ARGS[0] = 'RegularUpdate':
	if dounspell = 0:
		gs $this, 'UpdateBodyMeasurement'
		pcs_weight = func($this, 'CalcWeight')
		pcs_bmi = func($this, 'CalcBMI')
	end

	if pcs_skin > 1000: pcs_skin = 1000
	if pcs_skin < 0: pcs_skin = 0
end

if $ARGS[0] = 'DailyUpdate':
	!{
		Update once a day and called from cikl
	}
	if dounspell = 1:
		if strenbuf > 90:
			strenbuf -= 2
		elseif strenbuf > 80:
			strenbuf -= 1
		end
	
		if vitalbuf > 90:
			vitalbuf -= 2
		elseif vitalbuf > 80:
			vitalbuf -= 1
		end
	
		if strenbuf > pcs_stren: strenbuf -= 1
		if strenbuf < pcs_stren: strenbuf += 1
		if vitalbuf > pcs_vital: vitalbuf -= 1
		if vitalbuf < pcs_vital: vitalbuf += 1
		if agilbuf > pcs_agil: agilbuf -= 1
		if agilbuf < pcs_agil: agilbuf += 1
	else
		gs $this
	end

	gs $this, 'UpdateBodyImage'

	!!---- Calculation of lash extension degradation and false lash removal
	if pcs_lashes > 2:
		if lashextensionstyle >= 1:
			lashextensionduration -= 1
			if lashextensionduration >= 1 and lashextensionduration <= 4:
				'It''s time for you to do your maintenance on your lash extensions; you should go to the salon or you risk growing them all out.'
			end
			if lashextensionduration <= 0:
				'You waited too long to do maintenance on your lash extensions; there''s too little there to notice or work with at this point.'
				pcs_lashes = pcs_naturallashes
				killvar 'lashextensionstyle'
				killvar 'lashextensionduration'
				killvar 'lashextensionnew'
			end
		end
		if false_lashes > 0:
			false_lashes -= 1
			if false_lashes = 0:
				'Your false lashes came off in the night; there''s no recovering them now.'
				pcs_lashes = pcs_naturallashes
			else
				'Somehow, your lashes managed to stay attached throughout the night. You might be able to get away with wearing them another day straight.'
			end
		end
	end

	!! Max. Hair length 600mm, or 60cm, which should be somewhere in the lower back area.
	!! Hair grows 1mm each day, it takes 20 months (1 month = 30 days) to regrow the hair from 0.
	if pcs_hairlng < 1001 and hairgrowcht = 0:pcs_hairlng += 1

	! Hair colour change
	if pcs_haircol ! nathcol:
		dyefade -=1
		if dyefade < 0: dyefade = 0
	end

	!!pubic hair colouring
	!! pcs_pubecol = natural colour
	!! pcs_pubecol[1] = flag for saveupdate
	!! pcs_pubecol[2] = actual colour
	!! pcs_pubecol[3] = countdown timer for dye
	if pcs_pubecol[2] ! pcs_pubecol:
		pcs_pubecol[3] -=1
		if pcs_pubecol[3] < 0: pcs_pubecol[3] = 0
		if pcs_pubecol[3] = 0: pcs_pubecol[2] = pcs_pubecol
	end

	if pcs_pubes < 2: pcs_pubecol[2] = pcs_pubecol

	if hscrunch > 0:
		hscrunchrand = rand(1, 100)

		if hscrunchrand <= 8:hscrunch -= 1
	end

	! Leg and pubes hair growth
	if lashair ! 1:
		pcs_leghair += 1
		!!Pubic hair growth at 1/2 per night
		if pcs_pubes['growth'] > 1:
			pcs_pubes['growth'] = 0
			pcs_pubes += 1
		end
		pcs_pubes['growth'] += 1
	end
	
	if age < 18 and rand (0,2) = 0 and pcs_leghair > 0: pcs_leghair -= 1

	if pcs_skin <= 300:
		pcs_skin += min(skinDailyGain * 2, 20) - skinDailyPenalty - 1
	elseif pcs_skin <= 600:
		pcs_skin += min(skinDailyGain, 10) - skinDailyPenalty - 1
	elseif pcs_skin <= 800:
		pcs_skin += min(skinDailyGain/2, 5) - skinDailyPenalty - 1
	elseif pcs_skin <= 900:
		pcs_skin += min(skinDailyGain/3, 3) - skinDailyPenalty - 1
	elseif pcs_skin <= 1000:
		pcs_skin += min(skinDailyGain/5, 2) - skinDailyPenalty - 1
	end
	
	if pcs_teeth < 0:
		!! Daly degradation of perfect white teeth
		tempteeth = 1
		if teeth['caffe_or_tea'] > 8: tempteeth += 1
		if teeth['smoked'] > 1: tempteeth += 1
		tempteeth -= min(3,	teeth['brushed'])
		teeth['degradation'] += max(tempteeth, 0)
		killvar 'tempteeth'
		teeth['brushed'] = 0
		teeth['smoked'] = 0
		teeth['caffe_or_tea'] = 0
	
		if teeth['degradation'] > 60:
			!! After a certain time of not taking care of your teeth you will loose you perfect whit smile.
			teeth['degradation'] = 0
			pcs_teeth = 0
		elseif teeth['degradation'] < 0:
			teeth['degradation'] = 0
		end
	end

	!skin variable reset
	killvar 'moisturizerDailyCount'
	killvar 'skinDailyGain'
	killvar 'skinDailyPenalty'
end

if $ARGS[0] = '':
	!!This controls the gradual change in stat to -buf
	if strenbuf > pcs_stren: strenbuf -= 1
	if strenbuf < pcs_stren: strenbuf += 1
	if vitalbuf > pcs_vital: vitalbuf -= 1
	if vitalbuf < pcs_vital: vitalbuf += 1
	if agilbuf > pcs_agil: agilbuf -= 1
	if agilbuf < pcs_agil: agilbuf += 1

	!!All the ratios were rounded to 2 digits and there are divide 100s at the final calc points
	!!Waist to hip ratio

	wrtemp = ((2 * vitalbuf + strenbuf + agilbuf) /4)

	!!	Primary wratio handling
	if wrtemp < 11:
		wratio = 85 + (11 - (vitalbuf + strenbuf + agilbuf)/3)
	elseif wrtemp < 20:
		wratio = 85
	elseif wrtemp < 35:
		wratio = 85 - (wrtemp - 20) / 3
	elseif wrtemp < 55:
		wratio = 80 - (wrtemp - 35) / 4
	elseif wrtemp < 80:
		wratio = 75 - (wrtemp - 55) / 5
	elseif wrtemp >= 80:
		wratio = 70
	end

	!!	High stat value edge case handling
	if (vitalbuf + strenbuf + agilbuf) /3 > 100: wratio -= ((vitalbuf + strenbuf)/2 - agilbuf)/5

	!!	This is the oops and high stat gone overboard handling
	if wratio < 65: wratio = 65

	killvar 'wrtemp'

	!!For band to waist ratio
	brtemp = (2 * strenbuf + vitalbuf + agilbuf) /4

	if brtemp < 10:
		bratio = 105
	elseif brtemp =< 23:
		bratio = 106
	elseif brtemp =< 80:
		bratio = 106 + (brtemp - 23) / 3
	else
		bratio = 125
	end

	killvar 'brtemp'

	!!For hip to height ratio which is used to set the center point
	hrtemp = (2 * agilbuf + vitalbuf + strenbuf) /4

	if hrtemp < 35:
		hratio = 60
	elseif hrtemp < 45:
		hratio = 59
	elseif hrtemp < 60:
		hratio = 58
	elseif hrtemp < 80:
		hratio = 57
	else
		hratio = 56
	end

	killvar 'hrtemp'

	!!Salo Handling; the first part is because during a reset fat is not used and should be cleared
	if sftrstflag = 1 or cheatNoFat = 1:
		fat = 0
	else
		if fat > (17 + vitalbuf / 25): salo += 1 & fat = 0
		if fat < (-2 - (vitalbuf / 10)): salo -= 1 & fat = 0
		fat = fat/4
	end

	!!This is the salo cap for the weight approximation
	if salo > 250: salo = 250
		
	!!This calculates the current salo category; ranges are 20 points, seemed to balance best if the range is x10 the hip devisor
	:salocatloop
	if salo < 10:
		salocatnow = 0
	else
		salocatnow = 1 + (salo - 10) / 20
	end

	!!This resets the genetic bust size (genbsize) when the cheat is used to reduce breast size (maybe other things later)
	if titreduc = 1:
		killvar 'titreduc'
		if genbsize > nbsize:
			genbsize = 2 + nbsize - nbsize mod 5
		end
	end

	!!This controls the movement of salo to/from bust in order of precedence
	if salobustdo = 0 and nbsize < genbsize and salocatnow > 2:
		if sftrstflag = 0:'<b>Your breasts seem fuller.</b>'
		nbsize += 1
		salo -= 3
		salobustdo = 1
		jump 'salocatloop'
	end

	if salobustdo = 0 and magf2bdo = 1 and salocatnow > salocatlast and pcs_mana >= manamax / 2 and magikDostup = 0:
		if sftrstflag = 0:'<b>Your breasts seem fuller.</b>'
		magicf2b += 1
		salo -= 3
		salobustdo = 1
		if magicf2b >= 2 + magtarcup * 5: magf2bdo = 0
		if pcs_magik < 20:
			pcs_mana -= 2000 / pcs_magik
		else
			mana -= 100
		end
		jump 'salocatloop'
	end

	if salobustdo = 0 and salocatnow < 2 and salocatlast >= 2 and magicf2b > 0 and magikDostup = 0:
		if sftrstflag = 0:'<b>Your breasts seem to be getting smaller.</b>'
		magicf2b -= 1
		salo += 3
		salobustdo = 1
		magf2bdo = 1
		jump 'salocatloop'
	end

	if salobustdo = 0 and salocatnow < 1 and salocatlast >= 1 and nbsize > 0:
		if sftrstflag = 0:'<b>Your breasts seem to be getting smaller.</b>'
		nbsize -= 1
		salo += 3
		salobustdo = 1
		jump 'salocatloop'
	end

	!!This is if a Succubus has salo < 1
	if succubusflag = 1 and salo < 1:
		sucexcess -= 1
		salo += 3
	end

	!!This is if salo is still < 1
	if salo < 1:
		if fat >= 1:
			salo = 1
			fat -= 1
		elseif fat <= 0 and pcs_stren + pcs_vital > 0:
			stren_deg -= 1000
			vital_deg -= 1000
			salo = 1
		else
			if Enable_nogameover = 0:
				over = 3
				gt 'gameover'
				exit
			else
				pl '<font color=red><B>You starved to death, but Cheat Mode keeps you Alive.</B></font>'
				salo = 1
			end
		end
	end

	killvar 'tempvct' & killvar 'salobustdo'

	!!This is the hip calcs, 80 is the center of the current max-min range (10 - 130)
	vhtmp = (salo - 80) / 2
	
	if vhips > vhtmp: vhips -= 1
	if vhips < vhtmp: vhips += 1
	!!	Because a reset should be updating hip size instantly (this set is a bit redundant anyway)
	if sftrstflag = 1: vhips = vhtmp

	if (pcs_hgt * hratio) / 100 + vhips > (pcs_hgt * 72) / 100:
		vofat = ((pcs_hgt * hratio) / 100 + vhips - (pcs_hgt * 72) / 100) / 2
		vhips -= vofat * 2
	end

	!!This will trigger the warning notices in the bathing code (the +/- 12 should always be +/- 11 + the max change to salo w/ fat)
	if salolast > salo and salo <= 12 + (20 * (salocatnow - 1)): btwarn = 1
	if salolast < salo and salo >= (20 * (salocatnow + 1)) - 12: btwarn = 2

	!!This will trigger the dream for the option to use magic to increase bust
	!!Three nos at the dream will lock it out (1 yes resets the count)
	if pcs_magik >= 5 and MagikDostup = 0 and magf2bdo = 0:
		if salolast < salo and salo >= (20 * (salocatnow + 1)) - 11 and tits < 10:
			if mgf2bnocnt < 3:
				magf2bdo = 2
			else
				magf2bdo = 3 & killvar 'mgf2bnocnt'
			end
		end
	end

	!!This is to deal with the possibility that salocatnow changed by more than 1 (fat burners, vitamins, plastic surgery, etc.)
	if salocatnow < salocatlast: salocatlast -= 1
	if salocatnow > salocatlast: salocatlast += 1

	!!This is for use in the warning code and as part of the reset routines
	if salolast > salo: salolast -= 1
	if salolast < salo: salolast += 1

	!!Setting the pcs_apprnc bonus based on fat and strength
	pcs_bmi = FUNC($this, 'CalcBMI')

	!!This is to clean up unused variables
	killvar 'normbuffpick' & killvar 'nrmbfpckct'
	killvar 'vmeat' & killvar 'vfat' & killvar 'Kves' & killvar 'krost'
	killvar 'koefvesbt' & killvar 'koefbt'
end

if $ARGS[0] = 'UpdateBodyMeasurement':
	pcs_hips = (pcs_hgt * hratio) / 100 + vhips
	pcs_waist = (pcs_hips * wratio) / 100 + vofat
	pcs_band = (pcs_waist * bratio) / 100 + vofat
	pcs_bust = (pcs_waist * bratio) / 100 + nbsize + magicf2b + silicone
	pcs_butt = (pcs_hips / 10) + silicone_butt + butt_cheat + pcs_butt_tr
	pcs_cupsize = pcs_bust - pcs_band

end

if $ARGS[0] = 'CalcWeight':
	!{pcs_weight: Svetas weight in kg 
	Optimal Weight (170cm): 60kg, 60 salo
	This is an approximation, so that a sveta with a different height has the same BMI for the same salo values.
	The default height of 170 cm is used as a starting point. The bmi deviates by 0.06 for a deviation of 10cm and 0.4 for a deviation of 20cm.}
	result = 30 + salo / 2 + (pcs_hgt - 170) * 7 / 10

	!{Do not remove (julzor)
	This is the old more complex function, but it doesn''t work correctly.
	This variable is actually only used ONCE (except for the BMI calculation), when stripping, to see if you fall off the pole from being too heavy. I am reluctant to touch it, since the math is not explained. Maybe later.
	Weight = (height in cm x bottom of average weight in kilos for a 170cm female / 170cm + (hip modifier + 2 x overrun fat)/4 + cup size}
	
	!result = (pcs_hgt * 62 / 170) + (vhips + (vofat * 2)) / 4 + tits
end

if $ARGS[0] = 'UpdateBodyImage':
	!Update body image set
	if dounspell = 1:
		salocatnow = (pcs_hips / 10) - 5
		if bdsetlock = 0:
			if (knowpreg = 1 or (preg = 1 and thinkpreg = 1) or (preg = 1 and PregChem > 3600)):
				bodset = 3
			elseif strenbuf >= 100 and stren_plus_lvl > 0:
				bodset = 2
			elseif strenbuf <= 50:
				bodset = 0
			else
				bodset = 1
			end
		else
			bodset = fixbodset
		end
	elseif (knowpreg = 1 or (preg = 1 and thinkpreg = 1) or (preg = 1 and PregChem > 3600)) and bodet ! 3 and bdsetlock = 0:
		bodset = 3
	elseif preg = 0 and bdsetlock = 0:
		if strenbuf >= 100 and stren_plus_lvl > 0:
			bodset = 2
		elseif strenbuf <= 50:
			bodset = 0
		else
			bodset = 1
		end
	end

	! Update body description
	if (knowpreg = 1 or (preg = 1 and thinkpreg = 1) or (preg = 1 and PregChem > 3600)) and bodset = 3:
		if PregChem > 6216:
			$body = $bodimgsets[((bodset * 10) + 8)]
		elseif PregChem < 2688:
			$body = $bodimgsets[(bodset * 10)]
		else 
			$body = $bodimgsets[((bodset * 10)+((PregChem - 2184)/504))]
		end
	elseif salocatnow <= 7:
		$body = $bodimgsets[((bodset * 10) + salocatnow)]
	else
		$body = $bodimgsets[((bodset * 10) + 7)]
	end
end

if $ARGS[0] = 'CalcBMI':
	result = 10000 * (30 + salo / 2 + (pcs_hgt - 170) * 7 / 10) / (pcs_hgt * pcs_hgt)
end

if $ARGS[0] = 'SkinGain':
	if $ARGS[1] = 'CleanSelf' and lastShowerSkinGain ! daystart:
		lastShowerSkinGain = daystart
		skinDailyGain += 5 
		!!needs to be changet to +3 when the bathLuffa in added.
		!!if bathLuffa = 1: skinDailyGain += 2
	end

	if $ARGS[1] = 'Moisturizer':
		moisturizerDailyCount += 1
		if moisturizerDailyCount <= 2: skinDailyGain += 2
	end
end

if $ARGS[0] = 'SkinLoss':
	if $ARGS[1] = 'Smoke' and lastSmokeSkinPenalty ! daystart:
		lastSmokeSkinPenalty = daystart
		skinDailyPenalty += 1
	end

	if $ARGs[1] = 'MakeUpSleep':
		skinDailyPenalty += 10
	end
end

if $ARGS[0] = 'softreset':
	!!This is for use in immediately updating shape if something has caused a large change in salo, primarily fat burners and plastic surgery
	sftrstflag = 1
	:resetloop
	if salo ! salolast:
		if gmstrtflag = 1: salobustdo = 1
		gs 'body'
		jump 'resetloop'
	end
	!!Updates pcs_apprncbase after a reset
	gs 'AppearanceSystem', 'UpdateBaseAppearnce'
	!!Clears the warning and reset status flags if they were set
	sftrstflag = 0
	btwarn = 0
end

if $ARGS[0] = 'hardreset':
	!!This is primarily for canceling out "dounspell" and setting salo to whatever value will result in the current hip size then balancing everything out.
	!!Also could be built in as a means to in-game undo "dounspell", other than the cheat.
	if dounspell = 1 and dounsplkil > 0:
		salo = 12
		fat = 0
		agilbuf = pcs_agil & strenbuf = pcs_stren & vitalbuf = pcs_vital
		salobustdo = 1 & sftrstflag = 1 & normbuffpick = -1
		gs 'body'
		salo = (pcs_hips * 2) - ((pcs_hgt * hratio) / 50) + 80
		if salo < 10:
			salocatnow = 0
		else
			salocatnow = 1 + (salo - 10) / 20
		end
		salocatlast = salocatnow
		salolast = salo
		vhtmp = (salo - 80) / 2
		vhips = vhtmp
		if genbsize = 0 and nbsize > 0:
			If nbsize >= 27:
				genbsize = 27
			else
				genbsize = 2 + nbsize - nbsize mod 5
			end
		elseif genbsize = 0 and nbsize = 0 and silicone >= 20:
			genbsize = 12 & nbsize = 12 & silicone -= 10
		end
		sftrstflag = 0 & normbuffpick = 0 & btwarn = 0 & magf2bdo = 0
		killvar 'dounsplkil'
		newbdsp = 1
		dounspell = 0
		gs 'AppearanceSystem', 'UpdateBaseAppearnce'
		gs 'body'
		gs 'stat'
	else
		'If you''re seeing this, something odd happened. Please make a bug report that the body shape hard reset improperly triggered and what you were doing.'
	end
end

if $ARGS[0] = 'initial':
	!!	Sets the genetic bust size if it was not set in the start routines
	if genbsize = 0:
		genbsize = 12 & nbsize = 12
	else
		nbsize = genbsize
	end
	agilbuf = pcs_agil & strenbuf = pcs_stren & vitalbuf = pcs_vital
	normbuffpick = -1 & gmstrtflag = 1
	!!	Calling soft reset will cause the main code to cycle up to the starting value of salo
	gs 'body', 'softreset'
	!!	This sets/resets the controler variables
	salocatlast = salocatnow
	normbuffpick = 0 & magf2bdo = 0
	killvar 'gmstrtflag'
	newbdsp = 1
	!!	This does all the body shape setting before the first stat call
	gs 'body', 'UpdateBodyMeasurement'
	pcs_weight = func($this, 'CalcWeight')
	pcs_bmi = func($this, 'CalcBMI')
	gs 'body', 'UpdateBodyImage'
	gs 'body_desc', 'BMI'
end

--- body ---------------------------------

