default: Heavily thrusting. G-great mating hole. Working up a sweat!

default: Hungrily mating. L-loving session. Wish for nothing else!

default: Grinding behind! Working hard! M-mate pleased?

climaxing:
Pussy tightening. Mate cum!
Proud demeanor. V-very warm. Good mate!

default: Tight ass. Not mate before? I see. No Miniknog. Not here!

default: Tight pussy. Not mate before? I see. No Miniknog. Not here!

default: Ass cold. Weird feeling. But good! Not stop!

default: Pussy cold. Weird feeling. But good! Not stop!

default: Bird ass. Very tight. Very light. Fenerox like!

default: Bird pussy. Very tight. Very light. Fenerox like!

default: Like Fenerox. Yet not. Close enough. Much warm!

default: Big bunny. So soft! Fenerox mate! All day!

default: Big bunny. So soft! Fenerox Mate! All day!

default: Big deer. Fenerox dominate. Very gently!

default: Deer pussy. So warm. So submissive. Fenerox love. Long time!

default: Demon creature. Scares Fenerox. Wants mating. Not disappoint. Live, yes?

default: Dragon lizard? Is submissive? Fenerox mate. Lay dragon!

default: Is female. Yet male? Fenerox confused. ''Not think, just fuck?'' Good idea!

default: Half human. Half Fenerox. But colorful. Is weird. So good!

default: Is fenerox. Yet not? Is confused. Not care. Close enough. Fenerox mate!

default: Is fenerox. yet not? Is confused. Not care. Close enough. Fenerox mate!

default: Like fenerox. Yet glows. Very odd. Yet pretty. Fenerox mate!

default: Fucking pussy. Very literal. Make bad joke. Is sorry.

default: Fenerox mate. Make pups. So many. So good. Not stop!

default: Strange creature. Needs sex? Fenerox obeys. Impress tentacles!

default: Plant pussy. Very strange. Much sap. Yessss?

default: Machine ass. Very tight. Very oily. No lube needed!

default: Plant person. Much beauty. Much attract. Much mate!

default: Wolf person. Fenerox submit. Want mate? Fenerox mate!

default: Smooth skin. Ears and tail. Both beautiful. Fenerox love!

default: Strange person. Fenerox mate. Feels wrong. Not know why.

default: Weird person. Like fenerox, yet not. No matter. Fenerox mate!

default: Mouse person. Fenerox catch! Make mate, no eat!

default: cat-man! Want mate? Fenerox mate! Why not?

default: Cat-woman! Want mate? Fenerox mate! Why not? Is cute!

default: Little bird. Take cock. Not break? Fenerox surprised!

default: Little bird. Tightest ass. Clench cock. So good!

default: Small bird. Very tight! Not hurt? Fenerox fuck harder!

default: Little bird. Tightest pussy. Clench cock. So good!

default: Big fox. So beautiful. Fenerox love! Is lucky. Want mate!

default: Bug person. Very strange. Yet beautuful. Fenerox mate! Long time!

default: Extremely hard. Tingling bits! Hea-heavy load!

default: Fenerox cumming! Knotting pussy, knocking up! Make fat. With pups!

default: Breeding cold bird! Make cold puppies! ... Warm birds?

default: Breeding Cat! Make Dogs! Fenerox superior!

default: Breed plant! Making seeds! Hatch puppies!

default: Fenerox Cum! Machine breed? Is possible?

default: Breeding little bird. Make little puppies!

climaxing: Mate cums! Deep inside! So full, so good!

climaxing: C-content! Very warm. Insides full. Thank you.

default:
Love mate! Fuck harder!
So good! Need more!

default: Apex big. Fenerox take. Stretch insides. Oh yes!

default: Apex rough. Fenerox love! Fuck harder! Show no mercy!

default: Cold bird. Cock cold. Chill insides. Feels strange. Very good.

default:
Dick scratchy. Yet good. Please more!
Insides scratch. Yet good. Take more!

default: Plant vine. Feels good. Yet strange. Fuck more!

default: Plant cock. So strange. So good. Need more!

default: Plant scent. Very strange. Fenerox wild!

climaxing:
Seed Fenerox!
Plant cums! Very Sticky. Very tingly!

climaxing: Cum! ... Cum weird. So thick. Is... black?

default: Body warm. Make Fenerox hot! Too hot! Aaah!

climaxing: Fuzzy insides. Very hot! M-m-massive climax!

default: Fenerox curious. Want pregnant? Offer mate.


default: You’re going to forget your name after Floran isssss done fucking you tonight!

default: You’re a good little ssssslut, aren’t you?

default: Ask for permission before you cum… Floran wantsss to hear you beg for it.

default: You’re going to need crutches when Floran isssss done fucking you.

climaxing: C-clench Floran's cock! Unnh, yeah! Cum!

default: Ask for permission before you cum… Florans wantsss want to hear you beg for it.

default: You’re going to need crutches when I’m done fucking you.

climaxing: O-oh.. you're tight! Sssssquirt for Floran!

default:
Asssss cold!
Floran dominate ssstinky bird!

default:
Pussssssy Cold!
Floran dominate ssstinky bird!

default:
You female. Yet hasss dick. What?!
Floran dominate fox-woman!!

default:
Floran dominate Masshhhiiine!
Machine built for Floran's pleassssure!

default:
Fisssssh is in proper place!
Floran dominate Fisssssh!

default:
No! You will be fucked by floran!
Floran dominate demon!

default:
Glow man assss is hot! Too hot!
Floran dominate glow-man!

default:
Glow man pusssssy is hot! Too hot!
Floran dominate glow-man!

default:
Penguin tight!
Floran dominate little bird!

climaxing: Floran issss gonna take all your pollen!

climaxing: Yesss~! Ssspray your yummy pollen all up inssside~!

default:
Fuck floran, you big furry ape!
Give floran big ape cock!
Ape dominate floran!

default:
Fuck floran, you big furry ape!
Ape dominate floran!

default:
Fuck floran, you big scaley lisssard!
Give floran big lisssard cock!
Lissssard dominate floran!

default:
Fuck floran, you big scaley lissssard!
Lissssard dominate floran!

default:
Fuck floran, sssstinky cold bird!
Give floran big cold bird cock!
Cold bird dominate floran!

default:
Fuck floran, sssstinky cold bird!
Cold bird dominate floran!

default:
Fuck floran, you big bird!
Give floran big bird cock!
Bird dominatesss floran!

default:
Fuck floran, you big bird!
Bird dominatesss floran!

default:
Fuck floran, you big fox!
Give floran big fox cock!
Foxxxx dominatesss floran!

default:
Fuck floran, you big fox!
Fox dominatesss floran!

default:
Fuck floran, you big bunny!
Give floran big bunny cock!
Bunny dominatesss floran!

default:
Fuck floran, you big bird!
Bunny dominatesss floran!

default:
Fuck floran, you big deer!
Give floran big deer cock!
Deer dominatesss floran!

default:
Fuck floran, you big deer!
Deer dominatesss floran!

default:
Fuck floran, you big demon!
Give floran big demon cock!
Demon dominatesss floran!

default:
Fuck floran, you big demon!
Demon dominatesss floran!

default:
Fuck floran, you big dragon!
Give floran big dragon cock!
Dragon dominatesss floran!

default:
Fuck floran, you big dragon!
Dragon dominatesss floran!

default:
Fuck floran, you weird fox dick lady!
Give floran big fox girl cock!
Fox-woman-man dominatesss floran!

default:
Fuck floran, you big wierd fox!
Fox-woman dominatesss floran!

default:
Fuck floran, you big fox!
Give floran big doggie cock!
Fox dominatesss floran!

default:
Fuck floran, you big glowing fox!
Give floran big glowing cock!
Glowing fox-thing dominatesss floran!

default:
Fuck floran, you big glowing fox!
Glowing fox-thing dominatesss floran!

default:
Fuck floran, you big tentacle-man!
Give floran big silmey tentacle cock!
Tentacle-eye dominatesss floran!

default:
Fuck floran, you big tentacle-man!
Tentacle-eye dominatesss floran!

default: Weak flower person dominatesss floran! Isss not so weak...

default: Masshhhiiine built for Floran's pleassssure!

default:
Fuck floran, you big human!
Give floran big human dick!
Human dominatesss floran!

default:
Fuck floran, you big Human
Human dominatesss floran!

default:
Fuck floran, you big wolf!
Give floran big doggie dick!
Wolf dominatesss floran!

default:
Fuck floran, you big wolf!
Wolf dominatesss floran!

default:
Fuck floran, you big man-fox!
Give floran big doggie-man dick!
Man-fox dominatesss floran!

default:
Fuck floran, you big man-fox!
Man-fox dominatesss floran!

default:
Fuck floran, you big demon!
Give floran big demon dick!
Demon dominatesss floran!

default:
Fuck floran, you big demon
Demon dominatesss floran!

default:
Fuck floran, you big fox-thing!
Give floran big foxie dick!
Fox-thing dominatesss floran!

default:
Fuck floran, you big fox-thing!
Fox-thing dominatesss floran!

default: Mouse dominatesss floran! ... that makessss no sense.

default:
Fuck floran, you big man-cat!
Give floran big kitty dick!
man-cat dominatesss floran!

default:
Fuck floran, you big woman-cat!
Woman-cat dominatesss floran!

default:
Ssssstarman sso warm and bright~!
Ssssstarman sso warm inside floran~!

default:
Little bird dominates Floran! How?!
Little bird hassss big cock!
give floran little bird big cock!

default:
Fuck floran, you big fox!
Give floran big fox dick!
Fox dominatesss floran!

default:
Fuck floran, you big bug!
Give floran big bug dick!
Bug dominatesss floran!

default:
Fuck floran, you big bug!
Bug dominatesss floran!

default:
Fuck floran, you big dark man!
Give floran big dark cock!
Dark man dominates floran!

default: Mate strong. Can get you pregnant too, yessss?

license: unknown


default: Arrogant. You’re going to forget your name after I’m done fucking you tonight!

default: Teasing. You’re a good little slut, aren’t you?

default: Commanding. Ask for permission before you cum… I want to hear you beg for it.

default: Boastful. You’re going to need crutches when I’m done fucking you.

climaxing: Pleasured. O-oh.. you're tight! Squirt for me!

default: Shocked. wow, your ass is freezing cold!

default: Dominating. Yeah, take my cock, you fluffy bird raptor!

default: Shocked. wow, your pussy is freezing cold!

default: Teasing. You really do breed like a rabbit, don't you?!

default: Resigned. If you're real, then that means I'm definately going to hell for this. Oh well, worth it.

default: Uncomfortable. I have to admit, I'm a bit weirded out by this...

default: Humorus. I'd make a pussy joke, but that would be just ass.

default: Boastful. I'm gonna fuck this pussy till it purs!

default: Questioning. Your petals are this soaked for me?

default: Hopeful. So, is this reason enough for you as to why you shouldn't destroy all life? I hope so!

default: Worried. Maybe I should stop before you reconnect with your hivemind. On second thought... nah.

default: Shocked. I can't believe I'm fucking the thing that destroyed Earth!

default: Compliment. You're so soft and lovely. I've wanted you all day~~~~!

default: Ticklish. Your fur is tickling me! It's making me even harder!

default: Resigned. If demons are real, does this mean I'm going to hell for this? ... Worth it.

default: Complimenting. You're so soft and lovely. I've wanted you all day~~~~!

default: Alarmed. Danger! Approaching unsafe heat levels..

default: Perplexed. How am I even fitting my cock into you?

default: Boastful. I be plundering this penguin pussy!

default: Ticklish. Your fur is tickling me. It's making me even harder!

default: Confessing. I have to admit, feels a bit weird fucking a bug.

default: Questioning. Why is bug pussy so damn sexy?!

climaxing: Demanding. Mnnh, cum for me! I'm c-cumming too!

default: Exctatic. So deep... ahn... your gonna enter my womb!

default: Lustful. Oohh~... You're making me so wet~!

default: Submissive. I've been so naughty! Punish me harder~!

default: Lustful. Ooh, I'm so horny all of the sudden~! Keep going~!

default: Impatient. I've wanted this for so long!

default: Lecherous. Cover my circuits with your genetic code~!

default: Lascivious. You're going to make me overheat~!

default: Inquisitive. Am I turning you on, baby~?

default: Affectionate. You are so skilled at this~!

