From c57db136de35ece2a92e67ab478cd461c5975f9a Mon Sep 17 00:00:00 2001 From: lofcz Date: Sun, 6 Nov 2016 11:54:10 +0100 Subject: [PATCH] Update komponenty SimpleAI --- .../Engine source/DragonRise3.project.gmx | 6 +- .../Engine source/objects/oBunny.object.gmx | 110 ++--------------- .../Engine source/objects/oRat.object.gmx | 116 ++---------------- .../Engine source/objects/parEnemy.object.gmx | 35 ++---- .../Engine source/rooms/mapTest.room.gmx | 3 + .../Engine source/scripts/scrSimpleAiStep.gml | 96 ++++++++++++++- 6 files changed, 120 insertions(+), 246 deletions(-) diff --git a/SimplexRPGEngine/Engine source/DragonRise3.project.gmx b/SimplexRPGEngine/Engine source/DragonRise3.project.gmx index f8c6f67a..61fa8d6f 100644 --- a/SimplexRPGEngine/Engine source/DragonRise3.project.gmx +++ b/SimplexRPGEngine/Engine source/DragonRise3.project.gmx @@ -1092,8 +1092,10 @@ objects\parNPC - objects\oBunny - objects\oRat + + objects\oBunny + objects\oRat + diff --git a/SimplexRPGEngine/Engine source/objects/oBunny.object.gmx b/SimplexRPGEngine/Engine source/objects/oBunny.object.gmx index 9695d965..0296bef5 100644 --- a/SimplexRPGEngine/Engine source/objects/oBunny.object.gmx +++ b/SimplexRPGEngine/Engine source/objects/oBunny.object.gmx @@ -44,18 +44,16 @@ fovRange = 128; //event_user(0); -life = 2; -mySpeed = 2; -docile = true; -myLife = life; -paces = 0; -canMove = true; +docile = true; +paces = 0; +canMove = true; horiSpeed = 0; vertSpeed = 0; -state = "idle"; -idleTimer = 1*room_speed; -face = 0; +state = "idle"; +idleTimer = 1 * room_speed; +face = 0; + @@ -167,102 +165,8 @@ y = floor(y); event_inherited(); if (sprite_index != noone) {draw_self();} if (hp <= 0) {image_alpha = 0;} -/* -// Draw FOV -if (dir == "d") {x2 = x + fovRange; y2 = y + fovRange; x3 = x + fovRange; y3 = y - fovRange;} -if (dir == "s") {x2 = x - fovRange; y2 = y + fovRange; x3 = x + fovRange; y3 = y + fovRange;} - -draw_triangle(x, y, x2, y2, x3, y3, true); -draw_circle(x, y, 64, true); - -draw_circle(tarX, tarY, 8, false); -//mp_grid_draw(grid); -if (x == xprevious && y == yprevious) - { - mp_grid_destroy(grid); - path_delete(path); - event_user(0); - } -*/ if (canMove) {scrSimpleAiStep(horiSpeed, vertSpeed, parSolid);} - -if (canMove) -{ -switch (state) - { - case ("idle"): - idleTimer--; - if (idleTimer <= 0) - state = "turn"; - break; - - case ("turn"): - if (irandom(1)) - horiSpeed = choose(-3, 3); - else - vertSpeed = choose(-3, 3); - paces = irandom_range(25, 50); - state = "move"; - break; - - case ("move"): - paces--; - if (x == xprevious) - && (y == yprevious) - || (paces <= 0) - state = "stop"; - break; - - case ("stop"): - horiSpeed = 0; - vertSpeed = 0; - state = "idle"; - idleTimer = 1*room_speed; - break; - - case ("stagger"): - staggerTimer--; - image_blend = merge_color(c_white, c_red, lengthdir_x(1, staggerTimer*15)); - if (staggerTimer <= 0) - { - image_blend = c_white; - state = "idle"; - beenHit = false; - if (myLife <= 0) - hide = true; - } - - // Do stagger - switch (face) - { - case (0): vertSpeed = staggerTimer/5; break; - case (1): vertSpeed = staggerTimer/5; break; - case (2): horiSpeed = staggerTimer/5; break; - case (3): horiSpeed = staggerTimer/5; break; - } - break; - } - -// Sprite and animation management -if (vertSpeed < 0) face = 0; -if (vertSpeed > 0) face = 1; -if (horiSpeed > 0) face = 2; -if (horiSpeed < 0) face = 3; -//SetSpriteFromFace(sprChickenWalkNorth, sprChickenWalkSouth, sprChickenWalkEast, sprChickenWalkWest); - - // Adjust animation phase cycle - if (face == 0) {if (image_index < 12 || image_index > 15) {image_index = 12;}} - if (face == 1) {if (image_index < 0 || image_index > 3.9) {image_index = 0;}} - if (face == 2) {if (image_index < 9 || image_index > 11.9) {image_index = 9;}} - if (face == 3) {if (image_index < 4 || image_index > 7.9) {image_index = 4;}} - -if (x != xprevious) -|| (y != yprevious) - image_speed = 0.15; -else - image_index = 0; -} diff --git a/SimplexRPGEngine/Engine source/objects/oRat.object.gmx b/SimplexRPGEngine/Engine source/objects/oRat.object.gmx index c018c34c..8f28a383 100644 --- a/SimplexRPGEngine/Engine source/objects/oRat.object.gmx +++ b/SimplexRPGEngine/Engine source/objects/oRat.object.gmx @@ -42,20 +42,15 @@ x3 = 0; y3 = 0; fovRange = 128; -//event_user(0); -life = 2; -mySpeed = 2; -docile = true; - -myLife = life; -paces = 0; -canMove = true; +docile = true; +paces = 0; +canMove = true; horiSpeed = 0; vertSpeed = 0; -state = "idle"; -idleTimer = 1*room_speed; -face = 0; +state = "idle"; +idleTimer = 1 * room_speed; +face = 0; @@ -138,108 +133,11 @@ event_user(0); 1 - x = floor(x); -y = floor(y); - -event_inherited(); + event_inherited(); if (sprite_index != noone) {draw_self();} if (hp <= 0) {image_alpha = 0;} -/* -// Draw FOV -if (dir == "d") {x2 = x + fovRange; y2 = y + fovRange; x3 = x + fovRange; y3 = y - fovRange;} -if (dir == "s") {x2 = x - fovRange; y2 = y + fovRange; x3 = x + fovRange; y3 = y + fovRange;} -draw_triangle(x, y, x2, y2, x3, y3, true); -draw_circle(x, y, 64, true); - -draw_circle(tarX, tarY, 8, false); -//mp_grid_draw(grid); - -if (x == xprevious && y == yprevious) - { - mp_grid_destroy(grid); - path_delete(path); - event_user(0); - } -*/ if (canMove) {scrSimpleAiStep(horiSpeed, vertSpeed, parSolid);} - -if (canMove) -{ -switch (state) - { - case ("idle"): - idleTimer--; - if (idleTimer <= 0) - state = "turn"; - break; - - case ("turn"): - if (irandom(1)) - horiSpeed = choose(-3, 3); - else - vertSpeed = choose(-3, 3); - paces = irandom_range(25, 50); - state = "move"; - break; - - case ("move"): - paces--; - if (x == xprevious) - && (y == yprevious) - || (paces <= 0) - state = "stop"; - break; - - case ("stop"): - horiSpeed = 0; - vertSpeed = 0; - state = "idle"; - idleTimer = 1*room_speed; - break; - - case ("stagger"): - staggerTimer--; - image_blend = merge_color(c_white, c_red, lengthdir_x(1, staggerTimer*15)); - if (staggerTimer <= 0) - { - image_blend = c_white; - state = "idle"; - beenHit = false; - if (myLife <= 0) - hide = true; - } - - // Do stagger - switch (face) - { - case (0): vertSpeed = staggerTimer/5; break; - case (1): vertSpeed = staggerTimer/5; break; - case (2): horiSpeed = staggerTimer/5; break; - case (3): horiSpeed = staggerTimer/5; break; - } - break; - } - -// Sprite and animation management -if (vertSpeed < 0) face = 0; -if (vertSpeed > 0) face = 1; -if (horiSpeed > 0) face = 2; -if (horiSpeed < 0) face = 3; -//SetSpriteFromFace(sprChickenWalkNorth, sprChickenWalkSouth, sprChickenWalkEast, sprChickenWalkWest); - - // Adjust animation phase cycle - if (face == 0) {if (image_index < 12 || image_index > 15) {image_index = 12;}} - if (face == 1) {if (image_index < 0 || image_index > 3.9) {image_index = 0;}} - if (face == 2) {if (image_index < 9 || image_index > 11.9) {image_index = 9;}} - if (face == 3) {if (image_index < 4 || image_index > 7.9) {image_index = 4;}} - -if (x != xprevious) -|| (y != yprevious) - image_speed = 0.15; -else - image_index = 0; -} diff --git a/SimplexRPGEngine/Engine source/objects/parEnemy.object.gmx b/SimplexRPGEngine/Engine source/objects/parEnemy.object.gmx index c6805c2b..8519e0ef 100644 --- a/SimplexRPGEngine/Engine source/objects/parEnemy.object.gmx +++ b/SimplexRPGEngine/Engine source/objects/parEnemy.object.gmx @@ -124,32 +124,6 @@ scrEnemyGetPosition(); scrEnemyGetDamage(); - - - - - - - - 1 - 603 - 7 - 0 - 0 - -1 - 2 - - - self - 0 - 0 - - - 1 - /// Return to last position - -scrEnemyCollision(self); - @@ -174,6 +148,15 @@ scrEnemyCollision(self); 1 /// Draw self +if (x > room_width - 32 || y > room_height - 32 || x < 32 || y < 32) + { + instance_set_position(xprevious, yprevious); + state = "turn"; + scrEnemyGetPosition(); + mood = "idle"; + } + + // Cutscenes if (timeline_running && (timeline_position > (timeline_max_moment(timeline_index) + global.cutsceneTime))) { diff --git a/SimplexRPGEngine/Engine source/rooms/mapTest.room.gmx b/SimplexRPGEngine/Engine source/rooms/mapTest.room.gmx index bf57070c..e54af9e5 100644 --- a/SimplexRPGEngine/Engine source/rooms/mapTest.room.gmx +++ b/SimplexRPGEngine/Engine source/rooms/mapTest.room.gmx @@ -462,6 +462,9 @@ + + + diff --git a/SimplexRPGEngine/Engine source/scripts/scrSimpleAiStep.gml b/SimplexRPGEngine/Engine source/scripts/scrSimpleAiStep.gml index ec3ed956..98f5b256 100644 --- a/SimplexRPGEngine/Engine source/scripts/scrSimpleAiStep.gml +++ b/SimplexRPGEngine/Engine source/scripts/scrSimpleAiStep.gml @@ -5,7 +5,10 @@ _hSpeed = argument0; _vSpeed = argument1; _obstacle = argument2; -// Do collision +x = floor(x); +y = floor(y); + +// Movement var _i, _move; for (_i=abs(_hSpeed); _i>0; _i--) { @@ -22,10 +25,91 @@ for (_i=abs(_vSpeed); _i>0; _i--) if !place_meeting(x+_i, y+_move, _obstacle) {x += _i/2;} } -// This is a fix for if the character wasn't able to move at least 1 whole pixel -if (abs(x-xprevious) < 1) -&& (abs(y-yprevious) < 1) +if (abs(x-xprevious) < 1) && (abs(y-yprevious) < 1) + { + x = xprevious; + y = yprevious; + } + +// Ai +switch (state) { - x = xprevious; - y = yprevious; + case ("idle"): + { + idleTimer--; + if (idleTimer <= 0) {state = "turn";} + break; + } + + case ("turn"): + { + if (irandom(1)) {horiSpeed = choose(-3, 3);} + else {vertSpeed = choose(-3, 3);} + paces = irandom_range(25, 50); + state = "move"; + break; + } + + case ("move"): + { + paces--; + if (x == xprevious) + && (y == yprevious) + || (paces <= 0) + state = "stop"; + break; + } + + case ("stop"): + { + horiSpeed = 0; + vertSpeed = 0; + state = "idle"; + idleTimer = 1*room_speed; + break; + } + + case ("stagger"): + { + staggerTimer--; + image_blend = merge_color(c_white, c_red, lengthdir_x(1, staggerTimer*15)); + if (staggerTimer <= 0) + { + image_blend = c_white; + state = "idle"; + beenHit = false; + } + + switch (face) + { + case (0): {vertSpeed = staggerTimer/5; break;} + case (1): {vertSpeed = staggerTimer/5; break;} + case (2): {horiSpeed = staggerTimer/5; break;} + case (3): {horiSpeed = staggerTimer/5; break;} + } + break; + } } + + +if (vertSpeed < 0) {face = 0;} +if (vertSpeed > 0) {face = 1;} +if (horiSpeed > 0) {face = 2;} +if (horiSpeed < 0) {face = 3;} + +if (face == 0) {if (image_index < 12 || image_index > 15) {image_index = 12;}} +if (face == 1) {if (image_index < 0 || image_index > 3.9) {image_index = 0;}} +if (face == 2) {if (image_index < 9 || image_index > 11.9) {image_index = 9;}} +if (face == 3) {if (image_index < 4 || image_index > 7.9) {image_index = 4;}} + +if (x != xprevious) || (y != yprevious) {image_speed = 0.15; } +else + { + image_speed = 0; + + if (image_index > 12 && image_index < 15) {image_index = 12;} + if (image_index > 0 && image_index < 3.9) {image_index = 0;} + if (image_index > 9 && image_index < 11.9) {image_index = 9;} + if (image_index > 4 && image_index < 7.9) {image_index = 4;} + } +