objects/oLevel/step.gml
From spelunky.gmk, Spelunky Classic 1.1's source, © 2008, 2009 Derek Yu and Mossmouth, LLC, shown whole under the Spelunky User License v1.1b. Extracted by spelunky.ai's tools, an unofficial fan project, one file per script or event; the // ==== lines are the extractor's, naming each action of the event. Some scripts are others' work that Derek Yu credits in the source's readme.txt: Martin Piecyk's platform engine, ChevyRay's view scaling scripts and tsg1zzn's Super Sound System.
oLevel's step event, 137 lines of GML.
if (musicFade and musicFadeTimer < 100){ scrMusicFade(); musicFadeTimer += 1;}if (view_enabled){ // shake the screen if (global.shake > 0) { if (oPlayer1.y < 96 or oPlayer1.y > room_height-96) view_vborder[0] = 0; else view_vborder[0] = 96; if (global.shakeToggle or view_yview[0] <= 0) { view_yview += 3; global.shakeToggle = false; } else if (not global.shakeToggle or view_yview[0] >= room_height - view_hview[0]) { view_yview -= 3; global.shakeToggle = true; } global.shake -= 1; } else { view_vborder[0] = 96; } /* if (global.shake > 0) { if (oPlayer1.y < 240-96 or oPlayer1.y > room_height-144) view_vborder[0] = 0; else view_vborder[0] = 96; //view_xview[0] = view_xview[0] + rand(0,3) - rand(0,3); if (global.shakeToggle) { // if (view_yview[0] >= room_height - view_hview[0]) view_yview[0] = 304; // global.yviewPrev = view_yview[0]; global.yShakeDiff = rand(1,3); view_yview[0] = view_yview[0] + global.yShakeDiff; } else { view_yview[0] = view_yview[0] - global.yShakeDiff; } global.shake -= 1; global.shakeToggle = not global.shakeToggle; } else { global.shakeToggle = false; global.yShakeDiff = 0; view_vborder[0] = 96; } */ /* if (global.levelType != 2) { if (view_yview[0] + view_hview[0] > 560) view_yview[0] = 560; } */ offset = 96; // deactivate all instances outside the region // this is to prevent water from only getting drained partway with oWater { if (x+8 < view_xview[0]-96 or x+8 > view_xview[0]+view_wview[0]+96 or y+8 < view_yview[0]-96 or y+8 > view_yview[0]+view_hview[0]+96) { checked = false; } } instance_deactivate_region(view_xview[0]-offset, view_yview[0]-offset, view_wview[0]+offset*2, view_hview[0]+offset*2, false, true); // activate all instances inside the region instance_activate_region(view_xview[0]-offset, view_yview[0]-offset, view_wview[0]+offset*2, view_hview[0]+offset*2, true); // activate all important instances // instance_activate_object(oSolid); // instance_activate_object(oWater); instance_activate_object(oCharacter); instance_activate_object(oRope); instance_activate_object(oRopeThrow); instance_activate_object(oRopeTop); // instance_activate_object(oOlmec); instance_activate_object(oGame); instance_activate_object(oGlobals); instance_activate_object(oScreen); instance_activate_object(oGamepad); instance_activate_object(oExplosion); instance_activate_object(oGhost); instance_activate_object(oFinalBoss); if (instance_exists(oPlayer1)) instance_activate_region(oPlayer1.x-16, oPlayer1.y-16, oPlayer1.x+16, oPlayer1.y+16, true); instance_activate_object(oBoulder); if (instance_exists(oBoulder)) instance_activate_region(oBoulder.x-32, oBoulder.y-32, 64, 64, true); instance_activate_object(oOlmec); if (instance_exists(oOlmec)) instance_activate_region(oOlmec.x-16, oOlmec.y-16, 96, 96, true); /* with oCaveTop { if (not collision_point(x, y+16, oBrick, 0, 0)) instance_destroy(); } with oLushTop { if (not collision_point(x, y+16, oLush, 0, 0)) instance_destroy(); } with oDarkTop { if (not collision_point(x, y+16, oDark, 0, 0)) instance_destroy(); } with oTempleTop { if (not collision_point(x, y+16, oTemple, 0, 0)) instance_destroy(); } with oIceBottom { if (not collision_point(x, y-16, oIce, 0, 0)) instance_destroy(); } */}// darknessif (global.darkLevel){ // darkness = 0 : lightest // darkness = 1 : darkest dist = 160; if (global.hasCrown) dist = 0; else if (instance_exists(oFlare)) { flare = instance_nearest(oPlayer1.x, oPlayer1.y, oFlare); dist = flare.distToPlayer; } if (oPlayer1.distToNearestLightSource < 200 and oPlayer1.distToNearestLightSource < dist) { dist = oPlayer1.distToNearestLightSource; } if (dist == 0) darkness = 0; else darkness = dist / 160; if (global.darknessLerp > 0) { darkness = global.darknessLerp; global.darknessLerp -= 0.1; } if (darkness > 0.9) darkness = 0.9;}