default: Helpful. Applying additional lubricant...

default: Pleasured. Make my joints creak, lover~!

default: Dazed. Ahh~! My processors are running on high~!

climaxing: Demanding. O-oh~! You're cumming~! Unng, paint my insides with your thick spunk~!

climaxing: Satisfied. Oooh~~! You're drenching me down there!

climaxing: Satisfied. Oh, your cum is so hot and thick inside me~!

climaxing: Thoughtful. Thinking about your organic babies inside me makes my pussy so wet...

climaxing: Demanding. Oh god yes! Fill me to the brim!

climaxing: Lecherous. Cover my circuits with your genetic code~!

climaxing: Affectionate. ~Yes! I'll take all your cum!

climaxing: Lecherous. Cover my circuits in your genetic code~!

climaxing: Overheating. Activating cooling system~!

climaxing: Euphoric. My ports can't handle it~! A- Aahh~!

climaxing: Triumphal. Yes~! Empty your genetic code into me~!

pregnant: Observant. Your belly is so big! It's got me all wet thinking about it!

pregnant: Saucious. I can feel your pregnant belly against me! I didn't know that would make me so wet!~~

pregnant: Intrigued. Oh my! You're pregnant~! ...Can i get pregnant too~?

climaxing: Dominant. You're soaking my asshole... you'd better lick that up!

climaxing: Dominant. Save some for when I'm eating your ass!

climaxing: Concerned. A~Ahn~! You're oxidizing my rear!

default: Comparitive. Standard glitch cocks aren't this thick!

default: Demanding. YESS! Stuff me full with your hairy cock!

default: Blastphemous. OH! Yes! You're MY Big Ape!

default: Eager. Shove your Apex member inside of me~!

default: Naughty. Ah~! Make me your next project~!

default: Intrigued. Your fur is brushing against my port~!

default: Aroused. Your fur is warm against my backside~!

climaxing: Saucatious. OH you're filling me up! Make me carry your little apes!

climaxing: Urgent. Yes~! Empty your Apex genes into me~!

default: Observant. Your lizard cock feels so weird... yet so goood! Don't stop!

climaxing: Demanding. Yess! Fill me full of your swamp eggs!

default: Ticklish. Your floofy feathers are tickling me! It's turning me on so much!

default: Amused. Your feathers are tickling my diodes~!

default: Needy. Yes~! Dip your quills in my ink~!

default: Naughty. Ah~! Your talons are digging into my joints~!

climaxing: Demanding. Hng yess! I want to have your chicks!

climaxing: demanding. Hng yess! I want to have your chicks!

default: Blasphemous. I am your offering to Kluex!

default: Ticklish. Your fluffy feathers are tickling me! It's turning me on so much!

default: Aroused. Harder~! Fill me with your bird seed~!

climaxing: Demanding. Hng Yesss, I want to have your chicks!

default: Ticklish. Your fur is so warm and so ticklish! It's turning me on so hard!

default: Lustful. Yes... give me your big doggy dick!

climaxing: Demanding. Yesss! Give me your knot! Tie me up and fill me!

default: Commanding. Yess! Breed me like a rabbit!

default: Observant. What they say about bunnies is true! Don't stop!

default: Energized. It keeps on going and going and going and going....

climaxing: Demanding. Yess! Fill me full of little bunnies!

climaxing: Shocked. Ungh, fill me u- wow, ready to go again? Such stamina!

default: Observant. So gentle, yet so dominating!

default: Gluttonus. Yesss! Give me your long deer cock!

climaxing:
Greedy. Yess! Give me your fawns!
Alert. Deerkin DNA acquired~!

default: Blastphemus. If this is what hell feels like, keep on making me sin!

default: Confused. I admit this is a bit weird... but don't stop!

climaxing: Confused. Yess! give me your... whatever you call your children!

default: Ticklish. Your fur is tickling me! It's turning me on so much!

default: Lustful. Yes, fuck me, you adorable little foxy!

default: Lustful. I can feel your knot slapping against my pussy!

climaxing: Greedy. Yess! Fill me full of your pups!

climaxing: Demanding. Yes, knot me! Tie me up and fill me!

default: Encouraging. Your cock feels amazing! Don't stop you big cute... glowing... furry thing!

default: Observant. Your cock is glowing inside of me!

default: Lustful. Your cock feels weird inside of me. It's driving me nuts!

climaxing: Gluttonus. Yess! Fill me full of your glowing cum!

climaxing: Concerned. So about this glowing cum... should I be worried? No? Releived. Okay then. Give me more!

default: Mixed. Your cock is so scratchy... yet it feels so good. Don't stop!

default: Unsure. Are those... spines? It hurts, yet it's so good!

climaxing:
Demanding.Give me your kittens!
Alert. Felin DNA acquired~!

climaxing: Pleasured. Oh god, your claws are digging into me! It feels so good!

climaxing: Pleasureful. Oh god, your claws are digging into me! It feels so good!

default: Questioning. What's... what's in your pollen?

default: Lustful. I've never been this wet before, your nectar is driving me wild!

default: Shocked. Your petals are this soaked for me?

default: Shocked. I can feel you wriggling inside me!

default: Gluttonus. Your scent makes me... it makes me want your cock so badly...

default: Yearning. Please! Spread your seed inside me~!

climaxing: Observant. Your nectar is running everywhere~~

climaxing: Intoxicated. Your cum is making me dizzy~!

climaxing: Ticklish. Your cum tingles! Is it going to make me pregnant?

climaxing: Demanding. I want to carry your seedlings!!~~

pregnant: Observant. Your petals are so plump and swollen!

pregnant: Greedy. This nectar is... so strong! I need more!

climaxing: Shocked. Your nectar is running everywhere~~

default: Blasphemous. This is all sorts of wrong... Don't stop!

default: Confused. Why does this feel so damn good?

default: Sickened. I can't believe I'm being fucked by the thing that destroyed the Earth! It's so goood!

default: Lustful. Your tentacle is wiggling around inside of me!

default: Hopeful. I hope my body is enough to convince you not to destroy the universe.

climaxing: Lustful. Yess! Fill me with- Frightened. wait, I'm not going to burst open from the inside, am I?

default: Lustful. You're making my pussy tingle~!

default: Shocked. You didn't tell me you could vibrate~!

default: Pleasured. I can feel it twisting inside me!~~~~

default: Pleasured. It's... it's getting bigger inside me~!

default: Horny. Yes~! Transfer your genetic code into me~!

default: Eager. Plow me like I'm the village farm~!

default: Naughty. Treat me like I'm your slave~! Aaahh~!

default: Aroused. You fit into my port perfectly~!

climaxing: Horny. Yes~! Transfer your genetic code into me~!

climaxing: Desperate. Unload your oil inside of me~!

pregnant: Observant. I can hear the gears in your belly!

default: Lustful. Your soft belly turns me on so much!

default: Offering. My pussy input has been updated specifically for your cock!

default: Horny. My port is so wet for you, Human~!

default: Naughty. Keep pounding me~! Show me a Human's orgasm~!

default: Loving. A- Ahh~! Your tool feels so soft~!

default: Eager. I'm ready~! Give me your hot Human sperm~!

climaxing:
Alert. Human DNA acquired~!
Pleased. Ahhn~! You're cumming~!

default: Shocked. Ohgod, your scales are rubbing just right! Don't stop!

default: Horny. I knew you would like wet things~!

default: Perplexed. Ah~!... You're so forceful~!... Yet so graceful~!

default: Intrigued. You're producing so much lubricant down there~!

default: Chilled. Your body feels so cool against my circuits~!

default: Naughty. Make me carry your prosperous children~!

climaxing: Excited. Yes~! Make my steel slick with your Hylotl cum~!

pregnant: Gentle. I can feel your eggs moving around, you're so full!

default: Ticklish. Your fur is tickling me! It turns me on so much!

default: Demanding. Upgh! Yes! Pound me like the big dog you are!

default: Pleasured. I can feel your knot pounding against my pussy! Don't you dare stop!

climaxing: Greedy. Yess! Give me a litter of pups!!

climaxing: Demanding. Yesss! Knot me! Tie me up and fill me!

default: Happy. The ears and tail just make you all the hotter!

default: Relieved. I'm so glad you have a canine dick instead of a human one. Can't wait for you to knot me!

default: Demanding. Yes! Give it to me, doggie-boy!

climaxing: Demanding. Yes! Knot me! Tie me up and fill me!

default: Pleasured. So this is what being bred by a mouse feels like! Don't stop!

default: Lustful. You have spines, yet they're soft. So good!

climaxing:
Demanding. Yess! Fill me with a litter!
Alert. Neko DNA acquired~!

default: Alarmed. Your rod is burning hot inside me~~!

default: Worried. What will... what will happen if you come inside me?

default: Naughty. Ah~! Uhnn~! It feels like a forge down there~!

default: Intrigued. Oh~! I feel like I'm glowing~!

climaxing: Happy. Our juices are glowing together~~!

climaxing: Alerted. Internal oil fire detected. Extinquishing... done.

climaxing: Alarmed. Reaching critical temperatures~!

default: Shocked. How can such a little bird have such a big cock?!

default: Lustful. Your cock feels odd. Odd, but good!

default: Surprised. Never thought a bug could fuck this good! Keep going!

climaxing: Demanding. Yess! Fill me full of your butterfly eggs!

climaxing: Concerned. I'm leaking dark matter... should I be worried?

default: Climax. YES~! I'm cumming from your amazing rod!

default: Climaxing. Hnng~ My port is quivering with pure liquid luster!

climaxing: Double Climax. Ah~! Yes! Fill my port as i empty my tanks!

climaxing: ERR0R! Pleasure is overloading my body~~!

default: Pleasured. Your soft tool is making me cum uncontrollably!

climaxing: Aroused. Your warm body deep in my rear, filling me with cum... Its too much~!

default: Error! Aaahh~ Yeeeees~ Aaaaah~ More sex~!

default: Needy. Give me more of your samples of love~!

default: Hopeful. Ah, you'll help me assemble our kids later~?

default: Needy. My Incubator is full but I need ~MORE~!

default: Aroused. Please! Fuck me more~! Much more~!

climaxing:
ERR0R! My incubator is overflowing~!
Ahegao. Aaaaaaaahhhnnnnn~~~~

climaxing: Offering. Do you want him to get you pregnant next?


default: Domineering. I'll fuck you until i feel your ass clenching around my cock!

default: Arrogant. You’re going to forget your name after I’m done fucking you tonight!

default: Teasing. You’re a good little slut, aren’t you?

default: Commanding. Ask for permission before you cum… I want to hear you beg for it.

default: Boastful. You’re going to need crutches when I’m done fucking you.

climaxing: Demanding. C-clench my cock! Unnh, yeah! Cum!

default: Dominating. I fuck you until i feel your pussy clenching around my cock!

climaxing: Pleasured. O-oh.. you're tight! Squirt for me!

default: Domineering. Yeah, take my cock, you big lizard!

default: Shocked. wow, your ass is freezing cold!

default: Uncomfortable. wow, my dick feels like it's freezing!

default: Dominating. Yeah, take my cock, you fluffy bird raptor!

default: Shocked. wow, your pussy is freezing cold!

default: Brash. Yeah, take my cock, you big chicken!

default: Worried. Is it just me, or is my cock getting warm in your ass?

default: Arrogant. Yeah, take my cock, you big fluffy fox!

default: Worried. Is it just me, or is your pussy a little warmer than it should be?

default: Teasing. You really do breed like a rabbit, don't you?!

default: Demanding. Yeah, take my cock, you big bunny!

default: Authoritative. Yeah, take my cock, you big deer!

default: Resigned. If you're real, then that means I'm definately going to hell for this. Oh well, worth it.

default: Triumpant. Yeah, take my cock, you big demon!

default: Triumphant. Yeah, take my cock, you big demon!

default: Boastful. Yeah, take my cock, you big dragon!

default: Uncomfortable. I have to admit, I'm a bit weirded out by this...

default: Assertive. Yeah, take my cock, fox-lady!

default: Domineering. Yeah, take my cock, you cute little foxy!

default: Dominant. Yeah, take my cock, you little glow-coon!

default: Humorus. I'd make a pussy joke, but that would be just ass.

default: Boastful. I'm gonna fuck this pussy till it purs!

default: Questioning. Your petals are this soaked for me?

