@@ -68,7 +68,7 @@ Author: Zach & Ian
6868</style >
6969
7070<div id =" towerTitle " >Tower Defense Game</div >
71- <div id =" towerDesc " >Spend money to place monkeys down and protect the balloons from making it to the end!</div >
71+ <div id =" towerDesc " >Spend money to place monkeys down and protect the balloons from making it to the end! Click on troops to upgrade them and make them stronger! </div >
7272<div id =" statusBar " >
7373 <span id =" moneyDisplay " >Money: $1000</span >
7474 <span id =" healthDisplay " >Health: 20</span >
@@ -79,8 +79,9 @@ Author: Zach & Ian
7979 <canvas id =" gameCanvas " width =" 900 " height =" 500 " ></canvas >
8080
8181 <div id =" upgradePanel " >
82- <div><button id="upgradeRange">Upgrade Range (+$100)</button></div>
83- <div><button id="upgradeDamage">Upgrade Damage (+$100)</button></div>
82+ <div><button id="upgradeRange">Upgrade Range (-$100)</button></div>
83+ <div><button id="upgradeDamage">Upgrade Damage (-$100)</button></div>
84+ <div><button id="upgradeFireRate">Upgrade Fire Rate (-$100)</button></div>
8485 <div><button id="sellMonkey">Sell Monkey</button></div>
8586 </div >
8687</div >
@@ -102,6 +103,7 @@ Author: Zach & Ian
102103 const upgradePanel = document .getElementById (" upgradePanel" );
103104 const upgradeRangeBtn = document .getElementById (" upgradeRange" );
104105 const upgradeDamageBtn = document .getElementById (" upgradeDamage" );
106+ const upgradeFireRateBtn = document .getElementById (" upgradeFireRate" );
105107 const sellMonkeyBtn = document .getElementById (" sellMonkey" );
106108 const startWaveBtn = document .getElementById (" startWaveBtn" );
107109
@@ -145,11 +147,12 @@ Author: Zach & Ian
145147 this .y = y;
146148 this .range = 100 ;
147149 this .damage = 1 ;
148- this .price = price;
149150 this .fireRate = 60 ; // frames between shots
150151 this .fireCooldown = 0 ;
152+ this .price = price;
151153 this .selected = false ;
152154 this .type = " base" ;
155+ this .levels = { range: 0 , damage: 0 , fireRate: 0 }; // Levels for upgrades
153156 }
154157 draw () {
155158 ctx .save ();
@@ -522,51 +525,78 @@ Author: Zach & Ian
522525 balloons .push (new Balloon (type));
523526 }
524527
525- // Upgrade selected monkey range or damage
528+ // Update the upgrade panel to show sell price and levels
529+ function showUpgradePanel (monkey ) {
530+ selectedMonkey = monkey;
531+ const sellPrice = Math .floor (monkey .price / 2 );
532+ sellMonkeyBtn .textContent = ` Sell Monkey (+$${ sellPrice} )` ;
533+
534+ // Update levels next to each upgrade button
535+ upgradeRangeBtn .innerHTML = ` Upgrade Range (-$100) <span style =" ${monkey .levels .range === 10 ? 'font-weight :bold ;' : ' ' } " >[Lvl ${ monkey .levels .range } ]</span >` ;
536+ upgradeDamageBtn .innerHTML = ` Upgrade Damage (-$100) <span style =" ${monkey .levels .damage === 10 ? 'font-weight :bold ;' : ' ' } " >[Lvl ${ monkey .levels .damage } ]</span >` ;
537+ upgradeFireRateBtn .innerHTML = ` Upgrade Fire Rate (-$100) <span style =" ${monkey .levels .fireRate === 10 ? 'font-weight :bold ;' : ' ' } " >[Lvl ${ monkey .levels .fireRate } ]</span >` ;
538+
539+ // Position upgrade panel near monkey
540+ const rect = canvas .getBoundingClientRect ();
541+ const containerRect = document .getElementById (" gameContainer" ).getBoundingClientRect ();
542+ upgradePanel .style .left = (monkey .x + rect .left - containerRect .left + 20 ) + " px" ;
543+ upgradePanel .style .top = (monkey .y + rect .top - containerRect .top - 40 ) + " px" ;
544+ upgradePanel .style .display = " block" ;
545+ }
546+
547+ // Upgrade selected monkey's range, damage, or fire rate
526548 function upgradeSelectedMonkey (type ) {
527549 if (! selectedMonkey) return ;
528550
529- if (money < 100 ) {
530- alert (" Not enough money to upgrade!" );
531- return ;
532- }
533- if (type === " range" ) {
534- selectedMonkey .range += 20 ;
551+ if (type === " range" && selectedMonkey .levels .range < 10 && money >= 100 ) {
552+ selectedMonkey .range *= 1.10 ; // Increase range by 10%
553+ selectedMonkey .levels .range ++ ;
535554 money -= 100 ;
536- } else if (type === " damage" ) {
537- selectedMonkey .damage += 1 ;
555+ } else if (type === " damage" && selectedMonkey .levels .damage < 10 && money >= 100 ) {
556+ selectedMonkey .damage *= 1.10 ; // Increase damage by 10%
557+ selectedMonkey .levels .damage ++ ;
558+ money -= 100 ;
559+ } else if (type === " fireRate" && selectedMonkey .levels .fireRate < 10 && money >= 100 ) {
560+ selectedMonkey .fireRate = Math .floor (selectedMonkey .fireRate * 0.9 ); // Increase fire rate by 10%
561+ selectedMonkey .levels .fireRate ++ ;
538562 money -= 100 ;
539563 }
564+
565+ // Update levels in the upgrade panel
566+ showUpgradePanel (selectedMonkey);
540567 updateMoneyDisplay ();
541568 }
542569
543570 // Sell selected monkey
544571 function sellSelectedMonkey () {
545572 if (! selectedMonkey) return ;
546- money += Math .floor (selectedMonkey .price / 2 );
573+ const sellPrice = Math .floor (selectedMonkey .price / 2 );
574+ money += sellPrice;
547575 monkeys = monkeys .filter (m => m !== selectedMonkey);
548576 selectedMonkey = null ;
549577 hideUpgradePanel ();
550578 updateMoneyDisplay ();
551579 }
552580
553- // Show upgrade panel near monkey
554- function showUpgradePanel (monkey ) {
555- selectedMonkey = monkey;
556- // Position upgrade panel near monkey but keep it inside canvas container
557- const rect = canvas .getBoundingClientRect ();
558- const containerRect = document .getElementById (" gameContainer" ).getBoundingClientRect ();
559-
560- upgradePanel .style .left = (monkey .x + rect .left - containerRect .left + 20 ) + " px" ;
561- upgradePanel .style .top = (monkey .y + rect .top - containerRect .top - 40 ) + " px" ;
562- upgradePanel .style .display = " block" ;
563- }
564-
565581 function hideUpgradePanel () {
566582 upgradePanel .style .display = " none" ;
567583 selectedMonkey = null ;
568584 }
569585
586+ // Button handlers for upgrades
587+ upgradeRangeBtn .onclick = () => {
588+ upgradeSelectedMonkey (" range" );
589+ };
590+ upgradeDamageBtn .onclick = () => {
591+ upgradeSelectedMonkey (" damage" );
592+ };
593+ upgradeFireRateBtn .onclick = () => {
594+ upgradeSelectedMonkey (" fireRate" );
595+ };
596+ sellMonkeyBtn .onclick = () => {
597+ sellSelectedMonkey ();
598+ };
599+
570600 // Main update function
571601 function update () {
572602 if (gameOver) return ;
@@ -652,16 +682,6 @@ Author: Zach & Ian
652682 hideUpgradePanel ();
653683 };
654684
655- upgradeRangeBtn .onclick = () => {
656- upgradeSelectedMonkey (" range" );
657- };
658- upgradeDamageBtn .onclick = () => {
659- upgradeSelectedMonkey (" damage" );
660- };
661- sellMonkeyBtn .onclick = () => {
662- sellSelectedMonkey ();
663- };
664-
665685 // Canvas click handler for placing or selecting monkeys
666686 canvas .addEventListener (" click" , (e ) => {
667687 if (gameOver) return ;
0 commit comments