int screen = -1; //sets which screen the player is viewing (-2=gameover screen, -1=title screen, 0=main world for player to explore, 1=first battle, 2=second battle, 3=third battle) int UIscreen = 1; //determines what is being displayed in the player UI in battles (attacks, text, ect.) float maxHealth = 20; //determines how much the health the player can have up to float health = 20; //amount of damage player can take before gameover float monMaxHealth = 16; //amount of health monster has when at full health float monHealth = 16; //amount of damage enemy can take before dying float maxMana = 30; //amount of mana player has when at full mana float mana = 30; //amount of mana player has to use magic float maxExp = 70; //amount of exp required to level up float exp = 0; //amount of experience player has (determines when player's level increases) int level = 1; //player's level - increases health, damage dealt, level of enemies encountered int levelUpTime = 0; //time the display stays on the screen for when character levels up boolean doLevelUp = false; int monLevel; //enemy's level - increases health, damage, and exp earned float spriteX = 60; //player sprite x coordinate float spriteY = 200; //player sprite y coordinate float monX = 240; //enemy sprite's x coordinate float monY = 100; //enemy sprite's y coordinate int firstHit; //determines who will attack first int attackType = 0; //determines which attack player has selected when choosing attacks (0=sword, 1=fire, 2=lightning, 3=blizzard) boolean bliz = false; //determines if player used blizzard attack boolean fire = false; //determines if player used fire attack boolean light = false; //determines if player used lightning attack boolean sword = false; //determines if player used regular attack boolean monTackle = false; //determines if enemy used tackle attack boolean monFire = false; //determines if enemy1 used fire attack boolean monBite = false; //determines if enemy2 used bite attack boolean monSting = false; //determines if enemy3 used sting attack int winTime = 0; //sets how long player stays on battle screen after defeating enemy float time = 0; //used to create a timeline and animation for each attack float snowTimeX; float snowTimeY; int ranNum = 0; float playerX = 190; //determines player x coordinate float playerY = 100; //determines player y coordinate float groundX = 0; //moves ground's x coordinate float groundY = 0; //moves ground's y coordinate boolean up = false; //moves player up boolean right = false; //moves player right boolean down = false; //moves player down boolean left = false; //moves player left boolean dash = false; //determines if player is dashing (holding space) float dashSpd = 1.5; //sets increased speed player will move while dashing int direction = 0; //sets direction the player is facing float speed = 2; //determines how fast player will move void setup() { size(400, 400); frameRate(100); } void draw() { //set gameover screen\\ if (screen == -2) { frameRate(30); background(0); fill(255); textSize(22); text("GAMEOVER", 140, 200); textSize(16); text("You made it to level "+level, 118, 300); } //set title screen\\ if (screen == -1) { background (20); //draw sprites bat(270, 210); fireGuy(155, 180); spider(40, 210); sprite(100, 300); //draw black rectangle to cover up spider's web fill(0); rect(40, 0, 100, 157); //darw text fill(255); textSize(58); text("GARDEN", 80, 75); text("MONSTERS", 48, 125); textSize(14); text("CONTROLS: WASD AND [SPACE]", 90, 155); text("PRESS ANY KEY TO START", 110, 180); } //set screen 0 (the main screen)\\ if (screen == 0) { background(130, 235, 0); //set framerate to highest computer will allow so player doesn't lag when there are too many grass sprites on screen frameRate(100); //draw world drawPath(); drawHouse(); //draw signs and text that appears when player is near a sign drawSign(groundX+188, groundY+138); if (playerX>groundX+175 && playerX<groundX+250 && playerY<groundY+220 && playerY>groundY+150) { fill(0); textSize(14); text("Beware the monsters in the tall grass", groundX+84, groundY+135); text("Hold [SPACE] to dash", groundX+147, groundY+115); } drawSign(groundX+175, groundY-300); if (playerX>groundX+175 && playerX<groundX+250 && playerY<groundY-218 && playerY>groundY-288) { fill(0); textSize(14); text("Sorry, this rode is blocked", groundX+112, groundY-299); } drawRock(groundX+72, groundY-315); drawRock(groundX+125, groundY-298); drawRock(groundX-150, groundY-100); drawRock(groundX, groundY+550); drawRock(groundX-200, groundY-50); drawRock(groundX+500, groundY+150); //draw grass in loops\\ //top right corner for (int y = -200; y <= -150; y=y+50) { for (int x = -200; x <= 0; x=x+50) { drawGrass(groundX+x, groundY+y); } } for (int y = -100; y <= 50; y=y+50) { for (int x = -100; x <= 0; x=x+50) { drawGrass(groundX+x, groundY+y); } } for (int y = 50; y <= 350; y=y+50) { for (int x = -250; x <= 0; x=x+50) { drawGrass(groundX+x, groundY+y); } } //bottom left corner for (int y = 600; y <= 650; y=y+50) { for (int x = -300; x <= -50; x=x+50) { drawGrass(groundX+x, groundY+y); } } for (int x = 0; x <= 100; x=x+50) { drawGrass(groundX+x, groundY+650); } //right side for (int y = 50; y <= 550; y=y+50) { for (int x = 550; x <= 650; x=x+50) { drawGrass(groundX+x, groundY+y); } } for (int y = 200; y <= 300; y=y+50) { for (int x = 350; x <= 500; x=x+50) { drawGrass(groundX+x, groundY+y); } } for (int y = 350; y <= 450; y=y+50) { for (int x = 250; x <= 500; x=x+50) { drawGrass(groundX+x, groundY+y); } } drawGuard(groundX-300); //set player controls drawPlayer(); wasdMove(); scroll(); //draw trees (they must overlap player) drawTree(groundX+425, groundY-50); drawTree(groundX+475, groundY); //draw trees along sides of screen float treeX = groundX-350; //set x and y coordinates of first tree in loop float treeY = groundY-400; while (treeX<=groundX+700) { //top wall of trees if (treeX > groundX+150 || treeX < groundX+50) { drawTree(treeX, treeY); } treeX = treeX+51; //make it so trees are not all beside each other treeY = treeY-15; if (treeY <= groundY-420) { treeY = treeY+25; } } treeX = groundX-350; //set x and y coordinates of first tree in loop treeY = groundY-350; while (treeY<=groundY+700) { //left wall of trees if (treeY > groundY+500 || treeY < groundY+400) { drawTree(treeX, treeY); } treeY = treeY+71; //make it so trees are not all beside each other treeX = treeX-15; if (treeX <= groundX-370) { treeX = treeX+25; } } treeX = groundX+710; //set x and y coordinates of first tree in loop treeY = groundY-350; while (treeY<=groundY+755) { //right wall of trees drawTree(treeX, treeY); treeY = treeY+71; //make it so trees are not all beside each other treeX = treeX-15; if (treeX <= groundX+695) { treeX = treeX+25; } } treeX = groundX-350; //set x and y coordinates of first tree in loop treeY = groundY+700; while (treeX<=groundX+700) { //bottom wall of trees drawTree(treeX, treeY); treeX = treeX+51; //make it so trees are not all beside each other treeY = treeY-15; if (treeY <= groundY+680) { treeY = treeY+25; } } } if (screen==1) { //set the screen for the fire monster encounter setBackground(); frameRate(30); //set framerate to 30 so timers can work with it (variables will increase 30 times/second) constrainVariables(); sprite(spriteX, spriteY); fireGuy(monX, monY); enemyUI(); playerUI(); displayAttacks(); startAttack(); winFight(); } if (screen==2) { //set the screen for the spider monster encounter setBackground(); frameRate(30); //set framerate to 30 so timers can work with it (variables will increase 30 times/second) constrainVariables(); sprite(spriteX, spriteY); spider(monX, monY); enemyUI(); playerUI(); displayAttacks(); startAttack(); winFight(); } if (screen==3) { //set the screen for the bat monster encounter setBackground(); frameRate(30); //set framerate to 30 so timers can work with it (variables will increase 30 times/second) constrainVariables(); sprite(spriteX, spriteY); bat(monX, monY); enemyUI(); playerUI(); displayAttacks(); startAttack(); winFight(); } levelUp(); levelUpAnim(); if(health == 0){ screen = -2; } } void keyPressed() { if (screen == -2) { screen=-1; } if (screen == -1) { exp = 0; maxExp = 70; level=1; playerX = 190; playerY = 100; groundX = 0; groundY = 0; direction = 0; maxHealth = 16; health = maxHealth; maxMana = 30; mana = maxMana; screen = 0; } if (screen == 0) { wasdPress(); } if (screen>=1) { selectAttack(); } } void keyReleased() { if (screen == 0) { wasdRelease(); } } ///**\\\ B A T T L E S ///**\\\ /*/ ECONOMICS SETUP /*/ void constrainVariables() { if (monHealth < 0) { //set minimum monster health to 0 monHealth = 0; } if (monHealth > monMaxHealth) { //prevent monster from healing past max health monHealth = monMaxHealth; } if (health < 0) { //set minimum player health to 0 health = 0; } if (health > maxHealth) { //prevent player from healing past max health health = maxHealth; } if (mana < 0) { //set minimum player mana to 0 mana = 0; } if (mana > maxMana) { //prevent player from regenerating past max mana mana = maxMana; } if (monLevel < 1) { //prevent monsters with a level 0 or below appear monLevel = 1; } } //set stats each monster will have and other initial codes before the battle starts\\ void startBattle() { firstHit = int(random(1, 3)); attackType = 0; monLevel = int(random(-4, 2))+level; monMaxHealth = int(random(14, 17))+level*2; monHealth = monMaxHealth; UIscreen=1; sword=false; fire=false; light=false; bliz=false; resetMonAttack(); } void levelUp() { //set the output for when you reach max experience if (exp >= maxExp) { exp = exp-maxExp; //reset exp maxExp = maxExp +level*level/2 + 15; //increase the max exp according to the players level level++; //increase the player's level by one doLevelUp = true; //activate level up animation function (levelUpAnim) levelUpTime = 0; //reset timer for animation health = health + int(level*4); //heal player by a little bit maxHealth = maxHealth + 2+int(level/2); //increase player's max health mana = mana + 5+int(level*5); //regenerate some mana maxMana = maxMana + 4+int(level); //increase players max mana } } void levelUpAnim() { //set the animation for when the player levels up if (doLevelUp) { levelUpTime++; //start and run the timer noStroke(); fill(0, 100, 255, 150-levelUpTime*1.2); //draw animation with a lowering opacity ellipse(width/2, height/2, width, height); ellipse(width/2, height/2, width*2/3, height*2/3); stroke(0); fill(200, 200, 200, 255-levelUpTime*1.4); //draw text with animation textSize(50); text("LEVEL", 130, 175); text(level, 180, 225); if (level==3) { //tell player they unlocked fire spell at level 3 textSize(20); text("You learned",139,260); text("FIRE SPELL!",144,285); } if (level==6) { //tell player they unlocked lightning spell at level 6 textSize(18); text("You learned",144,260); text("LIGHTNING SPELL!",119,285); } if (level==9) { //tell player they unlocked blizzard spell at level 9 textSize(18); text("You learned",144,260); text("BLIZZARD SPELL!",127,285); } frameRate(100); if (levelUpTime > 3000) { //stop if statement from running infinitely doLevelUp = false; } } } /*/ UI SETUP /*/ //display enemy stats void enemyUI () { fill(245); rect(40, 110, 140, 40); //draw white box if (screen == 1) { //if you are fighting the fire guy, type the name as "FIRE GUY" fill(0); textSize(14); text("FIRE GUY", 50, 125); } if (screen == 2) { //if you are fighting the spider, type the name as "SPIDER" fill(0); textSize(14); text("SPIDER", 50, 125); } if (screen == 3) { //if you are fighting the bat, type the name as "BAT" fill(0); textSize(14); text("BAT", 50, 125); } text("LV: "+monLevel, 130, 125);//display level beside enemy's name textSize(13); text("HP", 157, 142); //display "HP" beside health bar fill(120, 0, 0); rect(50, 132, 100, 10); //display max health bar behind health bar to show how much health was depleted fill(200, 0, 0); rect(50, 132, 100*(monHealth/monMaxHealth), 10); } //set player UI void playerUI() { fill(245); //draw large rectangle where attacks and stats will be displayed rect(0, 300, width, 100); textSize(14); fill(0); //display label and values for level, health, mana, and experience text("LEVEL: "+level, 190, 320); text("HP:"+int(health)+"/"+int(maxHealth), 190, 343); text("MP:"+int(mana)+"/"+int(maxMana), 190, 367); text("EXP:"+int(exp)+"/"+int(maxExp), 190, 390); fill(120, 0, 0); //draw empty health bar to show amount of health depleted rect(290, 333, 100, 10); fill(200, 0, 0); rect(290, 333, 100*(health/maxHealth), 10); //draw health bar to show how much health player has left - will deplete when player loses health fill(0, 0, 120); //draw empty mana bar to show amount of mana depleted rect(290, 357, 100, 10); fill(0, 0, 200); rect(290, 357, 100*(mana/maxMana), 10); //draw mana bar to show how much mana player has left - will deplete when player loses mana fill(120, 120, 0); //draw empty exp bar to show amount of exp depleted rect(290, 380, 100, 10); fill(200, 200, 0); rect(290, 380, 100*(exp/maxExp), 10); //draw exp bar to show how much exp player has left - will deplete when player loses exp } //draw attack selections\\ void displayAttacks() { if (UIscreen == 1) { if (attackType==0) { //display text with the sword attack highlighted fill(0, 100, 255); triangle(10, 310, 10, 320, 20, 315); fill(0, 10, 165); text("SWORD 0MP", 30, 320); if (level>=3) { fill(245); triangle(10, 333, 10, 343, 20, 338); fill(0); text("FIRE 15MP", 30, 343); if (level>=6) { fill(245); triangle(10, 357, 10, 367, 20, 362); fill(0); text("LIGHTNING 19MP", 30, 367); if (level>=9) { fill(245); triangle(10, 380, 10, 390, 20, 385); fill(0); text("BLIZZARD 23MP", 30, 390); } } } } if (attackType==1) { //display text with the fire attack highlighted fill(245); triangle(10, 310, 10, 320, 20, 315); fill(0); text("SWORD 0MP", 30, 320); fill(0, 100, 255); triangle(10, 333, 10, 343, 20, 338); fill(0, 10, 165); text("FIRE 15MP", 30, 343); if (level>=6) { fill(245); triangle(10, 357, 10, 367, 20, 362); fill(0); text("LIGHTNING 19MP", 30, 367); if (level>=9) { fill(245); triangle(10, 380, 10, 390, 20, 385); fill(0); text("BLIZZARD 23MP", 30, 390); } } } if (attackType==2) { //display text with the lightning attack highlighted fill(245); triangle(10, 310, 10, 320, 20, 315); fill(0); text("SWORD 0MP", 30, 320); fill(245); triangle(10, 333, 10, 343, 20, 338); fill(0); text("FIRE 15MP", 30, 343); fill(0, 100, 255); triangle(10, 357, 10, 367, 20, 362); fill(0, 10, 165); text("LIGHTNING 19MP", 30, 367); if (level>=9) { fill(245); triangle(10, 380, 10, 390, 20, 385); fill(0); text("BLIZZARD 23MP", 30, 390); } } if (attackType==3) { //display text with the blizzard attack highlighted fill(245); triangle(10, 310, 10, 320, 20, 315); fill(0); text("SWORD 0MP", 30, 320); fill(245); triangle(10, 333, 10, 343, 20, 338); fill(0); text("FIRE 15MP", 30, 343); fill(245); triangle(10, 357, 10, 367, 20, 362); fill(0); text("LIGHTNING 19MP", 30, 367); fill(0, 100, 255); triangle(10, 380, 10, 390, 20, 385); fill(0, 10, 165); text("BLIZZARD 23MP", 30, 390); } } } //switch between selected attack with keypress\\ void selectAttack() { if (attackType==0) { if (key==' ') { sword=true; } if (level>=3 && key=='s') { attackType=1; } } if (attackType==1) { if (key==' ') { fire=true; } if (key=='w') { attackType=0; } if (level>=6 && key=='s') { attackType=2; } } if (attackType==2) { if (key==' ') { light=true; } if (key=='w') { attackType=1; } if (level>=9 && key=='s') { attackType=3; } } if (attackType==3) { if (key==' ') { bliz=true; } if (key=='w') { attackType=2; } } } //set the effect of each of attack when activated\\ void startAttack() { if (sword) { time++; if (firstHit>1) { //test to see if you attack first if (time>0 && time<=20) { UIscreen=2; } if (time>20 && time<=95) { spriteX=75; spriteY=190; monX=245; monY=95; fill(190); quad(140, 160, 200, 200, 240, 260, 220, 180); fill(0); textSize(12); text("you attacked with your sword", 5, 350); } if (time==20) { monHealth = monHealth-3-level; monChooseAttack(); } if (time>95 && time<=160) { fill(0); textSize(12); text("the monster took "+(3+level)+" damage", 5, 350); spriteX=60; spriteY=200; monX=240; monY=100; } if (time>160 && time<=235) { spriteX=50; spriteY=210; monX=220; monY=120; monUseAttack(); } if (time==160) { if (monTackle) { health = health - monLevel; } if (monFire || monBite || monSting) { health = health - 2+monLevel; } } if (time>235 && time<=300) { if (monTackle) { fill(0); textSize(12); text("you took "+monLevel+" damage", 5, 350); spriteX=60; spriteY=200; monX=240; monY=100; } if (monFire || monBite || monSting) { fill(0); textSize(12); text("you took "+(2+monLevel)+" damage", 5, 350); spriteX=60; spriteY=200; monX=240; monY=100; } } if (time>300) { sword=false; resetMonAttack(); time=0; UIscreen=1; } } if (firstHit==1) { //test to see if enemy attacks first if (time>0 && time<=20) { UIscreen=2; } if (time==19){ monChooseAttack(); } if (time>20 && time<=95) { spriteX=50; spriteY=210; monX=220; monY=120; monUseAttack(); } if (time==20) { if (monTackle) { health = health - monLevel; } if (monFire || monBite || monSting) { health = health - 2+monLevel; } } if (time>95 && time<=160) { if (monTackle) { fill(0); textSize(12); text("you took "+monLevel+" damage", 5, 350); spriteX=60; spriteY=200; monX=240; monY=100; } if (monFire || monBite || monSting) { fill(0); textSize(12); text("you took "+(2+monLevel)+" damage", 5, 350); spriteX=60; spriteY=200; monX=240; monY=100; } } if (time>160 && time<=235) { spriteX=75; spriteY=190; monX=245; monY=95; fill(190); quad(140, 160, 200, 200, 240, 260, 220, 180); fill(0); textSize(12); text("you attacked with your sword", 5, 350); } if (time==160) { monHealth = monHealth-3-level; } if (time>235 && time<=300) { fill(0); textSize(12); text("the monster took "+(3+level)+" damage", 5, 350); spriteX=60; spriteY=200; monX=240; monY=100; } if (time>300) { sword=false; resetMonAttack(); time=0; UIscreen=1; } } } if (fire) { if (mana>=15) { time++; if (firstHit>1) { //test to see if you attack first if (time>0 && time<=20) { UIscreen=2; } if (time>20 && time<=95) { spriteX=75; spriteY=190; monX=245; monY=95; float x = 120; float y = 260; for (int i=0; i<=7; i++) { while (x>260) { flame(int(random(x-20, x+20)), int(random(y-20, y+20))); x = x+3; y = y-2; } flame(int(random(220, 320)), int(random(120, 220))); } fill(0); textSize(12); text("you cast your fire spell", 5, 350); } if (time==20) { monHealth = monHealth-7-level; mana = mana-15; monChooseAttack(); } if (time>95 && time<=160) { fill(0); textSize(12); text("the monster took "+(7+level)+" damage", 5, 350); spriteX=60; spriteY=200; monX=240; monY=100; } if (time>160 && time<=235) { spriteX=50; spriteY=210; monX=220; monY=120; monUseAttack(); } if (time==160) { if (monTackle) { health = health - monLevel; } if (monFire || monBite || monSting) { health = health - 2+monLevel; } } if (time>235 && time<=300) { if (monTackle) { fill(0); textSize(12); text("you took "+monLevel+" damage", 5, 350); spriteX=60; spriteY=200; monX=240; monY=100; } if (monFire || monBite || monSting) { fill(0); textSize(12); text("you took "+(2+monLevel)+" damage", 5, 350); spriteX=60; spriteY=200; monX=240; monY=100; } } if (time>300) { fire=false; resetMonAttack(); time=0; UIscreen=1; } } if (firstHit==1) { //test to see if enemy attacks first if (time>0 && time<=20) { UIscreen=2; } if (time==19){ monChooseAttack(); } if (time>20 && time<=95) { spriteX=50; spriteY=210; monX=220; monY=120; monUseAttack(); } if (time==20) { if (monTackle) { health = health - monLevel; } if (monFire || monBite || monSting) { health = health - 2+monLevel; } } if (time>95 && time<=160) { if (monTackle) { fill(0); textSize(12); text("you took "+monLevel+" damage", 5, 350); spriteX=60; spriteY=200; monX=240; monY=100; } if (monFire || monBite || monSting) { fill(0); textSize(12); text("you took "+(2+monLevel)+" damage", 5, 350); spriteX=60; spriteY=200; monX=240; monY=100; } } if (time>160 && time<=235) { spriteX=75; spriteY=190; monX=245; monY=95; float x = 155; float y = 230; for (int i=0; i<=7; i++) { while (x>300) { flame(int(random(x-20, x+20)), int(random(y-20, y+20))); x = x+3; y = y-2; } flame(int(random(260, 360)), int(random(80, 180))); } fill(0); textSize(12); text("you cast your fire spell", 5, 350); } if (time==160) { monHealth = monHealth-7-level; mana = mana-15; } if (time>235 && time<=300) { fill(0); textSize(12); text("the monster took "+(7+level)+" damage", 5, 350); spriteX=60; spriteY=200; monX=240; monY=100; } if (time>300) { fire=false; resetMonAttack(); time=0; UIscreen=1; } } } else { println("NOT ENOUGH MP"); fire=false; } } if (light) { if (mana>=19) { time++; if (firstHit>1) { //test to see if you attack first if (time>0 && time<=20) { UIscreen=2; } if (time>20 && time<=95) { spriteX=75; spriteY=190; monX=245; monY=95; fill(255,255,100); triangle(random(280,309),-1,random(311,340),-1,310,130); fill(0); textSize(12); text("you cast your lightning spell", 5, 350); } if (time==20) { monHealth = int(monHealth - 5 -level*1.5); mana = mana-19; monChooseAttack(); } if (time>95 && time<=160) { fill(0); textSize(12); text("the monster took "+(int(5 +level*1.5))+" damage", 5, 350); spriteX=60; spriteY=200; monX=240; monY=100; } if (time>160 && time<=235) { spriteX=50; spriteY=210; monX=220; monY=120; monUseAttack(); } if (time==160) { if (monTackle) { health = health - monLevel; } if (monFire || monBite || monSting) { health = health - 2+monLevel; } } if (time>235 && time<=300) { if (monTackle) { fill(0); textSize(12); text("you took "+monLevel+" damage", 5, 350); spriteX=60; spriteY=200; monX=240; monY=100; } if (monFire || monBite || monSting) { fill(0); textSize(12); text("you took "+(2+monLevel)+" damage", 5, 350); spriteX=60; spriteY=200; monX=240; monY=100; } } if (time>300) { light=false; resetMonAttack(); time=0; UIscreen=1; } } if (firstHit==1) { //test to see if enemy attacks first if (time>0 && time<=20) { UIscreen=2; } if (time==19){ monChooseAttack(); } if (time>20 && time<=95) { spriteX=50; spriteY=210; monX=220; monY=120; monUseAttack(); } if (time==20) { if (monTackle) { health = health - monLevel; } if (monFire || monBite || monSting) { health = health - 2+monLevel; } } if (time>95 && time<=160) { if (monTackle) { fill(0); textSize(12); text("you took "+monLevel+" damage", 5, 350); spriteX=60; spriteY=200; monX=240; monY=100; } if (monFire || monBite || monSting) { fill(0); textSize(12); text("you took "+(2+monLevel)+" damage", 5, 350); spriteX=60; spriteY=200; monX=240; monY=100; } } if (time>160 && time<=235) { spriteX=75; spriteY=190; monX=245; monY=95; fill(255,255,100); triangle(random(280,309),-1,random(311,340),-1,310,130); fill(0); textSize(12); text("you cast your lightning spell", 5, 350); } if (time==160) { monHealth = monHealth-7-level; mana = mana-19; } if (time>235 && time<=300) { fill(0); textSize(12); text("the monster took "+(int(5+level*1.5))+" damage", 5, 350); spriteX=60; spriteY=200; monX=240; monY=100; } if (time>300) { light=false; resetMonAttack(); time=0; UIscreen=1; } } } else { println("NOT ENOUGH MP"); light=false; } } if (bliz) { if (mana>=23) { time++; if (firstHit>1) { //test to see if you attack first if (time>0 && time<=20) { UIscreen=2; } if (time>20 && time<=95) { spriteX=75; spriteY=190; monX=245; monY=95; stroke(0,255,255); line(60,180,220,100); line(140,180,280,80); line(60,280,240,140); line(180,280,260,180); line(260,240,320,160); snowTimeX = snowTimeX + 2; snowTimeY = snowTimeY - 1.8; snowFlake(snowTimeX+100,snowTimeY+140); snowFlake(snowTimeX+220,snowTimeY+180); snowFlake(snowTimeX+280,snowTimeY+240); snowFlake(snowTimeX+160,snowTimeY+260); snowFlake(snowTimeX+240,snowTimeY+200); snowFlake(snowTimeX+300,snowTimeY+260); snowFlake(snowTimeX+180,snowTimeY+160); snowFlake(snowTimeX+200,snowTimeY+220); snowFlake(snowTimeX+100,snowTimeY+200); stroke(0); fill(0); textSize(12); text("you cast your blizzard spell", 5, 350); } if (time==20) { monHealth = int(monHealth - 5 -level*1.5); mana = mana-23; monChooseAttack(); } if (time>95 && time<=160) { fill(0); textSize(12); text("the monster took "+(int(level*2.3))+" damage", 5, 350); spriteX=60; spriteY=200; monX=240; monY=100; snowTimeX = 0; snowTimeY = 0; } if (time>160 && time<=235) { spriteX=50; spriteY=210; monX=220; monY=120; monUseAttack(); } if (time==160) { if (monTackle) { health = health - monLevel; } if (monFire || monBite || monSting) { health = health - 2+monLevel; } } if (time>235 && time<=300) { if (monTackle) { fill(0); textSize(12); text("you took "+monLevel+" damage", 5, 350); spriteX=60; spriteY=200; monX=240; monY=100; } if (monFire || monBite || monSting) { fill(0); textSize(12); text("you took "+(2+monLevel)+" damage", 5, 350); spriteX=60; spriteY=200; monX=240; monY=100; } } if (time>300) { bliz=false; resetMonAttack(); time=0; UIscreen=1; } } if (firstHit==1) { //test to see if enemy attacks first if (time>0 && time<=20) { UIscreen=2; } if (time==19){ monChooseAttack(); } if (time>20 && time<=95) { spriteX=50; spriteY=210; monX=220; monY=120; monUseAttack(); } if (time==20) { if (monTackle) { health = health - monLevel; } if (monFire || monBite || monSting) { health = health - 2+monLevel; } } if (time>95 && time<=160) { if (monTackle) { fill(0); textSize(12); text("you took "+monLevel+" damage", 5, 350); spriteX=60; spriteY=200; monX=240; monY=100; } if (monFire || monBite || monSting) { fill(0); textSize(12); text("you took "+(2+monLevel)+" damage", 5, 350); spriteX=60; spriteY=200; monX=240; monY=100; } } if (time>160 && time<=235) { spriteX=75; spriteY=190; monX=245; monY=95; stroke(0,255,255); line(60,180,220,100); line(140,180,280,80); line(60,280,240,140); line(180,280,260,180); line(260,240,320,160); snowTimeX = snowTimeX + 2; snowTimeY = snowTimeY - 1.8; snowFlake(snowTimeX+100,snowTimeY+140); snowFlake(snowTimeX+220,snowTimeY+180); snowFlake(snowTimeX+280,snowTimeY+240); snowFlake(snowTimeX+160,snowTimeY+260); snowFlake(snowTimeX+240,snowTimeY+200); snowFlake(snowTimeX+300,snowTimeY+260); snowFlake(snowTimeX+180,snowTimeY+160); snowFlake(snowTimeX+200,snowTimeY+220); snowFlake(snowTimeX+100,snowTimeY+200); stroke(0); fill(0); textSize(12); text("you cast your blizzard spell", 5, 350); } if (time==160) { monHealth = int(monHealth-level*2.3); mana = mana-23; } if (time>235 && time<=300) { fill(0); textSize(12); text("the monster took "+(int(level*2.3))+" damage", 5, 350); spriteX=60; spriteY=200; monX=240; monY=100; snowTimeX = 0; snowTimeY = 0; } if (time>300) { bliz=false; resetMonAttack(); time=0; UIscreen=1; } } } else { println("NOT ENOUGH MP"); bliz=false; } } } void monChooseAttack() { int z = int(random(1, 2)); if (z==1) { monTackle = true; } if (z==2) { if (screen==1) { monFire = true; } if (screen==2) { monBite = true; } if (screen==3) { monSting = true; } } } void monUseAttack() { if (monTackle) { line(140, 280, 240, 240); line(160, 240, 230, 200); line(150, 200, 200, 130); line(130, 170, 160, 120); line(60, 220, 80, 140); fill(0); textSize(12); text("the monster used tackle", 5, 350); } if (monFire) { float x = 240; float y = 180; for (int i=0; i<=7; i++) { while (x<140) { flame(int(random(x-20, x+20)), int(random(y-20, y+20))); x = x-3; y = y+1; } flame(int(random(40, 140)), int(random(220, 300))); } fill(0); textSize(12); text("the monster used fire", 5, 350); } if (monBite) { fill(150); beginShape(); //left tooth vertex(160, 240); vertex(200, 220); vertex(220, 180); vertex(270, 210); vertex(230, 250); vertex(160, 240); endShape(); beginShape(); //right tooth vertex(80, 200); vertex(80, 160); vertex(100, 120); vertex(50, 100); vertex(40, 160); vertex(80, 200); endShape(); fill(0); textSize(12); text("the monster used bite", 5, 350); } if (monSting) { fill(100, 40, 160); beginShape(); //draw stinger vertex(160, 240); vertex(190, 210); vertex(210, 170); vertex(230, 200); vertex(270, 210); vertex(230, 250); vertex(160, 240); endShape(); fill(0); textSize(12); text("the monster used sting", 5, 350); } } void resetMonAttack() { monTackle=false; monFire=false; monBite=false; monSting=false; } /*/ ATTACK AND BATTLE SETUP /*/ //set actions for when player defeats enemy\\ void winFight() { if (monHealth==0) { //test to see if enemy died winTime=winTime+1; //run the clock if (winTime<2) { //increase you experience right away exp = exp + 80 + monLevel*6; time=0; UIscreen=1; sword=false; fire=false; light=false; bliz=false; resetMonAttack(); } if (winTime>60) { //after 2 seconds, go back to main screen (screen 0) and reset timer screen = 0; monHealth = monMaxHealth; winTime=0; } } } /*/ BACKGROUND /*/ void setBackground() { //set sky colour background(0, 150, 255); //draw two rows of trees for (float treeX = -75; treeX <= width; treeX = treeX+50) { drawTree(treeX, 25); } for (float treeX = -50; treeX <= width; treeX = treeX+50) { drawTree(treeX, 20); } //draw grass fill (130, 235, 0); noStroke(); ellipse(200, 300, 1900, 400); //draw light green patch under enemy fill(170, 255, 0); ellipse(286, 190, 140, 40); stroke(0); } ///**\\\ S P R I T E S ///**\\\ /*/ MAP SPRITES /*/ //draw sign\\ void drawSign(float signX, float signY) { //draw sign and three lines to look like text fill(210, 180, 90); rect(signX+21, signY+7, 8, 36); rect(signX+10, signY+12, 30, 15); line(signX+13, signY+16, signX+37, signY+16); line(signX+13, signY+19, signX+37, signY+19); line(signX+13, signY+22, signX+37, signY+22); //create bounding box to prevent player from walking through sign if (playerX>signX-9 && playerX<signX+59 && playerY>signY-12 && playerY<=signY) { playerY=playerY-speed; if (dash) { playerY = playerY - dashSpd; } } if (playerY<signY+43 && playerY>signY-12 && playerX<signX+59 && playerX>=signX+50) { playerX=playerX+speed; if (dash) { playerX = playerX + dashSpd; } } if (playerX>signX-9 && playerX<signX+59 && playerY<signY+43 && playerY>=signY+30) { playerY=playerY+speed; if (dash) { playerY = playerY + dashSpd; } } if (playerY<signY+43 && playerY>signY-12 && playerX>signX-9 && playerX<=signX+9) { playerX=playerX-speed; if (dash) { playerX = playerX - dashSpd; } } } //draw rock\\ void drawRock(float rockX, float rockY) { //draw exterior shape of rock fill(160); beginShape(); vertex(rockX+1, rockY+40); vertex(rockX+1, rockY+32); vertex(rockX+13, rockY+22); vertex(rockX+15, rockY+10); vertex(rockX+24, rockY+1); vertex(rockX+39, rockY+11); vertex(rockX+40, rockY+23); vertex(rockX+47, rockY+35); vertex(rockX+49, rockY+44); vertex(rockX+33, rockY+49); vertex(rockX+20, rockY+47); vertex(rockX+8, rockY+48); vertex(rockX+1, rockY+40); endShape(); //draw cracks in the rock line(rockX+10, rockY+33, rockX+18, rockY+33); line(rockX+13, rockY+33, rockX+17, rockY+38); line(rockX+26, rockY+39, rockX+33, rockY+42); line(rockX+39, rockY+26, rockX+33, rockY+42); line(rockX+33, rockY+49, rockX+33, rockY+42); line(rockX+35, rockY+25, rockX+24, rockY+28); line(rockX+18, rockY+11, rockX+23, rockY+14); line(rockX+30, rockY+12, rockX+23, rockY+14); line(rockX+25, rockY+18, rockX+23, rockY+14); //create bounding box to prevent player from walking through rock if (playerX>rockX-18 && playerX<rockX+68 && playerY>rockY-19 && playerY<=rockY) { playerY=playerY-speed; if (dash) { playerY = playerY - dashSpd; } } if (playerY<rockY+68 && playerY>rockY-18 && playerX<rockX+69 && playerX>=rockX+50) { playerX=playerX+speed; if (dash) { playerX = playerX + dashSpd; } } if (playerX>rockX-18 && playerX<rockX+68 && playerY<rockY+69 && playerY>=rockY+50) { playerY=playerY+speed; if (dash) { playerY = playerY + dashSpd; } } if (playerY<rockY+68 && playerY>rockY-18 && playerX>rockX-19 && playerX<=rockX) { playerX=playerX-speed; if (dash) { playerX = playerX - dashSpd; } } } //draw grass\\ void drawGrass(float x, float y) { fill(60, 130, 0); triangle(x+27, y+3, x+17, y+50, x+40, y+38); fill(110, 150, 0); quad(x+8, y+14, x+17, y, x+25, y+44, x+15, y+35); fill(40, 190, 0); quad(x+36, y+2, x+43, y+15, x+37, y+35, x+31, y+25); fill(40, 170, 0); quad(x+23, y+7, x+31, y+50, x+20, y+50, x+13, y+37); fill(70, 160, 0); beginShape(); vertex(x+49, y+17); vertex(x+45, y+34); vertex(x+35, y+50); vertex(x+30, y+50); vertex(x+30, y+40); vertex(x+49, y+17); endShape(); fill(120, 200, 0); beginShape(); vertex(x+1, y+14); vertex(x+5, y+32); vertex(x+17, y+50); vertex(x+22, y+50); vertex(x+16, y+27); vertex(x+1, y+14); endShape(); fill(140, 220, 0); quad(x+7, y+39, x+15, y+40, x+19, y+50, x+15, y+50); fill(60, 180, 0); quad(x+48, y+36, x+44, y+47, x+38, y+50, x+30, y+50); fill(110, 210, 0); quad(x+37, y+14, x+27, y+30, x+24, y+50, x+32, y+50); //if player is walking through the grass, run RNG to determine if an encounter occurs if (up||down||left||right) { //test to see if player is moving if (playerX<x+50 && playerX>x && playerY<y+50 && playerY>y) { //test to see if player is in grass if(!dash){ //test to see if player is walking (not dashing) ranNum = int(random(0,int((50/speed)*20))); if (ranNum == 1) { //set player to enemy screen 1 (5% chance per grass sprite) and disable movement and dash startBattle(); up=false; right=false; down=false; left=false; dash=false; ranNum = 0; screen = 1; } else if (ranNum == 2) { //set player to enemy screen 2 (5% chance per grass sprite) and disable movement and dash startBattle(); up=false; right=false; down=false; left=false; dash=false; ranNum = 0; screen = 2; } else if (ranNum == 3) { //set player to enemy screen 3 (5% chance per grass sprite) and disable movement and dash startBattle(); up=false; right=false; down=false; left=false; dash=false; ranNum = 0; screen=3; } } if(dash){ //test to see if player is dashing ranNum = int(random(0,int((50/(speed+dashSpd))*20))); if (ranNum == 1) { //set player to enemy screen 1 (5% chance per grass sprite) and disable movement and dash startBattle(); up=false; right=false; down=false; left=false; dash=false; ranNum = 0; screen = 1; } else if (ranNum == 2) { //set player to enemy screen 2 (5% chance per grass sprite) and disable movement and dash startBattle(); up=false; right=false; down=false; left=false; dash=false; ranNum = 0; screen = 2; } else if (ranNum == 3) { //set player to enemy screen 3 (5% chance per grass sprite) and disable movement and dash startBattle(); up=false; right=false; down=false; left=false; dash=false; ranNum = 0; screen=3; } } } } } //draw tree\\ void drawTree(float treeX,float treeY){ //draw trunk fill(100,60,15); beginShape(); vertex(treeX+16,treeY+50); vertex(treeX+15,treeY+70); vertex(treeX+6,treeY+86); vertex(treeX+16,treeY+84); vertex(treeX+16,treeY+94); vertex(treeX+28,treeY+86); vertex(treeX+40,treeY+90); vertex(treeX+33,treeY+70); vertex(treeX+31,treeY+50); endShape(); //draw leaves fill(20,100,0); beginShape(); vertex(treeX+1,treeY+65); vertex(treeX+12,treeY+45); vertex(treeX+7,treeY+48); vertex(treeX+13,treeY+33); vertex(treeX+9,treeY+36); vertex(treeX+14,treeY+22); vertex(treeX+11,treeY+25); vertex(treeX+25,treeY+1); vertex(treeX+39,treeY+25); vertex(treeX+36,treeY+22); vertex(treeX+41,treeY+36); vertex(treeX+37,treeY+33); vertex(treeX+43,treeY+48); vertex(treeX+38,treeY+45); vertex(treeX+49,treeY+65); vertex(treeX+33,treeY+60); vertex(treeX+35,treeY+63); vertex(treeX+27,treeY+58); vertex(treeX+22,treeY+64); vertex(treeX+17,treeY+59); vertex(treeX+1,treeY+65); endShape(); //create bounding box to prevent player from walkign through rock if (playerX>treeX-18 && playerX<treeX+68 && playerY>treeY+31 && playerY<=treeY+50) { playerY=playerY-speed; if (dash) { playerY = playerY - dashSpd; } } if (playerY<treeY+113 && playerY>treeY+31 && playerX<treeX+64 && playerX>=treeX+45) { playerX=playerX+speed; if (dash) { playerX = playerX + dashSpd; } } if (playerX>treeX-18 && playerX<treeX+68 && playerY<treeY+114 && playerY>=treeY+95) { playerY=playerY+speed; if (dash) { playerY = playerY + dashSpd; } } if (playerY<treeY+113 && playerY>treeY+31 && playerX>treeX-17 && playerX<=treeX+2) { playerX=playerX-speed; if (dash) { playerX = playerX - dashSpd; } } } //draw guard\\ void drawGuard(float guardX){ //make guard follow player float guardY = groundY+400; if(playerY>=groundY+400 && playerY<=groundY+600){ guardY = playerY; } else if (playerY<=groundY+400){ guardY = groundY+400; } else if (playerY>=groundY+600){ guardY = groundY+600; } //draw hands fill(243, 211, 174); ellipse(guardX+15,guardY-15,9,9); ellipse(guardX+15,guardY+15,9,9); //draw body fill(100,80,255); ellipse(guardX+8,guardY,12,36); //draw shoulder pads fill(180,160,20); ellipse(guardX+8,guardY-15,8,5); ellipse(guardX+8,guardY+15,8,5); //draw cap fill(20,0,140); ellipse(guardX+22,guardY,4,10); beginShape(); vertex(guardX+22,guardY-5); vertex(guardX+10,guardY-5); vertex(guardX+10,guardY+5); vertex(guardX+22,guardY+5); endShape(); //top of hat fill(40,0,140); ellipse(guardX+8,guardY,16,16); //create bounding box to prevent player from walking through guard if (playerX>guardX-18 && playerX<guardX+43 && playerY>guardY-39 && playerY<=guardY-15) { playerY=playerY-speed; if (dash) { playerY = playerY - dashSpd; } } if (playerY<guardY+58 && playerY>guardY-18 && playerX<guardX+44 && playerX>=guardX+25) { playerX=playerX+speed; if (dash) { playerX = playerX + dashSpd; } } if (playerX>guardX-18 && playerX<guardX+43 && playerY<guardY+39 && playerY>=guardY+15) { playerY=playerY+speed; if (dash) { playerY = playerY + dashSpd; } } if (playerY<guardY+58 && playerY>guardY-18 && playerX>guardX-19 && playerX<=guardX) { playerX=playerX-speed; if (dash) { playerX = playerX - dashSpd; } } //tell player he isn't allowed to pass when close to the guard if (playerX>guardX-10 && playerX<guardX+55 && playerY<guardY+40 && playerY>guardY-40) { fill(0); textSize(14); text("You cannot pass this point", guardX-30, guardY-30); } } /*/ BATTLE SPRITES /*/ //draw spider monster\\ void spider(float x, float y){ //string of web fill(190); rect(x+44,y-300,5,330); //legs fill(170,170,140); beginShape(); //top left leg vertex(x+32,y+41); vertex(x+18,y+26); vertex(x+30,y+10); vertex(x+25,y+25); vertex(x+34,y+35); endShape(); beginShape(); //middle left leg vertex(x+32,y+44); vertex(x+15,y+42); vertex(x+16,y+30); vertex(x+9,y+46); vertex(x+33,y+50); endShape(); beginShape(); //bottom left leg vertex(x+34,y+53); vertex(x+13,y+61); vertex(x+21,y+80); vertex(x+20,y+64); vertex(x+36,y+58); endShape(); beginShape(); //top right leg vertex(x+62,y+41); vertex(x+76,y+26); vertex(x+64,y+10); vertex(x+69,y+25); vertex(x+60,y+35); endShape(); beginShape(); //middle right leg vertex(x+62,y+44); vertex(x+79,y+42); vertex(x+78,y+30); vertex(x+85,y+46); vertex(x+61,y+50); endShape(); beginShape(); //bottom right leg vertex(x+60,y+53); vertex(x+81,y+61); vertex(x+73,y+80); vertex(x+74,y+64); vertex(x+58,y+58); endShape(); //body fill(30,150,10); ellipse(x+47,y+43,30,40); line(x+33,y+35,x+47,y+30); //top left line line(x+60,y+35,x+47,y+30); //top right line line(x+32,y+45,x+47,y+40); //middle left line line(x+61,y+45,x+47,y+40); //middle right line line(x+35,y+55,x+47,y+50); //bottom left line line(x+59,y+55,x+47,y+50); //bottom right line //teeth fill(180,180,170); beginShape(); //left large tooth vertex(x+39,y+70); vertex(x+38,y+77); vertex(x+42,y+81); vertex(x+41,y+77); vertex(x+47,y+70); endShape(); triangle(x+42,y+70,x+45,y+79,x+48,y+70); //left small tooth triangle(x+52,y+70,x+49,y+79,x+46,y+70); //right small tooth beginShape(); //right large tooth vertex(x+55,y+70); vertex(x+56,y+77); vertex(x+52,y+81); vertex(x+53,y+77); vertex(x+47,y+70); endShape(); //head fill(30,150,10); ellipse(x+47,y+66,30,18); //eyes fill(200,0,0); ellipse(x+39,y+69,5,5); //bottom left ellipse(x+55,y+69,5,5); //bottom right ellipse(x+44,y+65,3,3); //top left ellipse(x+50,y+65,3,3); //top right } //draw bat monster\\ void bat(float x, float y){ //draw tail fill(120,60,180); beginShape(); //long tail that leads to stinger vertex(x+55,y+65); vertex(x+57,y+60); vertex(x+50,y+57); vertex(x+37,y+60); vertex(x+31,y+54); vertex(x+36,y+45); vertex(x+41,y+47); vertex(x+36,y+53); vertex(x+38,y+57); vertex(x+51,y+53); vertex(x+60,y+59); vertex(x+57,y+66); endShape(); fill(100,40,160); ellipse(x+54,y+67,8,8); //circular part of stinger beginShape(); //pointed piece to stinger vertex(x+54,y+71); vertex(x+41,y+73); vertex(x+48,y+70); vertex(x+50,y+67); endShape(); //left wing fill(90,20,150); beginShape(); //skin (flappy part) of wing vertex(x+35,y+34); vertex(x+22,y+29); vertex(x+6,y+38); vertex(x+10,y+56); vertex(x+14,y+48); vertex(x+19,y+51); vertex(x+23,y+45); vertex(x+26,y+47); vertex(x+35,y+42); endShape(); fill(130,80,190); beginShape(); //arm (boney part) of wing vertex(x+33,y+37); vertex(x+23,y+32); vertex(x+26,y+47); vertex(x+21,y+32); vertex(x+16,y+35); vertex(x+19,y+51); vertex(x+14,y+36); vertex(x+9,y+39); vertex(x+10,y+56); vertex(x+6,y+38); vertex(x+22,y+29); vertex(x+35,y+34); endShape(); //right wing fill(90,20,150); beginShape(); //skin (flappy part) of wing vertex(x+57,y+34); vertex(x+70,y+29); vertex(x+86,y+38); vertex(x+82,y+56); vertex(x+78,y+48); vertex(x+73,y+51); vertex(x+69,y+45); vertex(x+66,y+47); vertex(x+57,y+42); endShape(); fill(130,80,190); beginShape(); //arm (boney part) of wing vertex(x+59,y+37); vertex(x+69,y+32); vertex(x+66,y+47); vertex(x+71,y+32); vertex(x+76,y+35); vertex(x+73,y+51); vertex(x+78,y+36); vertex(x+83,y+39); vertex(x+82,y+56); vertex(x+86,y+38); vertex(x+70,y+29); vertex(x+57,y+34); endShape(); //ears fill(130,80,190); quad(x+37,y+24,x+33,y+29,x+35,y+37,x+40,y+40); //left ear quad(x+55,y+24,x+59,y+29,x+57,y+37,x+52,y+40); //right ear //head fill(140,90,200); ellipse(x+46,y+39,28,20); //eyes fill(255); quad(x+37,y+35,x+35,y+39,x+43,y+40,x+42,y+37); //left eye quad(x+55,y+35,x+57,y+39,x+49,y+40,x+50,y+37); //right eye fill(150,0,0); ellipse(x+39,y+38,2,4); //left iris ellipse(x+53,y+38,2,4); //right iris //mouth fill(0); beginShape(); vertex(x+39,y+43); vertex(x+38,y+46); vertex(x+46,y+47); vertex(x+54,y+46); vertex(x+53,y+43); endShape(); //teeth fill(255); stroke(255); strokeWeight(0.3); triangle(x+41,y+43,x+43,y+43,x+42,y+45); triangle(x+51,y+43,x+49,y+43,x+50,y+45); strokeWeight(1); stroke(0); } //draw fire monster\\ void fireGuy(float x, float y){ //draw outer fire fill(255,20,0); beginShape(); vertex(x+26,y+79); vertex(x+12,y+55); vertex(x+22,y+63); vertex(x+20,y+45); vertex(x+27,y+27); vertex(x+27,y+41); vertex(x+32,y+44); vertex(x+36,y+30); vertex(x+42,y+25); vertex(x+37,y+14); vertex(x+41,y+4); vertex(x+40,y+11); vertex(x+51,y+24); vertex(x+49,y+30); vertex(x+56,y+31); vertex(x+62,y+25); vertex(x+62,y+19); vertex(x+66,y+26); vertex(x+63,y+40); vertex(x+67,y+46); vertex(x+76,y+35); vertex(x+68,y+58); vertex(x+70,y+64); vertex(x+74,y+60); vertex(x+72,y+72); vertex(x+60,y+84); endShape(); //draw inner fire fill(245,200,0); ellipse(x+45,y+69,42,42); //draw inner circle beginShape(); //first spike vertex(x+25,y+74); vertex(x+21,y+65); vertex(x+24,y+67); endShape(); beginShape(); //second spike vertex(x+26,y+62); vertex(x+26,y+47); vertex(x+33,y+53); endShape(); beginShape(); //third spike vertex(x+37,y+51); vertex(x+44,y+30); vertex(x+48,y+49); endShape(); beginShape(); //fourth spike vertex(x+51,y+50); vertex(x+59,y+36); vertex(x+57,y+53); endShape(); beginShape(); //fifth spike vertex(x+60,y+56); vertex(x+68,y+48); vertex(x+64,y+62); endShape(); beginShape(); //sixth spike vertex(x+66,y+70); vertex(x+70,y+68); vertex(x+65,y+75); endShape(); //draw eye fill(240); ellipse(x+44,y+64,12,10); //draw white oval fill(0,230,255); ellipse(x+43,y+65,6,9); //draw iris noStroke(); fill(255); ellipse(x+44,y+63,2,2); //draw two glares ellipse(x+42,y+67,2,2); stroke(0); //draw mouth fill(155,110,0,200); beginShape(); vertex(x+35,y+75); vertex(x+42,y+78); vertex(x+50,y+75); vertex(x+57,y+65); vertex(x+56,y+78); vertex(x+44,y+84); vertex(x+35,y+75); endShape(); //draw teeth strokeWeight(0.4); fill(220); triangle(x+42,y+79,x+44,y+78,x+44,y+80); //left tooth triangle(x+48,y+77,x+50,y+76,x+51,y+79); //right tooth strokeWeight(1); } //draw player when in battle\\ void sprite(float x,float y){ //swordblade fill(160); triangle(x+81,y,x+72,y+11,x+82,y+15); //top left quadrant fill(170); triangle(x+81,y,x+89,y+10,x+82,y+15); //top right quadrant quad(x+72,y+11,x+82,y+15,x+81,y+55,x+77,y+56); //bottom left quadrant fill(180); quad(x+89,y+10,x+82,y+15,x+81,y+55,x+85,y+56); //bottom right quadrant //sword handle fill(200,170,0); rect(x+78,y+54,6,21); //handle fill(195,165,0); ellipse(x+81,y+74,8,8); //pommel fill(180,120,0); beginShape(); //hand guard vertex(x+70,y+50); vertex(x+67,y+54); vertex(x+69,y+58); vertex(x+92,y+57); vertex(x+94,y+53); vertex(x+91,y+49); vertex(x+89,y+52); vertex(x+73,y+53); vertex(x+70,y+50); endShape(); //hand fill(243, 211, 174); beginShape(); vertex(x+73,y+64); vertex(x+78,y+60); vertex(x+78,y+64); vertex(x+84,y+63); vertex(x+84,y+58.5); vertex(x+88,y+65); vertex(x+88,y+70); vertex(x+84,y+74); vertex(x+77,y+74); vertex(x+73,y+70); vertex(x+73,y+64); endShape(); //neck and head fill(243, 211, 174); rect(x+29,y+40,9,15); ellipse(x+35,y+31,28,30); //right leg fill(190,160,70); triangle(x+40,y+80,x+60,y+110,x+40,y+110); //cloak fill(10, 20, 190); beginShape(); //draw back vertex(x+48,y+49); vertex(x+24,y+50); vertex(x+10,y+66); vertex(x+9,y+88); vertex(x,y+110); vertex(x+50,y+110); vertex(x+50,y+70); endShape(); line(x+50,y+70,x+38,y+88); //draw the creases in the cloak line(x+50,y+70,x+46,y+95); beginShape(); //draw right arm vertex(x+45,y+67); vertex(x+52,y+77); vertex(x+74,y+74); vertex(x+73,y+63); vertex(x+56,y+65); vertex(x+48,y+49); endShape(); line(x,y+110,x+18,y+66); //draw line to separate left arm from the back //draw hair fill(255,255,0); beginShape(); vertex(x+50,y+33); vertex(x+52,y+26); vertex(x+49,y+15); vertex(x+48,y+20); vertex(x+41,y+8); vertex(x+40,y+16); vertex(x+31,y+5); vertex(x+34,y+14); vertex(x+21,y+8); vertex(x+26,y+15); vertex(x+12,y+16); vertex(x+20,y+22); vertex(x+11,y+29); vertex(x+19,y+28); vertex(x+14,y+39); vertex(x+21,y+33); vertex(x+20,y+48); vertex(x+24,y+39); vertex(x+26,y+58); vertex(x+34,y+40); vertex(x+36,y+45); vertex(x+38,y+27); vertex(x+41,y+35); vertex(x+47,y+25); vertex(x+50,y+33); endShape(); } /*/ PARTICLES /*/ //snowflake particle\\ void snowFlake(float x, float y){ stroke(0,255,240); strokeWeight(0.85); noFill(); ellipse(x+10,y+10,4,4); //main circle in centre of snowflake line(x+3,y+17,x+17,y+3); //main eight lines coming from centre of snowflake line(x+0,y+10,x+20,y+10); line(x+3,y+3,x+17,y+17); line(x+10,y+0,x+10,y+20); line(x+7,y+13,x+5,y+12); //ring of zig-zags around circle line(x+5,y+12,x+7,y+10); line(x+7,y+10,x+5,y+8); line(x+5,y+8,x+7,y+7); line(x+7,y+7,x+8,y+5); line(x+8,y+5,x+10,y+7); line(x+10,y+7,x+12,y+5); line(x+12,y+5,x+13,y+7); line(x+13,y+7,x+15,y+8); line(x+15,y+8,x+13,y+10); line(x+13,y+10,x+15,y+12); line(x+15,y+12,x+13,y+13); line(x+13,y+13,x+12,y+15); line(x+12,y+15,x+10,y+13); line(x+10,y+13,x+8,y+15); line(x+8,y+15,x+7,y+13); line(x+6,y+6,x+5,y+3); //small lines that branch off of main eight lines line(x+6,y+6,x+3,y+5); line(x+10,y+4,x+8,y+1); line(x+10,y+4,x+12,y+1); line(x+14,y+6,x+15,y+3); line(x+14,y+6,x+17,y+5); line(x+16,y+10,x+19,y+8); line(x+16,y+10,x+19,y+12); line(x+14,y+14,x+17,y+15); line(x+14,y+14,x+15,y+17); line(x+10,y+16,x+12,y+19); line(x+10,y+16,x+8,y+19); line(x+6,y+14,x+3,y+15); line(x+6,y+14,x+5,y+17); line(x+4,y+10,x+1,y+12); line(x+4,y+10,x+1,y+8); stroke(0); strokeWeight(1); } //fire particle\\ void flame(float x, float y){ //outer red flame strokeWeight(0); fill(255,0,0); ellipse(x+10,y+14,12,12); beginShape(); vertex(x+4,y+14); vertex(x+6,y+6); vertex(x+7,y+8); vertex(x+10,y); vertex(x+13,y+8); vertex(x+14,y+6); vertex(x+16,y+14); endShape(); //inner yellow flame fill(255,230,0); ellipse(x+10,y+16,6,6); beginShape(); vertex(x+7,y+16); vertex(x+7,y+10); vertex(x+8,y+12); vertex(x+10,y+6); vertex(x+12,y+12); vertex(x+13,y+10); vertex(x+13,y+16); endShape(); strokeWeight(1); } /*/ PLAYER SPRITES /*/ //draw the player according to the direction the player is moving in\\ void drawPlayer() { stroke(0); //draw player when facing up if (direction == 0) { //draw hands fill(243, 211, 174); ellipse(playerX+15, playerY-10, 9, 9); ellipse(playerX-15, playerY-10, 9, 9); //draw the body fill(10, 20, 190); ellipse(playerX, playerY-3, 38, 14); //draw the head fill(243, 211, 174); ellipse(playerX, playerY-5, 18, 18); //draw the hair fill(255, 255, 0); beginShape(); vertex(playerX-12, playerY+12); vertex(playerX-4, playerY+6); vertex(playerX, playerY+20); vertex(playerX+4, playerY+6); vertex(playerX+12, playerY+12); vertex(playerX+8, playerY); vertex(playerX+20, playerY+4); vertex(playerX+8, playerY-12); vertex(playerX+6, playerY-8); vertex(playerX+2, playerY-14); vertex(playerX, playerY-10); vertex(playerX-2, playerY-14); vertex(playerX-6, playerY-8); vertex(playerX-8, playerY-12); vertex(playerX-20, playerY+4); vertex(playerX-8, playerY); endShape(CLOSE); } //draw player when facing right else if (direction == 1) { //draw hands fill(243, 211, 174); ellipse(playerX+10, playerY+15, 9, 9); ellipse(playerX+10, playerY-15, 9, 9); //draw the body fill(10, 20, 190); ellipse(playerX+3, playerY, 14, 38); //draw the head fill(243, 211, 174); ellipse(playerX+5, playerY, 18, 18); //draw the hair fill(255, 255, 0); beginShape(); vertex(playerX-12, playerY-12); vertex(playerX-6, playerY-4); vertex(playerX-20, playerY); vertex(playerX-6, playerY+4); vertex(playerX-12, playerY+12); vertex(playerX, playerY+8); vertex(playerX-4, playerY+20); vertex(playerX+12, playerY+8); vertex(playerX+8, playerY+6); vertex(playerX+14, playerY+2); vertex(playerX+10, playerY); vertex(playerX+14, playerY-2); vertex(playerX+8, playerY-6); vertex(playerX+12, playerY-8); vertex(playerX-4, playerY-20); vertex(playerX, playerY-8); endShape(CLOSE); } //draw player when facing down else if (direction == 2) { //draw hands fill(243, 211, 174); ellipse(playerX+15, playerY+10, 9, 9); ellipse(playerX-15, playerY+10, 9, 9); //draw the body fill(10, 20, 190); ellipse(playerX, playerY+3, 38, 14); //draw the head fill(243, 211, 174); ellipse(playerX, playerY+5, 18, 18); //draw the hair fill(255, 255, 0); beginShape(); vertex(playerX-12, playerY-12); vertex(playerX-4, playerY-6); vertex(playerX, playerY-20); vertex(playerX+4, playerY-6); vertex(playerX+12, playerY-12); vertex(playerX+8, playerY); vertex(playerX+20, playerY-4); vertex(playerX+8, playerY+12); vertex(playerX+6, playerY+8); vertex(playerX+2, playerY+14); vertex(playerX, playerY+10); vertex(playerX-2, playerY+14); vertex(playerX-6, playerY+8); vertex(playerX-8, playerY+12); vertex(playerX-20, playerY-4); vertex(playerX-8, playerY); endShape(CLOSE); } //draw player when facing left else if (direction == 3) { //draw hands fill(243, 211, 174); ellipse(playerX-10, playerY-15, 9, 9); ellipse(playerX-10, playerY+15, 9, 9); //draw the body fill(10, 20, 190); ellipse(playerX-3, playerY, 14, 38); //draw the head fill(243, 211, 174); ellipse(playerX-5, playerY, 18, 18); //draw the hair fill(255, 255, 0); beginShape(); vertex(playerX+12, playerY+12); vertex(playerX+6, playerY+4); vertex(playerX+20, playerY); vertex(playerX+6, playerY-4); vertex(playerX+12, playerY-12); vertex(playerX, playerY-8); vertex(playerX+4, playerY-20); vertex(playerX-12, playerY-8); vertex(playerX-8, playerY-6); vertex(playerX-14, playerY-2); vertex(playerX-10, playerY); vertex(playerX-14, playerY+2); vertex(playerX-8, playerY+6); vertex(playerX-12, playerY+8); vertex(playerX+4, playerY+20); vertex(playerX, playerY+8); endShape(CLOSE); } } ///**\\\ S C R E E N 0 F U N C T I O N S ///**\\\ /*/ BACKGROUND /*/ //draw path\\ void drawPath() { noStroke(); fill(240, 220, 50); rect(groundX+75, groundY-500, 100, 1050); rect(groundX-500, groundY+450, 675, 100); rect(groundX+75, groundY+25, 338, 100); rect(groundX+313, groundY-50, 100, 175); } //draw house\\ void drawHouse() { //draw main building stroke(0); fill(140, 0, 0); rect(groundX+275, groundY-300, 425, 250); //draw door step fill(200); rect(groundX+325, groundY-50, 75, 25); //draw door fill(255); ellipse(groundX+383, groundY-42, 5, 5); fill(150, 80, 0); rect(groundX+338, groundY-50, 50, 8); //tell player the door is locked if they are within range of door fill(255); textSize(14); if (playerX>groundX+300 && playerX<groundX+400 && playerY>groundY-50 && playerY<groundY+8) { text("The door is locked", groundX+300, groundY-75); } //prevent player from walking through walls of building if (playerX>groundX+256 && playerY<groundY-31 && playerY>=groundY-41) { playerY=playerY+speed; if (dash){ playerY = playerY + dashSpd; } } if (playerY<groundY-31 && playerX>groundX+256 && playerX<=groundX+266) { playerX=playerX-speed; if (dash){ playerX = playerX - dashSpd; } } } /*/ PLAYER CONTROLS /*/ //when player presses a WASD key, the move variable (up,right,down,left) is activated\\ void wasdPress() { if (key == 'w') { up = true; } else if (key == 'd') { right = true; } else if (key == 's') { down = true; } else if (key == 'a') { left = true; } if (key == ' '){ dash = true; } } //when player releases WASD key, it disables the move variable (up,right,down,left)\\ void wasdRelease() { if (key == 'w') { up = false; } if (key == 'd') { right = false; } if (key == 's') { down = false; } if (key == 'a') { left = false; } if (key == ' '){ dash = false; } } //when a move variable (up,right,down,left) is activated, the player is moved in the correct direction and the direction of the sprite is set to the direction player moves in\\ void wasdMove() { if (up) { playerY = playerY - speed; direction = 0; if (dash){ playerY = playerY - dashSpd; } } else if (right) { playerX = playerX + speed; direction = 1; if (dash){ playerX = playerX + dashSpd; } } else if (down) { playerY = playerY + speed; direction = 2; if (dash){ playerY = playerY + dashSpd; } } else if (left) { playerX = playerX - speed; direction = 3; if (dash){ playerX = playerX - dashSpd; } } } //when player moves 75 pixels away from border, translate board and player away from border to simulate scrolling screen void scroll(){ if (playerY<100) { playerY = playerY + speed; groundY = groundY + speed; if (dash){ playerY = playerY + dashSpd; groundY = groundY + dashSpd; } } if (playerX>300) { playerX = playerX - speed; groundX = groundX - speed; if (dash){ playerX = playerX - dashSpd; groundX = groundX - dashSpd; } } if (playerY>300) { playerY = playerY - speed; groundY = groundY - speed; if (dash){ playerY = playerY - dashSpd; groundY = groundY - dashSpd; } } if (playerX<100) { playerX = playerX + speed; groundX = groundX + speed; if (dash){ playerX = playerX + dashSpd; groundX = groundX + dashSpd; } } }