Add project code

This commit is contained in:
Andrew Trieu
2025-04-20 15:57:23 +03:00
committed by Andrew Trieu
commit 3fbd0e4977
612 changed files with 11196 additions and 0 deletions

36
objects/o_all_hurt/o_all_hurt.yy generated Normal file
View File

@@ -0,0 +1,36 @@
{
"$GMObject":"",
"%Name":"o_all_hurt",
"eventList":[],
"managed":true,
"name":"o_all_hurt",
"overriddenProperties":[],
"parent":{
"name":"Generic",
"path":"folders/Generic.yy",
},
"parentObjectId":{
"name":"o_parent_hurt",
"path":"objects/o_parent_hurt/o_parent_hurt.yy",
},
"persistent":false,
"physicsAngularDamping":0.1,
"physicsDensity":0.5,
"physicsFriction":0.2,
"physicsGroup":1,
"physicsKinematic":false,
"physicsLinearDamping":0.1,
"physicsObject":false,
"physicsRestitution":0.1,
"physicsSensor":false,
"physicsShape":1,
"physicsShapePoints":[],
"physicsStartAwake":true,
"properties":[],
"resourceType":"GMObject",
"resourceVersion":"2.0",
"solid":false,
"spriteId":null,
"spriteMaskId":null,
"visible":true,
}

View File

@@ -0,0 +1,28 @@
// Inherit the parent event
event_inherited();
move_dir = 0;
move_spd = 0;
chase_spd = 0.5
x_speed = 0;
y_speed = 0;
face = 1;
sprites[0] = s_archer_idle;
sprites[1] = s_archer_walk;
sprites[2] = s_archer_attack;
sprites[3] = s_archer_hurt;
sprites[4] = s_archer_death;
// State machine
state = 0;
shoot_timer = 0;
charge_time = 30;
recover_time = 60;
cooldown_time = 5*60;
bullet_inst = noone;
has_started_shooting = false;
// Spawn
fade_spd = 1/30;
spawn_spd = .25;

View File

@@ -0,0 +1,7 @@
if instance_exists(bullet_inst) && bullet_inst.state == 0 {
bullet_inst.is_exploding = true;
bullet_inst.sprite_index = s_arrow_destroy;
bullet_inst.image_index = 0; // Reset animation
bullet_inst.image_speed = 1; // Play explosion animation
bullet_inst.bullet_spd = 0;
}

View File

@@ -0,0 +1,7 @@
draw_sprite_ext(sprite_index, image_index, x, y, face, image_yscale, image_angle, image_blend, image_alpha);
var _healh_pct = hp / max_hp;
var _hp_img = _healh_pct * (sprite_get_number(s_enemy_health) - 1);
if instance_exists(o_player) {
draw_sprite_ext(s_enemy_health, _hp_img, x - 8, y - sprite_height / 2 - 5, image_xscale, image_yscale, image_angle, image_blend, image_alpha);
}

142
objects/o_archer/Step_0.gml Normal file
View File

@@ -0,0 +1,142 @@
// Pause
if pause_movement() { exit; }
var _wall_collisions = true;
var _get_damaged = true;
// State machine
switch(state) {
case -1:
// Spawn from spawner
if image_alpha < 1 {
move_spd = 0;
image_alpha += fade_spd;
}
_wall_collisions = false;
_get_damaged = false;
if image_alpha >= 1 {
move_spd = spawn_spd;
if instance_exists(o_player) {
move_dir = point_direction(x, y, o_player.x, o_player.y);
}
}
if !place_meeting(x, y, o_wall) {
state = 0;
}
break;
case 0:
if instance_exists(o_player) {
move_dir = point_direction(x, y, o_player.x, o_player.y);
}
move_spd = chase_spd;
var _cam_left = camera_get_view_x(view_camera[0]);
var _cam_right = _cam_left + camera_get_view_width(view_camera[0]);
var _cam_top = camera_get_view_y(view_camera[0]);
var _cam_bottom = _cam_top + camera_get_view_height(view_camera[0]);
if bbox_right > _cam_left && bbox_left < _cam_right && bbox_bottom > _cam_top && bbox_top < _cam_bottom {
shoot_timer++
}
if shoot_timer > cooldown_time {
state = 1;
shoot_timer = 0;
}
break;
case 1:
if instance_exists(o_player) {
move_dir = point_direction(x, y, o_player.x, o_player.y);
}
move_spd = 0;
shoot_timer++;
if shoot_timer == 1 && hp > 0 {
// Create arrow
bullet_inst = instance_create_depth(x, y, depth, o_arrow);
}
if shoot_timer == charge_time && instance_exists(bullet_inst) && hp > 0 {
bullet_inst.image_angle = move_dir;
bullet_inst.state = 1;
}
if shoot_timer > charge_time + recover_time {
state = 0;
shoot_timer = 0;
}
break;
}
// Chasing
#region
x_speed = lengthdir_x(move_spd, move_dir);
y_speed = lengthdir_y(move_spd, move_dir);
// Wall collisons
if _wall_collisions == true {
if place_meeting(x + x_speed, y, o_wall) {
x_speed = 0;
}
if place_meeting(x, y + y_speed, o_wall) {
y_speed = 0;
}
}
if place_meeting(x + x_speed, y, o_parent_enemy) {
x_speed = 0;
}
if place_meeting(x, y + y_speed, o_parent_enemy) {
y_speed = 0;
}
if (!is_stopping) {
x += x_speed;
y += y_speed;
}
depth = -y;
#endregion
// Sprite controls
#region
// Check if the enemy is moving
var is_moving = (x_speed != 0 || y_speed != 0);
// Update animation based on movement
if state == 1 {
sprite_index = sprites[2];
} else if is_moving {
sprite_index = sprites[1]; // Walking animation
} else {
sprite_index = sprites[0]; // Idle animation
}
// Determine facing direction
if x_speed != 0 {
face = sign(x_speed);
} else {
if instance_exists(o_player) {
var _player_offset_x = o_player.x - x;
face = (_player_offset_x > 0) ? 1 : -1;
}
}
#endregion
is_dying(sprites[4]);
// Inherit the parent event
if _get_damaged {
event_inherited();
}

44
objects/o_archer/o_archer.yy generated Normal file
View File

@@ -0,0 +1,44 @@
{
"$GMObject":"",
"%Name":"o_archer",
"eventList":[
{"$GMEvent":"v1","%Name":"","collisionObjectId":null,"eventNum":0,"eventType":0,"isDnD":false,"name":"","resourceType":"GMEvent","resourceVersion":"2.0",},
{"$GMEvent":"v1","%Name":"","collisionObjectId":null,"eventNum":0,"eventType":3,"isDnD":false,"name":"","resourceType":"GMEvent","resourceVersion":"2.0",},
{"$GMEvent":"v1","%Name":"","collisionObjectId":null,"eventNum":0,"eventType":8,"isDnD":false,"name":"","resourceType":"GMEvent","resourceVersion":"2.0",},
{"$GMEvent":"v1","%Name":"","collisionObjectId":null,"eventNum":0,"eventType":1,"isDnD":false,"name":"","resourceType":"GMEvent","resourceVersion":"2.0",},
],
"managed":true,
"name":"o_archer",
"overriddenProperties":[],
"parent":{
"name":"Enemies",
"path":"folders/Enemies.yy",
},
"parentObjectId":{
"name":"o_parent_enemy",
"path":"objects/o_parent_enemy/o_parent_enemy.yy",
},
"persistent":false,
"physicsAngularDamping":0.1,
"physicsDensity":0.5,
"physicsFriction":0.2,
"physicsGroup":1,
"physicsKinematic":false,
"physicsLinearDamping":0.1,
"physicsObject":false,
"physicsRestitution":0.1,
"physicsSensor":false,
"physicsShape":1,
"physicsShapePoints":[],
"physicsStartAwake":true,
"properties":[],
"resourceType":"GMObject",
"resourceVersion":"2.0",
"solid":false,
"spriteId":{
"name":"s_archer_idle",
"path":"sprites/s_archer_idle/s_archer_idle.yy",
},
"spriteMaskId":null,
"visible":true,
}

View File

@@ -0,0 +1,12 @@
event_inherited();
bullet_dir = 0;
bullet_spd = 4;
start_x = x;
start_y = y;
is_exploding = false;
max_distance = 500;
s_destroy = s_arrow_destroy;
pass_through_enemy = false;
state = 0;

View File

@@ -0,0 +1,3 @@
if sprite_index == s_destroy {
instance_destroy();
}

View File

@@ -0,0 +1,44 @@
if pause_movement() { exit; }
switch(state) {
case 0:
if instance_exists(o_player) {
bullet_dir = point_direction(x, y, o_player.x, o_player.y);
}
depth = -y - 50;
break;
case 1:
if (!is_exploding) {
// Calculate movement
var bullet_x_spd = lengthdir_x(bullet_spd, bullet_dir);
var bullet_y_spd = lengthdir_y(bullet_spd, bullet_dir);
// Move the fireball
x += bullet_x_spd;
y += bullet_y_spd;
depth = -y;
if hit_confirmed && !pass_through_enemy {
destroy_projectile()
}
// Check for collision with solid wall
if place_meeting(x, y, o_solid_wall) {
destroy_projectile();
}
// Check if fireball has traveled too far
if point_distance(start_x, start_y, x, y) > max_distance {
destroy_projectile();
}
if bbox_right < 0 || bbox_left > room_width || bbox_bottom < 0 || bbox_top > room_height {
destroy_projectile();
}
}
break;
}

43
objects/o_arrow/o_arrow.yy generated Normal file
View File