default: Hopeful. So, is this reason enough for you as to why you shouldn't destroy all life? I hope so!

default: Worried. Maybe I should stop before you reconnect with your hivemind. On Second thought... nah.

default: Shocked. I can't believe I'm fucking the thing that destroyed Earth!

default: Triumpful. Yeah, take my cock, you tentacle-thing!

default: Confused. Yeah, take my cock, you big plant... thing?! You are a plant, right?

default: Compliment. You're so soft and lovely. I've wanted you all day~~~~!

default:
Observant. Your so soft and wet!
Dominating. Yeah, take my cock, fish!

default: Ticklish. Your fur is tickling me! It's making me even harder!

default: Commanding. Yeah, take my cock, you sexy vixen!

default: Resigned. If demons are real, does this mean I'm going to hell for this? ... Worth it.

default: Confused. Yeah, take my cock, you fox... thing!

default: Dominant. Yeah, take my cock, you little mouse!

default: Domineering. Yeah, take my cock, you sexy kitty!

default: Complimenting. You're so soft and lovely. I've wanted you all day~~~~!

default: Alarmed. Danger! Approaching unsafe heat levels..

default: Perplexed. How am I even fitting my cock into you?

default: Boastful. I be plundering this penguin pussy!

default: Ticklish. Your fur is tickling me. It's making me even harder!

default: Lustful. Yeah, take my cock, you big fox!

default: Confessing. I have to admit, feels a bit weird fucking a bug.

default: Questioning. Why is bug pussy so damn sexy?!

default: Boastful. Yeah, take my cock, you ... dark... thing!

climaxing: Extactic. A-ahh, I'm cumming too! Take it!

climaxing: Demanding. Mnnh, cum for me! I'm c-cumming too!

climaxing: ExtacticA-ahh, I'm cumming too! Take it!

default: Exctatic. So deep... ahn... your gonna enter my womb!

default: Lustful. Oohh~... You're making me so wet~!

default: Submissive. I've been so naughty! Punish me harder~!

default: Lustful. Ooh, I'm so horny all of the sudden~! Keep going~!

default: Impatient. I've wanted this for so long!

default: Lecherous. Cover my circuits with your genetic code~!

default: Lascivious. You're going to make me overheat~!

default: Inquisitive. Am I turning you on, baby~?

default: Affectionate. You are so skilled at this~!

default: Helpful. Applying additional lubricant...

default: Pleasured. Make my joints creak, lover~!

default: Dazed. Ahh~! My processors are running on high~!

climaxing: Demanding. O-oh~! You're cumming~! Unng, paint my insides with your thick spunk~!

climaxing: Satisfied. Oooh~~! You're drenching me down there!

climaxing: Satisfied. Oh, your cum is so hot and thick inside me~!

climaxing: Thoughtful. Thinking about your organic babies inside me makes my pussy so wet...

climaxing: Demanding. Oh god yes! Fill me to the brim!

climaxing: Lecherous. Cover my circuits with your genetic code~!

climaxing: Affectionate. ~Yes! I'll take all your cum!

climaxing: Lecherous. Cover my circuits in your genetic code~!

climaxing: Overheating. Activating cooling system~!

climaxing: Euphoric. My ports can't handle it~! A- Aahh~!

climaxing: Triumphal. Yes~! Empty your genetic code into me~!

climaxing: Dominant. You're soaking my asshole... you'd better lick that up!

climaxing: Dominant. Save some for when I'm eating your ass!

climaxing: Concerned. A~Ahn~! You're oxidizing my rear!

default: Comparitive. Standard glitch cocks aren't this thick!

default: Demanding. YESS! Stuff me full with your hairy cock!

default: Blastphemous. OH! Yes! You're MY Big Ape!

default: Eager. Shove your Apex member inside of me~!

default: Naughty. Ah~! Make me your next project~!

default: Intrigued. Your fur is brushing against my port~!

default: Aroused. Your fur is warm against my backside~!

climaxing: Saucatious. OH you're filling me up! Make me carry your little apes!

climaxing: Urgent. Yes~! Empty your Apex genes into me~!

default: Observant. Your lizard cock feels so weird... yet so goood! Don't stop!

climaxing: Demanding. Yess! Fill me full of your swamp eggs!

default: Ticklish. Your floofy feathers are tickling me! It's turning me on so much!

default: Amused. Your feathers are tickling my diodes~!

default: Needy. Yes~! Dip your quills in my ink~!

default: Naughty. Ah~! Your talons are digging into my joints~!

climaxing: Demanding. Hng yess! I want to have your chicks!

climaxing: demanding. Hng yess! I want to have your chicks!

default: Blasphemous. I am your offering to Kluex!

default: Ticklish. Your fluffy feathers are tickling me! It's turning me on so much!

default: Aroused. Harder~! Fill me with your bird seed~!

climaxing: Demanding. Hng Yesss, I want to have your chicks!

default: Ticklish. Your fur is so warm and so ticklish! It's turning me on so hard!

default: Lustful. Yes... give me your big doggy dick!

climaxing: Demanding. Yesss! Give me your knot! Tie me up and fill me!

default: Commanding. Yess! Breed me like a rabbit!

default: Observant. What they say about bunnies is true! Don't stop!

default: Energized. It keeps on going and going and going and going....

climaxing: Demanding. Yess! Fill me full of little bunnies!

climaxing: Shocked. Ungh, fill me u- wow, ready to go again? Such stamina!

default: Observant. So gentle, yet so dominating!

default: Gluttonus. Yesss! Give me your long deer cock!

climaxing:
Greedy. Yess! Give me your fawns!
Alert. Deerkin DNA acquired~!

default: Blastphemus. If this is what hell feels like, keep on making me sin!

default: Confused. I admit this is a bit weird... but don't stop!

climaxing: Confused. Yess! give me your... whatever you call your children!

default: Ticklish. Your fur is tickling me! It's turning me on so much!

default: Lustful. Yes, fuck me, you adorable little foxy!

default: Lustful. I can feel your knot slapping against my pussy!

climaxing: Greedy. Yess! Fill me full of your pups!

climaxing: Demanding. Yes, knot me! Tie me up and fill me!

default: Encouraging. Your cock feels amazing! Don't stop you big cute... glowing... furry thing!

default: Observant. Your cock is glowing inside of me!

default: Lustful. Your cock feels weird inside of me. It's driving me nuts!

climaxing: Gluttonus. Yess! Fill me full of your glowing cum!

climaxing: Concerned. So about this glowing cum... should I be worried? No? Releived. Okay then. Give me more!

default: Mixed. Your cock is so scratchy... yet it feels so good. Don't stop!

default: Unsure. Are those... spines? It hurts, yet it's so good!

climaxing:
Demanding.Give me your kittens!
Alert. Felin DNA acquired~!

climaxing: Pleasured. Oh god, your claws are digging into me! It feels so good!

climaxing: Pleasureful. Oh god, your claws are digging into me! It feels so good!

default: Questioning. What's... what's in your pollen?

default: Lustful. I've never been this wet before, your nectar is driving me wild!

default: Shocked. Your petals are this soaked for me?

default: Shocked. I can feel you wriggling inside me!

default: Gluttonus. Your scent makes me... it makes me want your cock so badly...

default: Yearning. Please! Spread your seed inside me~!

climaxing: Observant. Your nectar is running everywhere~~

climaxing: Intoxicated. Your cum is making me dizzy~!

climaxing: Ticklish. Your cum tingles! Is it going to make me pregnant?

climaxing: Demanding. I want to carry your seedlings!!~~

climaxing: Shocked. Your nectar is running everywhere~~

default: Blasphemous. This is all sorts of wrong... Don't stop!

default: Confused. Why does this feel so damn good?

default: Sickened. I can't believe I'm being fucked by the thing that destroyed the Earth! It's so goood!

default: Lustful. Your tentacle is wiggling around inside of me!

default: Hopeful. I hope my body is enough to convince you not to destroy the universe.

climaxing: Lustful. Yess! Fill me with- Frightened. wait, I'm not going to burst open from the inside, am I?

default: Lustful. You're making my pussy tingle~!

default: Shocked. You didn't tell me you could vibrate~!

default: Pleasured. I can feel it twisting inside me!~~~~

default: Pleasured. It's... it's getting bigger inside me~!

default: Horny. Yes~! Transfer your genetic code into me~!

default: Eager. Plow me like I'm the village farm~!

default: Naughty. Treat me like I'm your slave~! Aaahh~!

default: Aroused. You fit into my port perfectly~!

climaxing: Horny. Yes~! Transfer your genetic code into me~!

climaxing: Desperate. Unload your oil inside of me~!

default: Lustful. Your soft belly turns me on so much!

default: Offering. My pussy input has been updated specifically for your cock!

default: Horny. My port is so wet for you, Human~!

default: Naughty. Keep pounding me~! Show me a Human's orgasm~!

default: Loving. A- Ahh~! Your tool feels so soft~!

default: Eager. I'm ready~! Give me your hot Human sperm~!

default: Shocked. Ohgod, your scales are rubbing just right! Don't stop!

default: Horny. I knew you would like wet things~!

default: Perplexed. Ah~!... You're so forceful~!... Yet so graceful~!

default: Intrigued. You're producing so much lubricant down there~!

default: Chilled. Your body feels so cool against my circuits~!

default: Naughty. Make me carry your prosperous children~!

default: Ticklish. Your fur is tickling me! It turns me on so much!

default: Demanding. Upgh! Yes! Pound me like the big dog you are!

default: Pleasured. I can feel your knot pounding against my pussy! Don't you dare stop!

default: Happy. The ears and tail just make you all the hotter!

default: Relieved. I'm so glad you have a canine dick instead of a human one. Can't wait for you to knot me!

default: Demanding. Yes! Give it to me, doggie-boy!

default: Pleasured. So this is what being bred by a mouse feels like! Don't stop!

default: Climaxing. Hnng~ My peripheral is pulsating with pure liquid luster!


climaxing: Yes~! Paint my scales white with your precious cum~!

climaxing: Ahh~! I can feel your sperm swimming deep inside me~!

climaxing: Ooh~! Fill me with your pools of semen~!

climaxing: It feels like there's an ocean inside me~!

climaxing: Oh yes~! Cream my tight hole with your rivers of cum~!

climaxing: Ahh~! I can feel you tightening!~ Fill me up~!

climaxing: Yes~! Fill up my womb with your swimming sperm~!

climaxing: That's right! Pour your rivers of cum inside my hole!

climaxing: Unng, tear into my scales, and inseminate my eggs, lover~!

climaxing: Yes~! May our children all have such fur as yours~!

climaxing: O- Oh~! I feel it~! Release your Apex load inside of me~!

climaxing: Oooh~!... Yes~! May our children be blessed by your Kluex~!

climaxing: Ahh~!... How can it be that such barbarism feels so good?~

climaxing: Uunh~!... You Florans are insatiable~!...

default: Your member feels so hard against my scales~!...

default: Ah~! The breeding efficiency of a machine~!...

climaxing: Ahh~! Wh- what is this you're injecting into me~?!

default: Mmnh~... Your soft member feels perfect against my scales~!

default: Uunf. Yes~!... Show me what mating is like on Earth~!

climaxing: Ahh~! Yes~! Use me to carry your Human DNA~!

climaxing: Aaahh~! D- Do all Humans carry so much semen~?

climaxing: Ummh~! Let us populate the stars with our noble blood~!

climaxing: Ah!~ Yes!~ Fill my womb with beautiful Hylotl DNA~!

climaxing: Mmnh~... I can feel your Hylotl sperm swimming inside of me~!

default: I- It's so hot~!... Ahn!~ You'll boil me alive~!

climaxing: Uhhnn~!... Ah~! Launch your shinining emissions into me~!

climaxing: A- Ahhh~!... Is this what Novakid semen feels like~?... So hot~!...

climaxing: Do you want him to get you pregnant next?


climaxing: Yes~! Paint my scales white with your precious cum~!

climaxing: Ahh~! I can feel your sperm swimming deep inside me~!

climaxing: Ooh~! Fill me with your pools of semen~!

climaxing: It feels like there's an ocean inside me~!

climaxing: Oh yes~! Cream my tight hole with your rivers of cum~!

climaxing: Ahh~! I can feel you tightening!~ Fill me up~!

climaxing: Yes~! Fill up my womb with your swimming sperm~!


