Blockly
Python
SAVED
PLAY
#Main Script
from processing import *
import random
import math
import time
### START ENGINE CODE
class Data:
url = "https://s3-us-west-1.amazonaws.com/media.pixelpad.io/Blockly_Assets/"
#Ivo-Engine stuff
objs = []
#object are only destroyed at the end of the frame
toBeDestroyed = []
inputkeys = {} #dict
gameWidth = 800
gameHeight = 500
refWidth = 800
refHeight = 500
scaleRatio = 1
reloadEndOfFrame = False
main = None
images = {}
#Base-class of every object to enable start & update
class MonoBehaviour:
#REGION variables
x = 0
y = 0
#used for sorting
z = 0
rot = 0
#used for z-sorting internally
prevZ = -1000
#should be changed through setScale only!
scale = 1
currAnim = None
inGameScreen = True
min_x = 0
min_y = 0
max_x = 0
max_y = 0
markForUpdateSize = False
#ENDREGION
def setAnim(self, anim):
self.currAnim = anim
def setScale(self, val):
self.scale = val
#REGION Sprites
sprite = None
def set_sprite(self, url, width = None, height = None):
if (url not in Data.images):
Data.images[url] = loadImage(Data.url + url)
self.sprite = Data.images[url]
if (width != None):
self.set_width(width)
if (height != None):
self.set_height(height)
#self.updateMinMax() should be called after...
def set_width(self, width):
self.sprite.width = width
def set_height(self, height):
self.sprite.height = height
def move_forward(self, value):
self.x += math.cos(radians(self.rot-90))*value
self.y -= math.sin(radians(self.rot-90))*value
def move_right(self, value):
self.x += math.cos(radians(self.rot))*value
self.y -= math.sin(radians(self.rot))*value
#ENDREGION
#REGION Collision
def get_real_width(self):
return self.sprite.width * self.scale
def get_real_height(self):
return self.sprite.height * self.scale
def get_min_x(self):
return self.x - self.get_real_width() * 0.5
def get_max_x(self):
return self.x + self.get_real_width() * 0.5
b
def get_min_y(self):
return self.y - self.get_real_height() * 0.5
def get_max_y(self):
return self.y + self.get_real_height() * 0.5
#TODO only objects inside the gamescreen collide?
def collisionCheck(self, objType):
if (not self.inGameScreen):
return False;
for obj in Data.objs:
if (obj.inGameScreen):
if (obj is not self and type(obj).__name__ == objType):
if (self.intersects(obj)):
return obj
return False
def intersects(self, obj2):
return not (self.get_max_x() < obj2.get_min_x() or self.get_min_x() > obj2.get_max_x() or self.get_min_y() > obj2.get_max_y() or self.get_max_y() < obj2.get_min_y())
def check_in_gamescreen(self):
return not (self.get_max_x() < -Data.refWidth * 0.5 or self.get_min_x() > Data.refWidth * 0.5 or self.get_min_y() > Data.refHeight * 0.5 or self.get_max_y() < -Data.refHeight*0.5)
#ENDREGION
#REGION base functions
def start_INTERNAL(self):
#commented since empty objects can just display nothing
self.set_sprite("Empty.png")
self.start()
def update_INTERNAL(self):
self.update()
#we use translate instead of setting the objects position, to fix rotation issues
posX = (int)((self.x+Data.refWidth*0.5)*Data.scaleRatio)
posY = (int)((-self.y+Data.refHeight*0.5)*Data.scaleRatio)
translate(posX, posY)
rotate(radians(self.rot))
#if (self.currAnim != None):
# self.newSprite = self.currAnim.play()
self.inGameScreen = self.check_in_gamescreen()
if (self.inGameScreen):
image(self.sprite, 0, 0, self.get_real_width()*Data.scaleRatio, self.get_real_height()*Data.scaleRatio)
rotate(-radians(self.rot))
translate(-posX, -posY)
#Base functions to be overridden by any class inheriting from MonoBehaviour
def start(self):
pass
def update(self):
pass
def isMouseOver(self):
return (Data.mouse.x > self.get_min_x() and Data.mouse.x < self.get_max_x() and Data.mouse.y > self.get_min_y() and Data.mouse.y < self.get_max_y())
#ENDREGION
class Anim:
images = None
frames = 0
framesPerImage = 5
imageIndex = 0
timer = 0
#FRAMES OER IMAGE IS NOT THE FRAMERATE... Confusing, sorry
def __init__(self, url, frames, framesPerImage = 3):
self.images = []
self.framesPerImage = framesPerImage
self.frames = frames
for i in range(frames):
fullUrl = Data.url + url + str(i+1) + ".png"
img = requestImage(fullUrl)
self.images.append(img)
#should be called from a MonoBehaviour every frame while playing.
#looks like this: self.newSprite = currAnim.play()
def play(self):
self.timer += 1
if (self.timer >= self.framesPerImage):
self.timer = 0
self.imageIndex += 1
if (self.imageIndex >= self.frames):
self.imageIndex = 0
return self.images[self.imageIndex]
def instantiate(objtype, posX = 0, posY = 0):
n = objtype()
n.x = posX
n.y = posY
n.start_INTERNAL()
Data.objs.append(n)
return n
def destroy(obj):
#Check if objects wasn't already marked as destroyed.
if obj not in Data.toBeDestroyed:
Data.toBeDestroyed.append(obj)
def key_is_pressed(k):
if (k not in Data.inputkeys):
return False
return Data.inputkeys[k] == 1 or Data.inputkeys[k] == 2
def key_was_pressed(k):
if (k not in Data.inputkeys):
return False
return Data.inputkeys[k] == 1
def key_was_released(k):
if (k not in Data.inputkeys):
return False
return Data.inputkeys[k] == 3
def reload_game():
Data.reloadEndOfFrame = True
#SHOULD BE CALLED AT END OF DRAW
def reload_game_immediate():
Data.reloadEndOfFrame = False
Data.objs = []
Data.inputkeys = {}
Data.main = Main()
Data.main.start()
class Main(MonoBehaviour):
def start(self):
print("No Blockly Main class")
class Global:
pass
### END ENGINE CODE
################################################################
#BLOCKLY_REPLACE
################################################################
### START HELPER CODE
#z-sorting
#bubblesort with extra check for each element if it changed
def bubbleSort(alist):
pop = 0
for passnum in range(len(alist)-1,0,-1):
if (alist[passnum].z != alist[passnum].prevZ):
for i in range(passnum):
pop += 1
if alist[i].z > alist[i+1].z:
temp = alist[i]
alist[i] = alist[i+1]
alist[i+1] = temp
alist[passnum].prevZ = alist[passnum].z
#print("Sorted " + str(pop) + " elements")
### END HELPER CODE
### START PROCESSING CODE
def setup():
#SIZE_REPLACE
size(Data.gameWidth, Data.gameHeight)
Data.scaleRatio = float(Data.gameWidth) / Data.refWidth
Data.invScaleRatio = float(1)/Data.scaleRatio
imageMode(CENTER)
frameRate(30)
textSize(32*Data.scaleRatio)
reload_game_immediate()
#run first frame right away
draw()
def draw():
background(0)
Data.mouse = PVector((mouse.x* Data.invScaleRatio-Data.refWidth*0.5), -(mouse.y * Data.invScaleRatio-Data.refHeight*0.5))
#bubbleSort(Data.objs)
Data.main.update()
for obj in Data.objs:
obj.update_INTERNAL()
#printObjs()
#if was pressed, go to is pressed now
for key in Data.inputkeys:
if (Data.inputkeys[key] == 1):
Data.inputkeys[key] = 2
#if was released, go to off now
if (Data.inputkeys[key] == 3):
Data.inputkeys[key] = 0
for obj in Data.toBeDestroyed:
Data.objs.remove(obj)
Data.toBeDestroyed = []
if (Data.reloadEndOfFrame):
reload_game_immediate()
#DevTools.showFPS()
#DevTools.printObjs()
class DevTools:
lastFrame = 0
avg = 0
nFramesToUpdate = 5
nFrame = 0
def showFPS():
DevTools.nFrame += 1
if (DevTools.nFrame >= DevTools.nFramesToUpdate):
m = millis()
deltaTime = m-DevTools.lastFrame
DevTools.lastFrame = m
DevTools.nFrame = 0
DevTools.avg = DevTools.nFramesToUpdate*1000/deltaTime
ui_text("FPS: " + str(DevTools.avg), 650, 50)
def printObjs():
#objs = ""
i = 0
j = 0
for obj in Data.objs:
#objs += str(obj.z) + ", "
i+=1
if (obj.inGameScreen):
j+=1
ui_text("Objs: " + str(i) + ", in screen: " + str(j), 450, 100)
def processKeyOrMousePress(val):
if (val not in Data.inputkeys or Data.inputkeys[val] == 0):
Data.inputkeys[val] = 1
def processKeyOrMouseRelease(val):
Data.inputkeys[val] = 3
def ui_text(txt, posX, posY):
pX = (int)((posX+Data.refWidth*0.5)*Data.scaleRatio)
pY = (int)((-posY+Data.refHeight*0.5)*Data.scaleRatio)
text(txt, pX, pY )
#Processing funcs
def keyPressed():
processKeyOrMousePress(str(keyboard.key))
def keyReleased():
processKeyOrMouseRelease(str(keyboard.key))
def mousePressed():
if (mouse.button == 37):
processKeyOrMousePress("m_left")
if (mouse.button == 39):
processKeyOrMousePress("m_right")
def mouseReleased():
if (mouse.button == 37):
processKeyOrMouseRelease("m_left")
if (mouse.button == 39):
processKeyOrMouseRelease("m_right")
run()
### END PROCESSING CODE
{"main":"<xml xmlns=\"http://www.w3.org/1999/xhtml\"><variables><variable type=\"\" id=\";:b0}_09KEg;*xJEagCC\">timer</variable><variable type=\"\" id=\"}RPNQ`F/t0+G?bnKI7lv\">haelth</variable><variable type=\"\" id=\"1UY,|Y?GG2E+)yxC7kq^\">score</variable><variable type=\"\" id=\"XacG(_J%L0njKS(tsJ,4\">helth timer</variable></variables><block type=\"class_object\" id=\"#TOSCa5Yjf3wzbRU4c^+\" x=\"-165\" y=\"-405\"><field name=\"NAME\">enemy</field><statement name=\"start\"><block type=\"set_sprite\" id=\"POh%_R}3_J0%^AI5Wp/K\"><value name=\"SPRITE\"><block type=\"sprite\" id=\"GupR}1%Ub@30MnhnbeIt\"><field name=\"SPRITE\">https://s3-us-west-1.amazonaws.com/media.pixelpad.io/Blockly_Assets/Space/Player.png</field></block></value><next><block type=\"set_rot\" id=\"r6f+jrg1SaZ{0b%PZUU!\"><value name=\"NAME\"><shadow type=\"math_number\" id=\"bXKl5,`ksm`IfG-pGEl.\"><field name=\"NUM\">180</field></shadow></value></block></next></block></statement><statement name=\"update\"><block type=\"move_forward\" id=\"Nxw!^]D}xwy!tPt@:7Bk\"><value name=\"NAME\"><shadow type=\"math_number\" id=\"JJ-,LfL~vE5Jg43kv-Gk\"><field name=\"NUM\">3</field></shadow></value><next><block type=\"controls_if\" id=\"Z;N5o][RqCMkyspA-#xX\"><value name=\"IF0\"><block type=\"collision_check\" id=\"[3/kVaTl.sX!H^[)5k6l\"><field name=\"NAME\">projectile</field></block></value><statement name=\"DO0\"><block type=\"destroy\" id=\"zgwFOvJ?Z5zb*sng})Z5\"><value name=\"NAME\"><block type=\"collision_check\" id=\"b}}Rpfd|CsDo6Z9nZp/[\"><field name=\"NAME\">projectile</field></block></value><next><block type=\"destroy\" id=\"LPt;Co,FRh0lfZ/%)id3\"><value name=\"NAME\"><block type=\"self\" id=\"L5C9To@]`Hy%}Xql|%Ve\"></block></value><next><block type=\"variables_change_custom\" id=\"cCe,bWETeW:pbuha;Uci\"><field name=\"TYPE\">Global.</field><field name=\"VAR\" id=\"1UY,|Y?GG2E+)yxC7kq^\" variabletype=\"\">score</field><value name=\"VALUE\"><block type=\"math_number\" id=\")V3aMv8s8_ssv*5JF/cb\"><field name=\"NUM\">1</field></block></value></block></next></block></next></block></statement><next><block type=\"ui_text\" id=\"xWzO-K`Y`AzWO5U^;UjK\"><value name=\"TEXT\"><shadow type=\"text\" id=\"AC-9t$va|c(:v;81uO%7\"><field name=\"TEXT\"></field></shadow><block type=\"variables_get_custom\" id=\"uWG|L/C5f}y/c8sP6Sj_\"><field name=\"TYPE\">Global.</field><field name=\"VAR\" id=\"1UY,|Y?GG2E+)yxC7kq^\" variabletype=\"\">score</field></block></value><value name=\"x\"><shadow type=\"math_number\" id=\"^9f}cJNwlL]Y;|F]%sk?\"><field name=\"NUM\">-240</field></shadow></value><value name=\"y\"><shadow type=\"math_number\" id=\"b.%7~3Lltl3R11HedTd]\"><field name=\"NUM\">200</field></shadow></value></block></next></block></next></block></statement></block><block type=\"class_object\" id=\":sr)pt6]#J,AiZd8Kim{\" x=\"345\" y=\"-285\"><field name=\"NAME\">health</field><statement name=\"start\"><block type=\"set_sprite\" id=\"l{;hE4g5X.j+LAs%HNbD\"><value name=\"SPRITE\"><block type=\"sprite\" id=\"eRewcj/noLOGQI+)}8}P\"><field name=\"SPRITE\">https://s3-us-west-1.amazonaws.com/media.pixelpad.io/Blockly_Assets/Dungeon/crate.png</field></block></value></block></statement><statement name=\"update\"><block type=\"move_forward\" id=\"bR6nTLpz*g*VQWz_FIH4\"><value name=\"NAME\"><shadow type=\"math_number\" id=\"Y*35zvzI?t?y)Aq0S:$p\"><field name=\"NUM\">-1</field></shadow></value><next><block type=\"controls_if\" id=\"]bkHcSa]aQG;0gG9*15%\"><value name=\"IF0\"><block type=\"collision_check\" id=\"^P74o/GZu7y5Y4Y}*h|k\"><field name=\"NAME\">player</field></block></value><statement name=\"DO0\"><block type=\"variables_change_custom\" id=\"y57U~ZlKdTw=m9uI`3A%\"><field name=\"TYPE\">Global.</field><field name=\"VAR\" id=\"}RPNQ`F/t0+G?bnKI7lv\" variabletype=\"\">haelth</field><value name=\"VALUE\"><block type=\"math_number\" id=\"NV1ox|IM@M|ypcS7#]s:\"><field name=\"NUM\">1</field></block></value><next><block type=\"destroy\" id=\"t+2Va_0ocYYgI!vhZX-]\"><value name=\"NAME\"><block type=\"self\" id=\"-bzRN*)!$Uu}zt_jyUB~\"></block></value></block></next></block></statement></block></next></block></statement></block><block type=\"class_object\" id=\"3e!i:q)lvWBYY8z{6:@-\" x=\"15\" y=\"-61\"><field name=\"NAME\">background</field><statement name=\"start\"><block type=\"set_sprite\" id=\"3`4r.Hf2u.WiSTo08VLz\"><value name=\"SPRITE\"><block type=\"sprite\" id=\"o)EjHn9B3qhkA4L=FRIo\"><field name=\"SPRITE\">https://s3-us-west-1.amazonaws.com/media.pixelpad.io/Blockly_Assets/Space/Nebula.jpg</field></block></value></block></statement></block><block type=\"main_class_object\" id=\"M|TUBcRXfP-zXMfslc+k\" x=\"225\" y=\"-45\"><statement name=\"start\"><block type=\"instantiate\" id=\"_=FEK*`R,~$9eOJKUIKI\"><field name=\"NAME\">background</field><next><block type=\"instantiate\" id=\"c(0-AVNa3/Cio1b8EFW*\"><field name=\"NAME\">player</field><next><block type=\"variables_set_custom\" id=\"Sb~J.m1sP4XWDe)/X:k$\"><field name=\"TYPE\">Global.</field><field name=\"VAR\" id=\";:b0}_09KEg;*xJEagCC\" variabletype=\"\">timer</field><value name=\"VALUE\"><block type=\"math_number\" id=\"3BbRQT(_Ba5V3sAjrx4#\"><field name=\"NUM\">0</field></block></value><next><block type=\"variables_set_custom\" id=\"DN..$!cEk#v3Q~pz}GUX\"><field name=\"TYPE\">Global.</field><field name=\"VAR\" id=\"1UY,|Y?GG2E+)yxC7kq^\" variabletype=\"\">score</field><value name=\"VALUE\"><block type=\"math_number\" id=\"R#:}CS66.$3WDL.TFxR0\"><field name=\"NUM\">0</field></block></value><next><block type=\"variables_set_custom\" id=\"lk!ixF]R}ysQ/p$Y/Lq{\"><field name=\"TYPE\">Global.</field><field name=\"VAR\" id=\"XacG(_J%L0njKS(tsJ,4\" variabletype=\"\">helth timer</field><value name=\"VALUE\"><block type=\"math_number\" id=\"IKNr*G;SVr[$Xf1VINm9\"><field name=\"NUM\">0</field></block></value></block></next></block></next></block></next></block></next></block></statement><statement name=\"update\"><block type=\"variables_change_custom\" id=\"-@jJoS?6zCu4eKl8RYLz\"><field name=\"TYPE\">Global.</field><field name=\"VAR\" id=\";:b0}_09KEg;*xJEagCC\" variabletype=\"\">timer</field><value name=\"VALUE\"><block type=\"math_number\" id=\"a#pM3Nk18#LZtomLwCr|\"><field name=\"NUM\">1</field></block></value><next><block type=\"controls_if\" id=\"I=lYT@oo]R=sag@E0h2m\"><value name=\"IF0\"><block type=\"logic_compare\" id=\"Wai)-]!z?p^}|,P,yAF}\"><field name=\"OP\">EQ</field><value name=\"A\"><block type=\"variables_get_custom\" id=\")yuqS2nHy~JZlFB#.5g6\"><field name=\"TYPE\">Global.</field><field name=\"VAR\" id=\";:b0}_09KEg;*xJEagCC\" variabletype=\"\">timer</field></block></value><value name=\"B\"><block type=\"math_number\" id=\"|Mgvn?0LibcvHEbB,xYb\"><field name=\"NUM\">30</field></block></value></block></value><statement name=\"DO0\"><block type=\"instantiate_at_pos\" id=\"(-0sGHzf~2|C[Bg=eWv$\"><field name=\"type\">enemy</field><value name=\"x\"><shadow type=\"math_number\" id=\"`+tf-s]iXzMZ~z:^s+L}\"><field name=\"NUM\">0</field></shadow><block type=\"math_random_int\" id=\"rE|s,z6HWAKE13lfO`1?\"><value name=\"FROM\"><shadow type=\"math_number\" id=\"]FMh?=Kd:78i6jx#BC~A\"><field name=\"NUM\">-200</field></shadow></value><value name=\"TO\"><shadow type=\"math_number\" id=\"/4%#6jjJ8cU6$6)$VCkT\"><field name=\"NUM\">200</field></shadow></value></block></value><value name=\"y\"><shadow type=\"math_number\" id=\",,$VwW(aBRv#koxfDs]!\"><field name=\"NUM\">250</field></shadow></value><next><block type=\"variables_set_custom\" id=\"9lOY61!@X/n6hgc%G~8^\"><field name=\"TYPE\">Global.</field><field name=\"VAR\" id=\";:b0}_09KEg;*xJEagCC\" variabletype=\"\">timer</field><value name=\"VALUE\"><block type=\"math_number\" id=\"{K}U_KQY801T!nT9)y3w\"><field name=\"NUM\">0</field></block></value><next><block type=\"variables_change_custom\" id=\"w*Qg)ZAp)aK=F?/c3Hp=\"><field name=\"TYPE\">Global.</field><field name=\"VAR\" id=\"XacG(_J%L0njKS(tsJ,4\" variabletype=\"\">helth timer</field><value name=\"VALUE\"><block type=\"math_number\" id=\"axAYXQ#DR3EwEm1:PxEF\"><field name=\"NUM\">1</field></block></value></block></next></block></next></block></statement><next><block type=\"controls_if\" id=\"~L{1aQO?Rn$qQ+N]a!?7\"><value name=\"IF0\"><block type=\"logic_compare\" id=\"xt*[#D#:NuLGYQNXlv:7\"><field name=\"OP\">EQ</field><value name=\"A\"><block type=\"variables_get_custom\" id=\"GKm.j8GX:lxx]m.-K)1D\"><field name=\"TYPE\">Global.</field><field name=\"VAR\" id=\"XacG(_J%L0njKS(tsJ,4\" variabletype=\"\">helth timer</field></block></value><value name=\"B\"><block type=\"math_number\" id=\"l1sWu/?:^/N!xE.:qa6r\"><field name=\"NUM\">5</field></block></value></block></value><statement name=\"DO0\"><block type=\"instantiate_at_pos\" id=\"oQ.#]!1;qs]w-x$*={O)\"><field name=\"type\">health</field><value name=\"x\"><shadow type=\"math_number\" id=\"Kb]Hx7ks*HFs]k{l$+~D\"><field name=\"NUM\">0</field></shadow></value><value name=\"y\"><shadow type=\"math_number\" id=\"iM3s,_d+IOpryPkJxeSG\"><field name=\"NUM\">200</field></shadow></value><next><block type=\"variables_set_custom\" id=\"QY#KA:o$Nn1WiJcpKNK?\"><field name=\"TYPE\">Global.</field><field name=\"VAR\" id=\"XacG(_J%L0njKS(tsJ,4\" variabletype=\"\">helth timer</field><value name=\"VALUE\"><block type=\"math_number\" id=\"I+|]U]Z(aTvtJQN6SfXE\"><field name=\"NUM\">0</field></block></value></block></next></block></statement></block></next></block></next></block></statement></block><block type=\"class_object\" id=\"ZQA@EuL8|y4P57G,sym@\" x=\"-132\" y=\"84\"><field name=\"NAME\">player</field><statement name=\"start\"><block type=\"set_sprite\" id=\"7*,F8qs#]5hw2Y[(KbD1\"><value name=\"SPRITE\"><block type=\"sprite\" id=\"m2ZY-9NdZb{8mgbpUSxL\"><field name=\"SPRITE\">https://s3-us-west-1.amazonaws.com/media.pixelpad.io/Blockly_Assets/Space/Enemy.png</field></block></value><next><block type=\"variables_set_custom\" id=\"q4lKi;L!%/4XFo/=9F_V\"><field name=\"TYPE\">Global.</field><field name=\"VAR\" id=\"}RPNQ`F/t0+G?bnKI7lv\" variabletype=\"\">haelth</field><value name=\"VALUE\"><block type=\"math_number\" id=\"Gr[qfk,-aeFC,*1]Q/6T\"><field name=\"NUM\">3</field></block></value></block></next></block></statement><statement name=\"update\"><block type=\"controls_if\" id=\"+RP3,K_Me*aOXUW8-n0e\"><value name=\"IF0\"><block type=\"key_input\" id=\"!zk%FU3S/hc!~[5m]|^D\"><field name=\"NAME\">w</field><field name=\"PRESSED\">key_is_pressed</field></block></value><statement name=\"DO0\"><block type=\"move_forward\" id=\"GY7Z[u7r:HB:Hd}$.6SR\"><value name=\"NAME\"><shadow type=\"math_number\" id=\"Oeg@;(ofwEy291)~9C*^\"><field name=\"NUM\">5</field></shadow></value></block></statement><next><block type=\"controls_if\" id=\"Zr0GS^k7zEIy7^_cOkVv\"><value name=\"IF0\"><block type=\"key_input\" id=\"_sf2DZz#IBfrBzC3XBxB\"><field name=\"NAME\">s</field><field name=\"PRESSED\">key_is_pressed</field></block></value><next><block type=\"controls_if\" id=\"q2{ji#FS+QXu]DxENb0,\"><value name=\"IF0\"><block type=\"key_input\" id=\"/-F)KulU2LekSp8U!k63\"><field name=\"NAME\">d</field><field name=\"PRESSED\">key_is_pressed</field></block></value><statement name=\"DO0\"><block type=\"move_right\" id=\"n5f=!i|eiU?V@@P9*|p(\"><value name=\"NAME\"><shadow type=\"math_number\" id=\"eIqHcuw5(pAX0Y=78`I,\"><field name=\"NUM\">5</field></shadow></value></block></statement><next><block type=\"controls_if\" id=\"G0ZAV[QVn/3VSH]VamG;\"><value name=\"IF0\"><block type=\"key_input\" id=\"%9={k6k6TAgc/n7f7CoB\"><field name=\"NAME\">a</field><field name=\"PRESSED\">key_is_pressed</field></block></value><statement name=\"DO0\"><block type=\"move_right\" id=\"mt3O)]Flg:Dbb^ku^|!y\"><value name=\"NAME\"><shadow type=\"math_number\" id=\"yJ|AAn|x_x*gLi5RZ`4]\"><field name=\"NUM\">-5</field></shadow></value></block></statement><next><block type=\"controls_if\" id=\"k1TbQeuAnSG__)H6oWTy\"><value name=\"IF0\"><block type=\"key_input\" id=\"zFdzmlH~J{[93E4$!7A3\"><field name=\"NAME\"> </field><field name=\"PRESSED\">key_was_pressed</field></block></value><statement name=\"DO0\"><block type=\"instantiate_at_pos\" id=\"yt;o7,f/E$GBu~AFuLnJ\"><field name=\"type\">projectile</field><value name=\"x\"><shadow type=\"math_number\" id=\"w151xpbqoZK:M({?n8C5\"><field name=\"NUM\">0</field></shadow><block type=\"get_pos\" id=\"!6Z)?.Uw7m|E*1HV^#e{\"><field name=\"pos\">x</field></block></value><value name=\"y\"><shadow type=\"math_number\" id=\"JsL~r5K6]/@ejal+[(T0\"><field name=\"NUM\">0</field></shadow><block type=\"get_pos\" id=\"w9(`kgf*21dYL$#]~:I4\"><field name=\"pos\">y</field></block></value></block></statement><next><block type=\"controls_if\" id=\"w*H|IFzat9V*nxRO1.U)\"><value name=\"IF0\"><block type=\"collision_check\" id=\"*xZ7K@iuy}IRwmU=C]e8\"><field name=\"NAME\">enemy</field></block></value><statement name=\"DO0\"><block type=\"destroy\" id=\"H/Zu[KBRnuv}Bv6Ok;?b\"><value name=\"NAME\"><block type=\"collision_check\" id=\"%B]wi}9!pEZ}ek9#HN#?\"><field name=\"NAME\">enemy</field></block></value><next><block type=\"variables_change_custom\" id=\"YO3-Vko_=m2f+oMa^/_`\"><field name=\"TYPE\">Global.</field><field name=\"VAR\" id=\"}RPNQ`F/t0+G?bnKI7lv\" variabletype=\"\">haelth</field><value name=\"VALUE\"><block type=\"math_number\" id=\"L7=V}l5yFrgMd8?/7|)%\"><field name=\"NUM\">-1</field></block></value><next><block type=\"controls_if\" id=\",2oA%CL[OXZBJs6-)]#m\"><value name=\"IF0\"><block type=\"logic_compare\" id=\"$zocXW_zeK3`C8BCbx9R\"><field name=\"OP\">EQ</field><value name=\"A\"><block type=\"variables_get_custom\" id=\"Jf:|c%gJZ8;DgAj8;.8V\"><field name=\"TYPE\">Global.</field><field name=\"VAR\" id=\"}RPNQ`F/t0+G?bnKI7lv\" variabletype=\"\">haelth</field></block></value><value name=\"B\"><block type=\"math_number\" id=\"[N/j:vkR-YiMaz*|Ya|Y\"><field name=\"NUM\">0</field></block></value></block></value><statement name=\"DO0\"><block type=\"destroy\" id=\"#17e=P?N)Une6W@vKtzK\"><value name=\"NAME\"><block type=\"self\" id=\"k2$1hOL|.229k5d/a(dI\"></block></value></block></statement></block></next></block></next></block></statement></block></next></block></next></block></next></block></next></block></next></block></statement></block><block type=\"class_object\" id=\"}qo+DK-tJ=lcNO_^47Kc\" x=\"-585\" y=\"135\"><field name=\"NAME\">projectile</field><statement name=\"start\"><block type=\"set_sprite\" id=\"1fUK`z{V(!`|0f|,g/hJ\"><value name=\"SPRITE\"><block type=\"sprite\" id=\"H.[odHq^Y$Ax]:!d6R43\"><field name=\"SPRITE\">https://s3-us-west-1.amazonaws.com/media.pixelpad.io/Blockly_Assets/Space/Bullet.png</field></block></value></block></statement><statement name=\"update\"><block type=\"move_forward\" id=\"E%WWdSydQR1gxZD~9)sR\"><value name=\"NAME\"><shadow type=\"math_number\" id=\"+uZdWtp|e*nR(`.HI02x\"><field name=\"NUM\">3</field></shadow></value><next><block type=\"controls_if\" id=\";QwPeVC4cv=u0rquki@A\"><value name=\"IF0\"><block type=\"logic_compare\" id=\"zY}tt5%tluDhaGym0a2u\"><field name=\"OP\">GT</field><value name=\"A\"><block type=\"get_pos\" id=\"X:_H6EfoE7|k$[oOxwCJ\"><field name=\"pos\">y</field></block></value><value name=\"B\"><block type=\"math_number\" id=\"bQXpkJ4r_p.K,[w[YYN2\"><field name=\"NUM\">400</field></block></value></block></value><statement name=\"DO0\"><block type=\"destroy\" id=\"pmdbI/MiXaQIhP!K{.s$\"><value name=\"NAME\"><block type=\"self\" id=\"g4wh7|=QD9bro-W_NU]8\"></block></value></block></statement></block></next></block></statement></block></xml>"}