@@ -0,0 +1,43 @@
{
"$GMObject":"",
"%Name":"o_arrow",
"eventList":[
{"$GMEvent":"v1","%Name":"","collisionObjectId":null,"eventNum":0,"eventType":0,"isDnD":false,"name":"","resourceType":"GMEvent","resourceVersion":"2.0",},
{"$GMEvent":"v1","%Name":"","collisionObjectId":null,"eventNum":0,"eventType":3,"isDnD":false,"name":"","resourceType":"GMEvent","resourceVersion":"2.0",},
{"$GMEvent":"v1","%Name":"","collisionObjectId":null,"eventNum":7,"eventType":7,"isDnD":false,"name":"","resourceType":"GMEvent","resourceVersion":"2.0",},
],
"managed":true,
"name":"o_arrow",
"overriddenProperties":[],
"parent":{
"name":"Enemies",
"path":"folders/Enemies.yy",
},
"parentObjectId":{
"name":"o_player_hurt",
"path":"objects/o_player_hurt/o_player_hurt.yy",
},
"persistent":false,
"physicsAngularDamping":0.1,
"physicsDensity":0.5,
"physicsFriction":0.2,
"physicsGroup":1,
"physicsKinematic":false,
"physicsLinearDamping":0.1,
"physicsObject":false,
"physicsRestitution":0.1,
"physicsSensor":false,
"physicsShape":1,
"physicsShapePoints":[],
"physicsStartAwake":true,
"properties":[],
"resourceType":"GMObject",
"resourceVersion":"2.0",
"solid":false,
"spriteId":{
"name":"s_arrow",
"path":"sprites/s_arrow/s_arrow.yy",
},
"spriteMaskId":null,
"visible":true,
}

View File

@@ -0,0 +1 @@
get_damaged_destroy();

View File

@@ -0,0 +1,4 @@
get_damaged_create(30);
depth = -700;

View File

@@ -0,0 +1,7 @@
get_damaged(o_parent_hurt, false, false);
if hp <= 0 {
instance_destroy();
instance_create_depth(x, y, -100, o_blocker_stump);
}

43
objects/o_blocker/o_blocker.yy generated Normal file
View File

@@ -0,0 +1,43 @@
{
"$GMObject":"",
"%Name":"o_blocker",
"eventList":[
{"$GMEvent":"v1","%Name":"","collisionObjectId":null,"eventNum":0,"eventType":0,"isDnD":false,"name":"","resourceType":"GMEvent","resourceVersion":"2.0",},
{"$GMEvent":"v1","%Name":"","collisionObjectId":null,"eventNum":0,"eventType":3,"isDnD":false,"name":"","resourceType":"GMEvent","resourceVersion":"2.0",},
{"$GMEvent":"v1","%Name":"","collisionObjectId":null,"eventNum":0,"eventType":12,"isDnD":false,"name":"","resourceType":"GMEvent","resourceVersion":"2.0",},
],
"managed":true,
"name":"o_blocker",
"overriddenProperties":[],
"parent":{
"name":"Rooms",
"path":"folders/Rooms.yy",
},
"parentObjectId":{
"name":"o_solid_wall",
"path":"objects/o_solid_wall/o_solid_wall.yy",
},
"persistent":false,
"physicsAngularDamping":0.1,
"physicsDensity":0.5,
"physicsFriction":0.2,
"physicsGroup":1,
"physicsKinematic":false,
"physicsLinearDamping":0.1,
"physicsObject":false,
"physicsRestitution":0.1,
"physicsSensor":false,
"physicsShape":1,
"physicsShapePoints":[],
"physicsStartAwake":true,
"properties":[],
"resourceType":"GMObject",
"resourceVersion":"2.0",
"solid":false,
"spriteId":{
"name":"s_blocker",
"path":"sprites/s_blocker/s_blocker.yy",
},
"spriteMaskId":null,
"visible":true,
}

View File

@@ -0,0 +1,36 @@
{
"$GMObject":"",
"%Name":"o_blocker_destroyed",
"eventList":[],
"managed":true,
"name":"o_blocker_destroyed",
"overriddenProperties":[],
"parent":{
"name":"Rooms",
"path":"folders/Rooms.yy",
},
"parentObjectId":null,
"persistent":false,
"physicsAngularDamping":0.1,
"physicsDensity":0.5,
"physicsFriction":0.2,
"physicsGroup":1,
"physicsKinematic":false,
"physicsLinearDamping":0.1,
"physicsObject":false,
"physicsRestitution":0.1,
"physicsSensor":false,
"physicsShape":1,
"physicsShapePoints":[],
"physicsStartAwake":true,
"properties":[],
"resourceType":"GMObject",
"resourceVersion":"2.0",
"solid":false,
"spriteId":{
"name":"s_blocker_destroyed",
"path":"sprites/s_blocker_destroyed/s_blocker_destroyed.yy",
},
"spriteMaskId":null,
"visible":true,
}

View File

@@ -0,0 +1 @@
get_damaged_destroy();

View File

@@ -0,0 +1 @@
get_damaged_create(100);

View File

@@ -0,0 +1,7 @@
get_damaged(o_parent_hurt, false, false);
if hp <= 0 {
instance_destroy();
instance_create_depth(x, y, -100, o_blocker_destroyed);
}

View File

@@ -0,0 +1,43 @@
{
"$GMObject":"",
"%Name":"o_blocker_stump",
"eventList":[
{"$GMEvent":"v1","%Name":"","collisionObjectId":null,"eventNum":0,"eventType":0,"isDnD":false,"name":"","resourceType":"GMEvent","resourceVersion":"2.0",},
{"$GMEvent":"v1","%Name":"","collisionObjectId":null,"eventNum":0,"eventType":12,"isDnD":false,"name":"","resourceType":"GMEvent","resourceVersion":"2.0",},
{"$GMEvent":"v1","%Name":"","collisionObjectId":null,"eventNum":0,"eventType":3,"isDnD":false,"name":"","resourceType":"GMEvent","resourceVersion":"2.0",},
],
"managed":true,
"name":"o_blocker_stump",
"overriddenProperties":[],
"parent":{
"name":"Rooms",
"path":"folders/Rooms.yy",
},
"parentObjectId":{
"name":"o_wall",
"path":"objects/o_wall/o_wall.yy",
},
"persistent":false,
"physicsAngularDamping":0.1,
"physicsDensity":0.5,
"physicsFriction":0.2,
"physicsGroup":1,
"physicsKinematic":false,
"physicsLinearDamping":0.1,
"physicsObject":false,
"physicsRestitution":0.1,
"physicsSensor":false,
"physicsShape":1,
"physicsShapePoints":[],
"physicsStartAwake":true,
"properties":[],
"resourceType":"GMObject",
"resourceVersion":"2.0",
"solid":false,
"spriteId":{
"name":"s_blocker_stump",
"path":"sprites/s_blocker_stump/s_blocker_stump.yy",
},
"spriteMaskId":null,
"visible":true,
}

View File

@@ -0,0 +1,13 @@
x_shake = 0;
x_shake_dir = 0;
x_shake_dir_spd = 45;
x_shake_amt = 0;
x_shake_amt_spd = 1/4;
y_shake = 0;
y_shake = 0;
y_shake_dir = 0;
y_shake_dir_spd = 45;
y_shake_amt = 0;
y_shake_amt_spd = 1/4;
audio_play_sound(background_music, 0, true);

View File

@@ -0,0 +1,35 @@
var _cam_width = camera_get_view_width(view_camera[0]);
var _cam_height = camera_get_view_height(view_camera[0]);
if instance_exists(o_player) {
x = o_player.x - _cam_width / 2;
y = o_player.center_y - _cam_height / 2;
}
#region
if x_shake_amt > 0 {
x_shake_dir += x_shake_dir_spd;
x_shake_amt -= x_shake_amt_spd;
} else {
x_shake_amt = 0;
x_shake_dir = 0;
}
x_shake = dsin(x_shake_dir) * x_shake_amt;
if y_shake_amt > 0 {
y_shake_dir += y_shake_dir_spd;
y_shake_amt -= y_shake_amt_spd;
} else {
y_shake_amt = 0;
y_shake_dir = 0;
}
y_shake = dsin(y_shake_dir) * y_shake_amt;
#endregion
x += x_shake;
y += y_shake;
x = clamp(x, 0, room_width - _cam_width);
y = clamp(y, 0, room_height - _cam_height);
camera_set_view_pos(view_camera[0], x, y);

36
objects/o_camera/o_camera.yy generated Normal file
View File

@@ -0,0 +1,36 @@
{
"$GMObject":"",
"%Name":"o_camera",
"eventList":[
{"$GMEvent":"v1","%Name":"","collisionObjectId":null,"eventNum":2,"eventType":3,"isDnD":false,"name":"","resourceType":"GMEvent","resourceVersion":"2.0",},
{"$GMEvent":"v1","%Name":"","collisionObjectId":null,"eventNum":0,"eventType":0,"isDnD":false,"name":"","resourceType":"GMEvent","resourceVersion":"2.0",},
],
"managed":true,
"name":"o_camera",
"overriddenProperties":[],
"parent":{
"name":"Controllers",
"path":"folders/Controllers.yy",
},
"parentObjectId":null,
"persistent":true,
"physicsAngularDamping":0.1,
"physicsDensity":0.5,
"physicsFriction":0.2,
"physicsGroup":1,
"physicsKinematic":false,
"physicsLinearDamping":0.1,
"physicsObject":false,
"physicsRestitution":0.1,
"physicsSensor":false,
"physicsShape":1,
"physicsShapePoints":[],
"physicsStartAwake":true,
"properties":[],
"resourceType":"GMObject",
"resourceVersion":"2.0",
"solid":false,
"spriteId":null,
"spriteMaskId":null,
"visible":true,
}

View File

@@ -0,0 +1,7 @@
// Inherit the parent event
event_inherited();
damage = 5;
bullet_spd = 4;
max_distance = 150;
s_destroy = s_disc_destroy;

41
objects/o_disc/o_disc.yy generated Normal file
View File

@@ -0,0 +1,41 @@
{
"$GMObject":"",
"%Name":"o_disc",
"eventList":[
{"$GMEvent":"v1","%Name":"","collisionObjectId":null,"eventNum":0,"eventType":0,"isDnD":false,"name":"","resourceType":"GMEvent","resourceVersion":"2.0",},
],
"managed":true,
"name":"o_disc",
"overriddenProperties":[],
"parent":{
"name":"Spells",
"path":"folders/Spells.yy",
},
"parentObjectId":{
"name":"o_fireball",
"path":"objects/o_fireball/o_fireball.yy",
},
"persistent":false,
"physicsAngularDamping":0.1,
"physicsDensity":0.5,
"physicsFriction":0.2,
"physicsGroup":1,
"physicsKinematic":false,
"physicsLinearDamping":0.1,
"physicsObject":false,
"physicsRestitution":0.1,
"physicsSensor":false,
"physicsShape":1,
"physicsShapePoints":[],
"physicsStartAwake":true,
"properties":[],
"resourceType":"GMObject",
"resourceVersion":"2.0",
"solid":false,
"spriteId":{
"name":"s_disc",
"path":"sprites/s_disc/s_disc.yy",
},
"spriteMaskId":null,
"visible":true,
}