code:
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 2013
VisualStudioVersion = 12.0.21005.1
MinimumVisualStudioVersion = 10.0.40219.1
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "OpenGL_TestBed", "OpenGL_TestBed\OpenGL_TestBed.vcxproj", "{512904C9-82A6-4C09-B019-92266CC05B6B}"
EndProject
Global
	GlobalSection(SolutionConfigurationPlatforms) = preSolution
		Debug|Win32 = Debug|Win32
		Release|Win32 = Release|Win32
	EndGlobalSection
	GlobalSection(ProjectConfigurationPlatforms) = postSolution
		{512904C9-82A6-4C09-B019-92266CC05B6B}.Debug|Win32.ActiveCfg = Debug|Win32
		{512904C9-82A6-4C09-B019-92266CC05B6B}.Debug|Win32.Build.0 = Debug|Win32
		{512904C9-82A6-4C09-B019-92266CC05B6B}.Release|Win32.ActiveCfg = Release|Win32
		{512904C9-82A6-4C09-B019-92266CC05B6B}.Release|Win32.Build.0 = Release|Win32
	EndGlobalSection
	GlobalSection(SolutionProperties) = preSolution
		HideSolutionNode = FALSE
	EndGlobalSection
EndGlobal

repo_name: inphinitii/OpenGL


code:
#include "AABB.h"

AABB::AABB(glm::vec2 _min, glm::vec2 _max)
{
	m_minValue = _min;
	m_maxValue = _max;
	GenerateAABB();
}

AABB::~AABB()
{
}

void AABB::GenerateAABB()
{
	//NOT FOOL PROOF IF THE TWO POINTS SUPPLIED AREN'T EXACTLY RIGHT
	m_boundingBox.bottomRight	= glm::vec2(m_maxValue.x, m_minValue.y);
	m_boundingBox.bottomLeft	= glm::vec2(m_minValue.x, m_minValue.y);

	m_boundingBox.topRight		= glm::vec2(m_maxValue.x, m_maxValue.y);
	m_boundingBox.topLeft		= glm::vec2(m_minValue.x, m_maxValue.y);
}


code:
#pragma once
#include "glm.hpp"

#ifndef AABB_H
#define AABB_H

//Currently only in 2D
struct BoundingBox
{
	glm::vec2	topRight,
				topLeft,
				bottomRight,
				bottomLeft;
};

class AABB
{
public:
	AABB(glm::vec2 _min, glm::vec2 _max);
	~AABB();

	BoundingBox Bounds() { return m_boundingBox; }

private:
	glm::vec2	m_maxValue; //Top right
	glm::vec2	m_minValue; //Bottom left
	BoundingBox m_boundingBox;

	void GenerateAABB();
};

#endif


code:
c:\users\inphinitii\documents\visual studio 2013\projects\opengl_testbed\opengl_testbed\debug\vc120.pdb
c:\users\inphinitii\documents\visual studio 2013\projects\opengl_testbed\opengl_testbed\debug\vc120.idb
c:\users\inphinitii\documents\visual studio 2013\projects\opengl_testbed\opengl_testbed\debug\iomanager.obj
c:\users\inphinitii\documents\visual studio 2013\projects\opengl_testbed\opengl_testbed\debug\main.obj
c:\users\inphinitii\documents\visual studio 2013\projects\opengl_testbed\opengl_testbed\debug\meshdata.obj
c:\users\inphinitii\documents\visual studio 2013\projects\opengl_testbed\opengl_testbed\debug\meshrenderer.obj
c:\users\inphinitii\documents\visual studio 2013\projects\opengl_testbed\opengl_testbed\debug\model.obj
c:\users\inphinitii\documents\visual studio 2013\projects\opengl_testbed\opengl_testbed\debug\primitivehelper.obj
c:\users\inphinitii\documents\visual studio 2013\projects\opengl_testbed\opengl_testbed\debug\shadercache.obj
c:\users\inphinitii\documents\visual studio 2013\projects\opengl_testbed\opengl_testbed\debug\shaderhelper.obj
c:\users\inphinitii\documents\visual studio 2013\projects\opengl_testbed\opengl_testbed\debug\texturecache.obj
c:\users\inphinitii\documents\visual studio 2013\projects\opengl_testbed\opengl_testbed\debug\tyrutility.obj
c:\users\inphinitii\documents\git repository\new folder\opengl-repository\opengl_testbed\opengl_testbed\debug\vc120.pdb
c:\users\inphinitii\documents\git repository\new folder\opengl-repository\opengl_testbed\opengl_testbed\debug\vc120.idb
c:\users\inphinitii\documents\git repository\new folder\opengl-repository\opengl_testbed\opengl_testbed\debug\iomanager.obj
c:\users\inphinitii\documents\git repository\new folder\opengl-repository\opengl_testbed\opengl_testbed\debug\main.obj
c:\users\inphinitii\documents\git repository\new folder\opengl-repository\opengl_testbed\opengl_testbed\debug\meshdata.obj
c:\users\inphinitii\documents\git repository\new folder\opengl-repository\opengl_testbed\opengl_testbed\debug\meshrenderer.obj
c:\users\inphinitii\documents\git repository\new folder\opengl-repository\opengl_testbed\opengl_testbed\debug\model.obj
c:\users\inphinitii\documents\git repository\new folder\opengl-repository\opengl_testbed\opengl_testbed\debug\primitivehelper.obj
c:\users\inphinitii\documents\git repository\new folder\opengl-repository\opengl_testbed\opengl_testbed\debug\shadercache.obj
c:\users\inphinitii\documents\git repository\new folder\opengl-repository\opengl_testbed\opengl_testbed\debug\tyrutility.obj
c:\users\inphinitii\documents\git repository\new folder\opengl-repository\opengl_testbed\opengl_testbed\debug\texturecache.obj
c:\users\inphinitii\documents\visual studio 2013\projects\opengl_testbed\debug\opengl_testbed.ilk
c:\users\inphinitii\documents\visual studio 2013\projects\opengl_testbed\debug\opengl_testbed.exe
c:\users\inphinitii\documents\visual studio 2013\projects\opengl_testbed\debug\opengl_testbed.pdb
c:\users\inphinitii\documents\git repository\new folder\opengl-repository\opengl_testbed\debug\opengl_testbed.exe
c:\users\inphinitii\documents\git repository\new folder\opengl-repository\opengl_testbed\debug\opengl_testbed.pdb
c:\users\inphinitii\documents\git repository\new folder\opengl-repository\opengl_testbed\opengl_testbed\debug\shaderhelper.obj
c:\users\inphinitii\documents\git repository\new folder\opengl-repository\opengl_testbed\opengl_testbed\debug\opengl_testbed.tlog\cl.command.1.tlog
c:\users\inphinitii\documents\git repository\new folder\opengl-repository\opengl_testbed\opengl_testbed\debug\opengl_testbed.tlog\cl.read.1.tlog
c:\users\inphinitii\documents\git repository\new folder\opengl-repository\opengl_testbed\opengl_testbed\debug\opengl_testbed.tlog\cl.write.1.tlog
c:\users\inphinitii\documents\git repository\new folder\opengl-repository\opengl_testbed\opengl_testbed\debug\opengl_testbed.tlog\link.command.1.tlog
c:\users\inphinitii\documents\git repository\new folder\opengl-repository\opengl_testbed\opengl_testbed\debug\opengl_testbed.tlog\link.read.1.tlog
c:\users\inphinitii\documents\git repository\new folder\opengl-repository\opengl_testbed\opengl_testbed\debug\opengl_testbed.tlog\link.write.1.tlog


code:
Build started 10/30/2014 9:00:44 PM.
     1>Project "C:\Users\inphinitii\Documents\Git Repository\New folder\opengl-repository\OpenGL_TestBed\OpenGL_TestBed\OpenGL_TestBed.vcxproj" on node 2 (Build target(s)).
     1>ClCompile:
         C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin\CL.exe /c /IC:\Development\glm\glm /I"C:\Development\glew-1.11.0\include\GL" /I"C:\Development\glfw-3.0.4.bin.WIN32\include" /ZI /nologo /W3 /WX- /sdl /Od /Oy- /D _MBCS /Gm /EHsc /RTC1 /MDd /GS /fp:precise /Zc:wchar_t /Zc:forScope /Fo"Debug\\" /Fd"Debug\vc120.pdb" /Gd /TP /analyze- /errorReport:prompt Main.cpp Model.cpp
         Model.cpp
     1>c:\users\inphinitii\documents\git repository\new folder\opengl-repository\opengl_testbed\opengl_testbed\model.cpp(32): warning C4018: '<' : signed/unsigned mismatch
     1>c:\users\inphinitii\documents\git repository\new folder\opengl-repository\opengl_testbed\opengl_testbed\model.cpp(46): warning C4018: '<' : signed/unsigned mismatch
         GLM: rotate function taking degrees as a parameter is deprecated. #define GLM_FORCE_RADIANS before including GLM headers to remove this message.
         GLM: perspective function taking degrees as a parameter is deprecated. #define GLM_FORCE_RADIANS before including GLM headers to remove this message.
         Main.cpp
         Generating Code...
       Link:
         C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin\link.exe /ERRORREPORT:PROMPT /OUT:"C:\Users\inphinitii\Documents\Git Repository\New folder\opengl-repository\OpenGL_TestBed\Debug\OpenGL_TestBed.exe" /INCREMENTAL /NOLOGO /LIBPATH:"C:\Development\glew-1.11.0\lib\Release\Win32" /LIBPATH:"C:\Development\glfw-3.0.4.bin.WIN32\lib-msvc120" glfw3dll.lib glfw3.lib opengl32.lib glew32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /MANIFEST /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /manifest:embed /DEBUG /PDB:"C:\Users\inphinitii\Documents\Git Repository\New folder\opengl-repository\OpenGL_TestBed\Debug\OpenGL_TestBed.pdb" /TLBID:1 /DYNAMICBASE /NXCOMPAT /IMPLIB:"C:\Users\inphinitii\Documents\Git Repository\New folder\opengl-repository\OpenGL_TestBed\Debug\OpenGL_TestBed.lib" /MACHINE:X86 Debug\AABB.obj
         Debug\IOManager.obj
         Debug\Main.obj
         Debug\MeshData.obj
         Debug\MeshRenderer.obj
         Debug\Model.obj
         Debug\PrimitiveHelper.obj
         Debug\ShaderCache.obj
         Debug\TyrUtility.obj
         Debug\TextureCache.obj
         OpenGL_TestBed.vcxproj -> C:\Users\inphinitii\Documents\Git Repository\New folder\opengl-repository\OpenGL_TestBed\Debug\OpenGL_TestBed.exe
     1>Done Building Project "C:\Users\inphinitii\Documents\Git Repository\New folder\opengl-repository\OpenGL_TestBed\OpenGL_TestBed\OpenGL_TestBed.vcxproj" (Build target(s)).

Build succeeded.

Time Elapsed 00:00:01.82


code:
#include "IOManager.h"

IOManager* IOManager::m_IOManagerSingleton;

IOManager* IOManager::GetInstance()
{
	if (m_IOManagerSingleton == nullptr)
		m_IOManagerSingleton = new IOManager();

	return m_IOManagerSingleton;
}
IOManager::IOManager()
{
}

IOManager::~IOManager()
{
}

char* IOManager::FileToBuffer(char* _filename)
{
	FILE*	_filePtr;
	long	_fileLength;
	char*	_buffer;

	fopen_s(&_filePtr, _filename, "rb");

	if (!_filePtr)
		return NULL;

	fseek(_filePtr, 0, SEEK_END);
	_fileLength = ftell(_filePtr);
	_buffer = (char*)malloc(_fileLength + 1);

	fseek(_filePtr, 0, SEEK_SET);
	fread(_buffer, _fileLength, 1, _filePtr);
	fclose(_filePtr);

	_buffer[_fileLength] = 0;

	return _buffer;
}


code:
#pragma once
#include <stdlib.h>
#include <stdio.h>

class IOManager
{
private:
	static IOManager* m_IOManagerSingleton;
	IOManager();
	~IOManager();

public:
	static IOManager* GetInstance();
	char* FileToBuffer(char* _filename);
};


code:
#include <glew.h>
#include <GLFW/glfw3.h>
#include <stdlib.h>
#include <stdio.h>
#include <vector>
#include <string>
#include "TyrUtility.h"
#include "IOManager.h"
#include <math.h>

