restored seaweed in water
[k8vacspelynky.git] / mapent / sfxobjs / cursetraps.vc
blob677de4f55482a07d8b28595bcf7133509303c3eb
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 ObjTikiCurse : MapObject abstract;
20 bool activated;
21 bool monkey; // if trap was triggered by a monkey
24 // if not stolen, then it is activated by monkey
25 void activate (bool stolen) {
26   monkey = !stolen;
30 defaultproperties {
31   spectral = true;
32   active = false;
33   visible = false;
37 // ////////////////////////////////////////////////////////////////////////// //
38 class ObjTikiCurseBoulder['oTikiCurseTriggerBoulder'] : ObjTikiCurse;
40 bool sprung;
41 int boulderSpawnTime;
44 override bool initialize () {
45   if (!::initialize()) return false;
46   return true;
50 override void activate (bool stolen) {
51   if (activated) return;
52   monkey = !stolen;
53   activated = true;
54   active = true;
55   level.scrShake(100);
56   writeln("*** Boulder Trap Activated ***");
60 override void thinkFrame () {
61   //writeln("boo!");
62   if (--boulderSpawnTime == 0) {
63     auto headTile = MapTileGiantTikiHead(level.findNearestTile(ix, iy, delegate bool (MapTile t) { return (t isa MapTileGiantTikiHead); }));
64     if (headTile) {
65       headTile.breakIt();
66       auto obj = ObjBoulder(level.MakeMapTile(headTile.ix/16, headTile.iy/16, 'oBoulder'));
67       if (obj) obj.monkey = monkey;
68       playSound('sndThump');
69     }
70     instanceRemove();
71   }
75 override void drawWithOfs (int xpos, int ypos, int scale, float currFrameDelta) {
79 defaultproperties {
80   boulderSpawnTime = 100;
84 // ////////////////////////////////////////////////////////////////////////// //
85 class ObjTikiCurseRemoveBricks['oTikiCurseRemoveBricks'] : ObjTikiCurse;
88 override bool initialize () {
89   if (!::initialize()) return false;
90   return true;
94 override void activate (bool stolen) {
95   if (activated) return;
96   monkey = !stolen;
97   activated = true;
98   active = true;
99   level.scrShake(30);
103 override void thinkFrame () {
104   if (!monkey && global.cemetary && !level.ghostSpawned) {
105     level.spawnGhost();
106   }
108   //FIXME: rewrite this for several idols (???)
109   level.forEachTile(delegate bool (MapTile t) {
110     auto tt = MapTileLushTrapBlock(t);
111     if (tt) tt.activate();
112     return false;
113   }, castClass:MapTileLushTrapBlock);
115   // it has no reason to live anymore
116   instanceRemove();
120 override void drawWithOfs (int xpos, int ypos, int scale, float currFrameDelta) {
124 defaultproperties {
128 // ////////////////////////////////////////////////////////////////////////// //
129 class ObjTikiCurseCilingTrap['oTikiCurseCeilingTrap'] : ObjTikiCurse;
132 override bool initialize () {
133   if (!::initialize()) return false;
134   return true;
138 override void activate (bool stolen) {
139   if (activated) return;
140   monkey = !stolen;
141   activated = true;
142   active = true;
143   level.scrShake(30);
147 override void thinkFrame () {
148   //FIXME: rewrite this for several idols (???)
149   level.forEachTile(delegate bool (MapTile t) {
150     auto tt = MapTileCeilingTrap(t);
151     if (!tt) return false;
152     /* // this is for 4
153     if (tt.distanceToEntityCenter(level.player) < 90) {
154       tt.instanceRemove();
155     } else {
156       tt.activate();
157     }
158     */
159     tt.activate();
160     return false;
161   }, castClass:MapTileCeilingTrap);
163   level.scrShake(20);
165   // it has no reason to live anymore
166   instanceRemove();
170 override void drawWithOfs (int xpos, int ypos, int scale, float currFrameDelta) {
174 defaultproperties {