View File

@@ -0,0 +1,5 @@
alpha = 0;
alpha_spd = 1/75;
alpha_mul = 0.8;
depth = -10000;

View File

@@ -0,0 +1,17 @@
var _cam_x = camera_get_view_x(view_camera[0]);
var _cam_w = camera_get_view_width(view_camera[0]);
var _cam_y = camera_get_view_y(view_camera[0]);
var _cam_h = camera_get_view_height(view_camera[0]);
draw_set_alpha(alpha * alpha_mul);
draw_rectangle_color(_cam_x, _cam_y, _cam_w + _cam_x, _cam_h + _cam_y, c_yellow, c_yellow, c_black, c_black, false);
draw_set_alpha(alpha);
draw_set_halign(fa_center);
draw_set_valign(fa_middle);
draw_set_font(fnt_Tiny5);
draw_text_transformed(_cam_x + (_cam_w / 2), _cam_y + (_cam_h / 2) - 20, "YOU WON!", 4, 4, 0);
draw_text_transformed(_cam_x + (_cam_w / 2), _cam_y + (_cam_h / 2) + 50, "-< Press any key to continue >-", 1, 1, 0);
draw_set_halign(fa_left);
draw_set_valign(fa_top);
draw_set_alpha(1);

View File

@@ -0,0 +1,9 @@
alpha += alpha_spd;
alpha = clamp(alpha, 0, 1);
if keyboard_check_pressed(vk_anykey) && alpha >= 1 {
global.enemyRoomMax += 100;
global.enemyActiveMax += 20;
global.first_start = false;
room_restart();
}

40
objects/o_end_screen/o_end_screen.yy generated Normal file
View File

@@ -0,0 +1,40 @@
{
"$GMObject":"",
"%Name":"o_end_screen",
"eventList":[
{"$GMEvent":"v1","%Name":"","collisionObjectId":null,"eventNum":0,"eventType":0,"isDnD":false,"name":"","resourceType":"GMEvent","resourceVersion":"2.0",},
{"$GMEvent":"v1","%Name":"","collisionObjectId":null,"eventNum":0,"eventType":3,"isDnD":false,"name":"","resourceType":"GMEvent","resourceVersion":"2.0",},
{"$GMEvent":"v1","%Name":"","collisionObjectId":null,"eventNum":0,"eventType":8,"isDnD":false,"name":"","resourceType":"GMEvent","resourceVersion":"2.0",},
],
"managed":true,
"name":"o_end_screen",
"overriddenProperties":[],
"parent":{
"name":"Controllers",
"path":"folders/Controllers.yy",
},
"parentObjectId":{
"name":"o_screen_pause",
"path":"objects/o_screen_pause/o_screen_pause.yy",
},
"persistent":false,
"physicsAngularDamping":0.1,
"physicsDensity":0.5,
"physicsFriction":0.2,
"physicsGroup":1,
"physicsKinematic":false,
"physicsLinearDamping":0.1,
"physicsObject":false,
"physicsRestitution":0.1,
"physicsSensor":false,
"physicsShape":1,
"physicsShapePoints":[],
"physicsStartAwake":true,
"properties":[],
"resourceType":"GMObject",
"resourceVersion":"2.0",
"solid":false,
"spriteId":null,
"spriteMaskId":null,
"visible":true,
}

36
objects/o_enemy_hurt/o_enemy_hurt.yy generated Normal file
View File

@@ -0,0 +1,36 @@
{
"$GMObject":"",
"%Name":"o_enemy_hurt",
"eventList":[],
"managed":true,
"name":"o_enemy_hurt",
"overriddenProperties":[],
"parent":{
"name":"Enemies",
"path":"folders/Enemies.yy",
},
"parentObjectId":{
"name":"o_parent_hurt",
"path":"objects/o_parent_hurt/o_parent_hurt.yy",
},
"persistent":false,
"physicsAngularDamping":0.1,
"physicsDensity":0.5,
"physicsFriction":0.2,
"physicsGroup":1,
"physicsKinematic":false,
"physicsLinearDamping":0.1,
"physicsObject":false,
"physicsRestitution":0.1,
"physicsSensor":false,
"physicsShape":1,
"physicsShapePoints":[],
"physicsStartAwake":true,
"properties":[],
"resourceType":"GMObject",
"resourceVersion":"2.0",
"solid":false,
"spriteId":null,
"spriteMaskId":null,
"visible":true,
}

View File

@@ -0,0 +1,4 @@
// Damage
damage = 100;
created_damage_objects = false;
hurt_instance = noone;

View File

@@ -0,0 +1 @@
instance_destroy();

View File

@@ -0,0 +1,21 @@
if pause_movement() { exit; }
if !created_damage_objects {
hurt_instance = instance_create_depth(x, y, 0, o_all_hurt);
with(hurt_instance) {
damage = other.damage;
mask_index = other.sprite_index;
image_xscale = other.image_xscale;
image_yscale = other.image_yscale;
}
created_damage_objects = true;
}
// When done, stop damage
if floor(image_index) >= 3 {
if instance_exists(hurt_instance) {
instance_destroy(hurt_instance);
}
}

40
objects/o_explosion/o_explosion.yy generated Normal file
View File

@@ -0,0 +1,40 @@
{
"$GMObject":"",
"%Name":"o_explosion",
"eventList":[
{"$GMEvent":"v1","%Name":"","collisionObjectId":null,"eventNum":7,"eventType":7,"isDnD":false,"name":"","resourceType":"GMEvent","resourceVersion":"2.0",},
{"$GMEvent":"v1","%Name":"","collisionObjectId":null,"eventNum":0,"eventType":0,"isDnD":false,"name":"","resourceType":"GMEvent","resourceVersion":"2.0",},
{"$GMEvent":"v1","%Name":"","collisionObjectId":null,"eventNum":0,"eventType":3,"isDnD":false,"name":"","resourceType":"GMEvent","resourceVersion":"2.0",},
],
"managed":true,
"name":"o_explosion",
"overriddenProperties":[],
"parent":{
"name":"Rooms",
"path":"folders/Rooms.yy",
},
"parentObjectId":null,
"persistent":false,
"physicsAngularDamping":0.1,
"physicsDensity":0.5,
"physicsFriction":0.2,
"physicsGroup":1,
"physicsKinematic":false,
"physicsLinearDamping":0.1,
"physicsObject":false,
"physicsRestitution":0.1,
"physicsSensor":false,
"physicsShape":1,
"physicsShapePoints":[],
"physicsStartAwake":true,
"properties":[],
"resourceType":"GMObject",
"resourceVersion":"2.0",
"solid":false,
"spriteId":{
"name":"s_explosion",
"path":"sprites/s_explosion/s_explosion.yy",
},
"spriteMaskId":null,
"visible":true,
}

View File

@@ -0,0 +1 @@
get_damaged_destroy();

View File

@@ -0,0 +1 @@
get_damaged_create(20);

View File

@@ -0,0 +1,14 @@
get_damaged(o_parent_hurt, false, false);
var _health_pct = 1 - (hp / max_hp);
image_index = _health_pct * (image_number - 1);
if hp <= 0 {
instance_create_depth(x, y, -1000, o_explosion);
audio_play_sound(explosion, 0, false);
create_screen_pause(12);
camera_shake(12);
instance_destroy();
}

46
objects/o_explosive/o_explosive.yy generated Normal file
View File

@@ -0,0 +1,46 @@
{
"$GMObject":"",
"%Name":"o_explosive",
"eventList":[
{"$GMEvent":"v1","%Name":"","collisionObjectId":null,"eventNum":0,"eventType":0,"isDnD":false,"name":"","resourceType":"GMEvent","resourceVersion":"2.0",},
{"$GMEvent":"v1","%Name":"","collisionObjectId":null,"eventNum":0,"eventType":3,"isDnD":false,"name":"","resourceType":"GMEvent","resourceVersion":"2.0",},
{"$GMEvent":"v1","%Name":"","collisionObjectId":null,"eventNum":0,"eventType":12,"isDnD":false,"name":"","resourceType":"GMEvent","resourceVersion":"2.0",},
],
"managed":true,
"name":"o_explosive",
"overriddenProperties":[],
"parent":{
"name":"Rooms",
"path":"folders/Rooms.yy",
},
"parentObjectId":{
"name":"o_solid_wall",
"path":"objects/o_solid_wall/o_solid_wall.yy",
},
"persistent":false,
"physicsAngularDamping":0.1,
"physicsDensity":0.5,
"physicsFriction":0.2,
"physicsGroup":1,
"physicsKinematic":false,
"physicsLinearDamping":0.1,
"physicsObject":false,
"physicsRestitution":0.1,
"physicsSensor":false,
"physicsShape":1,
"physicsShapePoints":[],
"physicsStartAwake":true,
"properties":[],
"resourceType":"GMObject",
"resourceVersion":"2.0",
"solid":false,
"spriteId":{
"name":"s_explosive",
"path":"sprites/s_explosive/s_explosive.yy",
},
"spriteMaskId":{
"name":"s_explosive",
"path":"sprites/s_explosive/s_explosive.yy",
},
"visible":true,
}

View File

@@ -0,0 +1,12 @@
event_inherited();
bullet_dir = 0;
bullet_spd = 5;
bullet_x_spd = 0;
bullet_y_spd = 0;
is_exploding = false;
start_x = x;
start_y = y;
max_distance = 300;
s_destroy = s_fireball_destroy;
pass_through_enemy = false;

View File

@@ -0,0 +1,3 @@
if sprite_index == s_destroy {
instance_destroy();
}

View File

@@ -0,0 +1,28 @@
if pause_movement() { exit; }
// Movements
#region
if (!is_exploding) {
// Calculate movement
var x_speed = lengthdir_x(bullet_spd, bullet_dir);
var y_speed = lengthdir_y(bullet_spd, bullet_dir);
// Move the fireball
x += x_speed;
y += y_speed;
if hit_confirmed && !pass_through_enemy {
destroy_projectile()
}
// Check for collision with solid wall
if place_meeting(x, y, o_solid_wall) {
destroy_projectile();
}
// Check if fireball has traveled too far
if point_distance(start_x, start_y, x, y) > max_distance {
destroy_projectile();
}
}
#endregion

43
objects/o_fireball/o_fireball.yy generated Normal file
View File