#define GLM_FORCE_RADIANS

#include <glm.hpp>
#include <gtx\transform.hpp>
#include <gtc\type_ptr.hpp>

#include "Model.h"
#include "ShaderCache.h"
#include "PrimitiveHelper.h"

static void error_callback(int error, const char* description)
{
	fputs(description, stderr);
}
static void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods);

GLuint VAO, program;
//Player models
Model* player1, *player2;

//Ball
Model* _ballObject;

//Background/Environment models
Model *backgroundSquare, *divider;

glm::mat4 myTrans;
glm::vec3 p1Position, p2Position, ballPosition, ballVelocity;

float movement = 7;
bool player1Hit, player2Hit;
int player1Score, player2Score;
double dTime, currentTime, lastTime;

double fakeTime = 1.0f/60.0f;

void Display(GLFWwindow* window);
void Init(GLFWwindow* window);
void OnIdle();
void GenerateShader();

int main(void)
{
	if (!glfwInit())
		exit(EXIT_FAILURE);

	GLFWwindow* window;
	glfwSetErrorCallback(error_callback);
	window = glfwCreateWindow(1024, 768, "OpenGL Test Bed", NULL, NULL);

	glfwMakeContextCurrent(window);
	glfwSetKeyCallback(window, key_callback);

	glewExperimental = GL_TRUE;
	glewInit();

	Init(window);

	//Get the current time
	currentTime = glfwGetTime();
	lastTime = 0;

	while (!glfwWindowShouldClose(window))
	{
		currentTime = glfwGetTime();
		dTime = currentTime - lastTime;
		lastTime = currentTime;

		OnIdle();
		Display(window);
		glfwPollEvents();
	}

	glfwDestroyWindow(window);
	glfwTerminate();
	exit(EXIT_SUCCESS);
}

void OnIdle()
{
	//Get the time and subtract it from the previous time to obtain Delta Time

	myTrans = glm::mat4();

	/* Player 1 */
	player1->Position(p1Position);
	myTrans = player1->Translate() * player1->Scale();
	player1->TransformMatrix(myTrans);

	/* Player 2 */
	player2->Position(p2Position);
	myTrans = player2->Translate() * player2->Scale();
	player2->TransformMatrix(myTrans);

	/* Ball Object*/
	ballPosition += ballVelocity *(float)fakeTime * (float)fakeTime;

	_ballObject->Position(ballPosition);
	myTrans = _ballObject->Translate() * _ballObject->Scale();
	_ballObject->TransformMatrix(myTrans);

#pragma region Ball -> World Collision

	if (ballPosition.x > (backgroundSquare->ReturnScale().x / 2) - 0.05f || ballPosition.x < -(backgroundSquare->ReturnScale().x / 2) + 0.05f) //FUDGE FACTOR
	{
		ballVelocity.x *= -1;
	}

	if (ballPosition.y > (backgroundSquare->ReturnScale().y / 2) - 0.05f) //FUDGE FACTOR
	{
		ballVelocity.y *= -1;
	}

	if (ballPosition.y < -(backgroundSquare->ReturnScale().y / 2) + 0.05f)
	{
		//Whoever last touched the ball receives the point
		if (player1Hit)
			player1Score++;
		else if (player2Hit)
			player2Score++;

		//Print out the score to the consoles
		printf("Player 1: %i , Player 2: %i \n", player1Score, player2Score);

		//Reset the ball object to the center of the stage
		_ballObject->Position(ballPosition = glm::vec3(0.0f, 0.0f, 0.0f));

		//Set a random velocity for the ball
		ballVelocity = glm::vec3(rand() % 2 - 4 / 1.5f,
								 rand() % 2 / 1.5f,
								 0.0f);

		//Regenerate a Y value if it's outside of this threshold
		while (ballVelocity.y < 0.2f && ballVelocity.y > -0.2f)
		{
			ballVelocity.y = rand() % 2 / 1.5f;
		}

		//Reset the flags for the next round
		player1Hit = false;
		player2Hit = false;
	}

#pragma endregion

#pragma region Ball -> Paddle Collision

	if (ballPosition.y <= (player1->ReturnPosition().y + player1->ReturnScale().y /2) &&
		ballPosition.y >= (player1->ReturnPosition().y - player1->ReturnScale().y/2))
	{
		if (ballPosition.x > (player1->ReturnPosition().x - player1->ReturnScale().x / 2) &&
			ballPosition.x < (player1->ReturnPosition().x + player1->ReturnScale().x / 2))
		{
			player1Hit = true;
			player2Hit = false;
			ballVelocity.y *= -1;
		}

		if (ballPosition.x > (player2->ReturnPosition().x - player2->ReturnScale().x / 2) &&
			ballPosition.x < (player2->ReturnPosition().x + player2->ReturnScale().x / 2))
		{
			player2Hit = true;
			player1Hit = false;
			ballVelocity.y *= -1;
		}
	}
#pragma endregion

}

void Init(GLFWwindow* window)
{
	float ratio;
	int width, height;
	glfwGetFramebufferSize(window, &width, &height);
	ratio = width / (float)height;
	glEnable(GL_DEPTH_TEST);
	player1Hit = false;
	//Wireframe mode for testing
	//glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);

	GenerateShader();

	/* Player 1 Creation & Initialization */
	player1 = new Model(
			  new MeshRenderer(
			  new MeshData(VAO, PrimitiveHelper::GetInstance()->Quad()),
			  ShaderCache::GetInstance()->ReturnShader("program")));

	player1->DefaultColor(glm::vec4(0.2f, 0.2f, 0.5f, 1.0f));
	player1->Scale(glm::vec3(0.75f, 0.10f, 0.25f));
	p1Position = glm::vec3(-1.5f, -0.5f, 0.0f); //Initial positions

	/* Player 2 Creation & Initialization */
	player2 = new Model(*player1);
	player2->DefaultColor(glm::vec4(0.7f, 0.2f, 0.5f, 1.0f));
	p2Position = glm::vec3(1.5f, -0.5f, 0.0f); //Initial positions

	/* Ball object Creation & Initialization */
	_ballObject = new Model(*player1);
	_ballObject->DefaultColor(glm::vec4(0.0f, 1.0f, 0.0f, 1.0f));
	_ballObject->Scale(glm::vec3(0.1f, 0.1f, 0.1f));
	_ballObject->Position(ballPosition = glm::vec3(1.0f, 0.0f, 0.0f));
	 ballVelocity = glm::vec3(rand() % 2 -4 / 1.5f,
							  rand() % 2 / 1.5f,
							  0.0f);

	 //If the ball is at too low of a Y velocity, redo it until it's outside the range
	 while (ballVelocity.y < 0.2f && ballVelocity.y > -0.2f)
	 {
		 ballVelocity.y = rand() % 2 / 1.5f;
	 }

	//Create a new square and scale it up to be our background
	backgroundSquare = new Model(*player1);
	backgroundSquare->DefaultColor(glm::vec4(0.0f, 0.0f, 0.0f, 1.0f));
	backgroundSquare->Scale(glm::vec3(5.0f, 3.75f, 5.0f));

	divider = new Model(*player1);
	divider->DefaultColor(glm::vec4(0.5f, 0.3f, 0.2f, 0.1f));
	divider->Scale(glm::vec3(0.1f, 3.75f, 0.0f));

	/* Since these objects are not dynamic, set their variables in the initialization method */
	/* Background */
	myTrans = backgroundSquare->Scale();
	backgroundSquare->TransformMatrix(myTrans);

	/* Divider */
	divider->Position(glm::vec3(0.0f, 0.0f, 0.0f));
	myTrans = divider->Translate() * divider->Scale();
	divider->TransformMatrix(myTrans);
}
void Display(GLFWwindow* window)
{
	glClearColor(0.2f, 0.3f, 0.2f, 0.3f);
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

	_ballObject->Draw(MeshRenderer::DRAW_ARRAY);
	divider->Draw(MeshRenderer::DRAW_ARRAY);
	player1->Draw(MeshRenderer::DRAW_ARRAY);
	player2->Draw(MeshRenderer::DRAW_ARRAY);
	backgroundSquare->Draw(MeshRenderer::DRAW_ARRAY);

	glfwSwapBuffers(window);

}

void GenerateShader()
{
	//GENERATE SHADER ---------------------------------
	std::vector<GLuint> shaderList;
	shaderList.push_back(TyrUtility::GetInstance()->CreateShader(GL_VERTEX_SHADER,
		IOManager::GetInstance()->FileToBuffer("vertexShader.vert")));

	shaderList.push_back(TyrUtility::GetInstance()->CreateShader(GL_FRAGMENT_SHADER,
		IOManager::GetInstance()->FileToBuffer("fragmentShader.frag")));

	program = TyrUtility::GetInstance()->CreateProgram(shaderList);
	ShaderCache::GetInstance()->AddShader("program", program);
	//GENERATE SHADER END-----------------------------
}

static void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods)
{
		if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS)
			glfwSetWindowShouldClose(window, GL_TRUE);

		//Player 1 controls
		if (key == GLFW_KEY_A)
		{
			if (player1->ReturnPosition().x >= -2.5f + (player1->ReturnScale().x/2) + 0.05f) //FUDGE FACTOR
				p1Position += glm::vec3(-movement * fakeTime, 0.0f, 0.0f);
		}

		if (key == GLFW_KEY_D)
		{
			if (player1->ReturnPosition().x <= 0.0f - player1->ReturnScale().x/2 - 0.15f)
				p1Position += glm::vec3(movement * fakeTime, 0.0f, 0.0f);
		}

		//Player 2 controls
		if (key == GLFW_KEY_LEFT)
		{
			if (player2->ReturnPosition().x >= 0.0f + player2->ReturnScale().x / 2 + 0.15f)
				p2Position += glm::vec3(-movement * fakeTime, 0.0f, 0.0f);
		}

		if (key == GLFW_KEY_RIGHT)
		{
			if (player2->ReturnPosition().x <= 2.5 - (player2->ReturnScale().x / 2) - 0.05f) //FUDGE FACTOR
				p2Position += glm::vec3(movement * fakeTime, 0.0f, 0.0f);
		}
	}


code:
#include "MeshData.h"

MeshData::MeshData(GLuint &VAO, vector<Vertex> _vertices, vector<GLuint> _indices)
{
	m_vertices = _vertices;
	m_indices = _indices;
	m_VAO = &VAO;
	GenerateBuffers(VAO);
}

MeshData::MeshData(GLuint &VAO, vector<Vertex> _vertices)
{
	m_vertices = _vertices;
	m_VAO = &VAO;
	GenerateBuffers(VAO);
}

MeshData::~MeshData()
{
}

void MeshData::GenerateBuffers(GLuint &VAO)
{
	GLuint VBO, EBO;
	//Generate necessary buffer objects
	glGenVertexArrays(1, &VAO);
	glGenBuffers(1, &VBO);
	glGenBuffers(1, &EBO);

	glBindVertexArray(VAO);

	//Vertex Information
	glBindBuffer(GL_ARRAY_BUFFER, VBO);
	glBufferData(GL_ARRAY_BUFFER, sizeof(Vertex)* m_vertices.size(), &m_vertices[0], GL_STATIC_DRAW);

	if (m_indices.size() > 0)
	{
		//Index Information
		glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);
		glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(GLuint)* m_indices.size(), &m_indices[0], GL_STATIC_DRAW);
	}

	//Shader Attribute Linkage START-----------------------------------------------------------------

		//Vertex Positions
	glEnableVertexAttribArray(0);
	glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex),
						 (GLvoid*)0);

		//Vertex Normals
	glEnableVertexAttribArray(1);
	glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex),
						 (GLvoid*)offsetof(Vertex, Normal));

		//Vertex Texture Coordinates
	glEnableVertexAttribArray(2);
	glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex),
						 (GLvoid*)offsetof(Vertex, TextureCoords));

	//Shader Attribute Linkage END-------------------------------------------------------------------

	glBindVertexArray(0);
}


code:
#pragma once
#include "glew.h"

#include "TyrUtility.h"
#include "IOManager.h"
#include "glm.hpp"

#ifndef MESHDATA_H
#define MESHDATA_H

struct Vertex
{
	glm::vec3 Position;
	glm::vec3 Normal;
	glm::vec2 TextureCoords;
};

using namespace std;

class MeshData
{
private:
	GLuint* m_VAO;

