mattock fixes: web blocks brick crushing; don't make hit sound if mattock hits no...
[k8vacspelynky.git] / mapent / items / decorum.vc
blobf74ca33e79bad3cbad2e907e7906ffd599115b74
1 /**********************************************************************************
2  * Copyright (c) 2008, 2009 Derek Yu and Mossmouth, LLC
3  * Copyright (c) 2010, Moloch
4  * Copyright (c) 2018, Ketmar Dark
5  *
6  * This file is part of Spelunky.
7  *
8  * You can redistribute and/or modify Spelunky, including its source code, under
9  * the terms of the Spelunky User License.
10  *
11  * Spelunky is distributed in the hope that it will be entertaining and useful,
12  * but WITHOUT WARRANTY.  Please see the Spelunky User License for more details.
13  *
14  * The Spelunky User License should be available in "Game Information", which
15  * can be found in the Resource Explorer, or as an external file called COPYING.
16  * If not, please obtain a new copy of Spelunky from <http://spelunkyworld.com/>
17  *
18  **********************************************************************************/
19 // web
20 //TODO: laser and water should destory it too!
21 class ItemWeb['oWeb'] : MapItem;
24 override bool initialize () {
25   if (!::initialize()) return false;
26   setSprite('sWeb');
27   return true;
31 // return `true` if tile was exploded
32 override bool onExplosionTouch (MapObject xplo) {
33   instanceRemove();
34   return true;
38 // return `false` to do standard weapon processing
39 override bool onTouchedByPlayerWeapon (PlayerPawn plr, PlayerWeapon wpn) {
40   life -= wpn.webDamage;
41   wpn.hitEnemy = true;
42   return false;
46 override void thinkFrame () {
47   imageAlpha = life/1200.0; //trunc(255-255.0*(life/1200.0));
48   if (dying) life -= 2; //0.02;
49   if (life <= 1) { instanceRemove(); return; }
51   if (isInstanceAlive && !spectral) {
52     spectral = true;
53     level.forEachObjectInRect(x0, y0, width, height, &doObjectColAction);
54     spectral = false;
55   }
59 override bool doObjectColAction (MapObject o) {
60   if (!isInstanceAlive) return true; // stop it, we are dead anyway
62   if (o isa MapItem) {
63     if (!o.collidesWith(self)) return false;
64     if (o.heldBy || o isa ItemRopeThrow || o isa ItemRopeTop) return false;
65     if (fabs(o.xVel) > 1) {
66       o.xVel *= 0.2;
67       if (!dying && global.config.enemyBreakWeb) tear(0.1);
68     } else {
69       o.xVel = 0;
70     }
72     if (fabs(o.yVel) > 1) {
73       o.yVel *= 0.2;
74       if (!dying && global.config.enemyBreakWeb) tear(0.1);
75     } else {
76       o.yVel = 0;
77     }
79     //!!!if (other.type == "Flare") life -= 0.5;
81     //other.xVel = 0;
82     //other.yVel = 0;
83     return false;
84   }
86   //return ::doObjectColAction(o);
87   return false;
91 void tear (float amount) {
92   if (amount <= 0) return;
93   life -= trunc(amount*100);
97 defaultproperties {
98   objName = 'Web';
99   desc = "Web";
100   desc2 = "A sticky silk web.";
101   setCollisionBounds(0, 0, 16, 16);
102   life = 1200;
103   flying = true;
107 // ////////////////////////////////////////////////////////////////////////// //
108 // bones
109 class ItemBones['oBones'] : MapItem;
112 override bool initialize () {
113   if (!::initialize()) return false;
114   setSprite('sBonesLeft');
115   return true;
119 override void thinkFrame () {
120   if (!isCollisionAtPoint(ix+8, iy+16)) {
121     shiftY(yVel);
122     yVel += yAcc;
123   }
125   if (isCollisionAtPoint(ix+8, iy+15)) {
126     shiftY(-1);
127     yVel = 0;
128   }
132 defaultproperties {
133   objName = 'Bone Pile';
134   desc = "Bone Pile";
135   desc2 = "A pile of bones.";
136   setCollisionBounds(0, 0, 16, 16); // means nothing
137   //yAcc = 0.2; k8:???
141 // ////////////////////////////////////////////////////////////////////////// //
142 // fake bones
143 class ItemFakeBones['oFakeBones'] : MapItem;
144 //class ItemFakeBones['oFakeBones'] : replaces(ItemBones);
146 bool raisingSkeleton;
149 override bool initialize () {
150   if (!::initialize()) return false;
151   setSprite('sFakeBonesLeft');
152   writeln("*** FAKE BONES CREATED");
153   return true;
157 override void onAnimationLooped () {
158   if (raisingSkeleton) {
159     // animation complete, raise it
160     //writeln("*** FAKE BONES RAISING: COMPLETE");
161     level.MakeMapObject(ix, iy, 'oSkeleton');
162     instanceRemove();
163   }
167 override void thinkFrame () {
168   if (!isCollisionAtPoint(ix+8, iy+16)) {
169     shiftY(yVel);
170     yVel += yAcc;
171   }
173   if (isCollisionAtPoint(ix+8, iy+15)) {
174     shiftY(-1);
175     yVel = 0;
176   }
178   if (level.player && !level.player.dead && !raisingSkeleton) {
179     if (abs(level.player.iy-(iy+8)) < 8 && abs(level.player.ix-(ix+8)) < 64) {
180       //writeln("*** FAKE BONES RAISING: STARTED");
181       //sprite_index = sSkeletonCreateL;
182       // this resets `imageLoopCount`
183       setSprite('sSkeletonCreateL');
184       raisingSkeleton = true;
185     }
186   }
190 defaultproperties {
191   objName = 'Bone Pile';
192   desc = "Bone Pile";
193   desc2 = "A pile of angry bones.";
194   setCollisionBounds(0, 0, 16, 16); // means nothing
195   //yAcc = 0.2; k8:???
196   //yAcc = 0.2;
197   imageSpeed = 1;