//initials
var GUIWidth = surface_get_width(application_surface);
var GUIHeight = surface_get_height(application_surface);
var camX = camera_get_view_x(Camera.camNormal);
var camY = camera_get_view_y(Camera.camNormal);
#region setup surfaces
if !surface_exists(topLeftSurf) {topLeftSurf = surface_create(GUIWidth/topLeftResolutionScale,GUIHeight/topLeftResolutionScale); resetBars = true;};
if !surface_exists(hpSurf) {hpSurf = surface_create(GUIWidth/topLeftResolutionScale,GUIHeight/topLeftResolutionScale); resetBars = true;}
if !surface_exists(hpSurfA) {hpSurfA = surface_create(GUIWidth/topLeftResolutionScale,GUIHeight/topLeftResolutionScale); resetBars = true;}
if !surface_exists(hpSurfB) {hpSurfB = surface_create(GUIWidth/topLeftResolutionScale,GUIHeight/topLeftResolutionScale); resetBars = true;}
if !surface_exists(hpSurfC) {hpSurfC = surface_create(GUIWidth/topLeftResolutionScale,GUIHeight/topLeftResolutionScale); resetBars = true;}
if !surface_exists(hpSurfD) {hpSurfD = surface_create(GUIWidth/topLeftResolutionScale,GUIHeight/topLeftResolutionScale); resetBars = true;}
if !surface_exists(mpSurf) {mpSurf = surface_create(GUIWidth/topLeftResolutionScale,GUIHeight/topLeftResolutionScale); resetBars = true;}
if !surface_exists(mpSurfA) {mpSurfA = surface_create(GUIWidth/topLeftResolutionScale,GUIHeight/topLeftResolutionScale); resetBars = true;}
if (resetBars)
{
hpDamageDisplayPrev = noone;
hpMaxPrev = noone;
hpPrev = noone;
mpMaxPrev = noone;
mpPrev = noone;
}
resetBars = false;
#endregion
#region Base
surface_set_target(hpSurfD);
draw_clear_alpha(c_black,0.0);
#region Spears and band
if (mouse_check_button_pressed(mb_left)) expansionOpen = !expansionOpen;
if (expansionOpen) expansionSpd += 0.1;
else expansionSpd -= 0.03;
var p = expansionVar;
expansionVar = clamp(expansionVar+expansionSpd,0.0,1.0);
if (expansionVar != p+expansionSpd)
{
expansionSpd *= -0.68;
if (abs(expansionSpd) <= 0.03) expansionSpd = 0;
}
var cx = hpXI-5;
var cy = hpYI-5;
var rootDist = expansionRootDist;
var minDist = expansionBaseDist;
var maxDist = expansionBaseDist+expansionVar*(expansionMaxDist-expansionBaseDist);
var s1x,s1y,s2x,s2y;
#region spears
//spear 1
var dir = 270;
var col = make_colour_rgb(204,183,133);
s1x = cx+rootDist*dcos(dir);
s1y = cy-rootDist*dsin(dir);
s2x = cx+maxDist*dcos(dir);
s2y = cy-maxDist*dsin(dir);
draw_line_color(s1x,s1y,s2x,s2y,col,col);
draw_sprite(spr_uiBase_spear1,0,s2x,s2y);
//spear 2
var dir = 292.5;
var col = make_colour_rgb(170,170,170);
s1x = cx+rootDist*dcos(dir);
s1y = cy-rootDist*dsin(dir);
s2x = cx+maxDist*dcos(dir);
s2y = cy-maxDist*dsin(dir);
draw_line_color(s1x,s1y,s2x,s2y,col,col);
draw_sprite(spr_uiBase_spear2,0,s2x,s2y);
//spear 3
var dir = 315;
var col = make_colour_rgb(213,213,213);
s1x = cx+rootDist*dcos(dir);
s1y = cy-rootDist*dsin(dir);
s2x = cx+maxDist*dcos(dir);
s2y = cy-maxDist*dsin(dir);
draw_line_color(s1x,s1y,s2x,s2y,col,col);
draw_sprite(spr_uiBase_spear3,0,s2x,s2y);
//spear 4
var dir = 337.5;
var col = make_colour_rgb(170,170,170);
s1x = cx+rootDist*dcos(dir);
s1y = cy-rootDist*dsin(dir);
s2x = cx+maxDist*dcos(dir);
s2y = cy-maxDist*dsin(dir);
draw_line_color(s1x,s1y,s2x,s2y,col,col);
draw_sprite(spr_uiBase_spear4,0,s2x,s2y);
//spear 5
var _mpMax = floor(PlayerStats.mpMax);
var _mpSize = max(floor(_mpMax/mpPP)+2,2);
var col = make_colour_rgb(204,183,133);
s1x = cx+max(min(minDist,_mpSize+8),16);
s1y = cy;
s2x = cx+max(maxDist,minDist,_mpSize+26);
s2y = cy;
draw_line_color(s1x,s1y,s2x,s2y,col,col);
draw_sprite(spr_uiBase_spear5,0,s2x,s2y+1);
#endregion
#region Band
draw_sprite(spr_uiBase_band,0,cx+2,cy+3);
#endregion
#endregion
#region Back static
draw_sprite(spr_uiBase_base,0,hpXI,hpYI);
/**/draw_circle(0,0,10,false);/**/
#endregion
surface_reset_target();
#endregion
#region Mp
var mp = floor(PlayerStats.mp);
var mpMax = floor(PlayerStats.mpMax);
if mp != mpPrev || mpMax != mpMaxPrev
{
surface_set_target(mpSurf);
draw_clear_alpha(c_white,0);
#region Back
#region draw bar mp + caps
//bar
var size = max(floor(mpMax/mpPP)+2,2);
var sprW = sprite_get_width(spr_mp_base_bar);
var sprH = sprite_get_height(spr_mp_base_bar);
var n = size/sprW;
for(var i = 0; i < n; i++)
{
var xPart = min(n-i,1);
draw_sprite_part(spr_mp_base_bar,min(i,1),0,0,floor(sprW*xPart),sprH,mpXI+i*sprW,mpYI);
}
//bar2/3
var sprW = sprite_get_width(spr_mp_base_bar2);
var sprH = sprite_get_height(spr_mp_base_bar2);
var n = round((size)/sprW);
for(var i = 0; i < n; i++)
{
if (i != 0) draw_sprite(spr_mp_base_bar2,0,mpXI+i*sprW+6,mpYI+9);
else draw_sprite_part(spr_mp_base_bar2,0,12,0,12,5,mpXI+i*sprW+6-2,mpYI+9);
}
//end cap
var cX = mpXI+size;
var cY = mpYI+5;
draw_sprite_ext(spr_mp_base_cap,0,cX,cY,1,1,-90,c_white,1.0);
#endregion
#endregion
#region fill
#region draw bar mp
//bar
var size = floor(mp/mpPP);
var sprW = sprite_get_width(spr_mp_fill_bar);
var sprH = sprite_get_height(spr_mp_fill_bar);
var n = size/sprW;
for(var i = 0; i < n; i++)
{
var xPart = min(n-i,1);
draw_sprite_part_ext(spr_mp_fill_bar,min(i,1),0,0,round(sprW*xPart),sprH,mpXI+1+i*sprW,mpYI+2,1,1,mpColour,1.0);
}
#endregion
#endregion
surface_reset_target();
}
mpPrev = mp;
mpMaxPrev = mpMax;
surface_set_target(mpSurfA);
draw_clear_alpha(c_white,0);
#region Animation
//preliminaries
mpAnimTimer++;
var subID = floor(mpAnimTimer/mpAnimStep);
//bar
var size = (mp/mpPP);
var sprW = sprite_get_width(spr_mp_anim_bar1);
var sprH = sprite_get_height(spr_mp_anim_bar1);
var n = size/sprW;
for(var i = 0; i < n; i++)
{
var xPart = min(n-i,1);
var spr = spr_mp_anim_bar2;
if (i == 0) spr = spr_mp_anim_bar1;
draw_sprite_part(spr,subID,0,0,sprW*xPart,sprH,mpXI+1+i*sprW,mpYI+2);
}
#endregion
surface_reset_target();
draw_set_colour(c_white);
#endregion
#region Hp
var v = hpPP*pi*hpR1*(4/3);
#region Back
var hpMax = PlayerStats.hpMax;
//show_debug_message(hpMax)
if hpMax != hpMaxPrev
{
surface_set_target(hpSurfB);
draw_clear_alpha(c_white,0);
#region preliminaries
var barHp = max(hpMax-v,0);
var curveHp = clamp(hpMax,0,v);
var hpd = 270*(curveHp/v);
draw_set_colour(hpBackColour);
#endregion
#region draw circle-triangle
draw_sprite(spr_hp_base_curve_0,0,hpXI+1,hpYI+1);
draw_sprite(spr_hp_base_curve_1,0,hpXI,hpYI+1);
draw_sprite(spr_hp_base_curve_2,0,hpXI,hpYI);
#endregion
#region draw circle-triangle cutout
d = 90;
gpu_set_blendmode(bm_subtract)
for(var i=0; i<hpA; i++;)
{
var p1x= hpXI;
var p1y= hpYI;
var p2x= hpXI + dcos(d)*(hpRMax);
var p2y= hpYI - dsin(d)*(hpRMax);
d += (270-hpd)/hpA;
var p3x= hpXI + dcos(d)*(hpRMax);
var p3y= hpYI - dsin(d)*(hpRMax);
draw_triangle(p1x,p1y,p2x,p2y,p3x,p3y,0);
}
gpu_set_blendmode(bm_normal)
#endregion
#region draw bar hp + caps
//bar
var size = floor(barHp/hpPP);
var sprW = sprite_get_width(spr_hp_base_bar);
var sprH = sprite_get_height(spr_hp_base_bar);
var n = size/sprW;
for(var i = 0; i < n; i++)
{
var xPart = min(n-i,1);
draw_sprite_part(spr_hp_base_bar,0,0,0,floor(sprW*xPart),sprH,hpXI+1+i*sprW,hpYI-35);
}
//start cap
var dst = 25;
draw_sprite_ext(spr_hp_base_cap,0,hpXI+1+dst,hpYI,1,1,0,c_white,1.0);
//end cap
if hpMax < v
{
var cX = hpXI+1+dcos(hpd+1.8)*dst;
var cY = hpYI+1+dsin(hpd+1.8)*dst;
draw_sprite_ext(spr_hp_base_cap,1,cX,cY,1,1,180-hpd,c_white,1.0);
}
else
{
var cX = hpXI+2+size;
var cY = hpYI+1-dst;
draw_sprite_ext(spr_hp_base_cap,2,cX,cY,1,1,-90,c_white,1.0);
}
//little bit
var xPart = min(n,1);
draw_sprite_part(spr_hp_littleBit,0,0,0,sprW*xPart,sprH,hpXI+1,hpYI-19);
#endregion
surface_reset_target();
}
hpMaxPrev = hpMax;
#endregion
#region Fill
var hp = PlayerStats.hp;
var hpDam = min(hpDamageDisplay,hpMax);
#region preliminaries
if PlayerStats.hpMax < hpDamageDisplay hpDamageDisplay = PlayerStats.hpMax;
if hp > hpDamageDisplay
{
hpDamageTarget = hp;
hpDamageDisplay = hp;
}
else if hp == hpDamageTarget
{
hpDamageDisplay += (hp-hpDamageDisplay)/8;
}
else
{
hpDamageDelayTimer++;
if hpDamageDelayTimer >= round(hpDamageDelay*room_speed)
{
hpDamageTarget = hp;
hpDamageDelayTimer = 0;
}
}
#endregion
if hpDam != hpDamageDisplayPrev || hp != hpPrev
{
#region draw damage portion
#region preliminaries
var barHp= max(hpDam-v,0);
var curveHp= clamp(hpDam,0,v);
var hpd = 270*(curveHp/v);
draw_set_colour(hpBackColour);
#endregion
surface_set_target(hpSurfC);
draw_clear_alpha(c_white,0);
#region draw circle-triangle
draw_sprite_ext(spr_hp_fill_curve_0,0,hpXI+1,hpYI+1,1,1,0,hpDamageColour,1.0);
draw_sprite_ext(spr_hp_fill_curve_1,0,hpXI,hpYI+1,1,1,0,hpDamageColour,1.0);
draw_sprite_ext(spr_hp_fill_curve_2,0,hpXI,hpYI,1,1,0,hpDamageColour,1.0);
#endregion
#region draw circle-triangle cutout
d = 90;
gpu_set_blendmode(bm_subtract)
for(var i=0; i<hpA; i++;)
{
var p1x = hpXI;
var p1y = hpYI;
var p2x = hpXI + dcos(d)*(hpRMax);
var p2y = hpYI - dsin(d)*(hpRMax);
d += (270-hpd)/hpA;
var p3x = hpXI + dcos(d)*(hpRMax);
var p3y = hpYI - dsin(d)*(hpRMax);
draw_triangle(p1x,p1y,p2x,p2y,p3x,p3y,0);
}
gpu_set_blendmode(bm_normal)
#endregion
#region draw bar hp
//bar
var size = floor(barHp/hpPP);
var sprW = sprite_get_width(spr_hp_fill_bar);
var sprH = sprite_get_height(spr_hp_fill_bar);
var n = size/sprW;
for(var i = 0; i < n; i++)
{
var xPart = min(n-i,1);
draw_sprite_part_ext(spr_hp_fill_bar,0,0,0,round(sprW*xPart),sprH,hpXI+1+i*sprW,hpYI-28,1,1,hpDamageColour,1.0);
}
#endregion
surface_reset_target();
#endregion
#region draw main hp portion
#region preliminaries
var barHp= max(hp-v,0);
var curveHp= clamp(hp,0,v);
var hpd = 270*(curveHp/v);
draw_set_colour(hpBackColour);
#endregion
surface_set_target(hpSurf);
draw_clear_alpha(c_white,0);
#region draw circle-triangle
draw_sprite_ext(spr_hp_fill_curve_0,0,hpXI+1,hpYI+1,1,1,0,hpColour,1.0);
draw_sprite_ext(spr_hp_fill_curve_1,0,hpXI,hpYI+1,1,1,0,hpColour,1.0);
draw_sprite_ext(spr_hp_fill_curve_2,0,hpXI,hpYI,1,1,0,hpColour,1.0);
#endregion
#region draw circle-triangle cutout
d = 90;
gpu_set_blendmode(bm_subtract)
for(var i=0; i<hpA; i++;)
{
var p1x = hpXI;
var p1y = hpYI;
var p2x = hpXI + dcos(d)*(hpRMax);
var p2y = hpYI - dsin(d)*(hpRMax);
d += (270-hpd)/hpA;
var p3x = hpXI + dcos(d)*(hpRMax);
var p3y = hpYI - dsin(d)*(hpRMax);
draw_triangle(p1x,p1y,p2x,p2y,p3x,p3y,0);
}
gpu_set_blendmode(bm_normal)
#endregion
#region draw bar hp
//bar
var size = floor(barHp/hpPP);
var sprW = sprite_get_width(spr_hp_fill_bar);
var sprH = sprite_get_height(spr_hp_fill_bar);
var n = size/sprW;
for(var i = 0; i < n; i++)
{
var xPart = min(n-i,1);
draw_sprite_part_ext(spr_hp_fill_bar,0,0,0,round(sprW*xPart),sprH,hpXI+1+i*sprW,hpYI-28,1,1,hpColour,1.0);
}
#endregion
surface_reset_target();
#endregion
}
hpDamageDisplayPrev = hpDam;
hpPrev = hp;
#region animation
#region preliminaries
hpAnimTimer++;
var animHP = max(hpDamageDisplay,hp);
var barHp= max(animHP-v,0);
var curveHp= clamp(animHP,0,v);
var hpd = 270*(curveHp/v);
var subID = floor(hpAnimTimer/hpAnimStep);
draw_set_colour(hpBackColour);
#endregion
surface_set_target(hpSurfA);
draw_clear_alpha(c_black,0.0);
#region draw circle-triangle
draw_sprite(spr_hp_anim_curve_0,subID,hpXI+1,hpYI+1);
draw_sprite(spr_hp_anim_curve_1,subID,hpXI,hpYI+1);
draw_sprite(spr_hp_anim_curve_2,subID,hpXI,hpYI);
#endregion
#region draw circle-triangle cutout
d = 90;
gpu_set_blendmode(bm_subtract);
draw_set_colour(c_white);
for(var i=0; i<hpA; i++;)
{
var p1x = hpXI;
var p1y = hpYI;
var p2x = hpXI + dcos(d)*(hpRMax);
var p2y = hpYI - dsin(d)*(hpRMax);
d += (270-hpd)/hpA;
var p3x = hpXI + dcos(d)*(hpRMax);
var p3y = hpYI - dsin(d)*(hpRMax);
draw_triangle(p1x,p1y,p2x,p2y,p3x,p3y,0);
}
gpu_set_blendmode(bm_normal)
#endregion
#region draw bar hp
//bar
var size = floor(barHp/hpPP-1);
var sprW = sprite_get_width(spr_hp_anim_bar);
var sprH = sprite_get_height(spr_hp_anim_bar);
var n = size/sprW;
for(var i = 0; i < n; i++)
{
var xPart = min(n-i,1);
draw_sprite_part(spr_hp_anim_bar,subID,0,0,ceil(sprW*xPart),sprH,hpXI+1+i*sprW,hpYI-28);
}
#endregion
surface_reset_target();
#endregion
#endregion
#endregion
#region final draw
surface_set_target(topLeftSurf);
draw_clear_alpha(c_black,0);
draw_surface(hpSurfD,0,0); //Back Static
//if (!keyboard_check(vk_numpad0)) {
draw_surface(hpSurfB,0,0); //Outline
//}
//if (!keyboard_check(vk_numpad4)) {
draw_surface(hpSurfC,0,0); //Red bar
//}
//if (!keyboard_check(vk_numpad2)) {
draw_surface(hpSurf,0,0); //Green bar
//}
gpu_set_blendmode(bm_add)
//if (!keyboard_check(vk_numpad3)) {
draw_surface_ext(hpSurfA,0,0,1,1,0,c_white,0.3);
//}
gpu_set_blendmode(bm_normal);
draw_surface(mpSurf,0,0);
gpu_set_blendmode(bm_add)
draw_surface_ext(mpSurfA,0,0,1,1,0,c_white,0.3);
gpu_set_blendmode(bm_normal);
surface_reset_target();
#endregion