diff --git a/Actors/Amanda/Clothed_NoBondage_NoGag_Surrender.png b/Actors/Amanda/Clothed_NoBondage_NoGag_Surrender.png new file mode 100644 index 0000000000..5de7d8eac8 Binary files /dev/null and b/Actors/Amanda/Clothed_NoBondage_NoGag_Surrender.png differ diff --git a/Actors/Sarah/Clothed_NoBondage_NoGag_Surrender.png b/Actors/Sarah/Clothed_NoBondage_NoGag_Surrender.png new file mode 100644 index 0000000000..fab3a64bb3 Binary files /dev/null and b/Actors/Sarah/Clothed_NoBondage_NoGag_Surrender.png differ diff --git a/Backgrounds/Lockers.jpeg b/Backgrounds/Lockers.jpeg new file mode 100644 index 0000000000..ea579e39fd Binary files /dev/null and b/Backgrounds/Lockers.jpeg differ diff --git a/C010_Revenge/AmandaSarah/Intro_EN.csv b/C010_Revenge/AmandaSarah/Intro_EN.csv index 9ca36f9c35..1563369891 100644 --- a/C010_Revenge/AmandaSarah/Intro_EN.csv +++ b/C010_Revenge/AmandaSarah/Intro_EN.csv @@ -39,3 +39,6 @@ Stage,LoveReq,SubReq,VarReq,IntroText,Image 250,0,0,,,LockersOpen.jpg 260,0,0,,,LockersOpen.jpg 300,0,0,,,LockersOpen.jpg +400,0,0,,Miss! Please! We surrender!|How can you be so strong?,Lockers.jpg +410,0,0,,,Lockers.jpg +420,0,0,,,Lockers.jpg diff --git a/C010_Revenge/AmandaSarah/LockersTwoOpen.jpg b/C010_Revenge/AmandaSarah/LockersTwoOpen.jpg new file mode 100644 index 0000000000..430e26042a Binary files /dev/null and b/C010_Revenge/AmandaSarah/LockersTwoOpen.jpg differ diff --git a/C010_Revenge/AmandaSarah/Script.js b/C010_Revenge/AmandaSarah/Script.js index fe0f11f76a..b0a1b00df1 100644 --- a/C010_Revenge/AmandaSarah/Script.js +++ b/C010_Revenge/AmandaSarah/Script.js @@ -6,6 +6,7 @@ var C010_Revenge_AmandaSarah_ItemStolen = false; var C010_Revenge_AmandaSarah_WasBelted = false; var C010_Revenge_AmandaSarah_MasturbateCount = 0; var C010_Revenge_AmandaSarah_IntroText = ""; +var C010_Revenge_AmandaSarah_AllowFight = true; // Chapter 10 - Amanda and Sarah Revenge Load function C010_Revenge_AmandaSarah_Load() { @@ -34,8 +35,8 @@ function C010_Revenge_AmandaSarah_Run() { // Build the text interactions BuildInteraction(C010_Revenge_AmandaSarah_CurrentStage); - // Before 100 we don't show the player and the girls can leave - if (C010_Revenge_AmandaSarah_CurrentStage < 100) { + // Before 100 we don't show the player and the girls can leave, same for 400 or up + if ((C010_Revenge_AmandaSarah_CurrentStage < 100) || (C010_Revenge_AmandaSarah_CurrentStage >= 400)) { if (!C010_Revenge_AmandaSarah_AmandaGone && !C010_Revenge_AmandaSarah_SarahGone) { if (CurrentActor == "Amanda") { DrawActor("Sarah", 800, 50, 0.8); @@ -61,8 +62,8 @@ function C010_Revenge_AmandaSarah_Run() { DrawActor("Player", 600, 0, 1.0); } - // Between 170 and 190, Amanda & Sarah are leaning on the lockers - if (((C010_Revenge_AmandaSarah_CurrentStage >= 170) && (C010_Revenge_AmandaSarah_CurrentStage <= 190)) || (C010_Revenge_AmandaSarah_CurrentStage >= 210)) { + // Between 170 and 190, 210 and 300, Amanda & Sarah are leaning on the lockers + if (((C010_Revenge_AmandaSarah_CurrentStage >= 170) && (C010_Revenge_AmandaSarah_CurrentStage <= 190)) || ((C010_Revenge_AmandaSarah_CurrentStage >= 210) && (C010_Revenge_AmandaSarah_CurrentStage <= 300))) { ActorSpecificSetPose("Amanda", "LeaningRight"); ActorSpecificSetPose("Sarah", "LeaningLeft"); DrawActor("Amanda", 475, 25, 0.8); @@ -71,7 +72,7 @@ function C010_Revenge_AmandaSarah_Run() { // Between 170 and 180, draw the player in front of the locker, at 190 or more she's inside if ((C010_Revenge_AmandaSarah_CurrentStage >= 170) && (C010_Revenge_AmandaSarah_CurrentStage <= 180)) DrawActor("Player", 600, 150, 1.0); - if (C010_Revenge_AmandaSarah_CurrentStage >= 190) DrawActor("Player", 690, 20, 0.75); + if ((C010_Revenge_AmandaSarah_CurrentStage >= 190) && (C010_Revenge_AmandaSarah_CurrentStage <= 300)) DrawActor("Player", 690, 20, 0.75); } @@ -92,9 +93,9 @@ function C010_Revenge_AmandaSarah_Click() { // Chapter 10 - Amanda and Sarah Revenge - Switch the focus to another actor function C010_Revenge_AmandaSarah_SwitchFocus(ActorToFocus) { - ActorSetPose("Angry"); + if (C010_Revenge_AmandaSarah_CurrentStage < 400) ActorSetPose("Angry"); ActorLoad(ActorToFocus, ""); - ActorSetPose("Furious"); + if (C010_Revenge_AmandaSarah_CurrentStage < 400) ActorSetPose("Furious"); LeaveIcon = ""; } @@ -170,10 +171,45 @@ function C010_Revenge_AmandaSarah_StealItems() { } +// Chapter 10 - Amanda and Sarah Revenge - Recover the stolen items and clothes +function C010_Revenge_AmandaSarah_RecoverItems() { + C010_Revenge_AmandaSarah_ItemStolen = false; + PlayerRestoreAllInventory(); + CurrentTime = CurrentTime + 50000; + PlayerClothes("Clothed"); +} + // Chapter 10 - Amanda and Sarah Revenge - Starts the fight 2 VS 1 function C010_Revenge_AmandaSarah_StartFight() { - ActorSpecificChangeAttitude("Amanda", -2, 1); - ActorSpecificChangeAttitude("Sarah", -2, 1); + + // Sets the fight difficulty + var AmandaDifficulty = "Normal"; + var SarahDifficulty = "Easy"; + if (ActorSpecificGetValue("Amanda", ActorSubmission) < 0) AmandaDifficulty = "Hard"; + if (ActorSpecificGetValue("Sarah", ActorSubmission) < 0) SarahDifficulty = "Normal"; + + // Launch the double fight + DoubleFightLoad("Amanda", AmandaDifficulty, "Punch", "Sarah", SarahDifficulty, "Punch", "Lockers", "C010_Revenge_AmandaSarah_EndFight"); + +} + +// Chapter 10 - Amanda and Sarah Revenge - When the fight ends +function C010_Revenge_AmandaSarah_EndFight(Victory) { + + // Change the girls attitude depending on the victory or defeat + ActorSpecificChangeAttitude("Amanda", -2, Victory ? 2 : -2); + ActorSpecificChangeAttitude("Sarah", -2, Victory ? 2 : -2); + C010_Revenge_AmandaSarah_AllowFight = false; + + // On a victory, we jump to stage 400 right away, on a defeat, we show a custom text + if (Victory) { + ActorLoad("Amanda", ""); + LeaveIcon = ""; + ActorSpecificSetPose("Amanda", "Surrender"); + ActorSpecificSetPose("Sarah", "Surrender"); + C010_Revenge_AmandaSarah_CurrentStage = 400; + } else OverridenIntroText = GetText("FightDefeat" + C010_Revenge_AmandaSarah_CurrentStage.toString()); + } // Chapter 10 - Amanda and Sarah Revenge - When the player strips diff --git a/C010_Revenge/AmandaSarah/Stage_EN.csv b/C010_Revenge/AmandaSarah/Stage_EN.csv index a2e3e08e0c..942d0cf631 100644 --- a/C010_Revenge/AmandaSarah/Stage_EN.csv +++ b/C010_Revenge/AmandaSarah/Stage_EN.csv @@ -47,7 +47,7 @@ Stage,LoveReq,SubReq,VarReq,Interaction,Result,NextStage,LoveMod,SubMod,Function 60,0,0,,"Ok, but don't steal.|(Drop your items.)","Very good, and now you|will strip for us, get naked.",80,1,-1,StealItems() 60,0,0,,Yes Miss.|(Drop your items.),"Good girl, and now you|will strip for us, get naked.",80,1,-2,StealItems() 60,0,20,,Amanda. Shut up|and kneel for me.,Errr... What Miss? Kneel?|(She blushes and seems confused.),71,0,0,"CalmDown(""Amanda"")" -70,0,0,,You want to fight?|Then let's fight!,,70,0,0,StartFight() +70,0,0,AllowFight,You want to fight?|Then let's fight!,,70,0,0,StartFight() 70,0,0,,You'll pay later.|(Drop your items.),"Shut up and strip, get naked.",80,0,0,StealItems() 70,0,0,,Ok but don't steal.|(Drop your items.),"Very good, and now you|will strip for us, get naked.",80,0,-1,StealItems() 70,0,20,,Amanda. Shut up|and kneel for me.,Errr... What Miss? Kneel?|(She blushes and seems confused.),71,0,0,"CalmDown(""Amanda"")" @@ -68,7 +68,7 @@ Stage,LoveReq,SubReq,VarReq,Interaction,Result,NextStage,LoveMod,SubMod,Function 80,0,0,,You perverts!|I'm not stripping.,We're not asking you. You will|strip up or we will beat you up.,90,-1,0, 80,0,0,,Alright Miss.|(Strip naked.),Very good. (They smile while you|strip in the empty school hall.),100,0,-1,PlayerStrip() 80,0,0,,I guess it's fair.|(Strip naked.),Very fair. (They smile while you|strip in the empty school hall.),100,1,-1,PlayerStrip() -90,0,0,,You want to fight?|Then let's fight!,,90,0,0,StartFight() +90,0,0,AllowFight,You want to fight?|Then let's fight!,,90,0,0,StartFight() 90,0,0,,I'll get you later.|(Strip naked.),Shut up! (They smile while you|strip in the empty school hall.),100,0,0,PlayerStrip() 90,0,0,,"Ok, don't hurt me.|(Strip naked.)",We won't. (They smile while you|strip in the empty school hall.),100,0,-1,PlayerStrip() 100,0,0,Common_PlayerChaste,What's so funny?,The belt! You're wearing a chastity belt!,110,0,-1, @@ -85,8 +85,8 @@ Stage,LoveReq,SubReq,VarReq,Interaction,Result,NextStage,LoveMod,SubMod,Function 130,0,0,,What the fuck?,"It's a chastity belt, and it will|stay locked on you for a long while.",140,-1,0, 130,0,0,,Sweet! That's|a chastity belt?,Yes! And it will be locked|on you for a long while.,140,1,-1, 130,0,0,,Put that belt|back in your bag.,Oh hell no! This chastity belt|will be locked on you for a long while.,140,0,1, -140,0,0,,Fuck you! I will|fight you both!,,140,0,0,StartFight() -140,0,0,,Fine! Lock the|stupid belt.,,150,0,0,LockBelt() +140,0,0,AllowFight,Fuck you! I will|fight you both!,,140,0,0,StartFight() +140,0,0,,Fine! Lock the|stupid belt.,(She hums a happy song while locks|the belt around your hips and crotch.),150,0,0,LockBelt() 140,0,0,,Nice! I love|chastity belts.,I love them too! (She locks the|belt around your hips and crotch.),150,1,-1,LockBelt() 150,0,0,,(Tug on the belt.),The belt isn't your biggest problem.|Since we will lock you up now.,160,0,0,BeltComment() 150,0,0,,You better have the key!,The key isn't your biggest problem.|Since we will lock you up now.,160,0,1,BeltComment() @@ -99,7 +99,7 @@ Stage,LoveReq,SubReq,VarReq,Interaction,Result,NextStage,LoveMod,SubMod,Function 170,0,0,,No way! Are|you two insane?,Shut up and step in|before we force you.,180,-1,0, 170,0,0,,"Ok, but not for long.|(Step in the locker.)",(You squeeze yourself in the locker.)|It will be fine. Any last words?,190,1,-1,"EnterLocker(""Player"")" 170,0,0,,I understand Miss.|(Step in the locker.),(You squeeze yourself in the locker.)|You will be alright. Any last words?,190,0,-2,"EnterLocker(""Player"")" -180,0,0,,Never! I will|fight you both!,,180,0,0,StartFight() +180,0,0,AllowFight,Never! I will|fight you both!,,180,0,0,StartFight() 180,0,0,,Fine! I'll do it.|(Step in the locker.),(You squeeze yourself in the locker.)|You will be alright. Any last words?,190,0,0,"EnterLocker(""Player"")" 180,0,0,,"Ok, I surrender.|(Step in the locker.)",(You squeeze yourself in the locker.)|You will be alright. Any last words?,190,0,-1,"EnterLocker(""Player"")" 190,0,0,,Wait! Let's negotiate!,Negotiation time is over!|(She slams the door and locks it.),200,0,-1,"CloseLocker(""Player"")" @@ -134,3 +134,14 @@ Stage,LoveReq,SubReq,VarReq,Interaction,Result,NextStage,LoveMod,SubMod,Function 300,0,0,WasBelted,Wait! What|about the belt?,"Oh yes, the belt. Well come and see us|after class. We'll talk about it some more.",300,0,0,RemoveWasBelted() 300,0,0,Common_PlayerNaked,(Dress up and leave.),,300,0,0,EndChapter() 300,0,0,Common_PlayerClothed,(Pick your items|and leave.),,300,0,0,EndChapter() +400,0,0,WasBelted,Shut up and|unlock that belt.,"Sorry, I cannot unlock it now|but I will help you after class.",410,-1,1, +400,0,0,WasBelted,Can you unlock|the belt now?,"Sorry, I cannot unlock it now|but I will help you after class.",410,0,0, +400,0,0,,I'm not that strong.|You two are pathetic.,Oh my god. I guess we|need to train with Jennifer.,410,-1,0, +400,0,0,,I've been fighting|for years girl.,Oh my. We never had a chance.,410,0,1, +400,0,0,,I got lucky.,Wow! That was some crazy luck.,410,1,-1, +410,0,0,ItemStolen,Where are|my items?,"It's right here, you can have it.|(You take back all your possessions.)",410,0,0,RecoverItems() +410,0,0,ItemStolen,Give me back|my stuff now!,Oh yes! We were not going to steal it.|(You take back all your possessions.),410,0,1,RecoverItems() +410,0,0,!ItemStolen,Now you know|who's the boss.,(Amanda nods and steps back.)|Yes Miss. We won't try that again.,420,0,1,"SwitchFocus(""Sarah"")" +410,0,0,!ItemStolen,I hope I did|not hurt you.,(Amanda shakes her head and steps back.)|It's fine. All that was hurt is our pride.,420,1,0,"SwitchFocus(""Sarah"")" +410,0,0,!ItemStolen,I need to go now.|(Leave them behind.),,410,0,0,"EarlyEnding(""FightVictory"")" +420,0,0,,I need to go now.|(Leave them behind.),,420,0,0,"EarlyEnding(""FightVictory"")" diff --git a/C010_Revenge/AmandaSarah/Text_EN.csv b/C010_Revenge/AmandaSarah/Text_EN.csv index d422505b6a..96cc369014 100644 --- a/C010_Revenge/AmandaSarah/Text_EN.csv +++ b/C010_Revenge/AmandaSarah/Text_EN.csv @@ -12,3 +12,7 @@ LearnLesson,(The locker opens and Amanda smiles.)|So have you learned a lesson t Orgasm,"(You stimulate yourself right on the spot and|tremble with exctasy, getting a great orgasm.)" OrgasmEnough,(You play with yourself but you're out of ideas.|It's too uncomfortable for a second orgasm.) OrgasmRepeat,(The touch yourself and the vibrating egg kicks|in to give you desires for another round.) +FightDefeat70,"Girl, you cannot fight both of us.|Now shut up and drop your stuff!" +FightDefeat90,"Girl, you cannot fight both of us.|Now shut up and get naked!" +FightDefeat140,"Girl, you cannot fight both of us.|We will lock that chastity belt on you." +FightDefeat180,"Girl, you cannot fight both of us.|You will step in that locker." diff --git a/C010_Revenge/EarlyEnding/Text_EN.csv b/C010_Revenge/EarlyEnding/Text_EN.csv index 68cd393a20..876342c19f 100644 --- a/C010_Revenge/EarlyEnding/Text_EN.csv +++ b/C010_Revenge/EarlyEnding/Text_EN.csv @@ -5,5 +5,13 @@ Alone3,But it was worth it to teach them a lesson. Alone4,The next class will be available later. Locker1,You walk the hallways with a smirk on your face. Locker2,Amanda and Sarah might have got you a little late. -Locker3,But it was worth it to see her stuggle in that locker. +Locker3,But it was worth it to see her struggle in that locker. Locker4,The next class will be available in another version. +FightVictory1,You walk the hallways and strech your mustles. +FightVictory2,Amanda and Sarah might have got you a little late. +FightVictory3,But it was worth it to crush them both in a fight. +FightVictory4,The next class will be available in another version. +DoubleLocker1,You walk the hallways with a big smile on your face. +DoubleLocker2,Amanda and Sarah might have got you a little late. +DoubleLocker3,But it was worth it to see them struggle in their lockers. +DoubleLocker4,The next class will be available in another version. diff --git a/C999_Common/Fights/Actors/Amanda/Clothed_Defeat.png b/C999_Common/Fights/Actors/Amanda/Clothed_Defeat.png new file mode 100644 index 0000000000..f1690b5b12 Binary files /dev/null and b/C999_Common/Fights/Actors/Amanda/Clothed_Defeat.png differ diff --git a/C999_Common/Fights/Actors/Amanda/Clothed_Even1.png b/C999_Common/Fights/Actors/Amanda/Clothed_Even1.png new file mode 100644 index 0000000000..711dd7731e Binary files /dev/null and b/C999_Common/Fights/Actors/Amanda/Clothed_Even1.png differ diff --git a/C999_Common/Fights/Actors/Amanda/Clothed_Even2.png b/C999_Common/Fights/Actors/Amanda/Clothed_Even2.png new file mode 100644 index 0000000000..aeedd8c2e6 Binary files /dev/null and b/C999_Common/Fights/Actors/Amanda/Clothed_Even2.png differ diff --git a/C999_Common/Fights/Actors/Amanda/Clothed_Even3.png b/C999_Common/Fights/Actors/Amanda/Clothed_Even3.png new file mode 100644 index 0000000000..b4f21470b3 Binary files /dev/null and b/C999_Common/Fights/Actors/Amanda/Clothed_Even3.png differ diff --git a/C999_Common/Fights/Actors/Amanda/Clothed_Losing1.png b/C999_Common/Fights/Actors/Amanda/Clothed_Losing1.png new file mode 100644 index 0000000000..44b38b302e Binary files /dev/null and b/C999_Common/Fights/Actors/Amanda/Clothed_Losing1.png differ diff --git a/C999_Common/Fights/Actors/Amanda/Clothed_Losing2.png b/C999_Common/Fights/Actors/Amanda/Clothed_Losing2.png new file mode 100644 index 0000000000..ed932027a8 Binary files /dev/null and b/C999_Common/Fights/Actors/Amanda/Clothed_Losing2.png differ diff --git a/C999_Common/Fights/Actors/Amanda/Clothed_Losing3.png b/C999_Common/Fights/Actors/Amanda/Clothed_Losing3.png new file mode 100644 index 0000000000..947cc006e4 Binary files /dev/null and b/C999_Common/Fights/Actors/Amanda/Clothed_Losing3.png differ diff --git a/C999_Common/Fights/Actors/Amanda/Clothed_Provoke.png b/C999_Common/Fights/Actors/Amanda/Clothed_Provoke.png new file mode 100644 index 0000000000..03cd490afd Binary files /dev/null and b/C999_Common/Fights/Actors/Amanda/Clothed_Provoke.png differ diff --git a/C999_Common/Fights/Actors/Amanda/Clothed_Victory.png b/C999_Common/Fights/Actors/Amanda/Clothed_Victory.png new file mode 100644 index 0000000000..f50aca0fb0 Binary files /dev/null and b/C999_Common/Fights/Actors/Amanda/Clothed_Victory.png differ diff --git a/C999_Common/Fights/Actors/Amanda/Clothed_Winning1.png b/C999_Common/Fights/Actors/Amanda/Clothed_Winning1.png new file mode 100644 index 0000000000..d6298afb58 Binary files /dev/null and b/C999_Common/Fights/Actors/Amanda/Clothed_Winning1.png differ diff --git a/C999_Common/Fights/Actors/Amanda/Clothed_Winning2.png b/C999_Common/Fights/Actors/Amanda/Clothed_Winning2.png new file mode 100644 index 0000000000..c3fbaeeca5 Binary files /dev/null and b/C999_Common/Fights/Actors/Amanda/Clothed_Winning2.png differ diff --git a/C999_Common/Fights/Actors/Amanda/Clothed_Winning3.png b/C999_Common/Fights/Actors/Amanda/Clothed_Winning3.png new file mode 100644 index 0000000000..9cfe6bf904 Binary files /dev/null and b/C999_Common/Fights/Actors/Amanda/Clothed_Winning3.png differ diff --git a/C999_Common/Fights/Actors/Sarah/Clothed_Defeat.png b/C999_Common/Fights/Actors/Sarah/Clothed_Defeat.png new file mode 100644 index 0000000000..4d82cb5c87 Binary files /dev/null and b/C999_Common/Fights/Actors/Sarah/Clothed_Defeat.png differ diff --git a/C999_Common/Fights/Actors/Sarah/Clothed_Even1.png b/C999_Common/Fights/Actors/Sarah/Clothed_Even1.png new file mode 100644 index 0000000000..a64571301b Binary files /dev/null and b/C999_Common/Fights/Actors/Sarah/Clothed_Even1.png differ diff --git a/C999_Common/Fights/Actors/Sarah/Clothed_Even2.png b/C999_Common/Fights/Actors/Sarah/Clothed_Even2.png new file mode 100644 index 0000000000..0f04c17c48 Binary files /dev/null and b/C999_Common/Fights/Actors/Sarah/Clothed_Even2.png differ diff --git a/C999_Common/Fights/Actors/Sarah/Clothed_Even3.png b/C999_Common/Fights/Actors/Sarah/Clothed_Even3.png new file mode 100644 index 0000000000..d117c8f208 Binary files /dev/null and b/C999_Common/Fights/Actors/Sarah/Clothed_Even3.png differ diff --git a/C999_Common/Fights/Actors/Sarah/Clothed_Losing1.png b/C999_Common/Fights/Actors/Sarah/Clothed_Losing1.png new file mode 100644 index 0000000000..08467065e2 Binary files /dev/null and b/C999_Common/Fights/Actors/Sarah/Clothed_Losing1.png differ diff --git a/C999_Common/Fights/Actors/Sarah/Clothed_Losing2.png b/C999_Common/Fights/Actors/Sarah/Clothed_Losing2.png new file mode 100644 index 0000000000..6c5fd0afb8 Binary files /dev/null and b/C999_Common/Fights/Actors/Sarah/Clothed_Losing2.png differ diff --git a/C999_Common/Fights/Actors/Sarah/Clothed_Losing3.png b/C999_Common/Fights/Actors/Sarah/Clothed_Losing3.png new file mode 100644 index 0000000000..bb476c96db Binary files /dev/null and b/C999_Common/Fights/Actors/Sarah/Clothed_Losing3.png differ diff --git a/C999_Common/Fights/Actors/Sarah/Clothed_Provoke.png b/C999_Common/Fights/Actors/Sarah/Clothed_Provoke.png new file mode 100644 index 0000000000..3a80466268 Binary files /dev/null and b/C999_Common/Fights/Actors/Sarah/Clothed_Provoke.png differ diff --git a/C999_Common/Fights/Actors/Sarah/Clothed_Victory.png b/C999_Common/Fights/Actors/Sarah/Clothed_Victory.png new file mode 100644 index 0000000000..dc87bef613 Binary files /dev/null and b/C999_Common/Fights/Actors/Sarah/Clothed_Victory.png differ diff --git a/C999_Common/Fights/Actors/Sarah/Clothed_Winning1.png b/C999_Common/Fights/Actors/Sarah/Clothed_Winning1.png new file mode 100644 index 0000000000..49ab15d466 Binary files /dev/null and b/C999_Common/Fights/Actors/Sarah/Clothed_Winning1.png differ diff --git a/C999_Common/Fights/Actors/Sarah/Clothed_Winning2.png b/C999_Common/Fights/Actors/Sarah/Clothed_Winning2.png new file mode 100644 index 0000000000..8bad14508b Binary files /dev/null and b/C999_Common/Fights/Actors/Sarah/Clothed_Winning2.png differ diff --git a/C999_Common/Fights/Actors/Sarah/Clothed_Winning3.png b/C999_Common/Fights/Actors/Sarah/Clothed_Winning3.png new file mode 100644 index 0000000000..20dd4f506e Binary files /dev/null and b/C999_Common/Fights/Actors/Sarah/Clothed_Winning3.png differ diff --git a/C999_Common/Fights/Backgrounds/Lockers.jpg b/C999_Common/Fights/Backgrounds/Lockers.jpg new file mode 100644 index 0000000000..01adf470bd Binary files /dev/null and b/C999_Common/Fights/Backgrounds/Lockers.jpg differ diff --git a/C999_Common/Fights/DoubleFight.js b/C999_Common/Fights/DoubleFight.js new file mode 100644 index 0000000000..375ceb0a64 --- /dev/null +++ b/C999_Common/Fights/DoubleFight.js @@ -0,0 +1,299 @@ +// Fight parameters +var DoubleFightTimer = 0; +var DoubleFightStartTime = 5000; +var DoubleFightEnded = false; +var DoubleFightVictory = false; +var DoubleFightEndFunction = ""; +var DoubleFightPerfect = true; +var DoubleFightOpponent1 = {}; +var DoubleFightOpponent2 = {}; +var DoubleFightText; +var DoubleFightBackupChapter = ""; +var DoubleFightBackupScreen = ""; + +// Generates a full fight sequence +function DoubleFightGenerateMoves(StartTime, DifficultyText) { + + // Set the difficulty ratio + var DifficultyRatio = 1; + if (DifficultyText == "Easy") DifficultyRatio = 1.5; + if (DifficultyText == "Hard") DifficultyRatio = 0.6667; + + // Full the fight sequence + var CurTimer = StartTime + 3000; + var Seq = 0; + DoubleFightMoves = []; + while (Seq < MaxFightSequence) { + + // Create a new fight move to do at a random position + DoubleFightMoves[DoubleFightMoves.length] = [Math.floor(Math.random() * 4), CurTimer]; + CurTimer = CurTimer + Math.floor((Math.random() * 800 + 400) * DifficultyRatio); + Seq++; + + } + + // Returns the fight move set + return DoubleFightMoves; + +} + +// Load the fight animations and full sequence +function DoubleFightLoad(Opp1ActorName, Opp1Difficulty, Opp1Icon, Opp2ActorName, Opp2Difficulty, Opp2Icon, BackgroundImage, EndFunction) { + + // Creates a brand new fight + LeaveIcon = ""; + DoubleFightTimer = 0; + DoubleFightEnded = false; + DoubleFightPerfect = true; + DoubleFightEndFunction = EndFunction; + DoubleFightBackgroundImage = BackgroundImage; + if (DoubleFightText == null) ReadCSV("DoubleFightText", "C999_Common/Fights/Text_" + CurrentLanguageTag + ".csv"); + + // Setup the 2 opponents + DoubleFightOpponent1 = { ActorName:Opp1ActorName, DifficultyText:Opp1Difficulty, FightIcon:Opp1Icon, LastMoveType:-1, LastMoveTypeTimer:-1, FightProgress:-1, FightMoves:DoubleFightGenerateMoves(DoubleFightStartTime, Opp1Difficulty), FightMoveTypeKeyUpper:[65, 83, 68, 70], FightMoveTypeKeyLower:[97, 115, 100, 102], FightXOffset:0, ImageXOffset:220, ImageName:"", NextImageTime:-1 }; + DoubleFightOpponent2 = { ActorName:Opp2ActorName, DifficultyText:Opp2Difficulty, FightIcon:Opp2Icon, LastMoveType:-1, LastMoveTypeTimer:-1, FightProgress:-1, FightMoves:DoubleFightGenerateMoves(DoubleFightStartTime, Opp2Difficulty), FightMoveTypeKeyUpper:[72, 74, 75, 76], FightMoveTypeKeyLower:[104, 106, 107, 108], FightXOffset:900, ImageXOffset:520, ImageName:"", NextImageTime:-1 }; + + // Keep a backup of the current chapter and screen + DoubleFightBackupChapter = CurrentChapter; + DoubleFightBackupScreen = CurrentScreen; + CurrentChapter = "C999_Common"; + CurrentScreen = "DoubleFight"; + +} + +// Draw the fight icons +function DoubleFightDrawIcons(ctx, Opponent) { + + // Scroll the fight icons with time + var Seq = 0; + while (Seq < Opponent.FightMoves.length) { + + // Draw the move from 3 seconds before to 1 second after + if ((Opponent.FightMoves[Seq][FightMoveTime] <= DoubleFightTimer + 3000) && (Opponent.FightMoves[Seq][FightMoveTime] >= DoubleFightTimer - 1000)) + DrawImage(ctx, "C999_Common/Fights/Icons/" + Opponent.FightIcon + ".png", Opponent.FightXOffset + 3 + (Opponent.FightMoves[Seq][FightMoveType] * 75), 410 + Math.floor((DoubleFightTimer - Opponent.FightMoves[Seq][FightMoveTime]) / 6)); + + // Remove the move from the sequence if it's past due + if (Opponent.FightMoves[Seq][FightMoveTime] < DoubleFightTimer - 1000) { + Opponent.FightMoves.splice(Seq, 1); + DoubleFightMiss(Opponent); + } + else Seq = Seq + 1; + + // Beyond 3 seconds forward, we exit + if (Seq < Opponent.FightMoves.length) + if (Opponent.FightMoves[Seq][FightMoveTime] > DoubleFightTimer + 3000) + return; + + } + +} + +// Draw the fight bars to tell when the moves will hit +function DoubleFightDrawBar(ctx, Opponent) { + + // Draw 4 bars per opponent + for(BarNum = 0; BarNum <= 3; BarNum++) { + + // The color changes when it's clicked or pressed + DrawRect(ctx, Opponent.FightXOffset + 3 + (BarNum * 75), 437, 70, 27, "White"); + if ((Opponent.LastMoveType == BarNum) && (Opponent.LastMoveTypeTimer >= DoubleFightTimer)) + DrawRect(ctx, Opponent.FightXOffset + 4 + (BarNum * 75), 438, 68, 25, "#66FF66"); + else + DrawRect(ctx, Opponent.FightXOffset + 4 + (BarNum * 75), 438, 68, 25, "Red"); + if (!IsMobile) DrawText(ctx, String.fromCharCode(Opponent.FightMoveTypeKeyUpper[BarNum]), Opponent.FightXOffset + 36 + (BarNum * 75), 451, "white"); + + } + +} + +// Draw the fight progress in the bottom of the fight scene +function DoubleFightDrawProgress(ctx, Opponent) { + DrawRect(ctx, Opponent.FightXOffset, 590, 300, 1, "white"); + DrawRect(ctx, Opponent.FightXOffset, 591, Opponent.FightProgress * 3, 9, "#66FF66"); + DrawRect(ctx, Opponent.FightXOffset + (Opponent.FightProgress * 3), 591, (100 - Opponent.FightProgress) * 3, 9, "red"); +} + +// Draw the opponent actor on the screen +function DoubleFightDrawOpponent(ctx, Opponent) { + + // Before the timer, we use the previous image + if (Opponent.NextImageTime < DoubleFightTimer) { + + // The image file is constructed based on the actor clothes and winning position + Opponent.NextImageTime = DoubleFightTimer + 1000 + Math.round(Math.random() * 2000); + Opponent.ImageName = "C999_Common/Fights/Actors/" + Opponent.ActorName + "/" + ActorSpecificGetValue(Opponent.ActorName, ActorCloth) + "_"; + if (Opponent.FightProgress == -1) Opponent.ImageName = Opponent.ImageName + "Provoke.png"; + if (Opponent.FightProgress == 100) Opponent.ImageName = Opponent.ImageName + "Defeat.png"; + if (Opponent.FightProgress == 0) Opponent.ImageName = Opponent.ImageName + "Victory.png"; + if ((Opponent.FightProgress >= 1) && (Opponent.FightProgress <= 33)) Opponent.ImageName = Opponent.ImageName + "Winning" + ((Math.round(new Date().getTime() / 3000) % 3) + 1).toString() + ".png"; + if ((Opponent.FightProgress >= 34) && (Opponent.FightProgress <= 66)) Opponent.ImageName = Opponent.ImageName + "Even" + ((Math.round(new Date().getTime() / 3000) % 3) + 1).toString() + ".png"; + if ((Opponent.FightProgress >= 67) && (Opponent.FightProgress <= 99)) Opponent.ImageName = Opponent.ImageName + "Losing" + ((Math.round(new Date().getTime() / 3000) % 3) + 1).toString() + ".png"; + + }; + + // Draw the image on the screen + DrawImageZoom(ctx, Opponent.ImageName, 0, 0, 600, 900, Opponent.ImageXOffset, 50, 600 * 0.75, 900 * 0.75); + +} + +// Renders a specific opponent +function DoubleFightRenderOpponent(ctx, Opponent) { + + // Starts the fight at an even level and generates moves if there'S none left + if (Opponent.FightProgress > 100) Opponent.FightProgress = 100; + if ((Opponent.FightProgress == -1) && (DoubleFightTimer >= DoubleFightStartTime)) Opponent.FightProgress = 50; + if ((Opponent.FightMoves.length == 0) && !DoubleFightEnded && Opponent.FightProgress > 0) Opponent.FightMoves = DoubleFightGenerateMoves(DoubleFightTimer, Opponent.DifficultyText); + + // Draw the fighting actors + DoubleFightDrawOpponent(ctx, Opponent); + + // Draw the fight icons, bars and bottom info when the fight is running + if (!DoubleFightEnded) { + if (DoubleFightTimer >= DoubleFightStartTime) { + if (Opponent.FightProgress < 100) { + DoubleFightDrawBar(ctx, Opponent); + DoubleFightDrawIcons(ctx, Opponent); + DoubleFightDrawProgress(ctx, Opponent); + } + } + else { + DrawText(ctx, GetCSVText(DoubleFightText, "Opponent") + " " + Opponent.ActorName, Opponent.FightXOffset + 150, 250, "white"); + DrawText(ctx, GetCSVText(DoubleFightText, "Difficulty") + " " + GetCSVText(DoubleFightText, Opponent.DifficultyText), Opponent.FightXOffset + 150, 350, "white"); + } + } + +} + +// Ends the fight and sends the result back to the screen +function DoubleFightEnd(Victory) { + DoubleFightOpponent1.NextImageTime = -1; + DoubleFightOpponent2.NextImageTime = -1; + if (DoubleFightOpponent1.FightProgress < 100) DoubleFightOpponent1.FightProgress = Victory ? 100 : 0; + if (DoubleFightOpponent2.FightProgress < 100) DoubleFightOpponent2.FightProgress = Victory ? 100 : 0; + DoubleFightEnded = true; + DoubleFightVictory = Victory; +} + +// When the player hits +function DoubleFightHit(Opponent) { + Opponent.FightProgress = Opponent.FightProgress + 2; + if (Opponent.FightProgress >= 100) Opponent.NextImageTime = -1; + if ((DoubleFightOpponent1.FightProgress >= 100) && (DoubleFightOpponent2.FightProgress >= 100)) DoubleFightEnd(true); +} + +// When the player misses (the penalty is greater on higher difficulties) +function DoubleFightMiss(Opponent) { + DoubleFightPerfect = false; + if (Opponent.DifficultyText == "Easy") Opponent.FightProgress = Opponent.FightProgress - 2; + if (Opponent.DifficultyText == "Normal") Opponent.FightProgress = Opponent.FightProgress - 3; + if (Opponent.DifficultyText == "Hard") Opponent.FightProgress = Opponent.FightProgress - 4; + if (Opponent.FightProgress <= 0) DoubleFightEnd(false); +} + +// When the player tries a specific move type +function DoubleFightDoMove(Opponent, MoveType) { + + // Make sure the hit is valid + if ((MoveType >= 0) && (Opponent.FightMoves.length > 0) && (Opponent.FightProgress > 0) && (Opponent.FightProgress < 100)) { + + // For each moves in the list + var Hit = false; + var Seq = 0; + while (Seq < Opponent.FightMoves.length) { + + // If the move connects (good timing and good type) + if ((Opponent.FightMoves[Seq][FightMoveTime] <= DoubleFightTimer + 300) && (Opponent.FightMoves[Seq][FightMoveTime] >= DoubleFightTimer - 300) && (MoveType == Opponent.FightMoves[Seq][FightMoveType])) { + Opponent.FightMoves.splice(Seq, 1); + Hit = true; + } + else Seq++; + + // Beyond 0.5 seconds forward, we give up + if (Seq < Opponent.FightMoves.length) + if (Opponent.FightMoves[Seq][FightMoveTime] > DoubleFightTimer + 300) + Seq = Opponent.FightMoves.length; + + } + + // Depending on hit or miss, we change the progress of the fight + Opponent.LastMoveType = MoveType; + Opponent.LastMoveTypeTimer = DoubleFightTimer + 200; + if (Hit) DoubleFightHit(Opponent); + else DoubleFightMiss(Opponent); + + // Each hit or miss add 5 seconds to the game clock + CurrentTime = CurrentTime + 5000; + + } + +} + +// Checks if the key is a valid fight move for an opponent +function DoubleFightCheckKey(Opponent) { + var MoveType = -1; + if ((KeyPress == Opponent.FightMoveTypeKeyUpper[0]) || (KeyPress == Opponent.FightMoveTypeKeyLower[0])) MoveType = 0; + if ((KeyPress == Opponent.FightMoveTypeKeyUpper[1]) || (KeyPress == Opponent.FightMoveTypeKeyLower[1])) MoveType = 1; + if ((KeyPress == Opponent.FightMoveTypeKeyUpper[2]) || (KeyPress == Opponent.FightMoveTypeKeyLower[2])) MoveType = 2; + if ((KeyPress == Opponent.FightMoveTypeKeyUpper[3]) || (KeyPress == Opponent.FightMoveTypeKeyLower[3])) MoveType = 3; + DoubleFightDoMove(Opponent, MoveType); +} + +// When a click is done on a mobile device, we send it to hit or miss +function DoubleFightCheckClick(Opponent) { + var MoveType = -1; + if ((MouseX >= Opponent.FightXOffset) && (MouseX <= Opponent.FightXOffset + 300) && (MouseY >= 400) && (MouseY <= 500)) MoveType = Math.round((MouseX - Opponent.FightXOffset) / 75); + DoubleFightDoMove(Opponent, MoveType); +} + +// Render the double fight scene +function C999_Common_DoubleFight_Run() { + + // Paints the background + var ctx = document.getElementById("MainCanvas").getContext("2d"); + DrawImage(ctx, "C999_Common/Fights/Backgrounds/" + DoubleFightBackgroundImage + ".jpg", 0, 0); + + // Increments the fight timer and renders the 2 opponents + DoubleFightTimer = DoubleFightTimer + RunInterval; + DoubleFightRenderOpponent(ctx, DoubleFightOpponent1); + DoubleFightRenderOpponent(ctx, DoubleFightOpponent2); + + // Draw the fight icons and bottom info when the fight is running + if (!DoubleFightEnded && (DoubleFightTimer < DoubleFightStartTime)) DrawText(ctx, GetCSVText(DoubleFightText, "StartsIn") + " " + (5 - Math.floor(DoubleFightTimer / 1000)).toString(), 600, 30, "white"); + + // Draw the end text + if (DoubleFightEnded) { + if ((DoubleFightOpponent1.FightProgress >= 100) && (DoubleFightOpponent2.FightProgress >= 100) && DoubleFightPerfect) DrawText(ctx, GetCSVText(DoubleFightText, "Perfect"), 600, 30, "white"); + if ((DoubleFightOpponent1.FightProgress >= 100) && (DoubleFightOpponent2.FightProgress >= 100) && !DoubleFightPerfect) DrawText(ctx, GetCSVText(DoubleFightText, "Victory"), 600, 30, "white"); + if ((DoubleFightOpponent1.FightProgress <= 0) || (DoubleFightOpponent2.FightProgress <= 0)) DrawText(ctx, GetCSVText(DoubleFightText, "Defeat"), 600, 30, "white"); + } + +} + +// When a key is pressed while fighting (for both keyboard and mobile) +function C999_Common_DoubleFight_KeyDown() { + + // If the fight has started, we check the key pressed and send it as a fight move + if ((DoubleFightTimer > DoubleFightStartTime) && (DoubleFightOpponent1.FightProgress != -1) && !DoubleFightEnded) { + DoubleFightCheckKey(DoubleFightOpponent1); + DoubleFightCheckKey(DoubleFightOpponent2); + } + +} + +// When a click is done while fighting (only works on mobile) +function C999_Common_DoubleFight_Click() { + + // If the fight is over, clicking above the opponents will end it + if (DoubleFightEnded && (MouseX >= 300) && (MouseX <= 900) && (MouseY <= 600)) { + CurrentChapter = DoubleFightBackupChapter; + CurrentScreen = DoubleFightBackupScreen; + DynamicFunction(DoubleFightEndFunction + "(" + DoubleFightVictory.toString() + ")"); + } + + // If the fight has started, we check the click position and send it as a fight move + if ((DoubleFightTimer > DoubleFightStartTime) && (DoubleFightOpponent1.FightProgress != -1) && !DoubleFightEnded && IsMobile) { + DoubleFightCheckClick(DoubleFightOpponent1); + DoubleFightCheckClick(DoubleFightOpponent2); + } + +} diff --git a/Fight.js b/C999_Common/Fights/Fight.js similarity index 99% rename from Fight.js rename to C999_Common/Fights/Fight.js index 9acbce4083..6519d37237 100644 --- a/Fight.js +++ b/C999_Common/Fights/Fight.js @@ -3,8 +3,6 @@ var MaxFightSequence = 500; var FightProgress = -1; var FightTimer = 0; var FightMove = []; -var FightMoveType = 0; -var FightMoveTime = 1; var FightAnim; var FightAnimFrom = 0; var FightAnimTo = 1; diff --git a/C999_Common/Fights/Icons/Punch.png b/C999_Common/Fights/Icons/Punch.png new file mode 100644 index 0000000000..f427020110 Binary files /dev/null and b/C999_Common/Fights/Icons/Punch.png differ diff --git a/C999_Common/Fights/Text_CN.csv b/C999_Common/Fights/Text_CN.csv new file mode 100644 index 0000000000..e6281c2197 --- /dev/null +++ b/C999_Common/Fights/Text_CN.csv @@ -0,0 +1,11 @@ +Tag,Content +Easy,Easy +Normal,Normal +Hard,Hard +StartsIn,Starts in +Opponent,Opponent: +Difficulty,Difficulty: +Perfect,Perfect fight! +Victory,You won! +Defeat,You lost! +ClickContinue,Click here to continue. diff --git a/C999_Common/Fights/Text_EN.csv b/C999_Common/Fights/Text_EN.csv new file mode 100644 index 0000000000..ae7a24dadf --- /dev/null +++ b/C999_Common/Fights/Text_EN.csv @@ -0,0 +1,10 @@ +Tag,Content +Easy,Easy +Normal,Normal +Hard,Hard +StartsIn,Starts in +Opponent,Opponent: +Difficulty,Difficulty: +Perfect,Perfect fight! Click on any opponent to continue. +Victory,You won! Click on any opponent to continue. +Defeat,You lost! Click on any opponent to continue. diff --git a/C999_Common/Fights/Text_FR.csv b/C999_Common/Fights/Text_FR.csv new file mode 100644 index 0000000000..e6281c2197 --- /dev/null +++ b/C999_Common/Fights/Text_FR.csv @@ -0,0 +1,11 @@ +Tag,Content +Easy,Easy +Normal,Normal +Hard,Hard +StartsIn,Starts in +Opponent,Opponent: +Difficulty,Difficulty: +Perfect,Perfect fight! +Victory,You won! +Defeat,You lost! +ClickContinue,Click here to continue. diff --git a/Common.js b/Common.js index 740d5546e6..a5a245bd25 100644 --- a/Common.js +++ b/Common.js @@ -16,6 +16,7 @@ var KeyPress = ""; var IsMobile = false; var TextPhase = 0; var CSVCache = {}; +var MaxFightSequence = 500; // Array variables var IntroStage = 0; @@ -36,6 +37,8 @@ var StageSubMod = 8; var StageFunction = 9; var TextTag = 0; var TextContent = 1; +var FightMoveType = 0; +var FightMoveTime = 1; // Common variables var Common_BondageAllowed = true; @@ -229,6 +232,25 @@ function GetText(Tag) { } +// Returns the text for a specific CSV associated with the tag +function GetCSVText(CSVText, Tag) { + + // Make sure the text CSV file is loaded + if (CSVText != null) { + + // Cycle the text to find a matching tag and returns the text content + Tag = Tag.trim().toUpperCase(); + for (var T = 0; T < CSVText.length; T++) + if (CSVText[T][TextTag].trim().toUpperCase() == Tag) + return CSVText[T][TextContent].trim(); + + // Returns an error message + return "MISSING TEXT FOR TAG: " + Tag.trim(); + + } else return ""; + +} + // Triggers the leave or wait button if needed function LeaveButtonClick() { diff --git a/index.html b/index.html index 93245772a4..46dfbc91a1 100644 --- a/index.html +++ b/index.html @@ -19,7 +19,6 @@ <script src="Actor.js"></script> <script src="Inventory.js"></script> <script src="Time.js"></script> -<script src="Fight.js"></script> <script src="Struggle.js"></script> <script src="C000_Intro/Intro/Script.js"></script> <script src="C000_Intro/ChapterSelect/Script.js"></script> @@ -117,6 +116,8 @@ <script src="C999_Common/SleepingPill/Script.js"></script> <script src="C999_Common/RustyHook/Script.js"></script> <script src="C999_Common/MetalSheet/Script.js"></script> +<script src="C999_Common/Fights/Fight.js"></script> +<script src="C999_Common/Fights/DoubleFight.js"></script> <script> // When the code is loaded, start on "Chapter 0" to select a chapter and loads the default language