@@ -0,0 +1,43 @@
{
"$GMObject":"",
"%Name":"o_fireball",
"eventList":[
{"$GMEvent":"v1","%Name":"","collisionObjectId":null,"eventNum":0,"eventType":0,"isDnD":false,"name":"","resourceType":"GMEvent","resourceVersion":"2.0",},
{"$GMEvent":"v1","%Name":"","collisionObjectId":null,"eventNum":0,"eventType":3,"isDnD":false,"name":"","resourceType":"GMEvent","resourceVersion":"2.0",},
{"$GMEvent":"v1","%Name":"","collisionObjectId":null,"eventNum":7,"eventType":7,"isDnD":false,"name":"","resourceType":"GMEvent","resourceVersion":"2.0",},
],
"managed":true,
"name":"o_fireball",
"overriddenProperties":[],
"parent":{
"name":"Spells",
"path":"folders/Spells.yy",
},
"parentObjectId":{
"name":"o_enemy_hurt",
"path":"objects/o_enemy_hurt/o_enemy_hurt.yy",
},
"persistent":false,
"physicsAngularDamping":0.1,
"physicsDensity":0.5,
"physicsFriction":0.2,
"physicsGroup":1,
"physicsKinematic":false,
"physicsLinearDamping":0.1,
"physicsObject":false,
"physicsRestitution":0.1,
"physicsSensor":false,
"physicsShape":1,
"physicsShapePoints":[],
"physicsStartAwake":true,
"properties":[],
"resourceType":"GMObject",
"resourceVersion":"2.0",
"solid":false,
"spriteId":{
"name":"s_fireball",
"path":"sprites/s_fireball/s_fireball.yy",
},
"spriteMaskId":null,
"visible":true,
}

View File

@@ -0,0 +1,5 @@
alpha = 0;
alpha_spd = 1/75;
alpha_mul = 0.9;
depth = -10000;

View File

@@ -0,0 +1,18 @@
var _cam_x = camera_get_view_x(view_camera[0]);
var _cam_w = camera_get_view_width(view_camera[0]);
var _cam_y = camera_get_view_y(view_camera[0]);
var _cam_h = camera_get_view_height(view_camera[0]);
draw_set_alpha(alpha * alpha_mul);
draw_rectangle_color(_cam_x, _cam_y, _cam_w + _cam_x, _cam_h + _cam_y, c_red, c_red, c_black, c_black, false);
draw_set_alpha(alpha);
draw_set_halign(fa_center);
draw_set_valign(fa_middle);
draw_set_font(fnt_Special_Elite);
draw_text_transformed(_cam_x + (_cam_w / 2), _cam_y + (_cam_h / 2) - 20, "YOU DIED", 4, 4, 0);
draw_set_font(fnt_Tiny5);
draw_text_transformed(_cam_x + (_cam_w / 2), _cam_y + (_cam_h / 2) + 50, "-< Press any key to resurrect >-", 1, 1, 0);
draw_set_halign(fa_left);
draw_set_valign(fa_top);
draw_set_alpha(1);

View File

@@ -0,0 +1,7 @@
alpha += alpha_spd;
alpha = clamp(alpha, 0, 1);
if keyboard_check_pressed(vk_anykey) && alpha >= 1 {
global.first_start = false;
room_restart()
}

37
objects/o_game_over/o_game_over.yy generated Normal file
View File

@@ -0,0 +1,37 @@
{
"$GMObject":"",
"%Name":"o_game_over",
"eventList":[
{"$GMEvent":"v1","%Name":"","collisionObjectId":null,"eventNum":0,"eventType":0,"isDnD":false,"name":"","resourceType":"GMEvent","resourceVersion":"2.0",},
{"$GMEvent":"v1","%Name":"","collisionObjectId":null,"eventNum":0,"eventType":3,"isDnD":false,"name":"","resourceType":"GMEvent","resourceVersion":"2.0",},
{"$GMEvent":"v1","%Name":"","collisionObjectId":null,"eventNum":0,"eventType":8,"isDnD":false,"name":"","resourceType":"GMEvent","resourceVersion":"2.0",},
],
"managed":true,
"name":"o_game_over",
"overriddenProperties":[],
"parent":{
"name":"Controllers",
"path":"folders/Controllers.yy",
},
"parentObjectId":null,
"persistent":false,
"physicsAngularDamping":0.1,
"physicsDensity":0.5,
"physicsFriction":0.2,
"physicsGroup":1,
"physicsKinematic":false,
"physicsLinearDamping":0.1,
"physicsObject":false,
"physicsRestitution":0.1,
"physicsSensor":false,
"physicsShape":1,
"physicsShapePoints":[],
"physicsStartAwake":true,
"properties":[],
"resourceType":"GMObject",
"resourceVersion":"2.0",
"solid":false,
"spriteId":null,
"spriteMaskId":null,
"visible":true,
}

View File

@@ -0,0 +1 @@
player_ref = o_player;

View File

@@ -0,0 +1,8 @@
if instance_exists(player_ref) {
x = player_ref.x;
y = player_ref.y;
}
if image_index >= image_number - 1 {
instance_destroy();
}

39
objects/o_heal/o_heal.yy generated Normal file
View File

@@ -0,0 +1,39 @@
{
"$GMObject":"",
"%Name":"o_heal",
"eventList":[
{"$GMEvent":"v1","%Name":"","collisionObjectId":null,"eventNum":0,"eventType":3,"isDnD":false,"name":"","resourceType":"GMEvent","resourceVersion":"2.0",},
{"$GMEvent":"v1","%Name":"","collisionObjectId":null,"eventNum":0,"eventType":0,"isDnD":false,"name":"","resourceType":"GMEvent","resourceVersion":"2.0",},
],
"managed":true,
"name":"o_heal",
"overriddenProperties":[],
"parent":{
"name":"Spells",
"path":"folders/Spells.yy",
},
"parentObjectId":null,
"persistent":false,
"physicsAngularDamping":0.1,
"physicsDensity":0.5,
"physicsFriction":0.2,
"physicsGroup":1,
"physicsKinematic":false,
"physicsLinearDamping":0.1,
"physicsObject":false,
"physicsRestitution":0.1,
"physicsSensor":false,
"physicsShape":1,
"physicsShapePoints":[],
"physicsStartAwake":true,
"properties":[],
"resourceType":"GMObject",
"resourceVersion":"2.0",
"solid":false,
"spriteId":{
"name":"s_heal",
"path":"sprites/s_heal/s_heal.yy",
},
"spriteMaskId":null,
"visible":true,
}

View File

@@ -0,0 +1,17 @@
depth = -9000;
global.first_start = true;
player_hp = 0;
player_max_hp = 0;
global.enemyRoomMax = 100;
global.enemyActiveMax = 20;
global.totalEnemiesSpawned = 0;
global.enemyKillCount = 0;
// Weapon pickup
global.weapon_notification = "";
global.weapon_notification_timer = 0;
menu_inst = noone;

37
objects/o_hud/Draw_0.gml Normal file
View File

@@ -0,0 +1,37 @@
var _cam_x = camera_get_view_x(view_camera[0]);
var _cam_w = camera_get_view_width(view_camera[0]);
var _cam_y = camera_get_view_y(view_camera[0]);
var _cam_h = camera_get_view_height(view_camera[0]);
var _padding = 10;
var _hud_x = _cam_x + _padding;
var _hud_y = _cam_y + _padding;
if instance_exists(o_player) && !instance_exists(o_screen_pause) {
draw_sprite(s_player_health, 0, _hud_x, _hud_y);
for (var i = 0; i < player_max_hp / 10; i++) {
var _img = 1;
if i + 1 <= player_hp / 10 { _img = 2; };
var _sep = 6;
draw_sprite(s_player_health, _img, _hud_x + _sep * i, _hud_y);
}
draw_sprite(s_kill_count, 0, _hud_x, _hud_y + 20);
draw_set_halign(fa_left);
draw_set_valign(fa_top);
draw_set_font(fnt_Tiny5);
draw_text_transformed(_hud_x + 28, _hud_y + 23, string(global.enemyKillCount) , 0.5, 0.5, 0);
draw_text_transformed(_hud_x + 49, _hud_y + 23, " / " + string(global.enemyRoomMax), 0.5, 0.5, 0);
}
// Draw notification if active
if (global.weapon_notification != "") {
draw_set_font(fnt_Tiny5);
draw_set_halign(fa_left);
draw_set_valign(fa_top);
// Draw at top center of screen
draw_text_transformed(_hud_x + 23, _hud_y + 40, global.weapon_notification , 0.5, 0.5, 0);
}

View File

@@ -0,0 +1,5 @@
global.totalEnemiesSpawned = 0;
global.enemyKillCount = 0;
global.weapon_notification = "";
global.weapon_notification_timer = 0;

26
objects/o_hud/Step_0.gml Normal file
View File

@@ -0,0 +1,26 @@
if global.first_start {
menu_inst = instance_create_depth(0, 0, -10000, o_start_menu)
}
if global.start_key_pressed && instance_exists(menu_inst) {
instance_destroy(menu_inst);
}
// Get player's hp
if instance_exists(o_player) {
player_hp = o_player.hp;
player_max_hp = o_player.max_hp;
} else {
player_hp = 0;
}
if (global.weapon_notification_timer > 0) {
global.weapon_notification_timer--;
if (global.weapon_notification_timer <= 0) {
global.weapon_notification = "";
}
}
if (global.enemyKillCount >= global.enemyRoomMax) {
instance_create_depth(0, 0, -10000, o_end_screen);
}

38
objects/o_hud/o_hud.yy generated Normal file
View File

@@ -0,0 +1,38 @@
{
"$GMObject":"",
"%Name":"o_hud",
"eventList":[
{"$GMEvent":"v1","%Name":"","collisionObjectId":null,"eventNum":0,"eventType":0,"isDnD":false,"name":"","resourceType":"GMEvent","resourceVersion":"2.0",},
{"$GMEvent":"v1","%Name":"","collisionObjectId":null,"eventNum":0,"eventType":3,"isDnD":false,"name":"","resourceType":"GMEvent","resourceVersion":"2.0",},
{"$GMEvent":"v1","%Name":"","collisionObjectId":null,"eventNum":0,"eventType":8,"isDnD":false,"name":"","resourceType":"GMEvent","resourceVersion":"2.0",},
{"$GMEvent":"v1","%Name":"","collisionObjectId":null,"eventNum":5,"eventType":7,"isDnD":false,"name":"","resourceType":"GMEvent","resourceVersion":"2.0",},
],
"managed":true,
"name":"o_hud",
"overriddenProperties":[],
"parent":{
"name":"Controllers",
"path":"folders/Controllers.yy",
},
"parentObjectId":null,
"persistent":true,
"physicsAngularDamping":0.1,
"physicsDensity":0.5,
"physicsFriction":0.2,
"physicsGroup":1,
"physicsKinematic":false,
"physicsLinearDamping":0.1,
"physicsObject":false,
"physicsRestitution":0.1,
"physicsSensor":false,
"physicsShape":1,
"physicsShapePoints":[],
"physicsStartAwake":true,
"properties":[],
"resourceType":"GMObject",
"resourceVersion":"2.0",
"solid":false,
"spriteId":null,
"spriteMaskId":null,
"visible":true,
}

