From 2f869d7421530ee6d72b421de8ee4bcd8826bef3 Mon Sep 17 00:00:00 2001
From: Ben987 <30805159+Ben987@users.noreply.github.com>
Date: Thu, 1 Mar 2018 18:54:24 -0500
Subject: [PATCH] More skills added to all chapters

More skills added to all chapters
---
 C000_Intro/CreatePlayer/Script.js      |  59 ++++++++++++++++++-------
 C000_Intro/CreatePlayer/Text_CN.csv    |   8 +++-
 C000_Intro/CreatePlayer/Text_EN.csv    |   8 +++-
 C000_Intro/CreatePlayer/Text_FR.csv    |   8 +++-
 C000_Intro/CreatePlayer/Text_PL.csv    |   6 +++
 C001_BeforeClass/Amanda/Script.js      |   5 ++-
 C004_ArtClass/Jennifer/Script.js       |  17 +++++++
 C004_ArtClass/Jennifer/Stage_EN.csv    |   3 ++
 C004_ArtClass/Jennifer/Text_EN.csv     |   1 +
 C004_ArtClass/Sarah/Script.js          |  17 +++++++
 C004_ArtClass/Sarah/Stage_EN.csv       |   3 ++
 C004_ArtClass/Sarah/Text_EN.csv        |   1 +
 C005_GymClass/LoseFight/Script.js      |   4 +-
 C005_GymClass/WinFight/Script.js       |   4 +-
 C006_Isolation/IsolationRoom/Script.js |   3 +-
 C007_LunchBreak/Amanda/Script.js       |   3 +-
 C007_LunchBreak/Amanda/Stage_EN.csv    |   1 +
 C007_LunchBreak/Jennifer/Script.js     |   2 +
 C007_LunchBreak/Jennifer/Stage_EN.csv  |   1 +
 C008_DramaClass/Julia/Script.js        |  11 +++--
 C008_DramaClass/Villain/Script.js      |  11 +++++
 C008_DramaClass/Villain/Stage_EN.csv   |   1 +
 C999_Common/Player/Script.js           |   1 +
 Drawing.js                             |   3 ++
 Icons/SkillLevelUp.png                 | Bin 0 -> 2755 bytes
 Skill.js                               |   4 ++
 Struggle.js                            |  10 ++++-
 Time.js                                |   1 +
 28 files changed, 164 insertions(+), 32 deletions(-)
 create mode 100644 Icons/SkillLevelUp.png

diff --git a/C000_Intro/CreatePlayer/Script.js b/C000_Intro/CreatePlayer/Script.js
index 5a90da2d3a..c58586b1cd 100644
--- a/C000_Intro/CreatePlayer/Script.js
+++ b/C000_Intro/CreatePlayer/Script.js
@@ -1,4 +1,6 @@
 var C000_Intro_CreatePlayer_ChapterToLoad = "C001_BeforeClass";
