hQ|*s^}&~eFNXaZCKdxP9I^^}
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
literal 0
HcmV?d00001
From a13989a93fd5e46c955b9046c5e120b1b2adaeeb Mon Sep 17 00:00:00 2001
From: yeahbennou <38169671+BenZeng04@users.noreply.github.com>
Date: Mon, 13 Dec 2021 18:38:52 -0500
Subject: [PATCH 07/31] draft-ify mentorship for now
---
README.md | 3 +--
content/_index.md | 3 +--
content/mentorship/_index.md | 1 +
3 files changed, 3 insertions(+), 4 deletions(-)
diff --git a/README.md b/README.md
index ae016daa..7f5636b4 100644
--- a/README.md
+++ b/README.md
@@ -6,5 +6,4 @@ A platform for the various events, resources and workshops that the Learning Bra
* [Game Dev Series](https://learning.mcpt.ca/game-dev/)
* [Game Jam](https://learning.mcpt.ca/game-jam/)
-* [LyonHacks](https://learning.mcpt.ca/lyon-hacks/)
-* [Mentorship](https://learning.mcpt.ca/mentorship/)
+* [LyonHacks](https://learning.mcpt.ca/lyon-hacks/)
\ No newline at end of file
diff --git a/content/_index.md b/content/_index.md
index 732a2967..440b26e7 100644
--- a/content/_index.md
+++ b/content/_index.md
@@ -13,5 +13,4 @@ Join us on **Thursday, December 16th** at **4:15pm** for our **Game Dev** series
### Jump To:
* [Game Series](game-dev)
* [Game Jam](game-jam)
-* [LyonHacks](lyon-hacks)
-* [Mentorship](mentorship)
+* [LyonHacks](lyon-hacks)
\ No newline at end of file
diff --git a/content/mentorship/_index.md b/content/mentorship/_index.md
index 90c9f36d..84b234cc 100644
--- a/content/mentorship/_index.md
+++ b/content/mentorship/_index.md
@@ -2,6 +2,7 @@
chapter = true
title = "Mentorship"
weight = 10
+draft = true
+++
# Mentorship Program
From 6c0447747746ca4c20f22c008926fec868be16bf Mon Sep 17 00:00:00 2001
From: yeahbennou <38169671+BenZeng04@users.noreply.github.com>
Date: Mon, 13 Dec 2021 19:16:26 -0500
Subject: [PATCH 08/31] Fix improper sorting & ranking
---
layouts/shortcodes/users-table.html | 13 +++++++++----
1 file changed, 9 insertions(+), 4 deletions(-)
diff --git a/layouts/shortcodes/users-table.html b/layouts/shortcodes/users-table.html
index 23ee7a67..ec1c677b 100644
--- a/layouts/shortcodes/users-table.html
+++ b/layouts/shortcodes/users-table.html
@@ -29,8 +29,9 @@
const app = initializeApp(firebaseConfig);
const db = getFirestore(app);
+ const lb = collection(doc(collection(db, "game-dev"), "leaderboard"), "users");
- const querySnapshot = await getDocs(collection(doc(collection(db, "game-dev"), "leaderboard"), "users"));
+ const querySnapshot = await getDocs(lb);
const users = [];
querySnapshot.forEach((doc) => {
const data = doc.data();
@@ -44,19 +45,23 @@
});
});
- users.sort((a, b) => a.total - b.total);
+ users.sort((a, b) => b.total - a.total);
+ let prevRank = 0;
for (let i = 0; i < users.length; i++) {
const user = users[i];
var row = table.insertRow();
var rank = row.insertCell();
- rank.innerHTML = "" + (i + 1);
+
+ if (user.total !== users[prevRank].total) prevRank = i;
+ rank.innerHTML = "" + (prevRank + 1);
+
var name = row.insertCell();
name.className = "user-name";
name.innerHTML = "" + user.name + ""
for (let i = 0; i < user.scores.length; i++) {
var score = row.insertCell();
var scoreValue = user.scores[i];
- if (scoreValue >= 200) {
+ if (scoreValue > 200) {
var bonus = scoreValue - 200;
score.className = "first-solve full-score";
score.innerHTML = "200\n" +
From d9c096faa0ab50903a5a26aafcbb2af3751fddf8 Mon Sep 17 00:00:00 2001
From: yeahbennou <38169671+BenZeng04@users.noreply.github.com>
Date: Mon, 13 Dec 2021 19:18:31 -0500
Subject: [PATCH 09/31] Delete leaderboard.yaml
---
data/leaderboard.yaml | 394 ------------------------------------------
1 file changed, 394 deletions(-)
delete mode 100644 data/leaderboard.yaml
diff --git a/data/leaderboard.yaml b/data/leaderboard.yaml
deleted file mode 100644
index fa9eca81..00000000
--- a/data/leaderboard.yaml
+++ /dev/null
@@ -1,394 +0,0 @@
-### Template: ###
-# - name: Name
-# rank: 1
-# scores:
-# - part: i
-# points: 200
-# bonus: 100
-# status: first-solve full-score # status for the table cell
-# - part: ii:
-# points: -9999
-# status: failed-score
-# - part: iii
-# total: 300
-# status: disqualified # status for the row
-#
-# status:
-# options: first-solve, full-score, partial-score, failed-score, disqualified
-# can space separate mutliple statuses (each has their own style)
-# default: full-score
-# (option names were chosen to match dmoj)
-#
-# full-score -> green bolded text
-# partial-score -> green text
-# failed-score -> red bolded text
-# first-solve -> highlights the box green
-# disqualified -> highlights the box red
-# The "part" key exists for human readability. Its value has no impact on the leaderboard.
-
-- name: Luka Jovanovic
- email: luka.jovanovic@student.tdsb.on.ca
- rank: 1
- scores:
- - part: i
- points: 200
- bonus: 100
- status: first-solve full-score
- - part: ii
- points: 200
- bonus: 300
- status: first-solve full-score
- - part: iii
- total: 800
-- name: Michael C
- email: michael.chen7@student.tdsb.on.ca
- rank: 2
- scores:
- - part: i
- points: 200
- bonus: 90
- status: first-solve full-score
- - part: ii
- points: 200
- bonus: 260
- status: first-solve full-score
- - part: iii
- total: 750
-- name: BattleMage_
- email: leyang.zou@student.tdsb.on.ca
- rank: 3
- scores:
- - part: i
- points: 200
- bonus: 100
- status: first-solve full-score
- - part: ii
- points: 200
- bonus: 240
- status: first-solve full-score
- - part: iii
- total: 740
-- name: Maplefin
- email: james.huynh2@student.tdsb.on.ca
- rank: 4
- scores:
- - part: i
- points: 200
- bonus: 60
- status: first-solve full-score
- - part: ii
- points: 200
- bonus: 220
- status: first-solve full-score
- - part: iii
- total: 680
-- name: AZron
- email: aaron.zhu@student.tdsb.on.ca
- rank: 5
- scores:
- - part: i
- points: 200
- bonus: 100
- status: first-solve full-score
- - part: ii
- points: 200
- bonus: 160
- status: first-solve full-score
- - part: iii
- total: 660
-- name: RedWiz
- email: saileshvijayaragavan.badri@student.tdsb.on.ca
- rank: 5
- scores:
- - part: i
- points: 200
- bonus: 60
- status: first-solve full-score
- - part: ii
- points: 200
- bonus: 200
- status: first-solve full-score
- - part: iii
- total: 660
-- name: Chelsea Wong
- email: chelsea.wong@student.tdsb.on.ca
- rank: 7
- scores:
- - part: i
- points: 200
- bonus: 100
- status: first-solve full-score
- - part: ii
- points: 200
- bonus: 140
- status: first-solve full-score
- - part: iii
- total: 640
-- name: alexa
- email: alyn.huang@student.tdsb.on.ca
- rank: 7
- scores:
- - part: i
- points: 200
- bonus: 60
- status: first-solve full-score
- - part: ii
- points: 200
- bonus: 180
- status: first-solve full-score
- - part: iii
- total: 640
-- name: Lost_Cactus
- email: sean.zhao2@student.tdsb.on.ca
- rank: 9
- scores:
- - part: i
- points: 200
- bonus: 50
- status: first-solve full-score
- - part: ii
- points: 200
- bonus: 120
- status: first-solve full-score
- - part: iii
- total: 570
-- name: lukas142434
- email: lukas.li@student.tdsb.on.ca
- rank: 10
- scores:
- - part: i
- points: 200
- bonus: 20
- status: first-solve full-score
- - part: ii
- points: 200
- bonus: 100
- status: first-solve full-score
- - part: iii
- total: 520
-- name: Felix
- email: felix.zhao2@student.tdsb.on.ca
- rank: 11
- scores:
- - part: i
- points: 200
- bonus: 10
- status: first-solve full-score
- - part: ii
- points: 200
- bonus: 100
- status: first-solve full-score
- - part: iii
- total: 510
-- name: 3xp3rtz
- email: caleb.chue@student.tdsb.on.ca
- rank: 12
- scores:
- - part: i
- - part: ii
- points: 200
- bonus: 280
- status: first-solve full-score
- - part: iii
- total: 480
-- name: Sarah Zhao
- email: sarah.zhao4@student.tdsb.on.ca
- rank: 13
- scores:
- - part: i
- points: 200
- bonus: 10
- status: first-solve full-score
- - part: ii
- points: 200
- - part: iii
- total: 410
-- name: Formoon28
- email: ethan.xu@student.tdsb.on.ca
- rank: 14
- scores:
- - part: i
- points: 200
- - part: ii
- points: 200
- - part: iii
- total: 400
-- name: Arjun
- email: arjun.jindal@student.tdsb.on.ca
- rank: 14
- scores:
- - part: i
- points: 200
- - part: ii
- points: 200
- - part: iii
- total: 400
-- name: Anthony Zanchetta
- email: anthony.zanchetta@student.tdsb.on.ca
- rank: 14
- scores:
- - part: i
- points: 200
- - part: ii
- points: 200
- - part: iii
- total: 400
-- name: Aidan Wang
- email: aidan.wang2@student.tdsb.on.ca
- rank: 14
- scores:
- - part: i
- points: 200
- - part: ii
- points: 200
- - part: iii
- total: 400
-- name: MuteMini
- email: min.kang@student.tdsb.on.ca
- rank: 18
- scores:
- - part: i
- points: 200
- bonus: 100
- status: first-solve full-score
- - part: ii
- - part: iii
- total: 300
-- name: MarsFlat
- email: shane.chen@student.tdsb.on.ca
- rank: 18
- scores:
- - part: i
- points: 200
- bonus: 100
- status: first-solve full-score
- - part: ii
- - part: iii
- total: 300
-- name: CodeBeginner
- email: joshua.persaud4@student.tdsb.on.ca
- rank: 18
- scores:
- - part: i
- - part: ii
- points: 200
- bonus: 100
- status: first-solve full-score
- - part: iii
- total: 300
-- name: Ryan Atlas
- email: ryan.atlas@student.tdsb.on.ca
- rank: 21
- scores:
- - part: i
- points: 200
- bonus: 90
- status: first-solve full-score
- - part: ii
- - part: iii
- total: 290
-- name: C.W.
- email: christina.wang4@student.tdsb.on.ca
- rank: 22
- scores:
- - part: i
- points: 200
- bonus: 20
- status: first-solve full-score
- - part: ii
- - part: iii
- total: 220
-- name: Minh
- email: minh.phan3@student.tdsb.on.ca
- rank: 23
- scores:
- - part: i
- points: 200
- bonus: 10
- status: first-solve full-score
- - part: ii
- - part: iii
- total: 210
-- name: Galit T.
- email: galit.tauber@student.tdsb.on.ca
- rank: 23
- scores:
- - part: i
- points: 200
- bonus: 10
- status: first-solve full-score
- - part: ii
- - part: iii
- total: 210
-- name: Ella R
- email: ella.richmond@student.tdsb.on.ca
- rank: 25
- scores:
- - part: i
- points: 200
- - part: ii
- - part: iii
- total: 200
-- name: Paul Lee
- email: paul.lee@student.tdsb.on.ca
- rank: 25
- scores:
- - part: i
- points: 200
- - part: ii
- - part: iii
- total: 200
-- name: Leo Liu
- email: leo.liu4@student.tdsb.on.ca
- rank: 25
- scores:
- - part: i
- points: 200
- - part: ii
- - part: iii
- total: 200
-- name: roma
- email: roman.shteflyuk@student.tdsb.on.ca
- rank: 25
- scores:
- - part: i
- points: 200
- - part: ii
- - part: iii
- total: 200
-- name: Ivy Zhuang
- email: ivy.zhuang@student.tdsb.on.ca
- rank: 25
- scores:
- - part: i
- points: 200
- - part: ii
- - part: iii
- total: 200
-- name: ryan gill
- email: ryan.gill2@student.tdsb.on.ca
- rank: 25
- scores:
- - part: i
- points: 200
- - part: ii
- - part: iii
- total: 200
-- name: deggy
- email: danya.cheng@student.tdsb.on.ca
- rank: 25
- scores:
- - part: i
- points: 200
- - part: ii
- - part: iii
- total: 200
-- name: Brian Song
- email: brian.song@student.tdsb.on.ca
- rank: 25
- scores:
- - part: i
- - part: ii
- points: 200
- - part: iii
- total: 200
From a824148003507bb87eef50b03cd5cae94a532911 Mon Sep 17 00:00:00 2001
From: ji-mmyliu
Date: Mon, 13 Dec 2021 20:08:58 -0500
Subject: [PATCH 10/31] Initial commit for powerups
Explains powerups: spikes, balloon slowdown, and tower speedup.
---
.gitignore | 1 +
content/game-dev/part-iii/powerups.md | 93 +++++++++++++++++++++++++++
2 files changed, 94 insertions(+)
create mode 100644 content/game-dev/part-iii/powerups.md
diff --git a/.gitignore b/.gitignore
index a1d5a715..0ac58eae 100644
--- a/.gitignore
+++ b/.gitignore
@@ -7,3 +7,4 @@ package-lock.json
package.json
.hugo_build.lock
+hugo.exe
diff --git a/content/game-dev/part-iii/powerups.md b/content/game-dev/part-iii/powerups.md
new file mode 100644
index 00000000..da7a5c55
--- /dev/null
+++ b/content/game-dev/part-iii/powerups.md
@@ -0,0 +1,93 @@
++++
+title = "Powerups"
+weight = 5
++++
+
+---
+
+### Road Spikes
+One feature in tower defense games is road spikes which are intended for use in urgent situations, where balloons are approaching the end of the path and need to be popped quickly. The implementation of road spikes is similar to towers, but the drag-and-drop interface was slightly different, since spikes are placed ***on*** the path rather than off, and they do not shoot anything, but rather sit on the path until a balloon comes by.
+
+The first modification to the drag-and-drop that needs to be made is to ensure that spikes are placed on the path. Recall beforehand that we checked to see if towers were *not* on the path by ensuring that its distance from the path is greater than the path's radius. Similarly, we will check to see if the distance of the spike to the path is ***less than*** the radius.
+
+{{% expand "See code for checking spike drop locations" "false" %}}
+```java
+// Checks if the location of the spike is on the path
+boolean legalSpikeDrop() {
+ PVector heldLocation = spikeLocation;
+ return shortestDist(heldLocation) <= PATH_RADIUS;
+}
+```
+{{% /expand %}}
+
+Next, we need to head to the `Balloons.pde` file to have every balloon check if they are within the range of a spike.
+
+{{% expand "See code for checking spike pops" "false" %}}
+```java
+PVector position = getLocation(balloon[distanceTravelled]); // Get the current location of the balloon
+if (balloonSpikeCollision(position)) { // Check for a collision between the balloon and any spike
+ handleBalloonPop(); // Award player for popping the balloon
+ balloons.remove(i); // Balloon has been popped! Remove it from the list
+ i--; // Obligatory index fixing due to ArrayList indexing
+ continue;
+}
+
+boolean balloonSpikeCollision(PVector position) {
+ for (int i = 0; i < spikeLocations.size(); i++) {
+ PVector spikeLocation = spikeLocations.get(i);
+ if (dist(position.x, position.y, spikeLocation.x, spikeLocation.y) <= PATH_RADIUS) { // See if there is a collision between the spike and the balloon
+ spikeData.set(i, spikeData.get(i) - 1);
+ return true; // // Spike has popped the balloon!
+ }
+ }
+ return false;
+}
+```
+{{% /expand %}}
+
+### Balloon Slowdowns
+The function of the balloon slowdown is to temporarily decrease the moving speeds of all the balloons to half their original speed. To do this, we will keep a `slowdownAmount` variable which will be multiplied into the speed of every balloon at all times.
+
+```java
+float travelSpeed = balloon[speed] * slowdownAmount; // Slow down the balloon if the slowdown powerup is engaged
+balloon[distanceTravelled] += travelSpeed; // Increases the balloon's total steps by the speed
+```
+
+Initially the `slowdownAmount` variable will be set to `1` to effect no change on the balloons' speeds. In the `handleSlowdownPress()` method, we will set `slowdownAmount` to `0.5` in order to multiply the speeds of all balloons by half.
+
+{{% expand "See code for handleSlowdownPress()" "false" %}}
+```java
+void handleSlowdownPress() {
+ if (withinSlowdownBounds() && powerupCount[slowdown] > 0 && slowdownAmount == 1) {
+ powerupCount[slowdown]--;
+ slowdownAmount = 0.5;
+ slowdownRemaining = slowdownLength * 60;
+ }
+}
+```
+{{% /expand %}}
+
+To make sure slowdowns are temporary, we will set a `slowdownRemaining` variable to keep track of how many frames of slowdown is left. Since the Processing frame-rate is 60 frames per second, one second will go by in 60 frames. Whenever the slowdown button is pressed, we need to refill `slowdownRemaining` with 60 times the length of a slowdown session in seconds. At each frame that goes by, `slowdownRemaining` will be decreased by 1. Once it reaches 0, the slowdown effect will be cancelled.
+
+{{% expand "See code for handling each frame of slowdown" "false" %}}
+```java
+void handleSlowdown() {
+ if (slowdownRemaining > 0) {
+ slowdownRemaining--;
+
+ if (slowdownRemaining == 0) { // Once slowdown has ended...
+ slowdownAmount = 1; // Revert to original speed
+ }
+ }
+}
+```
+{{% /expand %}}
+
+### Tower Speed Boosts
+This powerup will give every tower a speed boost for a limited amount of time. More specifically, the cooldown time for each tower will be reduced, allowing towers to shoot projectiles more quickly. Similar to the slowdown powerup, we will keep track of a `speedBoostAmount` which will be multiplied into the cooldowns of every tower on the field. We will modify the `Projectiles.pde` file to account for the speedboost value.
+
+```java
+data[cooldownRemaining] = (int)(data[maxCooldown] * speedBoostAmount); // Resets the cooldown accounting for the speedBoostAmount factor.
+```
+
+Make sure to cast the cooldown value into an integer since the `data` array stores integers rather than floating point numbers. Other than this slight change, all other parts of the powerup's implementation are identical to the slowdown powerup.
\ No newline at end of file
From 0450c466230c623951e18c83a7ce53556aafd5e2 Mon Sep 17 00:00:00 2001
From: ji-mmyliu
Date: Mon, 13 Dec 2021 20:46:15 -0500
Subject: [PATCH 11/31] Add powerups template code
Add attachment to files directory and attachment header to the powerups.md file
---
.../powerups.files/Powerups_Template.zip | Bin 0 -> 2462 bytes
content/game-dev/part-iii/powerups.md | 2 ++
2 files changed, 2 insertions(+)
create mode 100644 content/game-dev/part-iii/powerups.files/Powerups_Template.zip
diff --git a/content/game-dev/part-iii/powerups.files/Powerups_Template.zip b/content/game-dev/part-iii/powerups.files/Powerups_Template.zip
new file mode 100644
index 0000000000000000000000000000000000000000..3d57f42372cf60d139eb37475b43971384460d47
GIT binary patch
literal 2462
zcmZ{m`9Bkm1IB0OOqnCKTq!AX%x%t)!iKf6Top-fTaL&apOhmxvgRlz*P3DRW;T
zvL&~2lq)%sV?x=de*S#F&-26cdY;$w2fUGRPLL=70N@3r7ABz^MCUBmcmV(xDFEQ?
zpB0G>aSsT_1>UfA_rv+R2Dz*JXHmx8avyeBwh^}wW+!*Dk$o0;Er{<)9dVMWY`fb7
z;vBfLG#4G@&7`ejy3}jb4USJMv-dIEKK0!lr%@Z9!N>9S4O82t-!^b~aq40|@K;*k
z5rRqr(c;KpBPjhPat?ld#B6(Tf!mj}an`H(A-OdT)-d1d(whObaA4JSNc
zCD09zucKGdRWH(0^nX0LnmxjY8VOiy{*$+wJgBJ6uky
zEc1ME(36X{B$MlvbQv`-h-5+dhS7}~@PUNcx^UF@Zm2~2K(yG&7eJ36pVndtDw#b*
zTXd?b+9M4UnMaen3Zn9FGa!)@9X7J@>9b%~w@;ihNX0GLN5u(o_G?M@yCMW>ByH}D
zfp!_OC86=cp@K*W;VV`7Gi9~}F5g6b=};}xeaUteC2QgSIOoiZqk5muCtI6Q$Ylgw
z0gyrBred+l8DvXH;q>NLeB`}sE;Wn5k$CLayemg{eQ3SJH>h1Pv0w$WRH|*bc%Rqx
zqX^8zWcqt@@JV_fZ0<`4H6G?OuUY`@vVy#P;IQ_4gP-$O)J|}eKu$b^TS_VMb&Pjcef
z37)8G2o&+F@ZID7q=M>OrGohctU&5(nKIacl51rJ4EtPX{TTGIba(>B~*@NeHQanWT?;&ikxxh6VXUO@NFd{E52=i
zw&@fH9d^ioES#_36*kjj4B8^scc3l`2Qc6^TaLe6t!OSzYi&WOa&$6}$0Z1&xJCO#J#Lb4IDL>d<~$doQVO+(&6lM0-D?v_;X!khS8P
zR6(Ton?)Zz2S-JcQ&kW4ve2<}D{3km0yyV}`9qB{*8+usQF=mvt>v0BP<+K8vu?nD_6yx4~sKeBzU(kDDeO~!Rue@#jxPr*C!
z$JKxsl5ML+OS8!A?Q4l?M`tft;IWF{1!0ug#g$(jJUVQUG_!)rF#65k%{GL^>`*c&
z*Rt$}B_^70w$1C?>y#Q;?v`d8|w8Q_vF4DQLvH&N(2bEq$_)jLLF9Z$o=ru)M==($|Ht
zS9`Ut(BgqaMWI^1)4nWn_-$kl(~!xt+QWK%#rgH1wt%zXgsuz|}%*J8vDx
zoARZ{p62odl-m~;KmBe`DC$>c^)$u!S0fDHXtK&*vGe8RuwxBjg$()zXA{9~IEh?0
zzf>YU;N2lI3T1Lq=^1>sY&`=Hd4bXXsii@YS#+Td2iCw+<=UBYW4jfUuvv6TOHyO6
zVe4s{u_mZV$?v0aYX2()iNll&zE_?1p{t*_M%}JBYa!Sx6sH(y_QvQ-e=bGDvJVmR
zC}$kT(h4J=+n7mmRNfoJ+f6*FOj!A`L|Gn$H|6KBvTsT~`p4M_%9!;Y*ZAH1YdxpH
zzMlL31V1nsTr%4cg>~eB6?L*h1)Y?Ce2M9^jgt~Bd;rNX7@)L&95VEb4*h4BFdgto
z?a0Upv1Rd2M)JL=3byCv#&-a99@Oa%%L3pkD1PN@LRnWln4#@FPjnF%AC1PGv
zk?(nC!)aBgDa%-Qk~YE1e3CnUQU8GdS9(S%H$%byv4N|m-P+ifsp3iMsGp|BOo~(E?>#p7Q1|crPAJj%pKY
z^wfNEdo+XhdeWs(d}st1eC3#Z@NQUia>Gv%a)!AVd)}DS<%D9=RyRN2H--q}z
z94R@)C6>j1rnPyL)^U5bL$b=woP$%TV)`Lx5AQ=09kn}D-A^J-+_let63_9fz~lB@
zkI3U3-L_e())hO}mpwcVMzEu+dBXYMoQ}$-iGhh96uk;Y8JVcMvX7qe>lKXp^;R1J%q(2
zRQBTt{|;wS$rd|Sm7!iUExz#c^~D-A*M;wK+I;n$S$%rXVlzTVYtj5yAX#4tzUuxc
zIDJG8q=9^9*{|)*|E2zY4HI_EY6|mBjvU*O{zUtM*q#o&%E%m}(2W)g97K+B_Mk-=
zst5?{^pFFMnwX&_CbVgUnrt%J9Kg4iI&rElKbIve8u5Waj+9<}J%(@)<+$
z*mR=+F$zV?Z+kA$e9c&J)H1NL7M|zJ=GcF&AfIU{v~|^bmA>jI^n0X?9jmr}VWFYP
zcx``>i7nZ}evFxlG`+)%r(V(znwb2p+dMNSDN&}hH|$-{?`9k}<_?H>}`5I;}r4Wz7qrklr8
zh8mrkZrbBFks9Bpk#G*6DB%A?(;sdEZ~#vJjX(MiF#T_YLc+PY|K2(N*zQlN^ZjlA
E0>p=$!vFvP
literal 0
HcmV?d00001
diff --git a/content/game-dev/part-iii/powerups.md b/content/game-dev/part-iii/powerups.md
index da7a5c55..042c3b6d 100644
--- a/content/game-dev/part-iii/powerups.md
+++ b/content/game-dev/part-iii/powerups.md
@@ -5,6 +5,8 @@ weight = 5
---
+{{%attachments style="blue" title="Powerups Template Code" /%}}
+
### Road Spikes
One feature in tower defense games is road spikes which are intended for use in urgent situations, where balloons are approaching the end of the path and need to be popped quickly. The implementation of road spikes is similar to towers, but the drag-and-drop interface was slightly different, since spikes are placed ***on*** the path rather than off, and they do not shoot anything, but rather sit on the path until a balloon comes by.
From caf2e4e9a3a030bedb6e5cf04bfe38434e60dd8c Mon Sep 17 00:00:00 2001
From: Hazel G <58535328+toaster203@users.noreply.github.com>
Date: Mon, 13 Dec 2021 22:56:19 -0500
Subject: [PATCH 12/31] Create Upgrades.md
---
content/game-dev/part-iii/Upgrades.md | 103 ++++++++++++++++++++++++++
1 file changed, 103 insertions(+)
create mode 100644 content/game-dev/part-iii/Upgrades.md
diff --git a/content/game-dev/part-iii/Upgrades.md b/content/game-dev/part-iii/Upgrades.md
new file mode 100644
index 00000000..5cc7cac4
--- /dev/null
+++ b/content/game-dev/part-iii/Upgrades.md
@@ -0,0 +1,103 @@
++++
+title = "Upgrading Towers"
+weight = 2
++++
+
+---
+
+
+### Getting a Tower’s Damage from Projectile Type
+{{% expand "See code" "false" %}}
+```java
+int dmgFromProjectileType(int type, int[] temp){
+ if(type==0) {
+ int ret = defdmg;
+ if (temp[upgrade] >= 3) {
+ ret += temp[upgrade] - 2;
+ }
+ return ret;
+ }
+ else if(type==1) {
+ int ret = eightdmg;
+ if (temp[upgrade] >= 4) {
+ ret += temp[upgrade] - 3;
+ }
+ return ret;
+ }
+ else if(type==2) {
+ return slowdmg;
+ }
+ return 0;
+}
+{{% /expand %}}
+In this return method, we calculate the damage of a tower based on the projectile type and the tower’s current level, then return it. We take in two parameters, `type` which is the projectile’s type, as well as the temp array which is the tower’s data. We have three types of projectiles, so we will create three if/else if blocks. The first block will be `type==0`, which means that it is a “default” projectile. The `ret` variable will store the tower’s damage, and it is initialized as the default projectile’s level 1 damage. We can calculate the updated damage by adding 1 point of damage for every level that the tower is above 3. We can then return the tower’s damage by returning the `ret` variable.
+This is similar for the projectile that shoots in 8 directions, and the one that slows. For `type==1`, we set ret to the default level 1 damage for this projectile `eightdmg`, add damage based on the level, and then return the updated damage value.
+For the last type of projectile that slows balloons, the if block is even simpler since the upgrades do not affect the damage, but instead change the amount it slows by. This means that we can set ret to the original damage value and then return it. Outside this method, we have a `return 0;` statement because the method needs a ‘default’ return statement. This statement won’t be reached in our code, since type can only be 0,1 or 2.
+
+### Drawing Upgrade & Remove Button
+In these two methods, we will draw the buttons for upgrading and removing towers. You’ll notice that these two methods are very similar, since they do similar things.
+
+{{% expand "See code for drawing remove button " "false" %}}
+```java
+PVector removeLocation = new PVector(255, 470);
+void drawRemove() {
+ strokeWeight(1);
+ stroke(#deac9e);
+ fill(#FF6961);
+ rectMode(CENTER);
+ rect(removeLocation.x, removeLocation.y, 70, 24,5);
+ textSize(16);
+ fill(#ffffff);
+ text("Remove", removeLocation.x - 30, removeLocation.y+4);
+}
+```
+{{% /expand %}}
+
+{{% expand "See code for drawing upgrades button " "false" %}}
+```java
+PVector upgradeLocation = new PVector(145, 470);
+void drawUpgrade() {
+ strokeWeight(0);
+ stroke(0);
+ fill(#C364FF);
+ rectMode(CENTER);
+ rect(upgradeLocation.x, upgradeLocation.y, 86, 24,5);
+ textSize(16);
+ fill(255);
+ int[] temp = towerData.get(towerClicked);
+ text("Buy: $" + towerPrice[temp[projectileType]] / 2, upgradeLocation.x-40, upgradeLocation.y+4);
+}
+```
+{{% /expand %}}
+Both of these methods draw a rectangle with text. We use strokeWeight() and stroke() to change borders around the rectangles, and fill() to fill the rectangle with colour. The PVector upgradeLocation and removeLocation represent the centre of the upgrade and remove buttons respectively. We use a PVector to have a ‘centre’ coordinate to make it easier to check if the user is pressing the button (in upgradeCheck() and removeCheck() above. For the remove button, we just have to write some text to indicate that this button is for removing towers, in this case we just write “Remove” on the button. For upgrades, we also display the price of the current upgrade. This means that we have to get the cost of the upgrade, which is calculated by `towerPrice[temp[projectileType]] / 2`. Finally, we can use text()to write this to the user on the button.
+### Creating a tower UI
+Now that we have all the methods in place to upgrade and remove towers, we can draw the user interface. This UI will contain the upgrade and remove button, but also tell the user what level the tower is, as well as the damage and range of the tower when it is clicked.
+
+{{% expand "See code for drawing tower UI" "false" %}}
+```java
+// draw the tower UI - includes the remove option
+void drawTowerUI(){
+ if(towerClicked != -1) {
+ //draw outer box for upgrades
+ int[] temp = towerData.get(towerClicked);
+ stroke(#add558);
+ strokeWeight(1);
+ fill(#E7EAB5);
+ rect(200,450,216,80,3);
+ fill(#444941);
+ text("Current Level: " + temp[upgrade],98,426);
+ text("range: "+ temp[towerVision],104,446);
+ text("damage: "+ (dmgFromProjectileType(temp[projectileType], temp)),204,446);
+ strokeWeight(2);
+ stroke(#a8a89d,200);
+ line(100,453,295,453);
+
+ drawUpgrade();
+ upgradeCheck();
+ drawRemove();
+ removeCheck();
+ }
+}
+```
+{{% /expand %}}
+We start this method by reusing the towerClicked variable, which stores the towerID of the tower the user just clicked. If it is not equal to -1, that means that some tower is being clicked right now, so we can display the tower UI. We will get the tower data of this specific tower from the ArrayList of towers, and then store it in a local temp[] array. This will allow for easier use, since we will need to access the level, range, and damage of the tower. We draw the rectangle which will be the background for the tower UI, then the text indicating the tower’s stats. For the level and range stats, we can take it directly from the temp array since both of those values are stored. To display the damage of the projectile, we call the `dmgFromProjectileType()` method (explained above), then display that value. To end off this method, we draw a line to separate the stats and the buttons, then we can call the drawUpgrade() and drawRemove() methods to draw the upgrade and remove buttons respectively. Finally, the upgradeCheck() and removeCheck() methods are called to make the buttons actually work.
From 28e574bc16808d291bea638578fec82f7bf75b41 Mon Sep 17 00:00:00 2001
From: yeahbennou <38169671+BenZeng04@users.noreply.github.com>
Date: Tue, 14 Dec 2021 13:09:13 -0500
Subject: [PATCH 13/31] Update logo
---
static/img/game_jam_banner.png | Bin 25836 -> 41484 bytes
static/img/game_jam_logo.png | Bin 0 -> 76382 bytes
2 files changed, 0 insertions(+), 0 deletions(-)
create mode 100644 static/img/game_jam_logo.png
diff --git a/static/img/game_jam_banner.png b/static/img/game_jam_banner.png
index 4bac9eb87543848dc688f841ca8191ac6c559ad1..e97bb8ab7be29770eb4a5b39bcfcca076f297473 100644
GIT binary patch
literal 41484
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
TJ;!-QzRYZPiu6gCpo{rpS{bvlocdX5
z(T{!}3mB;$J*l^o+?Oz%Qnt%`-|VjZaH;r$^AJ_=@=Zu_9kW)26-eZJM6#7bPiVDT
zV53Fsuvr3Ei5I}&5w!U1t_PrtLC_iS)y0K}zflm*F
zlHL~>9on~3vKP}3E@_yC6cevmzln8@Lf6#{_Dd|L&%47>gKeOz6>Hb2%$e&BLcK1T
zK9&`+(C=PA&9S^;yYiFD<<&BUI#hu?pxJJR68Potfo7^}4gIFy%7mz!{Pht=OZ@S?lpEs>W~Y
zd5Hq^GQI72ZPa?tvY$gp+sEW;v(3`hzp*Xqt-x^EunAvkKJ{+d*M+8zx;E?f)Enjd
zdm@#gAM|^%c)q#MVv^$%lhFcP;3ep}h9zXC;J{u`@8_HtOwv+^^aV%G7N>j33HJi=
z_-DTcelx$#(xT4R$cniAA3FL
z1lzs66%z$v@bxU;&8L_DF{u?Z!0D^XJRanJc_MJtrPVAkru^T{1)S&}-C<(-BI%x0
zd2&rs&AIrMTIm$s5nZH0vHnC?sr(c-X#62;!M>B>iyMP8io$i*nxc8QAhVhkHF-()
z=gF+S`Ih?absfd&XlEj$t6=o+XR;f%qs#fn)C@hTfYp
zbpIJAdutf5&&|xPE{Vu)V@-){Hx{=(vhR=Mhd(`iV30%<1ZG~741FgfgJO>gi8s`&
z`}D~_{VUGnV34k9vg{lgBWQPiWN9XRd
zU3BoiGS?AjJ#%y_kd73-W8Z8=yB20G;RLsQQ+m1#Y8OHi(axx+QHa@wkvOC4`xiIO~HRlP>=)
zsg()2P(C_H`uj#)b&GAIQY_~v=`AM|rQ};$nK~HYLZQNFC5%CGKXJjuOJ&73*)IS+
zmoMC2Z7E3^d|C@d_RcZ<>u*ztHSX}g;u66?ORR<4+IU=7Rm^=LS#eRz-@}Hu096!r
zN(xQUNio@WEH8yYnYbN74aQCpI@RI=@MGL<{YouTZ3~}*W5pi0NCzx^%;}u=MM)Ws
z?)5jKEY5WEfIMgWUfa&%jg&k)Q?yCPyW4R?_^k2EeCj^3MYPC@wbQgG$SJ&rKlyj3Q5ggq#>6`as901Ll{K8
z+FVyOdxu6qjdX!vT^82(m>`oeLKl8mG(&|`)aWvJ^3$irk}8+Z?DVrg7NE`SWtP4>=pPjVB)rka__c7-wM^4s1d%DgHLEJdkjt!?A(uO
zt?UC!KUvJVXlXi>_g$;749
zIzbt&&Or94g^M%6W9zW-zkdthzgGM&NW2sY>^mu|arrFIk7NU=WqI3w)Es*bY%^3I
z1J*Y$PlUb^ZdU4IQl(HyJ1Jf}d*$|ajL?s|H@eeU3m=Ii004BadMO5BEXMEEC7=+3
z4w2#7orQ5?drIMUXE2g(6zp(TWp`Y$7<2M-F*n>&I^O*(G52tjYbV!O?{o%*P-NG+
z