mirror of
https://github.com/KevinMidboe/linguist.git
synced 2025-10-29 09:40:21 +00:00
299 lines
8.4 KiB
Plaintext
299 lines
8.4 KiB
Plaintext
// Originally from /spelunky/Scripts/Level Generation/scrInitLevel.gml in the Spelunky Community Update Project
|
|
|
|
//
|
|
// scrInitLevel()
|
|
//
|
|
// Calls scrLevelGen(), scrRoomGen*(), and scrEntityGen() to build level.
|
|
//
|
|
|
|
/**********************************************************************************
|
|
Copyright (c) 2008, 2009 Derek Yu and Mossmouth, LLC
|
|
|
|
This file is part of Spelunky.
|
|
|
|
You can redistribute and/or modify Spelunky, including its source code, under
|
|
the terms of the Spelunky User License.
|
|
|
|
Spelunky is distributed in the hope that it will be entertaining and useful,
|
|
but WITHOUT WARRANTY. Please see the Spelunky User License for more details.
|
|
|
|
The Spelunky User License should be available in "Game Information", which
|
|
can be found in the Resource Explorer, or as an external file called COPYING.
|
|
If not, please obtain a new copy of Spelunky from <http://spelunkyworld.com/>
|
|
|
|
***********************************************************************************/
|
|
|
|
global.levelType = 0;
|
|
//global.currLevel = 16;
|
|
if (global.currLevel > 4 and global.currLevel < 9) global.levelType = 1;
|
|
if (global.currLevel > 8 and global.currLevel < 13) global.levelType = 2;
|
|
if (global.currLevel > 12 and global.currLevel < 16) global.levelType = 3;
|
|
if (global.currLevel == 16) global.levelType = 4;
|
|
|
|
if (global.currLevel <= 1 or
|
|
global.currLevel == 5 or
|
|
global.currLevel == 9 or
|
|
global.currLevel == 13)
|
|
{
|
|
global.hadDarkLevel = false;
|
|
}
|
|
|
|
// global.levelType = 3; // debug
|
|
|
|
// DEBUG MODE //
|
|
/*
|
|
if (global.currLevel == 2) global.levelType = 4;
|
|
if (global.currLevel == 3) global.levelType = 2;
|
|
if (global.currLevel == 4) global.levelType = 3;
|
|
if (global.currLevel == 5) global.levelType = 4;
|
|
*/
|
|
|
|
// global.levelType = 0;
|
|
|
|
global.startRoomX = 0;
|
|
global.startRoomY = 0;
|
|
global.endRoomX = 0;
|
|
global.endRoomY = 0;
|
|
oGame.levelGen = false;
|
|
|
|
// this is used to determine the path to the exit (generally no bombs required)
|
|
for (i = 0; i < 4; i += 1)
|
|
{
|
|
for (j = 0; j < 4; j += 1)
|
|
{
|
|
global.roomPath[i,j] = 0;
|
|
}
|
|
}
|
|
|
|
// side walls
|
|
if (global.levelType == 4)
|
|
k = 54;
|
|
else if (global.levelType == 2)
|
|
k = 38;
|
|
else if (global.lake)
|
|
k = 41;
|
|
else
|
|
k = 33;
|
|
for (i = 0; i <= 42; i += 1)
|
|
{
|
|
for (j = 0; j <= k; j += 1)
|
|
{
|
|
if (not isLevel())
|
|
{
|
|
i = 999;
|
|
j = 999;
|
|
}
|
|
else if (global.levelType == 2)
|
|
{
|
|
if (i*16 == 0 or
|
|
i*16 == 656 or
|
|
j*16 == 0)
|
|
{
|
|
obj = instance_create(i*16, j*16, oDark);
|
|
obj.invincible = true;
|
|
obj.sprite_index = sDark;
|
|
}
|
|
}
|
|
else if (global.levelType == 4)
|
|
{
|
|
if (i*16 == 0 or
|
|
i*16 == 656 or
|
|
j*16 == 0)
|
|
{
|
|
obj = instance_create(i*16, j*16, oTemple);
|
|
obj.invincible = true;
|
|
if (not global.cityOfGold) obj.sprite_index = sTemple;
|
|
}
|
|
}
|
|
else if (global.lake)
|
|
{
|
|
if (i*16 == 0 or
|
|
i*16 == 656 or
|
|
j*16 == 0 or
|
|
j*16 >= 656)
|
|
{
|
|
obj = instance_create(i*16, j*16, oLush); obj.sprite_index = sLush;
|
|
obj.invincible = true;
|
|
}
|
|
}
|
|
else if (i*16 == 0 or
|
|
i*16 == 656 or
|
|
j*16 == 0 or
|
|
j*16 >= 528)
|
|
{
|
|
if (global.levelType == 0) { obj = instance_create(i*16, j*16, oBrick); obj.sprite_index = sBrick; }
|
|
else if (global.levelType == 1) { obj = instance_create(i*16, j*16, oLush); obj.sprite_index = sLush; }
|
|
else { obj = instance_create(i*16, j*16, oTemple); if (not global.cityOfGold) obj.sprite_index = sTemple; }
|
|
obj.invincible = true;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (global.levelType == 2)
|
|
{
|
|
for (i = 0; i <= 42; i += 1)
|
|
{
|
|
instance_create(i*16, 40*16, oDark);
|
|
//instance_create(i*16, 35*16, oSpikes);
|
|
}
|
|
}
|
|
|
|
if (global.levelType == 3)
|
|
{
|
|
background_index = bgTemple;
|
|
}
|
|
|
|
global.temp1 = global.gameStart;
|
|
scrLevelGen();
|
|
|
|
global.cemetary = false;
|
|
if (global.levelType == 1 and rand(1,global.probCemetary) == 1) global.cemetary = true;
|
|
|
|
with oRoom
|
|
{
|
|
if (global.levelType == 0) scrRoomGen();
|
|
else if (global.levelType == 1)
|
|
{
|
|
if (global.blackMarket) scrRoomGenMarket();
|
|
else scrRoomGen2();
|
|
}
|
|
else if (global.levelType == 2)
|
|
{
|
|
if (global.yetiLair) scrRoomGenYeti();
|
|
else scrRoomGen3();
|
|
}
|
|
else if (global.levelType == 3) scrRoomGen4();
|
|
else scrRoomGen5();
|
|
}
|
|
|
|
global.darkLevel = false;
|
|
//if (not global.hadDarkLevel and global.currLevel != 0 and global.levelType != 2 and global.currLevel != 16 and rand(1,1) == 1)
|
|
if (not global.hadDarkLevel and not global.noDarkLevel and global.currLevel != 0 and global.currLevel != 1 and global.levelType != 2 and global.currLevel != 16 and rand(1,global.probDarkLevel) == 1)
|
|
{
|
|
global.darkLevel = true;
|
|
global.hadDarkLevel = true;
|
|
//instance_create(oPlayer1.x, oPlayer1.y, oFlare);
|
|
}
|
|
|
|
if (global.blackMarket) global.darkLevel = false;
|
|
|
|
global.genUdjatEye = false;
|
|
if (not global.madeUdjatEye)
|
|
{
|
|
if (global.currLevel == 2 and rand(1,3) == 1) global.genUdjatEye = true;
|
|
else if (global.currLevel == 3 and rand(1,2) == 1) global.genUdjatEye = true;
|
|
else if (global.currLevel == 4) global.genUdjatEye = true;
|
|
}
|
|
|
|
global.genMarketEntrance = false;
|
|
if (not global.madeMarketEntrance)
|
|
{
|
|
if (global.currLevel == 5 and rand(1,3) == 1) global.genMarketEntrance = true;
|
|
else if (global.currLevel == 6 and rand(1,2) == 1) global.genMarketEntrance = true;
|
|
else if (global.currLevel == 7) global.genMarketEntrance = true;
|
|
}
|
|
|
|
////////////////////////////
|
|
// ENTITY / TREASURES
|
|
////////////////////////////
|
|
global.temp2 = global.gameStart;
|
|
if (not isRoom("rTutorial") and not isRoom("rLoadLevel")) scrEntityGen();
|
|
|
|
if (instance_exists(oEntrance) and not global.customLevel)
|
|
{
|
|
oPlayer1.x = oEntrance.x+8;
|
|
oPlayer1.y = oEntrance.y+8;
|
|
}
|
|
|
|
if (global.darkLevel or
|
|
global.blackMarket or
|
|
global.snakePit or
|
|
global.cemetary or
|
|
global.lake or
|
|
global.yetiLair or
|
|
global.alienCraft or
|
|
global.sacrificePit or
|
|
global.cityOfGold)
|
|
{
|
|
if (not isRoom("rLoadLevel"))
|
|
{
|
|
with oPlayer1 { alarm[0] = 10; }
|
|
}
|
|
}
|
|
|
|
if (global.levelType == 4) scrSetupWalls(864);
|
|
else if (global.lake) scrSetupWalls(656);
|
|
else scrSetupWalls(528);
|
|
|
|
// add background details
|
|
if (global.graphicsHigh)
|
|
{
|
|
repeat(20)
|
|
{
|
|
// bg = instance_create(16*rand(1,42), 16*rand(1,33), oCaveBG);
|
|
if (global.levelType == 1 and rand(1,3) < 3)
|
|
tile_add(bgExtrasLush, 32*rand(0,1), 0, 32, 32, 16*rand(1,42), 16*rand(1,33), 10002);
|
|
else if (global.levelType == 2 and rand(1,3) < 3)
|
|
tile_add(bgExtrasIce, 32*rand(0,1), 0, 32, 32, 16*rand(1,42), 16*rand(1,33), 10002);
|
|
else if (global.levelType == 3 and rand(1,3) < 3)
|
|
tile_add(bgExtrasTemple, 32*rand(0,1), 0, 32, 32, 16*rand(1,42), 16*rand(1,33), 10002);
|
|
else
|
|
tile_add(bgExtras, 32*rand(0,1), 0, 32, 32, 16*rand(1,42), 16*rand(1,33), 10002);
|
|
}
|
|
}
|
|
|
|
oGame.levelGen = true;
|
|
|
|
// generate angry shopkeeper at exit if murderer or thief
|
|
if ((global.murderer or global.thiefLevel > 0) and isRealLevel())
|
|
{
|
|
with oExit
|
|
{
|
|
if (type == "Exit")
|
|
{
|
|
obj = instance_create(x, y, oShopkeeper);
|
|
obj.status = 4;
|
|
}
|
|
}
|
|
// global.thiefLevel -= 1;
|
|
}
|
|
|
|
with oTreasure
|
|
{
|
|
if (collision_point(x, y, oSolid, 0, 0))
|
|
{
|
|
obj = instance_place(x, y, oSolid);
|
|
if (obj.invincible) instance_destroy();
|
|
}
|
|
}
|
|
|
|
with oWater
|
|
{
|
|
if (sprite_index == sWaterTop or sprite_index == sLavaTop)
|
|
{
|
|
scrCheckWaterTop();
|
|
}
|
|
/*
|
|
obj = instance_place(x-16, y, oWater);
|
|
if (instance_exists(obj))
|
|
{
|
|
if (obj.sprite_index == sWaterTop or obj.sprite_index == sLavaTop)
|
|
{
|
|
if (type == "Lava") sprite_index = sLavaTop;
|
|
else sprite_index = sWaterTop;
|
|
}
|
|
}
|
|
obj = instance_place(x+16, y, oWater);
|
|
if (instance_exists(obj))
|
|
{
|
|
if (obj.sprite_index == sWaterTop or obj.sprite_index == sLavaTop)
|
|
{
|
|
if (type == "Lava") sprite_index = sLavaTop;
|
|
else sprite_index = sWaterTop;
|
|
}
|
|
}
|
|
*/
|
|
}
|
|
|
|
global.temp3 = global.gameStart;
|