View File

@@ -0,0 +1,7 @@
// Inherit the parent event
event_inherited();
damage = 50;
bullet_spd = 2;
max_distance = 200;
s_destroy = s_icebolt_destroy;

41
objects/o_icebolt/o_icebolt.yy generated Normal file
View File

@@ -0,0 +1,41 @@
{
"$GMObject":"",
"%Name":"o_icebolt",
"eventList":[
{"$GMEvent":"v1","%Name":"","collisionObjectId":null,"eventNum":0,"eventType":0,"isDnD":false,"name":"","resourceType":"GMEvent","resourceVersion":"2.0",},
],
"managed":true,
"name":"o_icebolt",
"overriddenProperties":[],
"parent":{
"name":"Spells",
"path":"folders/Spells.yy",
},
"parentObjectId":{
"name":"o_fireball",
"path":"objects/o_fireball/o_fireball.yy",
},
"persistent":false,
"physicsAngularDamping":0.1,
"physicsDensity":0.5,
"physicsFriction":0.2,
"physicsGroup":1,
"physicsKinematic":false,
"physicsLinearDamping":0.1,
"physicsObject":false,
"physicsRestitution":0.1,
"physicsSensor":false,
"physicsShape":1,
"physicsShapePoints":[],
"physicsStartAwake":true,
"properties":[],
"resourceType":"GMObject",
"resourceVersion":"2.0",
"solid":false,
"spriteId":{
"name":"s_icebolt",
"path":"sprites/s_icebolt/s_icebolt.yy",
},
"spriteMaskId":null,
"visible":true,
}

View File

@@ -0,0 +1,11 @@
global.right_key = 0;
global.left_key = 0;
global.up_key = 0;
global.down_key = 0;
global.shoot_key = 0;
global.swap_key_pressed = 0;
global.heal_key_pressed = 0;
global.start_key_pressed = 0;
global.space_key_pressed = 0;
global.back_key_pressed = 0;
global.pause_key_pressed = 0;

View File

@@ -0,0 +1,18 @@
global.start_key_pressed = keyboard_check_pressed(vk_enter);
global.space_key_pressed = keyboard_check_pressed(vk_space);
global.back_key_pressed = keyboard_check_pressed(vk_backspace)
if instance_exists(o_start_menu) || instance_exists(o_tutorial) {
exit;
}
global.right_key = keyboard_check(ord("D"));
global.left_key = keyboard_check(ord("A"));
global.up_key = keyboard_check(ord("W"));
global.down_key = keyboard_check(ord("S"));
global.shoot_key = mouse_check_button(mb_left);
global.swap_key_pressed = mouse_check_button_pressed(mb_right);
global.heal_key_pressed = keyboard_check(ord("Q"));
global.pause_key_pressed = keyboard_check_pressed(vk_escape);

36
objects/o_inputs/o_inputs.yy generated Normal file
View File

@@ -0,0 +1,36 @@
{
"$GMObject":"",
"%Name":"o_inputs",
"eventList":[
{"$GMEvent":"v1","%Name":"","collisionObjectId":null,"eventNum":0,"eventType":0,"isDnD":false,"name":"","resourceType":"GMEvent","resourceVersion":"2.0",},
{"$GMEvent":"v1","%Name":"","collisionObjectId":null,"eventNum":1,"eventType":3,"isDnD":false,"name":"","resourceType":"GMEvent","resourceVersion":"2.0",},
],
"managed":true,
"name":"o_inputs",
"overriddenProperties":[],
"parent":{
"name":"Controllers",
"path":"folders/Controllers.yy",
},
"parentObjectId":null,
"persistent":true,
"physicsAngularDamping":0.1,
"physicsDensity":0.5,
"physicsFriction":0.2,
"physicsGroup":1,
"physicsKinematic":false,
"physicsLinearDamping":0.1,
"physicsObject":false,
"physicsRestitution":0.1,
"physicsSensor":false,
"physicsShape":1,
"physicsShapePoints":[],
"physicsStartAwake":true,
"properties":[],
"resourceType":"GMObject",
"resourceVersion":"2.0",
"solid":false,
"spriteId":null,
"spriteMaskId":null,
"visible":true,
}

View File

@@ -0,0 +1,3 @@
depth = -600;
float_dir = 0;
float_spd = 3;

View File

@@ -0,0 +1,18 @@
// Pause
if pause_movement() { exit; }
// Floating animation
float_dir += float_spd;
y = ystart + dsin(float_dir) * 2;
// Check player collision
if place_meeting(x, y, o_player) {
var obtained_weapon = get_random_weapon();
if (obtained_weapon != undefined) {
audio_play_sound(item_pick, 0, false);
// Set global notification
global.weapon_notification = "Got " + obtained_weapon.name + "!";
global.weapon_notification_timer = 90; // 1.5 seconds at 60FPS
instance_destroy();
}
}

39
objects/o_new_spell/o_new_spell.yy generated Normal file
View File

@@ -0,0 +1,39 @@
{
"$GMObject":"",
"%Name":"o_new_spell",
"eventList":[
{"$GMEvent":"v1","%Name":"","collisionObjectId":null,"eventNum":0,"eventType":3,"isDnD":false,"name":"","resourceType":"GMEvent","resourceVersion":"2.0",},
{"$GMEvent":"v1","%Name":"","collisionObjectId":null,"eventNum":0,"eventType":0,"isDnD":false,"name":"","resourceType":"GMEvent","resourceVersion":"2.0",},
],
"managed":true,
"name":"o_new_spell",
"overriddenProperties":[],
"parent":{
"name":"Spells",
"path":"folders/Spells.yy",
},
"parentObjectId":null,
"persistent":false,
"physicsAngularDamping":0.1,
"physicsDensity":0.5,
"physicsFriction":0.2,
"physicsGroup":1,
"physicsKinematic":false,
"physicsLinearDamping":0.1,
"physicsObject":false,
"physicsRestitution":0.1,
"physicsSensor":false,
"physicsShape":1,
"physicsShapePoints":[],
"physicsStartAwake":true,
"properties":[],
"resourceType":"GMObject",
"resourceVersion":"2.0",
"solid":false,
"spriteId":{
"name":"s_new_spell",
"path":"sprites/s_new_spell/s_new_spell.yy",
},
"spriteMaskId":null,
"visible":true,
}

View File

@@ -0,0 +1 @@
get_damaged_destroy();

View File

@@ -0,0 +1,4 @@
event_inherited();
get_damaged_create(100);
global.totalEnemiesSpawned++;

View File

@@ -0,0 +1,13 @@
if sprite_index == sprites[4] {
global.enemyKillCount++;
// Drop healing milk
var _drop_chance = 10;
var _chance = irandom(100);
if global.enemyKillCount mod 20 == 0 || _chance <= _drop_chance {
instance_create_depth(x, y, -600, o_potion);
}
instance_destroy();
}

View File

@@ -0,0 +1,2 @@
// Damaged
get_damaged(o_enemy_hurt);

41
objects/o_parent_enemy/o_parent_enemy.yy generated Normal file
View File

@@ -0,0 +1,41 @@
{
"$GMObject":"",
"%Name":"o_parent_enemy",
"eventList":[
{"$GMEvent":"v1","%Name":"","collisionObjectId":null,"eventNum":0,"eventType":0,"isDnD":false,"name":"","resourceType":"GMEvent","resourceVersion":"2.0",},
{"$GMEvent":"v1","%Name":"","collisionObjectId":null,"eventNum":0,"eventType":3,"isDnD":false,"name":"","resourceType":"GMEvent","resourceVersion":"2.0",},
{"$GMEvent":"v1","%Name":"","collisionObjectId":null,"eventNum":7,"eventType":7,"isDnD":false,"name":"","resourceType":"GMEvent","resourceVersion":"2.0",},
{"$GMEvent":"v1","%Name":"","collisionObjectId":null,"eventNum":0,"eventType":12,"isDnD":false,"name":"","resourceType":"GMEvent","resourceVersion":"2.0",},
],
"managed":true,
"name":"o_parent_enemy",
"overriddenProperties":[],
"parent":{
"name":"Enemies",
"path":"folders/Enemies.yy",
},
"parentObjectId":{
"name":"o_player_hurt",
"path":"objects/o_player_hurt/o_player_hurt.yy",
},
"persistent":false,
"physicsAngularDamping":0.1,
"physicsDensity":0.5,
"physicsFriction":0.2,
"physicsGroup":1,
"physicsKinematic":false,
"physicsLinearDamping":0.1,
"physicsObject":false,
"physicsRestitution":0.1,
"physicsSensor":false,
"physicsShape":1,
"physicsShapePoints":[],
"physicsStartAwake":true,
"properties":[],
"resourceType":"GMObject",
"resourceVersion":"2.0",
"solid":false,
"spriteId":null,
"spriteMaskId":null,
"visible":true,
}

View File

@@ -0,0 +1,2 @@
damage = 10;
hit_confirmed = false;

35
objects/o_parent_hurt/o_parent_hurt.yy generated Normal file
View File

@@ -0,0 +1,35 @@
{
"$GMObject":"",
"%Name":"o_parent_hurt",
"eventList":[
{"$GMEvent":"v1","%Name":"","collisionObjectId":null,"eventNum":0,"eventType":0,"isDnD":false,"name":"","resourceType":"GMEvent","resourceVersion":"2.0",},
],
"managed":true,
"name":"o_parent_hurt",
"overriddenProperties":[],
"parent":{
"name":"Generic",
"path":"folders/Generic.yy",
},
"parentObjectId":null,
"persistent":false,
"physicsAngularDamping":0.1,
"physicsDensity":0.5,
"physicsFriction":0.2,
"physicsGroup":1,
"physicsKinematic":false,
"physicsLinearDamping":0.1,
"physicsObject":false,
"physicsRestitution":0.1,
"physicsSensor":false,
"physicsShape":1,
"physicsShapePoints":[],
"physicsStartAwake":true,
"properties":[],
"resourceType":"GMObject",
"resourceVersion":"2.0",
"solid":false,
"spriteId":null,
"spriteMaskId":null,
"visible":true,
}