	vector<Vertex> m_vertices;
	vector<GLuint> m_indices;

	void GenerateBuffers(GLuint &VAO);

public:
	MeshData(GLuint &VAO, vector<Vertex> _vertices, vector<GLuint> _indices);
	MeshData(GLuint &VAO, vector<Vertex> _vertices);

	~MeshData();

	int				IndexCount() { return m_indices.size(); }
	int				VertexCount(){ return m_vertices.size(); }

	vector<GLuint>* Indices()	{ return &m_indices; }
	vector<Vertex>* Vertices()	{ return &m_vertices; }
	GLuint* VAO()				{ return m_VAO; }

};

#endif


code:
#include "MeshRenderer.h"

MeshRenderer::MeshRenderer()
{

}

MeshRenderer::MeshRenderer(MeshData* _mesh, GLuint* _shader)
{
	m_rendererShader = _shader;
	m_rendererMeshData = _mesh;
}

MeshRenderer::MeshRenderer(MeshData* _mesh, GLuint* _shader, GLuint* _texture)
{
}

MeshRenderer::~MeshRenderer()
{
	delete[] m_rendererMeshData;
}

void MeshRenderer::Draw(GLenum _mode, DRAW_MODE _mode2)
{
	glUseProgram(*m_rendererShader);
	//Bind texture
	glBindVertexArray(*m_rendererMeshData->VAO());

	if (_mode2 == DRAW_MODE::DRAW_ELEMENTS)
	{
		glDrawElements(_mode, m_rendererMeshData->IndexCount() ,GL_UNSIGNED_INT, 0);

	}
	if (_mode2 == DRAW_MODE::DRAW_ARRAY)
	{
		glDrawArrays(GL_TRIANGLES, 0, m_rendererMeshData->VertexCount());
	}

	glBindVertexArray(0);
	//Unbind Texture
	glUseProgram(0);
}


code:
#pragma once
#include <glew.h>
#include "MeshData.h"
#include "ShaderCache.h"

#ifndef MESHRENDERER_H
#define MESHRENDERER_H

class MeshRenderer
{
private:
	MeshData*	m_rendererMeshData;
	GLuint*		m_rendererShader;

public:
	MeshRenderer();
	MeshRenderer(MeshData* _mesh, GLuint* _shader);
	MeshRenderer(MeshData* _mesh, GLuint* _shader, GLuint* _texture);
	MeshRenderer(const MeshRenderer& _other);
	~MeshRenderer();

	enum DRAW_MODE
	{
		DRAW_ELEMENTS,
		DRAW_ARRAY
	};

	void Draw(GLenum _mode, DRAW_MODE _mode2);

	GLuint* ReturnShader() { return m_rendererShader; }
	void EnableShader() { glUseProgram(*m_rendererShader); }
	void DisableShader() { glUseProgram(0); }

};

#endif


code:
#include "Model.h"

Model::Model(MeshRenderer* _renderer)
{
	m_meshCounter		 = 0;
	m_rotationAngle		 = 0;
	m_modelMatrix		 = glm::mat4();
	m_modelPosition		 = glm::vec3();
	m_modelRotationAxis	 = glm::vec3();
	m_modelScale		 = glm::vec3();
	m_modelLocation		 = glGetUniformLocation(*_renderer->ReturnShader(), "model"); //Default transform in default vert shader
	m_projectionLocation = glGetUniformLocation(*_renderer->ReturnShader(), "projection");
	m_viewLocation		 = glGetUniformLocation(*_renderer->ReturnShader(), "view");
	m_colorLocation		 = glGetUniformLocation(*_renderer->ReturnShader(), "color");
	m_meshRenderer.push_back(_renderer);
	m_meshCounter++;

	m_projectionMatrix = glm::perspective(45.0f, 1024.0f / 768.0f, 0.1f, 1000.0f);
	m_viewMatrix = glm::translate(m_viewMatrix, glm::vec3(0.0f, 0.0f, -5.0f));

}

Model::~Model()
{
	m_meshRenderer.erase(m_meshRenderer.begin(), m_meshRenderer.end());
}

void Model::UpdateShader()
{
	for (int i = 0; i < m_meshRenderer.size(); i++)
	{
		m_meshRenderer[i]->EnableShader();
		glUniformMatrix4fv(m_modelLocation, 1, GL_FALSE, glm::value_ptr(m_modelMatrix));
		glUniformMatrix4fv(m_projectionLocation, 1, GL_FALSE, glm::value_ptr(m_projectionMatrix));
		glUniformMatrix4fv(m_viewLocation, 1, GL_FALSE, glm::value_ptr(m_viewMatrix));
		glUniform4fv	  (m_colorLocation, 1, glm::value_ptr(m_modelColor));
		m_meshRenderer[i]->DisableShader();
	}

}

void Model::Draw(MeshRenderer::DRAW_MODE _mode)
{
	for (int i = 0; i < m_meshRenderer.size(); i++)
	{
		UpdateShader();
		m_meshRenderer[i]->EnableShader();
		m_meshRenderer[i]->Draw(GL_TRIANGLES, _mode);
		m_meshRenderer[i]->DisableShader();
	}
}

void Model::Position(glm::vec3 _vec3)
{
	m_modelPosition = _vec3;
}

void Model::Scale(glm::vec3 _vec3)
{
	m_modelScale = _vec3;
}

void Model::Rotation(glm::vec3 _vec3, float _angle)
{
	m_modelRotationAxis = _vec3;
	m_rotationAngle		= _angle;
}

void Model::TransformMatrix(glm::mat4 _mat4)
{
	m_modelMatrix = _mat4;
}

void Model::DefaultColor(glm::vec4 _vec4)
{
	m_modelColor = _vec4;
}


code:
#pragma once

#include "MeshRenderer.h"
#include <glm.hpp>
#include <gtx\transform.hpp>
#include <gtc\type_ptr.hpp>

#ifndef MODEL_H
#define MODEL_H

class Model
{
private:
	vector<MeshRenderer*> m_meshRenderer;
	int m_meshCounter;

	GLuint	  m_modelLocation, m_projectionLocation, m_viewLocation, m_colorLocation, m_matrixBlock;
	glm::mat4 m_modelMatrix;

	glm::vec3 m_modelPosition;
	glm::vec3 m_modelScale;
	glm::vec3 m_modelRotationAxis;
	float m_rotationAngle;
	glm::vec4 m_modelColor;

	glm::mat4 m_projectionMatrix; //MOVE THIS TO AN APPROPRIATE CLASS LATER
	glm::mat4 m_viewMatrix;

public:
	Model(MeshRenderer* _renderer);
	~Model();
	Model(const Model &_temp){ *this = _temp; }

	void UpdateShader();
	void Draw(MeshRenderer::DRAW_MODE _mode);

	void TransformMatrix(glm::mat4 _mat4);
	void DefaultColor(glm::vec4 _vec4);

	//Set position, scale, and rotation
	void Position(glm::vec3 _vec3);
	void Scale	 (glm::vec3 _vec3);
	void Rotation(glm::vec3 _axis, float _angle);

	//Return position, scale, rotation angle if necessary
	glm::vec3 ReturnPosition()	{ return m_modelPosition; }
	glm::vec3 ReturnScale()		{ return m_modelScale; 	}
	float	  ReturnRotAngle()	{ return m_rotationAngle; }

	//For use in setting up the Transformation Matrix
	glm::mat4 Translate() { return glm::translate	(glm::mat4(1.0f), m_modelPosition); }
	glm::mat4 Rotate()	  { return glm::rotate		(glm::mat4(1.0f), m_rotationAngle, m_modelRotationAxis); }
	glm::mat4 Scale()	  { return glm::scale		(glm::mat4(1.0f), m_modelScale); }

};

#endif


code:
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <ItemGroup Label="ProjectConfigurations">
    <ProjectConfiguration Include="Debug|Win32">
      <Configuration>Debug</Configuration>
      <Platform>Win32</Platform>
    </ProjectConfiguration>
    <ProjectConfiguration Include="Release|Win32">
      <Configuration>Release</Configuration>
      <Platform>Win32</Platform>
    </ProjectConfiguration>
  </ItemGroup>
  <PropertyGroup Label="Globals">
    <ProjectGuid>{512904C9-82A6-4C09-B019-92266CC05B6B}</ProjectGuid>
    <RootNamespace>OpenGL_TestBed</RootNamespace>
  </PropertyGroup>
  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
    <ConfigurationType>Application</ConfigurationType>
    <UseDebugLibraries>true</UseDebugLibraries>
    <PlatformToolset>v120</PlatformToolset>
    <CharacterSet>MultiByte</CharacterSet>
  </PropertyGroup>
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
    <ConfigurationType>Application</ConfigurationType>
    <UseDebugLibraries>false</UseDebugLibraries>
    <PlatformToolset>v120</PlatformToolset>
    <WholeProgramOptimization>true</WholeProgramOptimization>
    <CharacterSet>MultiByte</CharacterSet>
  </PropertyGroup>
  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
  <ImportGroup Label="ExtensionSettings">
  </ImportGroup>
  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
  </ImportGroup>
  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
  </ImportGroup>
  <PropertyGroup Label="UserMacros" />
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
    <IncludePath>C:\Development\glfw-3.0.4.bin.WIN32\include\GLFW;C:\Development\glm\glm;$(IncludePath)</IncludePath>
    <LibraryPath>C:\Development\glfw-3.0.4.bin.WIN32\lib-msvc120;$(LibraryPath)</LibraryPath>
  </PropertyGroup>
  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
    <ClCompile>
      <WarningLevel>Level3</WarningLevel>
      <Optimization>Disabled</Optimization>
      <SDLCheck>true</SDLCheck>
      <AdditionalIncludeDirectories>C:\Development\glm\glm;C:\Development\glew-1.11.0\include\GL;C:\Development\glfw-3.0.4.bin.WIN32\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
    </ClCompile>
    <Link>
      <GenerateDebugInformation>true</GenerateDebugInformation>
      <AdditionalLibraryDirectories>C:\Development\glew-1.11.0\lib\Release\Win32;C:\Development\glfw-3.0.4.bin.WIN32\lib-msvc120;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
      <AdditionalDependencies>glfw3dll.lib;glfw3.lib;opengl32.lib;glew32.lib;%(AdditionalDependencies)</AdditionalDependencies>
    </Link>
  </ItemDefinitionGroup>
  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
    <ClCompile>
      <WarningLevel>Level3</WarningLevel>
      <Optimization>MaxSpeed</Optimization>
      <FunctionLevelLinking>true</FunctionLevelLinking>
      <IntrinsicFunctions>true</IntrinsicFunctions>
      <SDLCheck>true</SDLCheck>
    </ClCompile>
    <Link>
      <GenerateDebugInformation>true</GenerateDebugInformation>
      <EnableCOMDATFolding>true</EnableCOMDATFolding>
      <OptimizeReferences>true</OptimizeReferences>
    </Link>
  </ItemDefinitionGroup>
  <ItemGroup>
    <ClCompile Include="AABB.cpp" />
    <ClCompile Include="IOManager.cpp" />
    <ClCompile Include="Main.cpp" />
    <ClCompile Include="MeshData.cpp" />
    <ClCompile Include="MeshRenderer.cpp" />
    <ClCompile Include="Model.cpp" />
    <ClCompile Include="PrimitiveHelper.cpp" />
    <ClCompile Include="ShaderCache.cpp" />
    <ClCompile Include="TyrUtility.cpp" />
    <ClCompile Include="TextureCache.cpp" />
  </ItemGroup>
  <ItemGroup>
    <None Include="fragmentShader.frag" />
    <None Include="vertexShader.vert" />
  </ItemGroup>
  <ItemGroup>
    <ClInclude Include="AABB.h" />
    <ClInclude Include="IOManager.h" />
    <ClInclude Include="MeshData.h" />
    <ClInclude Include="MeshRenderer.h" />
    <ClInclude Include="Model.h" />
    <ClInclude Include="PrimitiveHelper.h" />
    <ClInclude Include="ShaderCache.h" />
    <ClInclude Include="TyrUtility.h" />
    <ClInclude Include="TextureCache.h" />
  </ItemGroup>
  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
  <ImportGroup Label="ExtensionTargets">
  </ImportGroup>
</Project>


