Come one, come all! Join the latest open community project! Submit your 1-to-2 floor dungeon for inclusion in the Community FrankenDungeon!
This project originated from a previous discussion on how a massive community dungeon could be done. Thread here: viewtopic.php?f=14&t=3300
It is being managed by HaunterV and myself based on ideas put forth by all of those involved in the original discussion thread, thanks to: Ancylus, antti, Belblindd, Blichew, Brodie301, Emciel, Ixnatifual, Komag, Lmaoboat, Montis, Neikun, sevenbirds, Shloogorgh, Shroom, SpacialKatana, SpiderFighter, Szragodesca, Whalefish
What is this project?
The Community FrankenDungeon is meant as mega-dungeon sutured together from a wide collection of submissions gathered from the Legend of Grimrock modding community. These pieces are made independently from each other, so the final product may have jarring theme changes. However, rules are established to guarantee a balanced leveling curve and cohesive progression.
Tiers
The purpose of dividing up all submissions among tiers is to allow them to be independently designed, but maintain the standard early-, mid-, late-game leveling curve. A submission should be designed for a specific tier.
The party can be expected to be at the same level as the tier number. For example, the party will be about level 5 when they reach tier 5. Do not expect the party to reach level 6 until tier 6.
Suggested Level (SL)
The Suggested Level (SL) is a rating I previously created to compare monsters and items for a balanced difficulty/progression curve. A monster/item SL is a close match for a party at that level.
This spreadsheet lists SL's for all LoG assets: https://docs.google.com/spreadsheet/ccc ... FBTNU16SGc
See Building Your Dungeon, Choosing Monsters and Loot for advice on how to utilize the SL rating.
The Hub Floor
The first floor of the CFD will serve several purposes:
- In-game introduction to Community FrankenDungeon 2012.
- As the Hub Floor, which can be returned to by casting a Scroll of Return.
- Warp zone to any unlocked floor. A floor is unlocked when it is first reached, or ahead of time when a password is entered on the hub floor keypad.
Scrolls of Return will be found throughout the CFD. They allow the player to return to the Hub Floor from any green level-entrance teleporter. The scroll is consumed upon use.
These items will be placed when the CFD is sutured together. The current plan is to have 1 Scroll of Return appear about every 3 floors. One of the lowest floors will contain the infinite-use Talisman of Return, allowing the player to move freely back and forth to the Hub Floor.
Q & A (extra info)
Yes! Think of this project as a showcase of the whole community. This can also be an opportunity to improve your skills with the whole community working along side you!
How large should my dungeon be?
There is no minimum length. But I would suggest building for quality instead of length.
This project is a showcase of community members and their work. If your dungeon takes 2 hours to beat, that's 2 hours before the player can see anyone else's work after yours; probably far too long. The whole completed work will probably be fairly large even if each piece is small.
The first tier or two will not have many different items/monsters to choose from. It may be hard to fill a large tradition-style dungeon floor with these limited assets.
Do I need to give all my placed objects unique ids?
Short answer: No, probably not.
Long answer: Maybe. It depends on whether I will be able to change them myself with regular expression find/replace commands. Since the Dungeon Editor generates only ids with an underscore followed by a number (_#), these are fairly easy to identify. If you name other things with a _# pattern or concatenate ids in your scripts, then you should give all your placed objects unique ids.
Suggested Method: my_object_#
where "my" is your own initials. Any id naming method is fine really, as long as it's unique.
Can I submit more than one dungeon?
If each submission brings something different to the table, yes, absolutely! Just be sure to pick tiers that are far apart, and use different themes and styles between your submissions.
If you flood submissions with many similar and lazy designs, only the best will be considered.
How will the submissions be arranged?
The tiers will remain in order, but the submissions within a tier will be arranged in a random order. A submission may be reassigned to a different tier than it was originally submitted for if it proves to be too easy or too difficult.
How will the CFD be released?
The current plan is to release the Community FrankenDungeon on Steam Workshop and Grimrock Nexus. The source code/assets will be zipped together and released publicly as well at or soon after the release of the dungeon. Great care will be taken to credit every piece to its original author.
Getting Started
These instructions are for everyone.
- Read the Submission Rules (see next section). Keep these in mind when you design your dungeon.
- Choose a tier.
- You may want to take a look at the Current Status Overview table, which shows the tiers already being worked on. Don't hesitate to pick a tier someone else is already working in. You dungeons will not conflict.
- View the SL (Suggested Level) values in this spreadsheet to get a fuzzy idea of what monsters/items should be in each tier. (Tier # = SL # = Party Level #)
https://docs.google.com/spreadsheet/ccc ... FBTNU16SGc
- Post in this thread. Let us know what tier you are working on so you can be added to the Overview table.
- Paste these scripts into your custom asset definitions .lua files.
(The first two can go in your monsters.lua and items.lua files respectively. The third should ideally go in a separate CFD.lua file which is then referenced from your init.lua file. If you don't know how to do this, just paste it into your objects.lua file.)
These scripts include objectClones of all monsters with XP scalers, objectClones of keys, and definitions for the level_entrance_teleporter and level_exit_teleporter:SpoilerShowCode: Select all
------------------------------------------------------------------ ------------------- CUSTOM MONSTER DEFINITIONS ------------------- --------------------------- (CFD 2012) --------------------------- ------------------------------------------------------------------ -- Please find/replace "my" with your own initials or nickname. -- ---------- You may set "xp_scale" to anything you like, ---------- ----- just be aware it will be changed later for balancing. ------ ------------------------------------------------------------------ xp_scale = 0.6 cloneObject{ name = "my_snail", baseObject = "snail", exp = 60 * xp_scale, } cloneObject{ name = "my_herder", baseObject = "herder", exp = 75 * xp_scale, } cloneObject{ name = "my_skeleton_warrior", baseObject = "skeleton_warrior", exp = 90 * xp_scale, } cloneObject{ name = "my_herder_small", baseObject = "herder_small", exp = 65 * xp_scale, } cloneObject{ name = "my_crowern", baseObject = "crowern", exp = 90 * xp_scale, } cloneObject{ name = "my_scavenger", baseObject = "scavenger", exp = 75 * xp_scale, } cloneObject{ name = "my_skeleton_archer", baseObject = "skeleton_archer", exp = 90 * xp_scale, } cloneObject{ name = "my_spider", baseObject = "spider", exp = 175 * xp_scale, } cloneObject{ name = "my_skeleton_patrol", baseObject = "skeleton_patrol", monsterType = "my_skeleton_warrior", } cloneObject{ name = "my_herder_swarm", baseObject = "herder_swarm", monsterType = "my_herder_small", } cloneObject{ name = "my_scavenger_swarm", baseObject = "scavenger_swarm", monsterType = "my_scavenger", } cloneObject{ name = "my_skeleton_archer_patrol", baseObject = "skeleton_archer_patrol", monsterType = "my_skeleton_archer", } cloneObject{ name = "my_green_slime", baseObject = "green_slime", exp = 190 * xp_scale, } cloneObject{ name = "my_wyvern", baseObject = "wyvern", exp = 90 * xp_scale, } cloneObject{ name = "my_herder_big", baseObject = "herder_big", exp = 95 * xp_scale, } cloneObject{ name = "my_tentacles", baseObject = "tentacles", exp = 320 * xp_scale, } cloneObject{ name = "my_shrakk_torr", baseObject = "shrakk_torr", exp = 195 * xp_scale, } cloneObject{ name = "my_crab", baseObject = "crab", exp = 450 * xp_scale, } cloneObject{ name = "my_uggardian", baseObject = "uggardian", exp = 500 * xp_scale, } cloneObject{ name = "my_ogre", baseObject = "ogre", exp = 750 * xp_scale, } cloneObject{ name = "my_ice_lizard", baseObject = "ice_lizard", exp = 675 * xp_scale, } cloneObject{ name = "my_warden", baseObject = "warden", exp = 750 * xp_scale, } cloneObject{ name = "my_goromorg", baseObject = "goromorg", exp = 1000 * xp_scale, }
Code: Select all
------------------------------------------------------------------ --------------------- CUSTOM KEY DEFINITIONS --------------------- --------------------------- (CFD 2012) --------------------------- ------------------------------------------------------------------ -- Please find/replace "my" with your own initials or nickname. -- ---- You may want to add a unique uiName so it won't be mixed ---- --------- up with other keys that have the same graphic. --------- ------------------------------------------------------------------ cloneObject{ name = "my_brass_key", baseObject = "brass_key", --uiName = "", } cloneObject{ name = "my_gear_key", baseObject = "gear_key", --uiName = "", } cloneObject{ name = "my_gold_key", baseObject = "gold_key", --uiName = "", } cloneObject{ name = "my_iron_key", baseObject = "iron_key", --uiName = "", } cloneObject{ name = "my_ornate_key", baseObject = "ornate_key", --uiName = "", } cloneObject{ name = "my_prison_key", baseObject = "prison_key", --uiName = "", } cloneObject{ name = "my_round_key", baseObject = "round_key", --uiName = "", }
Code: Select all
------------------------------------------------------------------ --------------- ENTRY/EXIT TELEPORTER DEFINITIONS ---------------- --------------------------- (CFD 2012) --------------------------- ------------------------------------------------------------------ --- Please place the entry teleporter at the beginning of your --- ---------- dungeon, and the exit teleporter at its end. ---------- ------ Uncheck "Emit Light" after placing these and add the ------ ----------- provided entry or exit light asset on top. ----------- ------------------------------------------------------------------ defineObject{ name = "level_entry_teleporter_light", class = "LightSource", lightPosition = vec(0, 1.5, 0), lightRange = 10, lightColor = vec(0.1, 0.9, 0.1), brightness = 9, castShadow = true, placement = "floor", editorIcon = 88, } cloneObject{ name = "level_entry_teleporter", baseObject = "teleporter", particleSystem = "teleporter_green", } defineParticleSystem{ name = "teleporter_green", emitters = { -- fog { emissionRate = 10, emissionTime = 0, maxParticles = 1000, boxMin = {-1.5, 0.0,-1.5}, boxMax = { 1.5, 3.0, 1.5}, sprayAngle = {0,360}, velocity = {0.1,1}, objectSpace = true, texture = "assets/textures/particles/fog.tga", lifetime = {3,3}, color0 = {0, 0.5, 0}, opacity = 1, fadeIn = 2, fadeOut = 2, size = {2, 2}, gravity = {0,0,0}, airResistance = 0.1, rotationSpeed = 0.3, blendMode = "Additive", }, -- stars { emissionRate = 200, emissionTime = 0, maxParticles = 1000, boxMin = {-1.5,-0.5,-1.5}, boxMax = { 1.5, 2.5, 1.5}, sprayAngle = {0,30}, velocity = {0.5,1.5}, objectSpace = true, texture = "assets/textures/particles/teleporter.tga", lifetime = {1,1}, color0 = {0, 2.8, 0}, opacity = 1, fadeIn = 0.1, fadeOut = 0.1, size = {0.1, 0.3}, gravity = {0,-1,0}, airResistance = 0.1, rotationSpeed = 2, blendMode = "Additive", }, -- small stars { emissionRate = 300, emissionTime = 0, maxParticles = 1000, boxMin = {-1.5,-0.5,-1.5}, boxMax = { 1.5, 2.5, 1.5}, sprayAngle = {0,30}, velocity = {0.5,1.0}, objectSpace = true, texture = "assets/textures/particles/teleporter.tga", lifetime = {1,1}, color0 = {0.5, 2, 0.5}, opacity = 1, fadeIn = 0.1, fadeOut = 0.1, size = {0.05, 0.1}, gravity = {0,-0.5,0}, airResistance = 0.1, rotationSpeed = 2, blendMode = "Additive", } } } defineObject{ name = "level_exit_teleporter_light", class = "LightSource", lightPosition = vec(0, 1.5, 0), lightRange = 10, lightColor = vec(0.9, 0, 0), brightness = 11, castShadow = true, placement = "floor", editorIcon = 88, } cloneObject{ name = "level_exit_teleporter", baseObject = "teleporter", particleSystem = "teleporter_red", } defineParticleSystem{ name = "teleporter_red", emitters = { -- fog { emissionRate = 10, emissionTime = 0, maxParticles = 1000, boxMin = {-1.5, 0.0,-1.5}, boxMax = { 1.5, 3.0, 1.5}, sprayAngle = {0,360}, velocity = {0.1,1}, objectSpace = true, texture = "assets/textures/particles/fog.tga", lifetime = {3,3}, color0 = {0.5, 0, 0}, opacity = 1, fadeIn = 2, fadeOut = 2, size = {2, 2}, gravity = {0,0,0}, airResistance = 0.1, rotationSpeed = 0.3, blendMode = "Additive", }, -- stars { emissionRate = 200, emissionTime = 0, maxParticles = 1000, boxMin = {-1.5, 0.5,-1.5}, boxMax = { 1.5, 3.5, 1.5}, sprayAngle = {150, 180}, velocity = {0.5,1.5}, objectSpace = true, texture = "assets/textures/particles/teleporter.tga", lifetime = {1,1}, color0 = {2.8, 0, 0}, opacity = 1, fadeIn = 0.1, fadeOut = 0.1, size = {0.1, 0.3}, gravity = {0,-1,0}, airResistance = 0.1, rotationSpeed = 2, blendMode = "Additive", }, -- small stars { emissionRate = 300, emissionTime = 0, maxParticles = 1000, boxMin = {-1.5, 0.5,-1.5}, boxMax = { 1.5, 3.5, 1.5}, sprayAngle = {150, 180}, velocity = {0.5,1.0}, objectSpace = true, texture = "assets/textures/particles/teleporter.tga", lifetime = {1,1}, color0 = {2, 0.5, 0.5}, opacity = 1, fadeIn = 0.1, fadeOut = 0.1, size = {0.05, 0.1}, gravity = {0,-0.5,0}, airResistance = 0.1, rotationSpeed = 2, blendMode = "Additive", } } }
- Place the entry teleporter at the beginning of your dungeon, and the exit teleporter at its end. They should not be used within your dungeon because the hub floor will warp only to the beginning of your dungeon.
- When you place a monster or a key, use your own cloned version. This prevents key conflicts and allows XP balancing later.
Advice for those who use monsters or loot in their dungeon. (Everyone?)
- Rule of thumb: Select monsters/loot for your dungeon from those with SL at or below your tier.
- In general, use your best judgement. I can't provide an SL for everything (there are many original assets out there), and the actual difficulty of a monster or usefulness of an item is very circumstantial. Design your dungeon for a party of level equal to your tier.
- For monsters: Stick strongly to SL ratings. Don't place a monster higher than your tier, or much lower. Keep in mind circumstantial advantage/disadvantages of the party or monster. You may get away with placing an SL 8 monster in tier 5, for example, if the layout heavily favors the party.
- For items:
- Weapons: Stick strongly to SL ratings. Weapon upgrades contribute heavily to a party's power. If you include any weapon with an SL higher than your tier, it'd better be very hard to find/obtain.
- Armor: Stick loosely to SL ratings. A single armor piece contributes little to a party's power. An armor set may have the same SL for all pieces, but they should not actually be found in the same tier. Pick some from lower SL's and a few from higher.
- Tomes: Be sparse with tomes or other things which can increase a champion's stats. There are very few in the original Legend of Grimrock dungeon. Perhaps you should flip a coin on whether to include 1 tome or none. And it's probably a good idea to not include any in the first few tiers.
- Other items: Try not to forget any one need. Include some food, alchemy ingredients, arrows, torches, bombs, spell scrolls, etc. Whatever you think a party of that level might need. But don't overdo it! It's better to supply a bit too little than a bit too much. Let a specialist player feel stressed while the versatile player makes do.
Instructions for those who script.
- Remember to use "self.level" instead of numbers for specifying a dungeon level! The dungeon levels will change when the submissions are compiled.
- In asset definitions .lua files call the .level property of an object on your dungeon level. For example:
- Place an empty script object and set the id to "my_dungeon"
- Reference your dungeon level with "my_dungeon.level"
- (use your own initials instead of "my")
- Do not override default assets. Use your own cloned versions.
- You may utilize the party hooks, but be careful not to interfere with others' scripts that do the same. These tips explain how to do it:
SpoilerShow
- Start with this predefined party definition. This will insure hook arguements will have the same names in everyone's code.
Code: Select all
------------------------------------------------------------------ -------------------- PARTY HOOKS DEFINITIONS --------------------- --------------------------- (CFD 2012) --------------------------- ------------------------------------------------------------------ ---- These insure the same hook arguement names for everyone. ---- ------ Please script so it does not interfere with others'. ------ ------------------------------------------------------------------ cloneObject{ name = "party", baseObject = "party", onMove = function(party, direction) end, onTurn = function(party, direction) end, onUseItem = function(champion, item, slot) end, onAttack = function(champion, weapon) end, onDamage = function(champion, amount, element) end, onProjectileHit = function(champion, projectile, amount, element) end, onDie = function(champion) end, onRest = function(party) end, onWakeUp = function(party) end, onReceiveCondition = function(champion, condition_name, condition_value) end, onCastSpell = function(champion, spell) end, onLevelUp = function(champion) end, onPickUpItem = function(party, item) end, }
- Write the contents of your hook so it will (A) only apply to your custom-defined assets, or (B) only apply on your dungeon level. Examples:
Code: Select all
onUseItem = function(champion, item, slot) if item.name == "my_mole_jerky" then hudPrint("MMMmmmm tasty!") end end,
Code: Select all
onMove = function(party, direction) if party.level == my_dungeon.level then hudPrint("tip toe") end end,
- Start with this predefined party definition. This will insure hook arguements will have the same names in everyone's code.
Rules
- Design to a specific tier.
- 1 to 2 floor dungeon.
- No pits on the lower floor. (A 1-floor dungeon should have no pits.)
- Use the provided entrance_teleporter and exit_teleporter at the beginning and exit of your dungeon.
- Keep the contents and scripts on your floor isolated from interfering with other's submissions.
- cloneObject the keys used in your dungeon so they cannot interfere with other's dungeons.
- cloneObject the monsters used in your dungeon so their XP values can be balanced by us after you submit.
- Submit a finished, tested, bug-free product. No WIP dungeons.
Fixes/changes may need to be made after you submit, which is fine. Just try to do the majority of the testing/polishing yourself ahead of time.
- Test your dungeon for bugs in preview mode and in-game. It is easier to fix bugs before you submit than after!
- Put the dungeon folder in your favorite compression/archive file format (.zip, .rar, .7z, .tar .gz, etc). We need your whole dungeon folder located at "Legend of Grimrock/Dungeons/YOUR_DUNGEON", not an exported .dat copy.
- Email it to CommunityFrankenDungeon@gmail.com
- Include in your email:
- Forum Name:
- Dungeon Name:
- Tier:
- Total Available XP:
- Any custom sources of XP (not from monsters or tomes)?
- Any encounters with an SL far above your tier? Are they still balanced? (e.g. A warden may work for a low-level flee sequence and still be balanced if it is clear the player does not have to kill the warden.)
- List of credits for all assets used in your dungeon. Include links if possible, especially to files obtained outside the LoG community.
- Other comments/questions/concerns?
- Follow up with any needed bug-fixes or adjustments.
Current Status
Overview
Item Build Upgrade Distribution