View File

@@ -0,0 +1,3 @@
alpha = 0.7;
depth = -10000;

View File

@@ -0,0 +1,16 @@
var _cam_x = camera_get_view_x(view_camera[0]);
var _cam_w = camera_get_view_width(view_camera[0]);
var _cam_y = camera_get_view_y(view_camera[0]);
var _cam_h = camera_get_view_height(view_camera[0]);
draw_set_alpha(alpha);
draw_rectangle_color(_cam_x, _cam_y, _cam_w + _cam_x, _cam_h + _cam_y, c_black, c_black, c_black, c_black, false);
draw_set_halign(fa_center);
draw_set_valign(fa_middle);
draw_set_font(fnt_Tiny5);
draw_text_transformed(_cam_x + (_cam_w / 2), _cam_y + (_cam_h / 2) - 20, "PAUSED", 4, 4, 0);
draw_sprite_ext(s_key_esc, image_index, _cam_x + (_cam_w / 2) + 160, _cam_y + (_cam_h / 2) + 60, 1.5, 1.5, 0, c_white, alpha);
draw_text_transformed(_cam_x + (_cam_w / 2), _cam_y + (_cam_h / 2) + 50, "-< Press ESC to resume", 1, 1, 0);
draw_set_halign(fa_left);
draw_set_valign(fa_top);
draw_set_alpha(1);

View File

@@ -0,0 +1,4 @@
if !instance_exists(o_player) {
instance_destroy();
exit;
}

40
objects/o_pause_menu/o_pause_menu.yy generated Normal file
View File

@@ -0,0 +1,40 @@
{
"$GMObject":"",
"%Name":"o_pause_menu",
"eventList":[
{"$GMEvent":"v1","%Name":"","collisionObjectId":null,"eventNum":0,"eventType":8,"isDnD":false,"name":"","resourceType":"GMEvent","resourceVersion":"2.0",},
{"$GMEvent":"v1","%Name":"","collisionObjectId":null,"eventNum":0,"eventType":0,"isDnD":false,"name":"","resourceType":"GMEvent","resourceVersion":"2.0",},
{"$GMEvent":"v1","%Name":"","collisionObjectId":null,"eventNum":0,"eventType":3,"isDnD":false,"name":"","resourceType":"GMEvent","resourceVersion":"2.0",},
],
"managed":true,
"name":"o_pause_menu",
"overriddenProperties":[],
"parent":{
"name":"Controllers",
"path":"folders/Controllers.yy",
},
"parentObjectId":{
"name":"o_screen_pause",
"path":"objects/o_screen_pause/o_screen_pause.yy",
},
"persistent":false,
"physicsAngularDamping":0.1,
"physicsDensity":0.5,
"physicsFriction":0.2,
"physicsGroup":1,
"physicsKinematic":false,
"physicsLinearDamping":0.1,
"physicsObject":false,
"physicsRestitution":0.1,
"physicsSensor":false,
"physicsShape":1,
"physicsShapePoints":[],
"physicsStartAwake":true,
"properties":[],
"resourceType":"GMObject",
"resourceVersion":"2.0",
"solid":false,
"spriteId":null,
"spriteMaskId":null,
"visible":true,
}

View File

@@ -0,0 +1,36 @@
// Vital stats
get_damaged_create(200, true);
// Movement variables
move_dir = 0;
move_spd = 2;
x_speed = 0;
y_speed = 0;
// Aiming variables
center_y_offset = -5;
center_y = y + center_y_offset;
aim_dir = 0;
// Sprite controls
face = 1;
sprites[0] = s_player_idle;
sprites[1] = s_player_walk;
sprites[2] = s_player_attack;
sprites[3] = s_player_hurt;
sprites[4] = s_player_death;
sprites[5] = s_player_heal;
sprite_index = sprites[0];
// Weapon info
shoot_timer = 0;
heal_timer = 0;
heal_cooldown = 30 * 60;
weapon_offset_dist = 5;
weapon_length = sprite_get_bbox_right(s_aimer) - sprite_get_xoffset(s_aimer);
// Add weapon to player's inventory
selected_weapon = 0;
weapon = global.PlayerWeapons[selected_weapon];

View File

@@ -0,0 +1,10 @@
if aim_dir >= 0 && aim_dir < 180 {
draw_own_weapon();
}
draw_sprite_ext(sprite_index, image_index, x, y, face, image_yscale, image_angle, image_blend, image_alpha);
if aim_dir >= 180 && aim_dir < 360 {
draw_own_weapon();
}

View File

@@ -0,0 +1,4 @@
if sprite_index == sprites[4] {
instance_create_depth(0, 0, -10000, o_game_over);
instance_destroy();
}

143
objects/o_player/Step_0.gml Normal file
View File

@@ -0,0 +1,143 @@
var right_key = global.right_key;
var left_key = global.left_key;
var up_key = global.up_key;
var down_key = global.down_key;
var shoot_key = global.shoot_key;
var swap_key_pressed = global.swap_key_pressed;
var heal_key_pressed = global.heal_key_pressed;
var pause_key_pressed = global.pause_key_pressed;
// Pause game
if pause_key_pressed {
if !instance_exists(o_pause_menu) {
instance_create_depth(0, 0, -10000, o_pause_menu);
} else {
instance_destroy(o_pause_menu);
}
}
if pause_movement() { exit; }
// Movements
#region
var _horizontal_key = right_key - left_key;
var _vertical_key = down_key - up_key;
move_dir = point_direction(0, 0, _horizontal_key, _vertical_key);
// Speeds
var _speed = 0;
var _input_lvl = point_distance(0, 0, _horizontal_key, _vertical_key);
_input_lvl = clamp(_input_lvl, 0 , 1);
_speed = move_spd * _input_lvl;
x_speed = lengthdir_x(_speed, move_dir);
y_speed = lengthdir_y(_speed, move_dir);
// Collision
if place_meeting(x + x_speed, y, o_wall) {
x_speed = 0;
}
if place_meeting(x, y + y_speed, o_wall) {
y_speed = 0;
}
x += x_speed;
y += y_speed;
depth = -600;
#endregion
// Sprite controls
#region
// Determine if the player is moving
var is_moving = (_horizontal_key != 0 || _vertical_key != 0);
// Update animation based on movement
if (is_moving) {
sprite_index = sprites[1]; // Walking animation
} else {
sprite_index = sprites[0]; // Idle animation
}
// Determine facing direction
if (_horizontal_key != 0) {
face = sign(_horizontal_key);
} else if (!is_moving) {
var _mouse_x_offset = mouse_x - x;
face = (_mouse_x_offset > 0) ? 1 : -1;
}
#endregion
// Get damaged
if get_damaged(o_player_hurt, true) {
audio_play_sound(hurt_sound, 0, false);
create_screen_pause(6);
camera_shake(6);
}
// Aiming
#region
center_y = y + center_y_offset;
aim_dir = point_direction(x, center_y, mouse_x, mouse_y)
#endregion
// Shooting
#region
if shoot_key {
sprite_index = sprites[2];
}
if shoot_timer > 0 {
shoot_timer--;
}
if shoot_key && shoot_timer <= 0 {
shoot_timer = weapon.cooldown;
var _x_offset = lengthdir_x(weapon_length + weapon_offset_dist, aim_dir);
var _y_offset = lengthdir_y(weapon_length + weapon_offset_dist, aim_dir);
var _spread = weapon.bullet_spread;
var _spread_div = _spread / max(weapon.bullet_num - 1, 1);
for (var i = 0; i < weapon.bullet_num; i++) {
var _bullet_inst = instance_create_depth(x + _x_offset + i*10, center_y + _y_offset, depth-50, weapon.bullet_obj);
with (_bullet_inst) {
bullet_dir = other.aim_dir - _spread/2 + _spread_div*i;
image_angle = bullet_dir;
}
}
}
#endregion
// Heal
#region
if (heal_timer > 0) {
heal_timer--; // Reduce cooldown timer each step
}
if (heal_key_pressed && heal_timer <= 0) {
instance_create_depth(x, y, depth - 100, o_heal); // Spawn heal effect
sprite_index = sprites[5]; // Play heal animation
heal_timer = heal_cooldown; // Set cooldown
audio_play_sound(item_pick, 0, false);
hp += 20;
}
#endregion
// Swap weapons
#region
var _player_weapons = global.PlayerWeapons;
if swap_key_pressed {
selected_weapon++;
if selected_weapon >= array_length(_player_weapons) {
selected_weapon = 0;
}
weapon = _player_weapons[selected_weapon];
}
#endregion
// Die
is_dying(sprites[4]);

41
objects/o_player/o_player.yy generated Normal file
View File

@@ -0,0 +1,41 @@
{
"$GMObject":"",
"%Name":"o_player",
"eventList":[
{"$GMEvent":"v1","%Name":"","collisionObjectId":null,"eventNum":0,"eventType":0,"isDnD":false,"name":"","resourceType":"GMEvent","resourceVersion":"2.0",},
{"$GMEvent":"v1","%Name":"","collisionObjectId":null,"eventNum":0,"eventType":3,"isDnD":false,"name":"","resourceType":"GMEvent","resourceVersion":"2.0",},
{"$GMEvent":"v1","%Name":"","collisionObjectId":null,"eventNum":0,"eventType":8,"isDnD":false,"name":"","resourceType":"GMEvent","resourceVersion":"2.0",},
{"$GMEvent":"v1","%Name":"","collisionObjectId":null,"eventNum":7,"eventType":7,"isDnD":false,"name":"","resourceType":"GMEvent","resourceVersion":"2.0",},
],
"managed":true,
"name":"o_player",
"overriddenProperties":[],
"parent":{
"name":"Player",
"path":"folders/Player.yy",
},
"parentObjectId":null,
"persistent":false,
"physicsAngularDamping":0.1,
"physicsDensity":0.5,
"physicsFriction":0.2,
"physicsGroup":1,
"physicsKinematic":false,
"physicsLinearDamping":0.1,
"physicsObject":false,
"physicsRestitution":0.1,
"physicsSensor":false,
"physicsShape":1,
"physicsShapePoints":[],
"physicsStartAwake":true,
"properties":[],
"resourceType":"GMObject",
"resourceVersion":"2.0",
"solid":false,
"spriteId":{
"name":"s_player_walk",
"path":"sprites/s_player_walk/s_player_walk.yy",
},
"spriteMaskId":null,
"visible":true,
}