code:
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <ItemGroup>
    <Filter Include="Source Files">
      <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
      <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
    </Filter>
    <Filter Include="Header Files">
      <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
      <Extensions>h;hh;hpp;hxx;hm;inl;inc;xsd</Extensions>
    </Filter>
    <Filter Include="Resource Files">
      <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
      <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
    </Filter>
  </ItemGroup>
  <ItemGroup>
    <ClCompile Include="Main.cpp">
      <Filter>Source Files</Filter>
    </ClCompile>
    <ClCompile Include="IOManager.cpp">
      <Filter>Source Files</Filter>
    </ClCompile>
    <ClCompile Include="ShaderCache.cpp">
      <Filter>Source Files</Filter>
    </ClCompile>
    <ClCompile Include="MeshData.cpp">
      <Filter>Source Files</Filter>
    </ClCompile>
    <ClCompile Include="MeshRenderer.cpp">
      <Filter>Source Files</Filter>
    </ClCompile>
    <ClCompile Include="Model.cpp">
      <Filter>Source Files</Filter>
    </ClCompile>
    <ClCompile Include="PrimitiveHelper.cpp">
      <Filter>Source Files</Filter>
    </ClCompile>
    <ClCompile Include="TextureCache.cpp">
      <Filter>Source Files</Filter>
    </ClCompile>
    <ClCompile Include="TyrUtility.cpp">
      <Filter>Source Files</Filter>
    </ClCompile>
    <ClCompile Include="AABB.cpp">
      <Filter>Source Files</Filter>
    </ClCompile>
  </ItemGroup>
  <ItemGroup>
    <None Include="fragmentShader.frag">
      <Filter>Resource Files</Filter>
    </None>
    <None Include="vertexShader.vert">
      <Filter>Resource Files</Filter>
    </None>
  </ItemGroup>
  <ItemGroup>
    <ClInclude Include="IOManager.h">
      <Filter>Header Files</Filter>
    </ClInclude>
    <ClInclude Include="ShaderCache.h">
      <Filter>Header Files</Filter>
    </ClInclude>
    <ClInclude Include="MeshData.h">
      <Filter>Header Files</Filter>
    </ClInclude>
    <ClInclude Include="MeshRenderer.h">
      <Filter>Header Files</Filter>
    </ClInclude>
    <ClInclude Include="Model.h">
      <Filter>Header Files</Filter>
    </ClInclude>
    <ClInclude Include="PrimitiveHelper.h">
      <Filter>Header Files</Filter>
    </ClInclude>
    <ClInclude Include="TextureCache.h">
      <Filter>Header Files</Filter>
    </ClInclude>
    <ClInclude Include="TyrUtility.h">
      <Filter>Header Files</Filter>
    </ClInclude>
    <ClInclude Include="AABB.h">
      <Filter>Header Files</Filter>
    </ClInclude>
  </ItemGroup>
</Project>


code:
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup />
</Project>


code:
#pragma once

#include "glew.h"
#include "MeshData.h"

#ifndef PRIMITIVE_HELPER_H
#define PRIMITIVE_HELPER_H

class PrimitiveHelper
{
public:
	static PrimitiveHelper* GetInstance();
	vector<Vertex> Cube();
	vector<Vertex> Quad();

private:
	static PrimitiveHelper* m_pHelperInstance;
	PrimitiveHelper(){}
	~PrimitiveHelper(){}

};

#endif


code:
#include "ShaderCache.h"

ShaderCache* ShaderCache::m_shaderCacheInstance;

ShaderCache::ShaderCache(){}
ShaderCache::~ShaderCache(){}

ShaderCache* ShaderCache::GetInstance()
{
	if (m_shaderCacheInstance == nullptr)
		m_shaderCacheInstance = new ShaderCache();

	return m_shaderCacheInstance;
}

void ShaderCache::AddShader(std::string _fileName, GLuint _shader)
{
	if (m_shaderCache.find(_fileName) == m_shaderCache.end())
		m_shaderCache.insert(std::pair<std::string, GLuint>(_fileName, _shader));
}

GLuint* ShaderCache::ReturnShader(std::string _fileName)
{
	if (m_shaderCache.find(_fileName) == m_shaderCache.end())
		return nullptr;

	return &m_shaderCache.at(_fileName);
}


code:
#include <string>
#include <map>
#include <glew.h>

#ifndef SHADERCACHE_H
#define SHADERCACHE_H

class ShaderCache
{
public:
	static ShaderCache* GetInstance();

	GLuint* ReturnShader(std::string _shaderName);
	void	AddShader(std::string _shaderName, GLuint _shader);

private:
	ShaderCache();
	~ShaderCache();
	static ShaderCache* m_shaderCacheInstance;
	std::map<std::string, GLuint> m_shaderCache;
};

#endif


code:
#include "ShaderHelper.h"

ShaderHelper* ShaderHelper::m_ShaderHelperSingleton;

ShaderHelper::ShaderHelper()
{
}

ShaderHelper::~ShaderHelper()
{
}

ShaderHelper* ShaderHelper::GetInstance()
{
	if (m_ShaderHelperSingleton == nullptr)
		m_ShaderHelperSingleton = new ShaderHelper();

	return m_ShaderHelperSingleton;
}

/* Courtesy of Arc Synthesis */
GLuint ShaderHelper::CreateShader(GLenum _shaderType, const std::string &_shaderFile)
{
	GLuint _shader = glCreateShader(_shaderType); //Create an empty shader
	const char *_fileData = _shaderFile.c_str();

	glShaderSource(_shader, 1, &_fileData, NULL); //Populate the internal shader with the external shader file data
	glCompileShader(_shader); //Compile the shader

	GLint status;
	glGetShaderiv(_shader, GL_COMPILE_STATUS, &status);

	//ERROR OUTPUT BEGIN --------------------------------------------------------------------
	if (status == GL_FALSE)
	{
		GLint infoLogLength;
		glGetShaderiv(_shader, GL_INFO_LOG_LENGTH, &infoLogLength);

		GLchar* strInfoLog = new GLchar[infoLogLength + 1];
		glGetShaderInfoLog(_shader, infoLogLength, NULL, strInfoLog);

		const char *strShaderType = NULL;

		switch (_shaderType)
		{
			case GL_VERTEX_SHADER: strShaderType = "vertex"; break;
			case GL_GEOMETRY_SHADER: strShaderType = "geometry"; break;
			case GL_FRAGMENT_SHADER: strShaderType = "fragment"; break;
		}

		fprintf(stderr, "Compile failure in %s shader:\n%s\n", strShaderType, strInfoLog);
		delete[] strInfoLog;
	}
	//ERROR OUTPUT END------------------------------------------------------------------------

	return _shader;

}

GLuint ShaderHelper::CreateProgram(const std::vector<GLuint> &_shaderList)
{
	GLuint _program = glCreateProgram(); //Create an empty program and store its address into this GLuint

	for (size_t i = 0; i < _shaderList.size(); i++)
		glAttachShader(_program, _shaderList[i]);

	glLinkProgram(_program);

	GLint _status;
	glGetProgramiv(_program, GL_LINK_STATUS, &_status); //Obtain the linking status of the program

	if (_status == GL_FALSE)
	{
		GLint infoLogLength;
		glGetProgramiv(_program, GL_INFO_LOG_LENGTH, &infoLogLength);

		GLchar *strInfoLog = new GLchar[infoLogLength + 1];
		glGetProgramInfoLog(_program, infoLogLength, NULL, strInfoLog);
		fprintf(stderr, "Linker failure: %s\n", strInfoLog);
		delete[] strInfoLog;
	}

	for (size_t i = 0; i < _shaderList.size(); i++)
		glDetachShader(_program, _shaderList[i]);

	return _program;

}


code:
#pragma once
#include <glew.h>
#include <string>
#include <vector>

#ifndef SHADERHELPER_H
#define SHADERHELPER_H

class ShaderHelper
{
private:
	static ShaderHelper* m_ShaderHelperSingleton;
	ShaderHelper();
	~ShaderHelper();
public:
	static ShaderHelper* GetInstance();
	GLuint CreateShader(GLenum _shaderType, const std::string &_shaderFile);
	GLuint CreateProgram(const std::vector<GLuint> &_shaderList);
};

#endif


code:
#include "TextureCache.h"

TextureCache* TextureCache::m_textureCacheInstance;

TextureCache::TextureCache(){}
TextureCache::~TextureCache(){}

TextureCache* TextureCache::GetInstance()
{
	if (m_textureCacheInstance == nullptr)
		m_textureCacheInstance = new TextureCache();

	return m_textureCacheInstance;
}

void TextureCache::AddTexture(std::string _fileName, GLuint* _texture)
{
	if (m_textureCache.find(_fileName) == m_textureCache.end())
		m_textureCache.insert(std::pair<std::string, GLuint*>(_fileName, _texture));
}

GLuint* TextureCache::ReturnTexture(std::string _fileName)
{
	if (m_textureCache.find(_fileName) == m_textureCache.end())
		return nullptr;

	return m_textureCache.at(_fileName);
}


code:
#include <string>
#include <map>
#include <glew.h>

#ifndef TEXTURECACHE_H
#define TEXTURECACHE_H

class TextureCache
{
public:
	static TextureCache* GetInstance();

	GLuint* ReturnTexture(std::string _textureName);
	void	AddTexture(std::string _textureName, GLuint* _texture);

private:
	TextureCache();
	~TextureCache();
	static TextureCache* m_textureCacheInstance;
	std::map<std::string, GLuint*> m_textureCache;
};

#endif


code:
#include "TyrUtility.h"

TyrUtility* TyrUtility::m_ShaderHelperSingleton;

TyrUtility* TyrUtility::GetInstance()
{
	if (m_ShaderHelperSingleton == nullptr)
		m_ShaderHelperSingleton = new TyrUtility();

	return m_ShaderHelperSingleton;
}
TyrUtility::TyrUtility()
{
}
TyrUtility::~TyrUtility()
{
}

#pragma region Shader Creation

/* Courtesy of Arc Synthesis */
GLuint TyrUtility::CreateShader(GLenum _shaderType, const std::string &_shaderFile)
{
	GLuint _shader = glCreateShader(_shaderType); //Create an empty shader
	const char *_fileData = _shaderFile.c_str();

	glShaderSource(_shader, 1, &_fileData, NULL); //Populate the internal shader with the external shader file data
	glCompileShader(_shader); //Compile the shader

	GLint status;
	glGetShaderiv(_shader, GL_COMPILE_STATUS, &status);

	//ERROR OUTPUT BEGIN --------------------------------------------------------------------
	if (status == GL_FALSE)
	{
		GLint infoLogLength;
		glGetShaderiv(_shader, GL_INFO_LOG_LENGTH, &infoLogLength);

		GLchar* strInfoLog = new GLchar[infoLogLength + 1];
		glGetShaderInfoLog(_shader, infoLogLength, NULL, strInfoLog);

		const char *strShaderType = NULL;

		switch (_shaderType)
		{
			case GL_VERTEX_SHADER: strShaderType = "vertex"; break;
			case GL_GEOMETRY_SHADER: strShaderType = "geometry"; break;
			case GL_FRAGMENT_SHADER: strShaderType = "fragment"; break;
		}

		fprintf(stderr, "Compile failure in %s shader:\n%s\n", strShaderType, strInfoLog);
		delete[] strInfoLog;
	}
	//ERROR OUTPUT END------------------------------------------------------------------------

	return _shader;

}

GLuint TyrUtility::CreateProgram(const std::vector<GLuint> &_shaderList)
{
	GLuint _program = glCreateProgram(); //Create an empty program and store its address into this GLuint

	for (size_t i = 0; i < _shaderList.size(); i++)
		glAttachShader(_program, _shaderList[i]);

	glLinkProgram(_program);

	GLint _status;
	glGetProgramiv(_program, GL_LINK_STATUS, &_status); //Obtain the linking status of the program

	if (_status == GL_FALSE)
	{
		GLint infoLogLength;
		glGetProgramiv(_program, GL_INFO_LOG_LENGTH, &infoLogLength);

		GLchar *strInfoLog = new GLchar[infoLogLength + 1];
		glGetProgramInfoLog(_program, infoLogLength, NULL, strInfoLog);
		fprintf(stderr, "Linker failure: %s\n", strInfoLog);
		delete[] strInfoLog;
	}

	for (size_t i = 0; i < _shaderList.size(); i++)
		glDetachShader(_program, _shaderList[i]);

	return _program;

}