+var C000_Intro_CreatePlayer_SkillCount = 5;
+var C000_Intro_CreatePlayer_ControlLoaded = false;
 
 // Create Player Load
 function C000_Intro_CreatePlayer_Load() {
@@ -7,31 +9,48 @@ function C000_Intro_CreatePlayer_Load() {
 	LeaveIcon = "";
 	LeaveScreen = "";
 	LoadText();
-	
-	// Creates a text box to enter the player name
-	var InputName = document.createElement('input');
-	InputName.setAttribute("ID", "InputName");
-	InputName.setAttribute("name", "InputName");
-	InputName.setAttribute("type", "text");
-	InputName.setAttribute("value", "");
-	InputName.setAttribute("maxlength", "20");
-	InputName.setAttribute("style", "font-size:24px; font-family:Arial; position:fixed; padding-left:10px; left:200px; top:300px; width:500px; height:50px;");
-	InputName.addEventListener("keypress", KeyDown);
-	document.body.appendChild(InputName);
-	InputName.focus();
-	
+
 }
 
 // Create Player Run
 function C000_Intro_CreatePlayer_Run() {
+
+	// If we load the controls
+	if ((C000_Intro_CreatePlayer_ControlLoaded == false) && (GetText("Skill" + C000_Intro_CreatePlayer_SkillCount.toString()) != "")) {
+
+		// Creates a text box to enter the player name
+		var InputName = document.createElement('input');
+		InputName.setAttribute("ID", "InputName");
+		InputName.setAttribute("name", "InputName");
+		InputName.setAttribute("type", "text");
+		InputName.setAttribute("value", "");
+		InputName.setAttribute("maxlength", "20");
+		InputName.setAttribute("style", "font-size:24px; font-family:Arial; position:absolute; padding-left:10px; left:200px; top:240px; width:500px; height:50px;");
+		InputName.addEventListener("keypress", KeyDown);
+		document.body.appendChild(InputName);
+		InputName.focus();
+
+		// Creates a select box to pick a starting skill
+		var SelectSkill = document.createElement('select');
+		SelectSkill.setAttribute("ID", "SelectSkill");
+		SelectSkill.setAttribute("name", "SelectSkill");
+		SelectSkill.setAttribute("style", "font-size:24px; font-family:Arial; position:absolute; padding-left:10px; left:300px; top:320px; width:300px; height:50px;");
+		for(var S = 0; S <= 5; S++)
+			SelectSkill.appendChild(new Option(GetText("Skill" + S.toString()), S.toString()));
+		document.body.appendChild(SelectSkill);
+		C000_Intro_CreatePlayer_ControlLoaded = true;
+	
+	}
 	
 	// Draw the player image and the text input for the name
 	var ctx = document.getElementById("MainCanvas").getContext("2d");
 	DrawImage(ctx, CurrentChapter + "/" + CurrentScreen + "/Player.jpg", 900, 0);
 	DrawRect(ctx, 0, 0, 900, 600, "white");
-	DrawRect(ctx, 300, 430, 300, 70, "#8c304e");
 	DrawText(ctx, GetText("EnterName"), 450, 100, "black");
-	DrawText(ctx, GetText("ValidChars"), 450, 200, "black");
+	DrawText(ctx, GetText("ValidChars"), 450, 180, "black");
+
+	// Creates the "validate" button
+	DrawRect(ctx, 300, 430, 300, 70, "#8c304e");
 	DrawText(ctx, GetText("Validate"), 450, 465, "white");
 	
 }
@@ -39,17 +58,25 @@ function C000_Intro_CreatePlayer_Run() {
 // Validate the name and starts the game
 function C000_Intro_CreatePlayer_Validate() {
 	var NewName = document.getElementById("InputName").value.trim();
+	var StartingSkill = document.getElementById("SelectSkill").value.trim();
 	var letters = /^[a-zA-Z ]+$/;
 	if (NewName.match(letters) && (NewName.length > 0) && (NewName.length <= 20)) {
+		if (StartingSkill == "1") PlayerAddSkill("Arts", 1);
+		if (StartingSkill == "2") PlayerAddSkill("Fighting", 1);
+		if (StartingSkill == "3") PlayerAddSkill("RopeMastery", 1);
+		if (StartingSkill == "4") PlayerAddSkill("Sports", 1);
+		if (StartingSkill == "5") PlayerAddSkill("Seduction", 1);
+		PlayerSkillShowLevelUp = 0;
 		Common_PlayerName = NewName;
 		document.getElementById("InputName").parentNode.removeChild(document.getElementById("InputName"));
+		document.getElementById("SelectSkill").parentNode.removeChild(document.getElementById("SelectSkill"));
 		SetScene(C000_Intro_CreatePlayer_ChapterToLoad, "Intro");
 	}
 }
 
 // Create Player Key Down
 function C000_Intro_CreatePlayer_KeyDown() {
-	if (KeyPress == 13) C000_Intro_CreatePlayer_Validate();
+	//if (KeyPress == 13) C000_Intro_CreatePlayer_Validate();
 }
 
 // Create Player Click
diff --git a/C000_Intro/CreatePlayer/Text_CN.csv b/C000_Intro/CreatePlayer/Text_CN.csv
index f925fb59b7..bda6ae82fd 100644
--- a/C000_Intro/CreatePlayer/Text_CN.csv
+++ b/C000_Intro/CreatePlayer/Text_CN.csv
@@ -1,4 +1,10 @@
 Tag,Content
-EnterName,Enter a name for your character.
+EnterName,Enter a name and select a skill for your character.
 ValidChars,You can only use letters & spaces.
 Validate,Start the game
+Skill0,No skill
+Skill1,Arts
+Skill2,Fighting
+Skill3,Rope Mastery
+Skill4,Sports
+Skill5,Seduction
diff --git a/C000_Intro/CreatePlayer/Text_EN.csv b/C000_Intro/CreatePlayer/Text_EN.csv
index f925fb59b7..bda6ae82fd 100644
--- a/C000_Intro/CreatePlayer/Text_EN.csv
+++ b/C000_Intro/CreatePlayer/Text_EN.csv
@@ -1,4 +1,10 @@
 Tag,Content
-EnterName,Enter a name for your character.
+EnterName,Enter a name and select a skill for your character.
 ValidChars,You can only use letters & spaces.
 Validate,Start the game
+Skill0,No skill
+Skill1,Arts
+Skill2,Fighting
+Skill3,Rope Mastery
+Skill4,Sports
+Skill5,Seduction
diff --git a/C000_Intro/CreatePlayer/Text_FR.csv b/C000_Intro/CreatePlayer/Text_FR.csv
index dac0518c33..ac2bec8175 100644
--- a/C000_Intro/CreatePlayer/Text_FR.csv
+++ b/C000_Intro/CreatePlayer/Text_FR.csv
@@ -1,4 +1,10 @@
 Tag,Content
-EnterName,Entrez un nom pour votre personnage.
+EnterName,Choisissez un nom et un talent pour votre personnage.
 ValidChars,Seulement des lettres et des espaces.
 Validate,Démarrer la partie
+Skill0,No skill
+Skill1,Arts
+Skill2,Combat
+Skill3,Maîtrise des Cordes
+Skill4,Sports
+Skill5,Séduction
diff --git a/C000_Intro/CreatePlayer/Text_PL.csv b/C000_Intro/CreatePlayer/Text_PL.csv
index fe0fd578b4..9d52bbf888 100644
--- a/C000_Intro/CreatePlayer/Text_PL.csv
+++ b/C000_Intro/CreatePlayer/Text_PL.csv
@@ -2,3 +2,9 @@ Tag,Content
 EnterName,Nadaj imi� swojej postaci.
 ValidChars,Mo�esz u�ywa� wy��cznie liter oraz spacji.
 Validate,Zacznij gr�
+Skill0,No skill
+Skill1,Arts
+Skill2,Fighting
+Skill3,Rope Mastery
+Skill4,Sports
+Skill5,Seduction
diff --git a/C001_BeforeClass/Amanda/Script.js b/C001_BeforeClass/Amanda/Script.js
index bb8c73d414..66cdbd29fd 100644
--- a/C001_BeforeClass/Amanda/Script.js
+++ b/C001_BeforeClass/Amanda/Script.js
@@ -71,11 +71,12 @@ function C001_BeforeClass_Amanda_ConfrontBondage() {
 	C001_BeforeClass_Amanda_BondageNotConfronted = false;
 }
 
-// Chapter 1 - Amanda Kiss
+// Chapter 1 - Amanda Kiss (extra love if the player has seduction)
 function C001_BeforeClass_Amanda_Kiss() {
 	if (C001_BeforeClass_Amanda_Kiss_Done == false) {
 		C001_BeforeClass_Amanda_Kiss_Done = true;
-		ActorChangeAttitude(1, 0);
+		if (PlayerGetSkillLevel("Seduction") >= 1) ActorChangeAttitude(2, 0);
+		else ActorChangeAttitude(1, 0);
 		OverridenIntroText = GetText("Kiss");
 	}
 }
diff --git a/C004_ArtClass/Jennifer/Script.js b/C004_ArtClass/Jennifer/Script.js
index bccb841428..f31bd8edbf 100644
--- a/C004_ArtClass/Jennifer/Script.js
+++ b/C004_ArtClass/Jennifer/Script.js
@@ -15,6 +15,7 @@ var C004_ArtClass_Jennifer_PityDone = false;
 var C004_ArtClass_Jennifer_EggConfirm = false;
 var C004_ArtClass_Jennifer_EggInside = false;
 var C004_ArtClass_Jennifer_StunningBeautyReady = true;
+var C004_ArtClass_Jennifer_PaintAvail = true;
 
 // Chapter 4 - Jennifer Load
 function C004_ArtClass_Jennifer_Load() {
@@ -230,4 +231,20 @@ function C004_ArtClass_Jennifer_PityComment() {
 function C004_ArtClass_Jennifer_StunningBeauty() {
 	C004_ArtClass_Jennifer_StunningBeautyReady = false;
 	ActorChangeAttitude(1, 0);
+}
+
+// Chapter 4 - Jennifer Paint, can only be done if there's 30 minutes left for the class
+function C004_ArtClass_Jennifer_Paint() {
+	if (CurrentTime <= 9.75 * 60 * 60 * 1000) {
+		C004_ArtClass_Sarah_PaintAvail = false;
+		C004_ArtClass_Jennifer_PaintAvail = false;
+		ActorChangeAttitude(0, 2);
+		CurrentTime = CurrentTime + 0.5 * 60 * 60 * 1000;
+		PlayerAddSkill("Arts", 1);
+		if (PlayerGetSkillLevel("Arts") >= 1) {
+			ActorSpecificChangeAttitude("Julia", PlayerGetSkillLevel("Arts"), 0);
+			ActorSpecificChangeAttitude("Sarah", PlayerGetSkillLevel("Arts"), 0);
+			ActorSpecificChangeAttitude("Jennifer", PlayerGetSkillLevel("Arts"), 0);
+		}
+	} else OverridenIntroText = GetText("NoTimeToPaint");
 }
\ No newline at end of file
diff --git a/C004_ArtClass/Jennifer/Stage_EN.csv b/C004_ArtClass/Jennifer/Stage_EN.csv
index d2d576124a..0d305f4f44 100644
--- a/C004_ArtClass/Jennifer/Stage_EN.csv
+++ b/C004_ArtClass/Jennifer/Stage_EN.csv
@@ -42,9 +42,12 @@ Stage,LoveReq,SubReq,VarReq,Interaction,Result,NextStage,LoveMod,SubMod,Function
 130,0,0,,(Tighten the ropes.)|(1 minute),(This bondage is already|as tight as it can be.),130,0,0,Tighten()
 130,0,0,,(Tickle her.)|(1 minute),(She cowers in shame|to avoid your tickling.),130,0,0,Tickle()
 130,0,0,Common_PlayerNotRestrained,(Untie her.)|(1 minute),(You untie her and she throws the|ropes at you.)  Can I go sit now?,120,0,0,Untie()
+130,0,0,PaintAvail,(Paint Jennifer.)|(30 minutes),(You carefully paint her and show the result.)|Please destroy this painting once class is over.,130,0,0,Paint()
 140,0,0,,(Tighten the ropes.)|(1 minute),(This bondage is already|as tight as it can be.),140,0,0,Tighten()
 140,0,0,,(Tickle her.)|(1 minute),(She cowers in shame|to avoid your tickling.),140,0,0,Tickle()
 140,0,0,Common_PlayerNotRestrained,(Ungag her.)|(1 minute),(You unbuckle the gag and release it|from her mouth)  Can you untie me now?,130,0,0,Ungag()
+140,0,0,PaintAvail,(Paint Jennifer.)|(30 minutes),(You carefully paint her and show the result.)|(She looks at your work of art and whimpers.),140,0,0,Paint()
 150,0,0,,(Tighten the ropes.)|(1 minute),(This bondage is already|as tight as it can be.),150,0,0,Tighten()
 150,0,0,,(Tickle her.)|(1 minute),(She cowers in shame|to avoid your tickling.),150,0,0,Tickle()
 150,0,0,Common_PlayerNotRestrained,(Ungag her.)|(1 minute),"(You remove the tape from her mouth.)|Alright, can you untie me now?",130,0,0,Ungag()
+150,0,0,PaintAvail,(Paint Jennifer.)|(30 minutes),(You carefully paint her and show the result.)|(She looks at your work of art and whimpers.),150,0,0,Paint()
diff --git a/C004_ArtClass/Jennifer/Text_EN.csv b/C004_ArtClass/Jennifer/Text_EN.csv
index ee9367eb04..c092ad4022 100644
--- a/C004_ArtClass/Jennifer/Text_EN.csv
+++ b/C004_ArtClass/Jennifer/Text_EN.csv
@@ -19,3 +19,4 @@ EarnTrust,I'll try to trust you then.|All of this is making me nervous.
 EggComment,"But, but, but.  I, I.  Ok.|(She bows her head.)"
 PlayerUntie,"(She blushes and steps up to untie you.)|Here you go my friend, I bet that was humiliating."
 PlayerStayTied,(She's too nervous to move up to help you.)|(You need 3 love or more to get help from her.)
+NoTimeToPaint,(There's not enough time left in|class to produce a work of art.)
diff --git a/C004_ArtClass/Sarah/Script.js b/C004_ArtClass/Sarah/Script.js
index 55881dee8e..9989ee0c3e 100644
--- a/C004_ArtClass/Sarah/Script.js
+++ b/C004_ArtClass/Sarah/Script.js
@@ -18,6 +18,7 @@ var C004_ArtClass_Sarah_EggConfirm = false;
 var C004_ArtClass_Sarah_EggInside = false;
 var C004_ArtClass_Sarah_CrotchRopeReady = false;
 var C004_ArtClass_Sarah_OrgasmDone = false;
+var C004_ArtClass_Sarah_PaintAvail = true;
 
 // Chapter 4 - Sarah Load
 function C004_ArtClass_Sarah_Load() {
@@ -226,4 +227,20 @@ function C004_ArtClass_Sarah_OrgasmStart() {
 // Chapter 4 - Sarah Orgasm
 function C004_ArtClass_Sarah_Orgasm() {
 	ActorAddOrgasm();
+}
+
+// Chapter 4 - Sarah Paint, can only be done if there's 30 minutes left for the class
+function C004_ArtClass_Sarah_Paint() {
+	if (CurrentTime <= 9.75 * 60 * 60 * 1000) {
+		C004_ArtClass_Sarah_PaintAvail = false;
+		C004_ArtClass_Jennifer_PaintAvail = false;
+		ActorChangeAttitude(1, 1);
+		CurrentTime = CurrentTime + 0.5 * 60 * 60 * 1000;
+		PlayerAddSkill("Arts", 1);
+		if (PlayerGetSkillLevel("Arts") >= 1) {
+			ActorSpecificChangeAttitude("Julia", PlayerGetSkillLevel("Arts"), 0);
+			ActorSpecificChangeAttitude("Sarah", PlayerGetSkillLevel("Arts"), 0);
+			ActorSpecificChangeAttitude("Jennifer", PlayerGetSkillLevel("Arts"), 0);
+		}
+	} else OverridenIntroText = GetText("NoTimeToPaint");
 }
\ No newline at end of file
diff --git a/C004_ArtClass/Sarah/Stage_EN.csv b/C004_ArtClass/Sarah/Stage_EN.csv
index 518bbc419f..4b3aa0b14b 100644
--- a/C004_ArtClass/Sarah/Stage_EN.csv
+++ b/C004_ArtClass/Sarah/Stage_EN.csv
@@ -40,14 +40,17 @@ Stage,LoveReq,SubReq,VarReq,Interaction,Result,NextStage,LoveMod,SubMod,Function
 160,0,0,,(Tighten the ropes.)|(1 minute),The ropes are as tight as they can be.,160,0,0,Tighten()
 160,0,0,Common_PlayerNotRestrained,(Untie her.)|(1 minute),"Ooooooh, why did you untie me?|(She pulls her tongue and takes her pose.)",150,0,0,Untie()
 160,0,0,Common_PlayerNotRestrained,(Tickle her.)|(1 minute),You're funny.  But is that the best you can do?|(She giggles but isn't impressed by your tickling.),160,0,0,
+160,0,0,PaintAvail,(Paint Sarah.)|(30 minutes),(You carefully paint her and show the result.)|Wow!  This is such a kinky painting.  I love it!,160,0,0,Paint()
 170,0,0,CrotchRopeReady,(Play with the crotch|rope.)  (1 minute),(You play while she trembles and falls on|her knees.  Ready to have a huge orgasm.),200,0,0,OrgasmStart()
 170,0,0,,(Tighten the ropes.)|(1 minute),The ropes are as tight as they can be.,170,0,0,Tighten()
 170,0,0,Common_PlayerNotRestrained,(Ungag her.)|(1 minute),(She stretches her jaw and smiles)|Do you have a bigger gag coming up?,160,0,0,Ungag()
 170,0,0,Common_PlayerNotRestrained,(Tickle her.)|(1 minute),(She giggles but isn't impressed by your tickling.),170,0,0,
+170,0,0,PaintAvail,(Paint Sarah.)|(30 minutes),(You carefully paint her and show the result.)|(She looks at your work of art and nods happily.),170,0,0,Paint()
 180,0,0,CrotchRopeReady,(Play with the crotch|rope.)  (1 minute),(You play while she trembles and falls on|her knees.  Ready to have a huge orgasm.),250,0,0,OrgasmStart()
 180,0,0,,(Tighten the ropes.)|(1 minute),The ropes are as tight as they can be.,180,0,0,Tighten()
 180,0,0,Common_PlayerNotRestrained,(Ungag her.)|(1 minute),(She smiles at you.)  This tape|was the best idea I've ever had.,160,0,0,Ungag()
 180,0,0,Common_PlayerNotRestrained,(Tickle her.)|(1 minute),(She giggles but isn't impressed by your tickling.),180,0,0,
+180,0,0,PaintAvail,(Paint Sarah.)|(30 minutes),(You carefully paint her and show the result.)|(She looks at your work of art and nods happily.),180,0,0,Paint()
 200,0,0,,Do you want to|climax subbie girl?,"(She nods slowly, trying to control herself.)",210,0,1,
 200,0,0,,So this slut|wants to cum?,"(She shakes her head from left to right, then|from up to down, trying to control herself.)",210,-1,0,
 200,0,0,,You seem ready|to reach heaven.,"(She nods happily, trying to control herself.)",210,1,0,
diff --git a/C004_ArtClass/Sarah/Text_EN.csv b/C004_ArtClass/Sarah/Text_EN.csv
index 85390f4cdb..43150223da 100644
--- a/C004_ArtClass/Sarah/Text_EN.csv
+++ b/C004_ArtClass/Sarah/Text_EN.csv
@@ -12,3 +12,4 @@ Tighten,"(You tighten the knots while she moans.)|Mmmmhh, can we see each other
 TightenFail,(You try to tighten Sarah's bondage|but fail as the other students giggle.)
 PlayerRelease,Yes Miss.  Someone like you shouldn't be tied up.|(She releases you from your bondage.)
 PlayerGag,Help you?  Yes!  I know what could help.|(She searches to find tape and shuts your mouth.)
+NoTimeToPaint,(There's not enough time left in|class to produce a work of art.)
diff --git a/C005_GymClass/LoseFight/Script.js b/C005_GymClass/LoseFight/Script.js
index 1ee65f2358..71840be643 100644
--- a/C005_GymClass/LoseFight/Script.js
+++ b/C005_GymClass/LoseFight/Script.js
@@ -1,7 +1,7 @@
 // Chapter 5 - Lose Fight Load
 function C005_GymClass_LoseFight_Load() {
-	if (C005_GymClass_Jennifer_EasyMode) LoadFight("Jennifer", "Easy", Icons.Fight.Rope, PlayerGetSkillLevel("Fighting"));
-	else LoadFight("Jennifer", "Normal", Icons.Fight.Rope, PlayerGetSkillLevel("Fighting"));
+	if (C005_GymClass_Jennifer_EasyMode) LoadFight("Jennifer", "Easy", Icons.Fight.Rope, PlayerGetSkillLevel("RopeMastery"));
+	else LoadFight("Jennifer", "Normal", Icons.Fight.Rope, PlayerGetSkillLevel("RopeMastery"));
 }
 
 // Chapter 5 - Lose Fight Run
diff --git a/C005_GymClass/WinFight/Script.js b/C005_GymClass/WinFight/Script.js
index 35c55a6be7..035a287820 100644
--- a/C005_GymClass/WinFight/Script.js
+++ b/C005_GymClass/WinFight/Script.js
@@ -1,7 +1,7 @@
 // Chapter 5 - Win Fight Load
 function C005_GymClass_WinFight_Load() {
-	if (C005_GymClass_Jennifer_EasyMode) LoadFight("Jennifer", "Normal", Icons.Fight.Rope, PlayerGetSkillLevel("Fighting"));
-	else LoadFight("Jennifer", "Hard", Icons.Fight.Rope, PlayerGetSkillLevel("Fighting"));
+	if (C005_GymClass_Jennifer_EasyMode) LoadFight("Jennifer", "Normal", Icons.Fight.Rope, PlayerGetSkillLevel("RopeMastery"));
+	else LoadFight("Jennifer", "Hard", Icons.Fight.Rope, PlayerGetSkillLevel("RopeMastery"));
 }
 
 // Chapter 5 - Win Fight Run
diff --git a/C006_Isolation/IsolationRoom/Script.js b/C006_Isolation/IsolationRoom/Script.js
index 545fb40ce5..abb8fde16e 100644
--- a/C006_Isolation/IsolationRoom/Script.js
+++ b/C006_Isolation/IsolationRoom/Script.js
@@ -19,8 +19,7 @@ function C006_Isolation_IsolationRoom_DropInventory() {
 // Chapter 6 - Isolation Room Load
 function C006_Isolation_IsolationRoom_Load() {
 	LeaveIcon = "Wait";
-	StruggleDone = false;
-	StruggleProgress = 0;
+	StruggleLoad();
 	C006_Isolation_IsolationRoom_OrgasmReady = (PlayerHasLockedInventory("VibratingEgg"));
 	LoadText();
 }
diff --git a/C007_LunchBreak/Amanda/Script.js b/C007_LunchBreak/Amanda/Script.js
index d034f18261..33c91b7e92 100644
--- a/C007_LunchBreak/Amanda/Script.js
+++ b/C007_LunchBreak/Amanda/Script.js
@@ -13,6 +13,7 @@ var C007_LunchBreak_Amanda_IntroText = "";
 var C007_LunchBreak_Amanda_LeaveIcon = "";
 var C007_LunchBreak_Amanda_IsBoundAndGagged = false;
 var C007_LunchBreak_Amanda_ConfirmEvil = false;
+var C007_LunchBreak_Amanda_HasSeduction = false;
 
 // Calculates the screen parameters
 function C007_LunchBreak_Amanda_CalcParams() {
@@ -53,6 +54,7 @@ function C007_LunchBreak_Amanda_Load() {
 	ActorLoad("Amanda", "ActorSelect");
 	LoadInteractions();
 	C007_LunchBreak_Amanda_CalcParams();
+	C007_LunchBreak_Amanda_HasSeduction = (PlayerGetSkillLevel("Seduction") >= 1);
 	
 	// If Amanda doesn't like the player and isn't subbie enough, she leaves and don't talk
 	if ((ActorGetValue(ActorLove) <= -3) && (ActorGetValue(ActorSubmission) <= 2) && (C007_LunchBreak_Amanda_CurrentStage == 0)) {
@@ -261,7 +263,6 @@ function C007_LunchBreak_Amanda_Ungag() {
 // Chapter 7 - Amanda Test Make Love (Amanda will only make love if +8 or more)
 function C007_LunchBreak_Amanda_TestMakeLove() {
 	if (ActorGetValue(ActorLove) >= 8) {
-		if (PlayerGetSkillLevel("Seduction") >= 1) ActorChangeAttitude(1, 0);
 		OverridenIntroText = GetText("LoveStart");
 		C007_LunchBreak_Amanda_CurrentStage = 240;
 	} else {
diff --git a/C007_LunchBreak/Amanda/Stage_EN.csv b/C007_LunchBreak/Amanda/Stage_EN.csv
index d928d59335..a6769159b8 100644
--- a/C007_LunchBreak/Amanda/Stage_EN.csv
+++ b/C007_LunchBreak/Amanda/Stage_EN.csv
@@ -77,6 +77,7 @@ Stage,LoveReq,SubReq,VarReq,Interaction,Result,NextStage,LoveMod,SubMod,Function
 200,0,0,,We still have time|before the bell?,(She giggles.)  Time for what?,210,0,0,
 200,0,0,,Thanks for showing|me this lovely cafe.,My pleasure!  We had a good time.,210,1,-1,
 200,0,0,,I wanted you to know|that I had a great time.,I did too!  We seem to fit well together.,210,1,0,
+200,0,0,HasSeduction,"Amy, you're the sweetest|thing in this college.",(She blushes red and giggles.)|You're also sweet COMMON_PLAYERNAME.,210,2,0,
 200,0,0,,Can I kiss you?|(1 minute),(She nods and puts her lips against yours.),220,1,0,
 200,0,0,,(Stay silent and kiss her.)|(1 minute),,220,0,1,
 200,0,0,,Better not be late.|(Back to college.),,0,0,0,EndBonus()
diff --git a/C007_LunchBreak/Jennifer/Script.js b/C007_LunchBreak/Jennifer/Script.js
index be0e7aea01..bdfcd0a0d6 100644
--- a/C007_LunchBreak/Jennifer/Script.js
+++ b/C007_LunchBreak/Jennifer/Script.js
@@ -24,6 +24,7 @@ var C007_LunchBreak_Jennifer_PushUpQuality = 0;
 var C007_LunchBreak_Jennifer_PushUpCount = 0;
 var C007_LunchBreak_Jennifer_RacketQuality = 0;
 var C007_LunchBreak_Jennifer_HasRestrainsAvail = false;
+var C007_LunchBreak_Jennifer_HasSeduction = false;
 
 // Calculates the screen parameters
 function C007_LunchBreak_Jennifer_CalcParams() {
@@ -74,6 +75,7 @@ function C007_LunchBreak_Jennifer_Load() {
 	ActorLoad("Jennifer", "ActorSelect");
 	LoadInteractions();
 	C007_LunchBreak_Jennifer_CalcParams();
+	C007_LunchBreak_Jennifer_HasSeduction = (PlayerGetSkillLevel("Seduction") >= 1);
 	
 	// If Jennifer doesn't like the player, she will run away from the start
 	if ((ActorGetValue(ActorLove) <= -3) && (ActorGetValue(ActorSubmission) <= 3)) {
diff --git a/C007_LunchBreak/Jennifer/Stage_EN.csv b/C007_LunchBreak/Jennifer/Stage_EN.csv
index fff8ad37fe..b0593edb41 100644
--- a/C007_LunchBreak/Jennifer/Stage_EN.csv
+++ b/C007_LunchBreak/Jennifer/Stage_EN.csv
@@ -18,6 +18,7 @@ Stage,LoveReq,SubReq,VarReq,Interaction,Result,NextStage,LoveMod,SubMod,Function
 20,0,0,,The loser will be the|winner slave for lunch.,Slave?  You mean the loser pays for lunch?,30,0,1,
 20,0,0,,The loser submits to|the winner for lunch.,Submits?  You mean the loser pays for lunch?,30,0,0,
 20,0,0,,On second thoughts.|I don't want to play.,"Alright then, see you later.|(She packs and leaves for tennis.)",90,0,0,EndLunch()
+30,0,0,HasSeduction,Lovely Jennifer.  You|can't resist a challenge.,(She blushes and looks at the floor.)|Indeed.  Are you ready to play now?,40,1,1,
 30,0,0,,"Yes, whoever loses|will pay and obey.",You have a strange way to phrase your|bet but I'm up for it!  Should we go now?,40,0,0,
 30,0,0,,Don't make me repeat.|Are you game or not?,(She frowns at you and gets competitive.)|Alright then!  Are you ready to play now?,40,-1,0,
 30,0,0,,On second thoughts.|I don't want to play.,"Alright then, see you later.|(She packs and leaves for tennis.)",90,0,0,EndLunch()
diff --git a/C008_DramaClass/Julia/Script.js b/C008_DramaClass/Julia/Script.js
index 4511a3e7c1..683d9171ec 100644
--- a/C008_DramaClass/Julia/Script.js
+++ b/C008_DramaClass/Julia/Script.js
@@ -44,6 +44,12 @@ function C008_DramaClass_Julia_Load() {
 	ActorLoad("Julia", "Theater");
 	LoadInteractions();
 	
+	// On a perfect play, the player gains a level in arts
+	if ((C008_DramaClass_Julia_CurrentStage == 300) && C008_DramaClass_Theater_PerfectPlay) {
+		C008_DramaClass_Theater_PerfectPlay = false;
+		PlayerAddSkill("Arts");
+	}
+	
 	// Cannot leave before Julia gave her instructions
 	if (C008_DramaClass_Julia_CurrentStage < 100) LeaveIcon = "";
 	if (C008_DramaClass_Julia_CurrentStage == 330) C008_DramaClass_Julia_CurrentStage = 400;
@@ -193,10 +199,9 @@ function C008_DramaClass_Julia_Masturbate() {
 
 // Chapter 8 - Julia can be flattered with a "quiant" comment
 function C008_DramaClass_Julia_QuaintComment() {
-	if (!C008_DramaClass_Julia_QuaintCommentDone) { 
+	if (!C008_DramaClass_Julia_QuaintCommentDone) {
 		C008_DramaClass_Julia_QuaintCommentDone = true;
-		if (PlayerGetSkillLevel("Seduction") >= 1) ActorChangeAttitude(2, 0);
-		else ActorChangeAttitude(1, 0);
+		ActorChangeAttitude(1 + PlayerGetSkillLevel("Seduction"), 0);
 	}
 	C008_DramaClass_Julia_CalcParams();
 }
diff --git a/C008_DramaClass/Villain/Script.js b/C008_DramaClass/Villain/Script.js
index abe0f22345..1e95e61f20 100644
--- a/C008_DramaClass/Villain/Script.js
+++ b/C008_DramaClass/Villain/Script.js
@@ -21,6 +21,7 @@ var C008_DramaClass_Villain_SpankDone = false;
 var C008_DramaClass_Villain_OrgasmDone = false;
 var C008_DramaClass_Villain_MastubateCount = 0;
 var C008_DramaClass_Villain_RavishDone = false;
+var C008_DramaClass_Villain_CanDoSwordDance = false;
 
 // Calculates the scene parameters
 function C008_DramaClass_Villain_CalcParams() {
@@ -32,6 +33,7 @@ function C008_DramaClass_Villain_CalcParams() {
 	C008_DramaClass_Villain_CanConvinceJuliaToStrip = (C008_DramaClass_Villain_PlayerIsDamsel && !C008_DramaClass_Villain_IsGagged && (C008_DramaClass_Julia_CurrentStage == 400) && ((ActorSpecificGetValue("Amanda", ActorLove) >= 10) || (ActorSpecificGetValue("Amanda", ActorSubmission) >= 10)));
 	C008_DramaClass_Villain_DamselCanInteract = (C008_DramaClass_Villain_PlayerIsDamsel && !Common_PlayerGagged);
 	C008_DramaClass_Villain_DamselCanBeg = (C008_DramaClass_Villain_PlayerIsDamsel && Common_PlayerGagged);
+	C008_DramaClass_Villain_CanDoSwordDance = (!C008_DramaClass_Villain_PlayerIsDamsel && PlayerGetSkillLevel("Arts"));
 	OverridenIntroImage = "";
 }
 
@@ -261,4 +263,13 @@ function C008_DramaClass_Villain_Ravish() {
 		OverridenIntroText = GetText("Ravish");
 	}
 	C008_DramaClass_Villain_CalcParams();
+}
+
+// Chapter 8 - Sword Dance, a special option to disarm the opponent using art
+function C008_DramaClass_Villain_SwordDance() {
+	if (C008_DramaClass_Villain_PlayerIsHeroine) { C008_DramaClass_Villain_CurrentStage = 240; C008_DramaClass_Theater_GlobalStage = 240; }
+	if (C008_DramaClass_Villain_PlayerIsVillain) { C008_DramaClass_Villain_CurrentStage = 270; C008_DramaClass_Theater_GlobalStage = 270; }
+	ActorSpecificChangeAttitude("Julia", PlayerGetSkillLevel("Arts"), 0);
+	ActorSpecificChangeAttitude("Amanda", 0, 1);
+	ActorSpecificChangeAttitude("Sarah", 0, 1);
 }
\ No newline at end of file
diff --git a/C008_DramaClass/Villain/Stage_EN.csv b/C008_DramaClass/Villain/Stage_EN.csv
index 51970f9291..6b4740ac61 100644
--- a/C008_DramaClass/Villain/Stage_EN.csv
+++ b/C008_DramaClass/Villain/Stage_EN.csv
@@ -31,6 +31,7 @@ Stage,LoveReq,SubReq,VarReq,Interaction,Result,NextStage,LoveMod,SubMod,Function
 230,0,0,PlayerIsHeroine,(Do a sword fight.),You charge each other and start|a funny but intense sword fight.,235,0,0,NoLeave()
 230,0,0,PlayerIsHeroine,(Surrender without a fight.),You drop your sword and the black|knight steps forward with a grin.,270,0,0,Surrender()
 230,0,0,PlayerIsDamsel,(Watch the fight.),Both knights charge on each other and|engage in a pretty neat sword fight.,235,0,0,NoLeave()
+235,0,0,CanDoSwordDance,(Do a sword dance.)|(1 minute),You dance gracefully around your opponent and|easily disarm her while she's dazzled by you.,270,0,0,SwordDance()
 235,0,0,CanIntimidate,(Intimidate her.)|(1 minute),You give a menacing look to Amanda which|barely fights and lets you disarm her.,270,0,0,"GlobalStage(270, 0, 1)"
 235,0,0,CanDisarm,(Disarm her.)|(1 minute),Amanda puts a pretty nice fight but|you're able to win by disarming her.,270,0,0,"GlobalStage(270, 0, 0)"
 235,0,0,PlayerIsVillain,(Play defensive.)|(1 minute),You stick to defensive moves and Amanda|takes advantage of it to disarm you.,240,0,0,"GlobalStage(240, 0, 0)"
diff --git a/C999_Common/Player/Script.js b/C999_Common/Player/Script.js
index 599f4c2568..630dd50c5d 100644
--- a/C999_Common/Player/Script.js
+++ b/C999_Common/Player/Script.js
@@ -5,6 +5,7 @@ function C999_Common_Player_Load() {
 	C999_Common_Player_ActiveTab = "Profile";
 	LeaveIcon = "Leave";
 	LoadText();
+	PlayerSkillShowLevelUp = 0;
 }
 
 // Returns the title for the player based on actor interactions
diff --git a/Drawing.js b/Drawing.js
index 7dcef3b7c3..2762c7fe50 100644
--- a/Drawing.js
+++ b/Drawing.js
@@ -248,6 +248,9 @@ function DrawInventory(ctx) {
 	else
 		DrawImage(ctx, "Icons/" + GetPlayerIconImage() + "_Inactive.png", 0, 601);
 	
+	// Draw an arrow over the player head if there's a skill level up
+	if (PlayerSkillShowLevelUp > 0) DrawImage(ctx, "Icons/SkillLevelUp.png", 0, 601);
+	
 	// Scroll in the full inventory to draw the icons and quantity, draw a padlock over the item if it's locked
 	var Pos = 1;
 	for (var I = 0; I < PlayerInventory.length; I++) {
diff --git a/Icons/SkillLevelUp.png b/Icons/SkillLevelUp.png
new file mode 100644
index 0000000000000000000000000000000000000000..2be40445ff3e095bf3cd26b58e8f4c62d6ccafdc
GIT binary patch
literal 2755
zcmV;!3Ox0RP)<h;3K|Lk000e1NJLTq002t>002t}1^@s6I8J)%00006VoOIv0RI60
z0RN!9r;`8x010qNS#tmY3ljhU3ljkVnw%H_000McNliru;sXH}7CYR&<eC5g3Q$Qz
zK~#9!?Oc0sTvZwWopbN*-E1D4U6Veclv)#}r3($%($*@9c5I6<%(NijjD$vU92qSL
zGhnBql>rBsGJ<x>)LI=K8H&YHq=hO}Z3~KRlGZ+w^tEXdLLQsvZtiaO-t+m#?k0C1
z(cSdk&8FnboIi5!<eam=`+dLj`@ZjPfJvLQNgHQl`Lr3I&sXX3c)S2OfUwW!JL2_v
zTP7dV2tYT5LZMwWiU}b?0|Ns;tFN!0{fPx>^XAR&a5(%vWnsO&z0Y{PUi&8rC*IJ|
zutEqyV;P#J`8RCXP*zY-z^-(lSRfGCJ~|jFAvoF)=gytGGsbOKB*Al4Rrf23a$CwK
z7{frg8Hbx6Ltpp|2m+khFuiCQme2k<hyZ|6ChYF+-cVLn_6z`VC4nUm4i4^hI2>O|
zy+wHUd^MW<ufoO)!3<jxq=TTLYUUI8?2IQtlnR*N@BdMGdHK^<3Rw0)An>}=>0F(-
zFhg(XEM7l#D>MqH^_*ciNnmQx&A7c{4>-3c015yd9UYHPn>Ovai4K-M5D5IKprBw?
zV%TxC1rB4^$=hI;iZkA-T`I!8-lMQ{S4tRnc6L5Kb?VgTCMsBRFc|!+!{PWs@{%q6
z@8XSyJ7ANFvfeIZ4AnQDh0L8PfcgFYAD5SxZ~C8ZnulO9H558xv)QVWZ(Qu#kGGoc
zg~Y}#mpGGAbCVB%lya}XukQtq$MYBfeL{d03WZL}vOF(&DPP}SynXgTFcVIEiP^F4
zrZZq9r`!t!0$WQ<OTT9}U}l3Qg+ie^S(X<hhKPi7J$vx>nFqm{%{(o_WK=Ia0UJ*Z
z=YfHNEpE5_VKZfgX`=3$Yp!(;s_HRGmKRWrGzb7^63%w-#+!}b0GJITwtF*%MjE!&
zRzQt(0$?z%TU=cHUBAEkc~ga=8I!D8v!>|OsS_XCWO+V_5FZjGG<5C48x8kIpFS}Q
zhJ<ak^AHHP#E^=vO++XuDPG^%+4*eVgyEvaiwh4NIB>*nvsD`B<4nfsuASI>W*ro{
z#Bwng5h`jH9!H^Vddgwg*VnhXtgP(O@dnF2sH&%BS)P+T?WxXJ@R#%7hs+CdmQU$4
zgl|`!f<rD%NBTQFZg<V)aM)#mrK;*hNs_KkzJ9D@2mao?5uC~6lC3|q@IPraoT{pO
zTrSsLV+CxiU@=uyFG-R#GdYDh+Ws;QH9rl;IL6Bu<EXju-*Cw8bh2iDNlD4du>dv}
zupEPfgJ+Y0;>?DlZNJ39OHYGA#`qiIfg28@M7at?A{nr~E|=?T*#ef;<A0#Kx;PjN
zHYNilb32ZHyaflEp8{Y5f#t#A_*LC4@T-j}UhZ%>R&{rG{~_DYpN(g+?(UwqorTU7
z2|zJBK5W~91I<5yEr(>DsfG0cJm7r~Q=IcbNsiRo+WPRP=gj$q*`CFknwq{<SXi*a
zsG~R}yx;l)-t%pO%$y)%c{l951Urs>37vx{!3;VKM7V0^%$N4R^UlIdohDPyvJa|i
zh%v^De|os}dHkzo3nZTZJ%or*QSIH2PZd-opOAGPx4X(L&tgZ89J!k_o{&#8_aDSR
zTegBTB`-ZHdC1I(-<`NCS~xU(4rhUL;eGerKg%qzq$yLUd^vieL|5QU!k^Eq2WPf~
zd@Sz=3G6uj)s#EyA6dULlPJsNj2A_P#Y>Fk@382Hss&6bwd7cVp)cGH&g{^|P^@H4
zC@(8t1YkP=?Q+4A8AGu#---w|+HqkMuXRVn3|<vAO^dKhqAU~Fu=Vuz9ydC!Q!0nV
zlvvh3QDTrm7aC@j+yYGujljhi8X6mqn!;I}b8)fx;`>Ho6r`ityBmsJ3PA*obm$~T
z8I%(dI{NxLbkZSl2X35tFV<eSEdfLZh95rq$lv~72xclBq{_<5d9`(Q$CLYZ60<|2
z5PHKGp=v!N(-DDUZr&a|jdy*|TAC|{^#JahzXM8|<k>D2!DXKTr|dyQgi`LewY44k
z%-p$m0O&D;;PuAF#*g;C_130Ut5$C`0;bat7&zSa*>KxukHQgA-OMd)B<ZAMhSLj0
z8oh27(L-tX_PJ%tegHr<O~Et9`q!>q`|H};qpwEgRyIEgqS=xm2wColpy`@+_uXq(
zwYRsQ2M{(5EFy}?vfQzJ`SK@Udhw;lw1}=tTms90;7R0Q=$Vl`XB?by)YsMTE_Jz<
z?c2BSLje8Au+NxnY}f&m0hqFJ<HpY~TD-Vw&YU@3m&-L%mSu&A;B-1mjPqU^sKxJ3
ztOHNe<1@=ttrt%$se>XH8{~jC6p2JsUDqSQV6dyTwdHhOU489SKYi+u-`~~D80#XU
zU^Zo%Yzt3A06qrLvuV?&765x<0NP?+>g?<5Kg<{#L55g#I~GbZLvk@f+#j{o&!0c<
zJFz|Mu}~X~jSvw<vR!8^RXPzPL=`}H3?vBv^LRX-s8C>u1aC1|LdWpw8#kxZsR6hU
z+h@Fcc3Dl=%PnaRx9|W!QIs$UM2w6D%P6l{=~)zCij0R6#k?tO);gxwe+d*Ne#7rp
zg9Q=w;6&##|J@Kvisi;9Oa#lrP!})=6|11K0<1I-*zzzG(Ssx&j?566c?%ZB!!SuD
zr$mS)oHcSB(u4>@O0&ltc@`zFo$sE-hIu2m1TRD?KKajC@w!?9!87Z_P#6->WId7J
zoR!KamWxu6x_171)^N!-Nl4^MXITuF<<fyfG##<Bx1q<X4iic`APv0_(}$&`757|1
z{B=p>eHf-8Rw9aqiPZ!zDDiNi2@r;9WY+M}ZY{yH2}bbgwiz$~3X44pV&V~eviDOC
z6}-hVD+jOW#XZaN+|c^&xHVx&i3D%8bP&RrAX=v#ED6K-D-e_vik5~UEM|9DR{Tp%
zci3biouPOT09pBV5~Y1id7ene3Vmr$Lo2b;)1HPRufb|>Z`X!~hI$l5DUV+(Qrrk@
zVJNcGGO#$a!C@;*xYpIxdD3k6GCMdTXU{afW-QoDchAMuo_UtF@*#jbZ(a|H%P{up
zU*5X)HRSo1Gi|F^-+s&X?c4uhyr>BcFYbK^=R1x;;^uuhb0`wRt=Hd!uP=Ebp|c}|
z2+x=?y@D~;LS)`KY&KXNzzkpW#X3b%%8WM@n-dp0j>A9Dn$kTUTj)u+cFF>{oaNB;
zkxo2g4DIdh2XF8$xC?+kpFIlzik2>2w&ahycI{{5@Xl#C9PXKY&8$TLF2TfZGyqFp
zZP8j=TZ5IAl>-%(m0!#yP`a)U)vSB)o(mT)G!oIE+4EcV=xqR|Em^X(YUj?KugJ1&
z`Imb9et*;T*U$eZfOE0%6B7ljxGZrO7Z=Z3x^&rf>uPFNR#jE4bT}NP%!K$9LWutU
z{?<c>4!!x?-|TqrgAYDvB%&4o0a)-q9dePXa{vl}A^?Q|3M(oqT#PZE)VR)a*Nnp9
zknZ#OdH@6sV+a=N-&``V6a$Z&v@XRwNFYc55^B;WZPLcw{tGBSr3jkVU`YS~002ov
JPDHLkV1g{4BbopJ

literal 0
HcmV?d00001

diff --git a/Skill.js b/Skill.js
index 8ebfaa4b49..d9cf8d1e7b 100644
--- a/Skill.js
+++ b/Skill.js
@@ -1,10 +1,14 @@
 var PlayerSkill = [];
 var PlayerSkillName = 0;
 var PlayerSkillLevel = 1;
+var PlayerSkillShowLevelUp = 0;
 
 // Add a new skill or raise the skill level if the skill is already known
 function PlayerAddSkill(SkillToAdd, LevelToAdd) {
 
+	// Shows the new skill warning for 15 seconds
+	PlayerSkillShowLevelUp = Math.round(15 * 1000 / RunInterval);
+
 	// If the skill is already known, we raise the level
 	for (var I = 0; I < PlayerSkill.length; I++)
 		if (SkillToAdd == PlayerSkill[I][PlayerSkillName]) {
diff --git a/Struggle.js b/Struggle.js
index 514a318268..4c324b226f 100644
--- a/Struggle.js
+++ b/Struggle.js
@@ -13,6 +13,14 @@ var StruggleDone = false;
 var StruggleImageFrame = 0;
 var StruggleImageFrameMax = 1;
 var StruggleImageFrameTime = 0;
+var StruggleSkillBonus = 0;
+
+// For each Rope Mastery level, it's 50% easier to struggle out
+function StruggleLoad() {
+	StruggleDone = false;
+	StruggleProgress = 0;
+	StruggleSkillBonus = PlayerGetSkillLevel("RopeMastery");
+}
 
 // The next tick to lower the struggle time comes faster with harder levels
 function StruggleGetNextTick() {
@@ -53,7 +61,7 @@ function StruggleClick(SType, SDifficulty, SMessage, SDoneMessage, SX, SY, SRadi
 		
 		// Raise the progress by 2 for each click, 100 is done
 		if (StruggleProgress <= 0) StruggleProgress = 8;
-		StruggleProgress = StruggleProgress + 2;
+		StruggleProgress = StruggleProgress + 2 + StruggleSkillBonus;
 		if (StruggleProgress >= 100) {
 			StruggleProgress = 100;
 			StruggleDone = true;
diff --git a/Time.js b/Time.js
index 46446c7e53..4340912168 100644
--- a/Time.js
+++ b/Time.js
@@ -32,6 +32,7 @@ function ProcessTimer() {
 	// Ticks the timer every for the screen refresh and events
 	clearInterval(CurrentTimer);
 	CurrentTimer = setInterval("MainRun()", RunInterval);
+	if (PlayerSkillShowLevelUp > 0) PlayerSkillShowLevelUp--;
 
 	// If the timer must run
 	if (RunTimer) {