36
objects/o_player_hurt/o_player_hurt.yy generated Normal file
View File

@@ -0,0 +1,36 @@
{
"$GMObject":"",
"%Name":"o_player_hurt",
"eventList":[],
"managed":true,
"name":"o_player_hurt",
"overriddenProperties":[],
"parent":{
"name":"Player",
"path":"folders/Player.yy",
},
"parentObjectId":{
"name":"o_parent_hurt",
"path":"objects/o_parent_hurt/o_parent_hurt.yy",
},
"persistent":false,
"physicsAngularDamping":0.1,
"physicsDensity":0.5,
"physicsFriction":0.2,
"physicsGroup":1,
"physicsKinematic":false,
"physicsLinearDamping":0.1,
"physicsObject":false,
"physicsRestitution":0.1,
"physicsSensor":false,
"physicsShape":1,
"physicsShapePoints":[],
"physicsStartAwake":true,
"properties":[],
"resourceType":"GMObject",
"resourceVersion":"2.0",
"solid":false,
"spriteId":null,
"spriteMaskId":null,
"visible":true,
}

View File

@@ -0,0 +1,8 @@
// Inherit the parent event
event_inherited();
damage = 5;
bullet_spd = 8;
max_distance = 600;
s_destroy = s_poison_destroy;
pass_through_enemy = true;

41
objects/o_poison/o_poison.yy generated Normal file
View File

@@ -0,0 +1,41 @@
{
"$GMObject":"",
"%Name":"o_poison",
"eventList":[
{"$GMEvent":"v1","%Name":"","collisionObjectId":null,"eventNum":0,"eventType":0,"isDnD":false,"name":"","resourceType":"GMEvent","resourceVersion":"2.0",},
],
"managed":true,
"name":"o_poison",
"overriddenProperties":[],
"parent":{
"name":"Spells",
"path":"folders/Spells.yy",
},
"parentObjectId":{
"name":"o_fireball",
"path":"objects/o_fireball/o_fireball.yy",
},
"persistent":false,
"physicsAngularDamping":0.1,
"physicsDensity":0.5,
"physicsFriction":0.2,
"physicsGroup":1,
"physicsKinematic":false,
"physicsLinearDamping":0.1,
"physicsObject":false,
"physicsRestitution":0.1,
"physicsSensor":false,
"physicsShape":1,
"physicsShapePoints":[],
"physicsStartAwake":true,
"properties":[],
"resourceType":"GMObject",
"resourceVersion":"2.0",
"solid":false,
"spriteId":{
"name":"s_poison",
"path":"sprites/s_poison/s_poison.yy",
},
"spriteMaskId":null,
"visible":true,
}

View File

@@ -0,0 +1,4 @@
depth = -600;
heal = 50;
float_dir = 0;
float_spd = 3;

View File

@@ -0,0 +1,12 @@
// Pause
if pause_movement() { exit; }
float_dir += float_spd;
y = ystart + dsin(float_dir) * 2;
// Heal player
if place_meeting(x, y, o_player) {
o_player.hp += heal;
audio_play_sound(item_pick, 0, false);
instance_destroy();
}

39
objects/o_potion/o_potion.yy generated Normal file
View File

@@ -0,0 +1,39 @@
{
"$GMObject":"",
"%Name":"o_potion",
"eventList":[
{"$GMEvent":"v1","%Name":"","collisionObjectId":null,"eventNum":0,"eventType":0,"isDnD":false,"name":"","resourceType":"GMEvent","resourceVersion":"2.0",},
{"$GMEvent":"v1","%Name":"","collisionObjectId":null,"eventNum":0,"eventType":3,"isDnD":false,"name":"","resourceType":"GMEvent","resourceVersion":"2.0",},
],
"managed":true,
"name":"o_potion",
"overriddenProperties":[],
"parent":{
"name":"Player",
"path":"folders/Player.yy",
},
"parentObjectId":null,
"persistent":false,
"physicsAngularDamping":0.1,
"physicsDensity":0.5,
"physicsFriction":0.2,
"physicsGroup":1,
"physicsKinematic":false,
"physicsLinearDamping":0.1,
"physicsObject":false,
"physicsRestitution":0.1,
"physicsSensor":false,
"physicsShape":1,
"physicsShapePoints":[],
"physicsStartAwake":true,
"properties":[],
"resourceType":"GMObject",
"resourceVersion":"2.0",
"solid":false,
"spriteId":{
"name":"s_potion",
"path":"sprites/s_potion/s_potion.yy",
},
"spriteMaskId":null,
"visible":true,
}

33
objects/o_screen_pause/o_screen_pause.yy generated Normal file
View File

@@ -0,0 +1,33 @@
{
"$GMObject":"",
"%Name":"o_screen_pause",
"eventList":[],
"managed":true,
"name":"o_screen_pause",
"overriddenProperties":[],
"parent":{
"name":"Controllers",
"path":"folders/Controllers.yy",
},
"parentObjectId":null,
"persistent":false,
"physicsAngularDamping":0.1,
"physicsDensity":0.5,
"physicsFriction":0.2,
"physicsGroup":1,
"physicsKinematic":false,
"physicsLinearDamping":0.1,
"physicsObject":false,
"physicsRestitution":0.1,
"physicsSensor":false,
"physicsShape":1,
"physicsShapePoints":[],
"physicsStartAwake":true,
"properties":[],
"resourceType":"GMObject",
"resourceVersion":"2.0",
"solid":false,
"spriteId":null,
"spriteMaskId":null,
"visible":true,
}

View File

@@ -0,0 +1 @@
timer = 8;

View File

@@ -0,0 +1,2 @@
if timer <= 0 { instance_destroy(); };
timer--;

View File

@@ -0,0 +1,39 @@
{
"$GMObject":"",
"%Name":"o_screen_pause_timed",
"eventList":[
{"$GMEvent":"v1","%Name":"","collisionObjectId":null,"eventNum":0,"eventType":0,"isDnD":false,"name":"","resourceType":"GMEvent","resourceVersion":"2.0",},
{"$GMEvent":"v1","%Name":"","collisionObjectId":null,"eventNum":0,"eventType":3,"isDnD":false,"name":"","resourceType":"GMEvent","resourceVersion":"2.0",},
],
"managed":true,
"name":"o_screen_pause_timed",
"overriddenProperties":[],
"parent":{
"name":"Controllers",
"path":"folders/Controllers.yy",
},
"parentObjectId":{
"name":"o_screen_pause",
"path":"objects/o_screen_pause/o_screen_pause.yy",
},
"persistent":false,
"physicsAngularDamping":0.1,
"physicsDensity":0.5,
"physicsFriction":0.2,
"physicsGroup":1,
"physicsKinematic":false,
"physicsLinearDamping":0.1,
"physicsObject":false,
"physicsRestitution":0.1,
"physicsSensor":false,
"physicsShape":1,
"physicsShapePoints":[],
"physicsStartAwake":true,
"properties":[],
"resourceType":"GMObject",
"resourceVersion":"2.0",
"solid":false,
"spriteId":null,
"spriteMaskId":null,
"visible":true,
}

View File

@@ -0,0 +1,7 @@
// Inherit the parent event
event_inherited();
damage = 20;
bullet_spd = 6;
max_distance = 400;
s_destroy = s_shards_destroy;

41
objects/o_shards/o_shards.yy generated Normal file
View File

@@ -0,0 +1,41 @@
{
"$GMObject":"",
"%Name":"o_shards",
"eventList":[
{"$GMEvent":"v1","%Name":"","collisionObjectId":null,"eventNum":0,"eventType":0,"isDnD":false,"name":"","resourceType":"GMEvent","resourceVersion":"2.0",},
],
"managed":true,
"name":"o_shards",
"overriddenProperties":[],
"parent":{
"name":"Spells",
"path":"folders/Spells.yy",
},
"parentObjectId":{
"name":"o_fireball",
"path":"objects/o_fireball/o_fireball.yy",
},
"persistent":false,
"physicsAngularDamping":0.1,
"physicsDensity":0.5,
"physicsFriction":0.2,
"physicsGroup":1,
"physicsKinematic":false,
"physicsLinearDamping":0.1,
"physicsObject":false,
"physicsRestitution":0.1,
"physicsSensor":false,
"physicsShape":1,
"physicsShapePoints":[],
"physicsStartAwake":true,
"properties":[],
"resourceType":"GMObject",
"resourceVersion":"2.0",
"solid":false,
"spriteId":{
"name":"s_shards",
"path":"sprites/s_shards/s_shards.yy",
},
"spriteMaskId":null,
"visible":true,
}

39
objects/o_solid_wall/o_solid_wall.yy generated Normal file
View File

@@ -0,0 +1,39 @@
{
"$GMObject":"",
"%Name":"o_solid_wall",
"eventList":[],
"managed":true,
"name":"o_solid_wall",
"overriddenProperties":[],
"parent":{
"name":"Rooms",
"path":"folders/Rooms.yy",
},
"parentObjectId":{
"name":"o_wall",
"path":"objects/o_wall/o_wall.yy",
},
"persistent":false,
"physicsAngularDamping":0.1,
"physicsDensity":0.5,
"physicsFriction":0.2,
"physicsGroup":1,
"physicsKinematic":false,
"physicsLinearDamping":0.1,
"physicsObject":false,
"physicsRestitution":0.1,
"physicsSensor":false,
"physicsShape":1,
"physicsShapePoints":[],
"physicsStartAwake":true,
"properties":[],
"resourceType":"GMObject",
"resourceVersion":"2.0",
"solid":false,
"spriteId":{
"name":"s_solid_wall",
"path":"sprites/s_solid_wall/s_solid_wall.yy",
},
"spriteMaskId":null,
"visible":true,
}

View File

@@ -0,0 +1,4 @@
depth = -bbox_top;
timer = 600;
spawn_time = 10 * 60;

View File