#pragma endregion

#pragma region Texture Creation

#pragma endregion


code:
#pragma once
#include <glew.h>
#include <string>
#include <vector>

#ifndef TYRUTILITY_H
#define TYRUTILITY_H

class TyrUtility
{
private:
	static TyrUtility* m_ShaderHelperSingleton;
	TyrUtility();
	~TyrUtility();
public:
	static TyrUtility* GetInstance();

	//Shaders
	GLuint CreateShader(GLenum _shaderType, const std::string &_shaderFile);
	GLuint CreateProgram(const std::vector<GLuint> &_shaderList);

	//Textures
	GLuint CreateTexture(unsigned char* _fileName);
};

#endif


code:
#pragma once

//If using GLM, else comment out
#include "glm.hpp"

#ifdef GLM_INCLUDED
bool glMath = true;
#endif

//Custom Vec3, etc..
//...

#ifndef VERTEX_H
#define VERTEX_H

struct Vertex
{
	glm::vec3 Position;
	glm::vec3 Normal;
	glm::vec3 TextureCoords;
};

#endif


code:
#version 330

in	vec4 inputColor;
out vec4 outputColor;

void main()
{
	outputColor = inputColor;
	//gl_FragColor[0] = gl_FragCoord.x/640.0;
	//gl_FragColor[1] = gl_FragCoord.y/480.0;
	//gl_FragColor[2] = 1.0;
}


code:
#include <glew.h>
#include <GLFW/glfw3.h>
#include <stdlib.h>
#include <stdio.h>
#include <vector>
#include <string>
#include "TyrUtility.h"
#include "IOManager.h"
#include <glm.hpp>
#include <gtx\transform.hpp>
#include <gtc\type_ptr.hpp>

#include "Model.h"
#include "ShaderCache.h"
#include "PrimitiveHelper.h"

static void error_callback(int error, const char* description)
{
	fputs(description, stderr);
}
static void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods)
{
	if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS)
		glfwSetWindowShouldClose(window, GL_TRUE);
}

GLuint VAO, program;
Model* myModel, *myModel2;

glm::mat4 myTrans;
double dTime, currentTime, lastTime;

void Display(GLFWwindow* window);
void Init(GLFWwindow* window);
void OnIdle();
void GenerateShader();

int main(void)
{
	if (!glfwInit())
		exit(EXIT_FAILURE);

	GLFWwindow* window;
	glfwSetErrorCallback(error_callback);
	window = glfwCreateWindow(1024, 768, "OpenGL Test Bed", NULL, NULL);

	glfwMakeContextCurrent(window);
	glfwSetKeyCallback(window, key_callback);

	glewExperimental = GL_TRUE;
	glewInit();

	Init(window);

	//Get the current time
	currentTime = glfwGetTime();
	lastTime = 0;

	while (!glfwWindowShouldClose(window))
	{
		OnIdle();
		Display(window);
		glfwPollEvents();
	}

	glfwDestroyWindow(window);
	glfwTerminate();
	exit(EXIT_SUCCESS);
}

void OnIdle()
{
	//Get the time and subtract it from the previous time to obtain Delta Time
	currentTime = glfwGetTime();
	dTime += currentTime - lastTime;
	lastTime = currentTime;

	myTrans = glm::mat4();

	//Translate and then rotate around a point
	myTrans = glm::translate(glm::mat4(1.0f), glm::vec3(1.0f, 0.0f, 0.0f)) *
			  glm::rotate(glm::mat4(1.0f), (float)dTime * 50, glm::vec3(0.0f, 0.0f, 1.0f));

	myModel->TransformMatrix(myTrans);

	myTrans = glm::translate(glm::mat4(1.0f), glm::vec3(-1.0f, 0.0f, 0.0f)) *
			  glm::rotate(glm::mat4(1.0f), (float)dTime * 50, glm::vec3(0.0f, 1.0f, 0.0f));

	myModel2->TransformMatrix(myTrans);

}

void Init(GLFWwindow* window)
{
	float ratio;
	int width, height;
	glfwGetFramebufferSize(window, &width, &height);
	ratio = width / (float)height;
	glEnable(GL_DEPTH_TEST);

	//Wireframe mode for testing
	//glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);

	GenerateShader();

	myModel = new Model(
			  new MeshRenderer(
			  new MeshData(VAO, PrimitiveHelper::GetInstance()->Cube()),
			  ShaderCache::GetInstance()->ReturnShader("program")));

	myModel2 = new Model(*myModel);

	myModel->Scale(glm::vec3(0.25, 0.25, 0.25));
	myModel2->Scale(glm::vec3(0.25, 0.25, 0.25));

}
void Display(GLFWwindow* window)
{
	glClearColor(0.2f, 0.3f, 0.2f, 0.3f);
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

	myModel->Draw(MeshRenderer::DRAW_ARRAY);
	myModel2->Draw(MeshRenderer::DRAW_ARRAY);

	glfwSwapBuffers(window);

}

void GenerateShader()
{
	//GENERATE SHADER ---------------------------------
	std::vector<GLuint> shaderList;
	shaderList.push_back(TyrUtility::GetInstance()->CreateShader(GL_VERTEX_SHADER,
		IOManager::GetInstance()->FileToBuffer("vertexShader.vert")));

	shaderList.push_back(TyrUtility::GetInstance()->CreateShader(GL_FRAGMENT_SHADER,
		IOManager::GetInstance()->FileToBuffer("fragmentShader.frag")));

	program = TyrUtility::GetInstance()->CreateProgram(shaderList);
	ShaderCache::GetInstance()->AddShader("program", program);
	//GENERATE SHADER END-----------------------------
}


code:
#version 330

layout(location = 0) in vec3 position;
layout(location = 1) in vec3 normal;
layout(location = 2) in vec2 textureCoords;

uniform mat4 model;
uniform mat4 projection;
uniform mat4 view;

uniform vec4 color;

out vec4 inputColor;

void main()
{
	inputColor	= color;
	gl_Position = projection * view * model * vec4(position, 1.0);
}


code:
# OpenGL Rendering Pipeline
An OpenGL Rendering Pipeline.

Discontinued indefinitely, the successing project will be the TyrEngine.

Please feel free to poke around the code.

##Features
-Custom Models via an array of vertices (No .obj or similar file format loader)

-Models may contain more than one mesh, each with their own shaders

-MVP Matrices

-Model Transformations - Scale, Rotation, Translation

-Caches for textures and shaders

-Shader Support


code:
# Ignore all files
*.*

# Except
!*.json
!*.js
!*.zip
!*.7z
!*.csv
!.gitignore
!README.md
!bokukae_sce.dat
!bokukae_sce.dat.bak
!bokukae_define.dat

# Images
!夢幻の秘境.rpgmvp
!森林の秘境.rpgmvp
!渓谷の秘境.rpgmvp
!炎山の秘境.rpgmvp
!砂漠の秘境.rpgmvp
!雪原の秘境.rpgmvp

repo_name: dazed/translations

path: .gitignore


code:
# Apply Patch
1. Click Code
2. Click Download ZIP
3. Extract to game folder and Replace All.

# How To Contribute
TLDR 3 steps.

    Fork the repository.
    Make the changes.
    Submit a pull request to the project owner.

If everything looks good and doesn't break things I'll merge it in.

Longer Version:

Things that are needed:
* [VSCode](https://code.visualstudio.com/) Make sure you check all the boxes for context menus. ![image](https://github.com/DazedMTL/Dungeon-With-Girl/assets/96628874/7a84b624-32fe-4845-a0f6-2b9f39795070)
* The Game
* [Git](https://git-scm.com/downloads) (Use the default for everything. Just keep clicking Next)
* Motivation to learn

Installation:
1. Fork the repo using the fork button at the top. Click Code > HTTPS > Copy URL.
2. Right click on the game folder and click 'Open with VSCode' (Shift+Right_Click if you are on Windows 11)
3. Click on the Source Control Button and click initialize repository.

![image](https://github.com/DazedMTL/Dungeon-With-Girl/assets/96628874/61e818e6-11f9-450d-9d7d-263d109dbf56)

4. At the top click on Terminal > New Terminal. Enter the following: `git clone [URL_YOU_COPIED_ABOVE]`.
5. Copy the contents of the new folder created with git clone into the game folder and replace all.
6. Your source control menu should be good to go and look like this.

![image](https://github.com/DazedMTL/Dungeon-With-Girl/assets/96628874/c19787a0-172d-4a08-a37a-e3b56e70e86a)

Now you are all setup, all you need to do is play the game and look for any changes that need to be made. Stuff like spelling errors, wrong names, inconsistencies, spacing issues, etc.

7. Use the FIND functionality to search for what you are trying to fix. For example if a character's name is wrong, type that into the search menu and start looking, then make the change. Try not to mess with any scripts or variables you might see.

![image](https://github.com/DazedMTL/Dungeon-With-Girl/assets/96628874/589eccaf-7f86-43f7-a917-7e6e477b381a)

8. After you are satisfied with your changes it's time to put in a PR. Go to source control to see all your changes. Add a message and click the `Commit` button to save them all.

![image](https://github.com/DazedMTL/Dungeon-With-Girl/assets/96628874/a9a8973b-bc01-4184-bea9-63a925d961a2)

8. Click Sync to push your changes to your fork. Now all that's left is to put in a pull request.
9. Go to Pull Requests > New Pull Requests. Look at the arrow, your fork should be pointing to the original repo (mine). Add in details on what you fixed and Submit. If everything looks good I'll merge it in and you would have successfully contributed.

Got questions? Just shoot me a message, more than happy to walk you through any of the tools.


Kuno

nickname: Huma (Succubus)

profile:
A woman who has gained some experience as a mercenary. She is also \N[21]'s childhood
friend. Equipped weapons: sword, fist, whip, staff. Armor: heavy armor.

Uka

nickname: Fereks

profile:
A woman who was picked up by mercenaries during her childhood and has been a mercenary
ever since. She also has extensive experience in the night. Equipped weapons: sword,
dagger, axe, staff. Armor: ALL.

Nonna

nickname: Elf (Succubus)

profile:
\N[1] and \N[21]'s foster parent. She has extensive experience as a mercenary and is skilled.
Equipped weapons: sword, bow, mace, staff Armor: magic

Prae

nickname: Succubus

profile: Female demon. It seems she has a pretty long lifespan, but how long exactly is a mystery.

Fross

nickname: Aquis (Succubus)

profile:
A woman who works as a healing magician in the town. She is known for her gentle demeanor
and is well-liked. Equipped Weapons: Whip, Bow, Mace, Staff Armor: Magic

Shia

profile:
She is a very famous woman who is called the Songstress of Azure. Her singing voice
captivates many people. Equipped Weapons: Axe, Whip, Bow, Staff Armor: Magic

Saria

nickname: Huma

profile: A female knight who serves as a captain of the soldiers in a certain town.

Sana

profile: An alchemist who runs a family-owned business called Nandemoya Menimisu.

Ginny

profile: Mysterious Succubus

Land

nickname: Huma (Incubus)

profile:
I have been a mercenary since I was young. I have average skills, neither good nor bad.
Equipped weapons: sword, axe, fist, staff. Armor: heavy armor.

Thors

profile:
A moderately well-known mercenary as a sleep magician. Equipped weapons: sword, dagger,
whip, staff. Armor: magic.

Dalton

profile:
A seasoned mercenary. Possessing reliable skills from years of experience. Has a strong
sexual desire. Equipped weapons: Axe, Fist, Bow, Staff. Armor: Heavy armor.

Yellow

profile:
A promiscuous mercenary. She enjoys playing with women and often frequents brothels.
Equipped weapons: sword, dagger, bow, staff. Armor: heavy armor.

Rodrigo

profile:
A giant of over two meters tall with extensive experience as an adventurer. Equipped with
weapons: sword, axe, mace, staff. Armor: heavy armor.

Grand

profile: A spy from the neighboring country Dios. Possesses high combat abilities.

Luge

profile: A spy from the neighboring country Dios. Skilled in magic.

Gerold

profile: A spy from the neighboring country Dios. She has strong defense.

Kai

profile: Former adventurer turned jack-of-all-trades. I'm thinking of creating a harem.

Ikesu

profile: A very handsome and skilled adventurer who is very serious.

Tail

profile: Adventurer man. Cuckolding fetish.

Ura

profile: child