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;
}
}
}