@@ -0,0 +1,18 @@
if pause_movement() { exit; }
timer++;
// Reset when limit reached
if instance_number(o_parent_enemy) >= global.enemyActiveMax || global.totalEnemiesSpawned >= global.enemyRoomMax {
timer = 0;
}
// Spawn enemy
if timer >= spawn_time && !place_meeting(x, y, o_archer) {
var _inst = instance_create_depth(x, y, -500, o_archer);
with _inst {
image_alpha = 0;
state = -1;
}
timer = 0;
}

42
objects/o_spawner/o_spawner.yy generated Normal file
View File

@@ -0,0 +1,42 @@
{
"$GMObject":"",
"%Name":"o_spawner",
"eventList":[
{"$GMEvent":"v1","%Name":"","collisionObjectId":null,"eventNum":0,"eventType":0,"isDnD":false,"name":"","resourceType":"GMEvent","resourceVersion":"2.0",},
{"$GMEvent":"v1","%Name":"","collisionObjectId":null,"eventNum":0,"eventType":3,"isDnD":false,"name":"","resourceType":"GMEvent","resourceVersion":"2.0",},
],
"managed":true,
"name":"o_spawner",
"overriddenProperties":[],
"parent":{
"name":"Enemies",
"path":"folders/Enemies.yy",
},
"parentObjectId":{
"name":"o_solid_wall",
"path":"objects/o_solid_wall/o_solid_wall.yy",
},
"persistent":false,
"physicsAngularDamping":0.1,
"physicsDensity":0.5,
"physicsFriction":0.2,
"physicsGroup":1,
"physicsKinematic":false,
"physicsLinearDamping":0.1,
"physicsObject":false,
"physicsRestitution":0.1,
"physicsSensor":false,
"physicsShape":1,
"physicsShapePoints":[],
"physicsStartAwake":true,
"properties":[],
"resourceType":"GMObject",
"resourceVersion":"2.0",
"solid":false,
"spriteId":{
"name":"s_spawner",
"path":"sprites/s_spawner/s_spawner.yy",
},
"spriteMaskId":null,
"visible":true,
}

View File

@@ -0,0 +1,3 @@
alpha = 1;
depth = -9000;

View File

@@ -0,0 +1,24 @@
var _cam_x = camera_get_view_x(view_camera[0]);
var _cam_w = camera_get_view_width(view_camera[0]);
var _cam_y = camera_get_view_y(view_camera[0]);
var _cam_h = camera_get_view_height(view_camera[0]);
draw_set_alpha(alpha);
draw_rectangle_color(_cam_x, _cam_y, _cam_w + _cam_x, _cam_h + _cam_y, c_green, c_green, c_green, c_green, false);
draw_set_halign(fa_center);
draw_set_valign(fa_middle);
draw_set_font(fnt_Tiny5);
draw_text_transformed(_cam_x + (_cam_w / 2), _cam_y + (_cam_h / 2) - 40, "Bit Blaster", 4, 4, 0);
var pulse = 1 + 0.05 * sin(current_time * 0.01);
if global.first_start {
draw_sprite_ext(s_key_enter, image_index, _cam_x + (_cam_w / 2) + 160, _cam_y + (_cam_h / 2) + 40, 0.5 + pulse, 0.5 + pulse, 0, c_white, 1);
draw_text_transformed(_cam_x + (_cam_w / 2), _cam_y + (_cam_h / 2) + 30, "-< Press Enter to start", pulse, pulse, 0);
} else {
draw_sprite_ext(s_key_enter, image_index, _cam_x + (_cam_w / 2) + 180, _cam_y + (_cam_h / 2) + 40, 0.5 + pulse, 0.5 + pulse, 0, c_white, 1);
draw_text_transformed(_cam_x + (_cam_w / 2), _cam_y + (_cam_h / 2) + 30, "-< Press Enter to continue", pulse, pulse, 0);
}
draw_sprite_ext(s_key_space, image_index, _cam_x + (_cam_w / 2) + 180, _cam_y + (_cam_h / 2) + 80, 1.5, 1.5, 0, c_white, 1);
draw_text_transformed(_cam_x + (_cam_w / 2), _cam_y + (_cam_h / 2) + 70, "-< Press Space for tutorial", 1, 1, 0);
draw_set_halign(fa_left);
draw_set_valign(fa_top);
draw_set_alpha(1);

View File

@@ -0,0 +1,10 @@
if global.start_key_pressed {
instance_destroy();
global.first_start = false;
}
if global.space_key_pressed {
instance_destroy();
instance_create_depth(0, 0, -10000, o_tutorial);
}

40
objects/o_start_menu/o_start_menu.yy generated Normal file
View File

@@ -0,0 +1,40 @@
{
"$GMObject":"",
"%Name":"o_start_menu",
"eventList":[
{"$GMEvent":"v1","%Name":"","collisionObjectId":null,"eventNum":0,"eventType":8,"isDnD":false,"name":"","resourceType":"GMEvent","resourceVersion":"2.0",},
{"$GMEvent":"v1","%Name":"","collisionObjectId":null,"eventNum":0,"eventType":0,"isDnD":false,"name":"","resourceType":"GMEvent","resourceVersion":"2.0",},
{"$GMEvent":"v1","%Name":"","collisionObjectId":null,"eventNum":0,"eventType":3,"isDnD":false,"name":"","resourceType":"GMEvent","resourceVersion":"2.0",},
],
"managed":true,
"name":"o_start_menu",
"overriddenProperties":[],
"parent":{
"name":"Controllers",
"path":"folders/Controllers.yy",
},
"parentObjectId":{
"name":"o_screen_pause",
"path":"objects/o_screen_pause/o_screen_pause.yy",
},
"persistent":false,
"physicsAngularDamping":0.1,
"physicsDensity":0.5,
"physicsFriction":0.2,
"physicsGroup":1,
"physicsKinematic":false,
"physicsLinearDamping":0.1,
"physicsObject":false,
"physicsRestitution":0.1,
"physicsSensor":false,
"physicsShape":1,
"physicsShapePoints":[],
"physicsStartAwake":true,
"properties":[],
"resourceType":"GMObject",
"resourceVersion":"2.0",
"solid":false,
"spriteId":null,
"spriteMaskId":null,
"visible":true,
}

View File

@@ -0,0 +1,18 @@
alpha = 1;
depth = -10000;
image_speed = 0.2;
icons = {
wasd: s_key_wasd,
mouse_left: s_mouse_left,
mouse_right: s_mouse_right,
heal: s_key_q,
skeleton: s_key_wasd,
milk: s_key_wasd,
wizard: s_key_wasd,
tree: s_key_wasd,
stump: s_key_wasd,
coal: s_key_wasd,
};

View File

@@ -0,0 +1,45 @@
var _cam_x = camera_get_view_x(view_camera[0]);
var _cam_w = camera_get_view_width(view_camera[0]);
var _cam_y = camera_get_view_y(view_camera[0]);
var _cam_h = camera_get_view_height(view_camera[0]);
draw_set_alpha(alpha);
draw_rectangle_color(_cam_x, _cam_y, _cam_w + _cam_x, _cam_h + _cam_y, c_black, c_black, c_black, c_black, false);
draw_set_font(fnt_Tiny5);
draw_text_transformed(_cam_x + 10, _cam_y, "Tutorial", 2, 2, 0);
var start_x = _cam_x + 40;
var start_y = _cam_y + 50;
var line_height = 24;
draw_text(start_x, start_y, "");
draw_sprite_ext(s_key_wasd, 0, start_x - 20, start_y + line_height + 23, 0.5, 0.5, 0, c_white, 1);
draw_text(start_x, start_y + line_height, "- WASD: Player's movement");
draw_sprite_ext(s_mouse_left, 0, start_x - 20, start_y + line_height*2 + 23, 1, 1, 0, c_white, 1);
draw_text(start_x, start_y + line_height*2, "- Left Click: Shoot spell");
draw_sprite_ext(s_mouse_right, 0, start_x - 20, start_y + line_height*3 + 23, 1, 1, 0, c_white, 1);
draw_text(start_x, start_y + line_height*3, "- Right Click: Switch spell");
draw_sprite_ext(s_key_q, 0, start_x - 20, start_y + line_height*4 + 23, 1, 1, 0, c_white, 1);
draw_text(start_x, start_y + line_height*4, "- Q: Heal 20 HP (30s cooldown)");
draw_sprite_ext(s_archer_walk, image_index, start_x - 20, start_y + line_height*5 + 16, 1, 1, 0, c_white, 1);
draw_text(start_x, start_y + line_height*5, "- Kill skeletons to reach target");
draw_sprite_ext(s_potion, 0, start_x - 20, start_y + line_height*6 + 23, 1, 1, 0, c_white, 1);
draw_text(start_x, start_y + line_height*6, "- Milk cartons heal 50 HP");
draw_sprite_ext(s_support_spells, 0, start_x - 20, start_y + line_height*7 + 23, 1, 1, 0, c_white, 1);
draw_sprite_ext(s_new_spell, 0, start_x - 20, start_y + line_height*7 + 5, 0.6, 0.6, 0, c_white, 1);
draw_text(start_x, start_y + line_height*7, "- Find dead wizards for new spells (4 total)");
draw_sprite_ext(s_blocker, 0, start_x - 20, start_y + line_height*8 + 23, 0.5, 0.5, 0, c_white, 1);
draw_text(start_x, start_y + line_height*8, "- Trees block arrows (until stumps)");
draw_sprite_ext(s_blocker_stump, 0, start_x - 20, start_y + line_height*9 + 16, 1, 1, 0, c_white, 1);
draw_text(start_x, start_y + line_height*9, "- Stumps block movement only (can be destroyed)");
draw_sprite_ext(s_explosive, image_index, start_x - 20, start_y + line_height*10 + 16, 1, 1, 0, c_white, 1);
draw_text(start_x, start_y + line_height*10, "- Coal crate explodes when too damaged");
var pulse = 1 + 0.05 * sin(current_time * 0.01);
draw_sprite_ext(s_key_back, image_index, _cam_x + 610, _cam_y + 45, 0.5 + pulse, 0.5 + pulse, 0, c_white, 1);
draw_text_transformed(_cam_x + 225, _cam_y + 20, "-< Press Backspace to return", pulse, pulse, 0);
draw_set_halign(fa_left);
draw_set_valign(fa_top);
draw_set_alpha(1);

View File

@@ -0,0 +1,5 @@
if global.back_key_pressed {
instance_destroy();
instance_create_depth(0, 0, -9000, o_start_menu);
}

Some files were not shown because too many files have changed in this diff Show More