some fixes for new vccrun
[k8vacspelynky.git] / mapent / sfxobjs / cursetraps.vc
blob502413400c52f0819b187bddc43e2de25e44526e
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 class ObjTikiCurse : MapObject abstract;
21 bool activated;
22 bool monkey; // if trap was triggered by a monkey
25 // if not stolen, then it is activated by monkey
26 void activate (bool stolen) {
27   monkey = !stolen;
31 defaultproperties {
32   spectral = true;
33   active = false;
34   visible = false;
38 // ////////////////////////////////////////////////////////////////////////// //
39 class ObjTikiCurseBoulder['oTikiCurseTriggerBoulder'] : ObjTikiCurse;
41 bool sprung;
42 int boulderSpawnTime;
45 override bool initialize () {
46   if (!::initialize()) return false;
47   return true;
51 override void activate (bool stolen) {
52   if (activated) return;
53   monkey = !stolen;
54   activated = true;
55   active = true;
56   level.scrShake(100);
57   writeln("*** Boulder Trap Activated ***");
61 override void thinkFrame () {
62   //writeln("boo!");
63   if (--boulderSpawnTime == 0) {
64     auto headTile = MapTileGiantTikiHead(level.findNearestTile(ix, iy, delegate bool (MapTile t) { return (t isa MapTileGiantTikiHead); }));
65     if (headTile) {
66       headTile.breakIt();
67       auto obj = ObjBoulder(level.MakeMapTile(headTile.ix/16, headTile.iy/16, 'oBoulder'));
68       if (obj) obj.monkey = monkey;
69       playSound('sndThump');
70     }
71     instanceRemove();
72   }
76 override void drawWithOfs (int xpos, int ypos, int scale, float currFrameDelta) {
80 defaultproperties {
81   boulderSpawnTime = 100;
85 // ////////////////////////////////////////////////////////////////////////// //
86 class ObjTikiCurseRemoveBricks['oTikiCurseRemoveBricks'] : ObjTikiCurse;
89 override bool initialize () {
90   if (!::initialize()) return false;
91   return true;
95 override void activate (bool stolen) {
96   if (activated) return;
97   monkey = !stolen;
98   activated = true;
99   active = true;
100   level.scrShake(30);
104 override void thinkFrame () {
105   if (!monkey && global.cemetary && !level.ghostSpawned) {
106     level.spawnGhost();
107   }
109   //FIXME: rewrite this for several idols (???)
110   level.forEachTile(delegate bool (MapTile t) {
111     auto tt = MapTileLushTrapBlock(t);
112     if (tt) tt.activate();
113     return false;
114   }, castClass:MapTileLushTrapBlock);
116   // it has no reason to live anymore
117   instanceRemove();
121 override void drawWithOfs (int xpos, int ypos, int scale, float currFrameDelta) {
125 defaultproperties {
129 // ////////////////////////////////////////////////////////////////////////// //
130 class ObjTikiCurseCilingTrap['oTikiCurseCeilingTrap'] : ObjTikiCurse;
133 override bool initialize () {
134   if (!::initialize()) return false;
135   return true;
139 override void activate (bool stolen) {
140   if (activated) return;
141   monkey = !stolen;
142   activated = true;
143   active = true;
144   level.scrShake(30);
148 override void thinkFrame () {
149   //FIXME: rewrite this for several idols (???)
150   level.forEachTile(delegate bool (MapTile t) {
151     auto tt = MapTileCeilingTrap(t);
152     if (!tt) return false;
153     /* // this is for 4
154     if (tt.distanceToEntityCenter(level.player) < 90) {
155       tt.instanceRemove();
156     } else {
157       tt.activate();
158     }
159     */
160     tt.activate();
161     return false;
162   }, castClass:MapTileCeilingTrap);
164   level.scrShake(20);
166   // it has no reason to live anymore
167   instanceRemove();
171 override void drawWithOfs (int xpos, int ypos, int scale, float currFrameDelta) {
175 defaultproperties {