thrown enemies now does damage
[k8vacspelynky.git] / mapent / enemies / alien.vc
blobf682a52e4c4849d0a195ee2cabc7cc075f5e9691
1 /**********************************************************************************
2  * Copyright (c) 2008, 2009 Derek Yu and Mossmouth, LLC
3  * Copyright (c) 2018, Ketmar Dark
4  *
5  * This file is part of Spelunky.
6  *
7  * You can redistribute and/or modify Spelunky, including its source code, under
8  * the terms of the Spelunky User License.
9  *
10  * Spelunky is distributed in the hope that it will be entertaining and useful,
11  * but WITHOUT WARRANTY.  Please see the Spelunky User License for more details.
12  *
13  * The Spelunky User License should be available in "Game Information", which
14  * can be found in the Resource Explorer, or as an external file called COPYING.
15  * If not, please obtain a new copy of Spelunky from <http://spelunkyworld.com/>
16  *
17  **********************************************************************************/
18 class EnemyAlien['oAlien'] : MapEnemy;
21 override bool initialize () {
22   if (!::initialize()) return false;
23   setSprite('sAlien');
24   dir = global.randOther(0, 1);
25   return true;
29 // ////////////////////////////////////////////////////////////////////////// //
30 override void thinkFrame () {
31   ::thinkFrame();
32   if (!isInstanceAlive) return;
34   moveRel(xVel, yVel);
35   //done in basic hanler: if (collision_point(x+8, y+8, oSolid, 0, 0)) hp = 0;
37   /+done in basic hanler:
38   if (hp &lt; 1) {
39     scrCreateBlood(x+8, y+8, 3);
40     if (countsAsKill) {
41       if (isRealLevel()) global.enemyKills[15] += 1;
42       global.aliens += 1;
43       global.kills += 1;
44     }
45     instance_destroy();
46   }
47   +/
49   yVel = fmin(yVel+0.6, 42.0);
51   int x = ix, y = iy;
53   if (isCollisionBottom(1) && status != STUNNED) yVel = 0;
55   if (status == IDLE) {
56     if (counter > 0) --counter;
57     if (counter == 0) {
58       dir = global.randOther(0, 1);
59       status = WALK;
60     }
61   } else if (status == WALK) {
62     if (isCollisionRight(1)) dir = Dir.Left;
63     if (isCollisionLeft(1)) dir = Dir.Right;
64     if (dir == Dir.Left && !level.isSolidAtPoint(x-1, y) && !level.isSolidAtPoint(x-1, y+16)) {
65       dir = Dir.Right;
66     } else if (dir == Dir.Right && !level.isSolidAtPoint(x+16, y) && !level.isSolidAtPoint(x+16, y+16)) {
67       dir = Dir.Left;
68     }
70     if ((!level.isSolidAtPoint(x-1, y+16) || level.isSolidAtPoint(x-1, y)) &&
71         (!level.isSolidAtPoint(x+16, y+16) || level.isSolidAtPoint(x+16, y)))
72     {
73       dir = (level.isSolidAtPoint(x-1, y) ? Dir.Right : Dir.Left);
74       xVel = 0;
75     } else if (dir == Dir.Left) {
76       xVel = -1;
77     } else {
78       xVel = 1;
79     }
81     if (global.randOther(1, 100) == 1) {
82       status = IDLE;
83       counter = global.randOther(20, 50);
84       xVel = 0;
85     }
86   }
87   //if (isCollisionSolid()) y -= 2; // in the original
91 defaultproperties {
92   objName = 'Alien';
93   desc = "Alien";
94   desc2 = "A hostile and intelligent extraterrestrial being.";
96   setCollisionBounds(2, 6, 14, 16);
97   xVel = 2.5;
98   imageSpeed = 0.5;
100   yVelLimit = 6; // YASM 1.7
102   // stats
103   hp = 1;
104   invincible = 0;
106   // status
107   status = IDLE;
109   dir = Dir.Right;
111   bloodless = false;
112   bloodLeft = 1;
114   doBasicPhysics = false;
115   countsAsKill = true;
116   leavesBody = false; // default processing
117   checkInsideBlock = true;
118   allowWaterProcessing = true;
120   depth = 60;