Jump to content
The Dark Mod Forums

Leaderboard


Popular Content

Showing content with the highest reputation since 05/03/20 in all areas

  1. 9 points
    Two pics from the next William Steele mission, entitled Baleford Museum.
  2. 8 points
    After a considerable amount of time and work by a group effort, while betatesting was mostly on hold, a new beta build has been uploaded today. The FM has been improved & completed in all kinds of areas (such as overall presentation, readables, voiceovers, execution of the main story and new secret locations), and now the time has come to resume testing. Both new and returning betatesters would be very welcome. In fact, quite a few new betatesters may be needed as it's been a while since the last build. Here's another link to the Discord server: https://discord.gg/fP32yEn"
  3. 7 points
    I have a nice, 2TB storage dedicated server I can put to use as a mirror if necessary. It's US based and should be able serve everything pretty quickly. Is there a need for another mirror to host missions and game files at this time?
  4. 5 points
    Hi guys, Beta Testing of HH:TLC shall begin latest at the end of next week. The map size is ca. 80% of HH:I, and depending on play style it should take ca. three/four hours to complete the mission. Please sign up here if you want to help. In case you don't want to help, then sign up here as well, and I will ask grayman for divine punishment for all of those who do not work to the will of the Builder! Jack
  5. 5 points
    I've gotten around this by providing an alternate source of information. For example, at the start of Somewhere Above the City, the drunk guard is there to provide you with background and objectives. If you like to blackjack guards, and you do so before he completes his monologue, there's a piece of paper on his table that provides the same information.
  6. 5 points
    Heyo, I was asked if I would do a familiariisation of Dark Radiant for new mappers, so they can quickly learn what's what in DR and how to use it. It's not a mapping tutorial, but more just a get familiar with DR. It'd be good if this is useful, if it would be stickied so it's always available for new mappers. Springheels,Sothas, and Fidcals tutorials are all in the description of the video.
  7. 5 points
    beta208-06 has been released. The list of changes is provided in its usual place. Remember that you must download tdm_mirrors.txt again from the link in the original post before running tdm_update. The bloom parameters have been tweaked. It is strongly recommended to reset them to new defaults after update. One way to achieve that is deleting darkmod.cfg (full config reset). Another way is to find and delete all lines conaining r_bloom in darkmod.cfg (7 lines/cvars).
  8. 5 points
    Hey, here is a little note-to-self/funny tidbit of note. Nbohr1more alerted me earlier to the presence of r_testSpecularFix in the beta thread and I've been checking out the differences intermittently while testing for other stuff. Overall it does look a bit poorer, there's less fresnels to go around, but it's definitely better math, metal is actually shiny now more often than not. Anyway, point being I was going through some of my old WIPs for testing now and I noticed a very stupid trick that the fix broke that I thought you'd get a kick out of seeing. I was making a glass material a long time ago that was basically a heathazewithdepth.vpf stage with a blend filter for the color of the glass afterwards and no need for a diffusemap. Consequently, I seem to remember that I couldn't make regular lights reflect off it, it seemed to need a diffusemap for that purpose. I ingeniously set up this code block: { blend diffusemap map _black rgb 8 } What it did was miraculously make specular work without the need of a specularmap keyword to be defined, and upping the rgb (to 8 and above) made it factor the lights more strongly. I loaded this map tonight and I saw that the specular practically disappeared between r_testSpecularFix 0 and 1. I dug in and realized that the mere rgb factor on the diffusemap used to bump the specular and that furthermore that was the reason I couldn't get the specularmap keyword to work without a diffusemap in hand. I reformatted it like this now and it works the same: { blend specularmap map _white rgb 1 } Here are screenshots of the difference that having a specular makes on this particular surface, for illustration: I managed to notice it now and I don't think anybody else uses this trick in their maps (even I don't anymore), but I think it's a very good abject example of exactly how this got fixed
  9. 4 points
    Went from 7Mbps ADSL to this. I had this just a few hours ago: So hard right now.
  10. 4 points
    @STRUNK, @grayman, I think I figured it out after some more experimenting... turns out my towers were worldspawn, and apparently when a speaker is embedded within a brush it behaves in this peculiar way. Learn something new every day I guess ^^
  11. 4 points
    Indeed, I think it's mostly practical reasons. First you need to recruit enough voice actors (1 for the player/briefing, at least 2 for a dialogue between NPCs), and ideally they should sound similar to one of the existing vocal sets. Usually you get multiple takes, among which you need to pick the best for each line (or ask for more takes if none of them hit the mark) and then edit & split up the recording into individual files for each line. Then each file needs to be setup as a sound shader, and each sound shader needs to be referenced by name in the conversation editor. And of course you need an idea for what should be said in the first place. A lot of steps/hurdles on top of all the other mapping work, but I agree that it does add much to the immersion and storytelling. Missions which have voiced lines, off the top of my head: The Painter's Wife, aka the Bikerdude/Shadowhide city FM, which has re-entered beta a couple days ago, has been upgraded with a lot of voiceovers and a voiced briefing recently. Basically all Goldwell missions, no doubt aided by the fact he's a talented voice actor himself with good contacts in the Thief FM voice acting scene. Volta missions I used several scripted dialogues in Down by the Riverside. I didn't use them in One Step Too Far, my first FM, because I had enough on my hands with learning the editor, nor in Perilous Refuge, my third FM, because that was intended as a less labour-intensive release while I continue working on other more ambitious projects.
  12. 4 points
    @nbohr1more @stgatilov You guys were right, after updating to 2.08 it looks like... 1. ...crashes during WIP loading have vanished and 2. ...in game crashes in WIP area with fire elementals have vanished as well! Thank you, after adding final voice lines in the next days I will start beta/optimizing! Jack P.S. ....love the new swimming system, although I think I will have to add a few more breath potions as the lake is very, very deep! P.P.S. ...and I have the feeling, that everything runs much faster now!
  13. 4 points
    Taken from Far Cry 3: Blood Dragon...
  14. 4 points
    The number of mirrors is not too high today, and new mirror would definitely be welcome. However, we have been split on the question of whether we could use a server as official mirror when its owner has zero posts on these forums. The TDM code does not properly verify downloads, so we must be sure that mirrors owners can be trusted. Sorry.
  15. 4 points
  16. 4 points
    All badly rotated entities were either fixed or replaced. So the next released version will be compliant with future releases of TDM. Next I will go through the map and adjust all the lights to look good with 2.08. Then comes a new start area, outdoors, before the cave. Perhaps it will feature a bit of hide & seek with some patrols on a road. I'd also like to do more integration of the human-built structure with the cave system. And I'll be changing the entire second floor textures and decor to be a less fancy upgrade from the other floors.
  17. 3 points
    In general, FMs that are currently in beta should not be used as example to troubleshoot new version of the engine. There are too many variables to take into account, and usually bugs are result of mapper's work in progress. Released missions that have been thoroughly tested and updated by mappers post-launch are much more reliable source material, and even those can have bugs that were not caught around the time of release.
  18. 3 points
    So many misconceptions here, I guess I should say something. Yes, 32-bit is perfectly OK in general. There is limitation of 2GB of memory in 32-bit mode. And that's a hard limit: a process cannot use more than 2 GB even if you have 16GB RAM physically installed and 32GB pagefile for swap. When trying to allocate more, process will simply crash on 32-bit platform. If your workload fits well into this limit, then there is no harm from it. If it does not, then it becomes an unavoidable blocker. If you have a very big map, you simply cannot dmap it on 32-bit, but if your map is small/medium size, it does not matter for you if executable is 32-bit or 64-bit. Speaking of variables in code and 64-bit mode switch, some of them stay the same size, but some of then switch from 32-bit to 64-bit. All the pointers inevitably become two times larger, and all sizes in STL types do the same. Also, 64-bit process has more overhead for heap allocations. It means that the process consumes more memory in 64-bit, and consequently can work slower since the cache size does not change. You can probably see increased memory consumption yourself: take a big brushy map, and dmap it both in 32-bit and in 64-bit modes, looking at memory consumption in process explorer. While this point is not very strong for native applications and games, it is a major problem for managed languages like Java, where pointers are everywhere. For instance, modern JVM still uses 32-bit pointers internally, as long as you don't request for more than 32 GB of heap memory. They say it is 30% faster 64-bit mode does not offer any new capabilities except for more-than-2GB memory. There are many other differences between 32-bit and 64-bit, but they are all about performance. 64-bit mode does not offer better precision. Floating point numbers are 32-bit and 64-bit both on 32-bit and 64-bit, working with same performance. In fact, 32-bit mode also offers 80-bit floating point numbers. Moreover, before something like TDM 2.06, this awful 80-bit arithmetic was used everywhere for intermediate values when computing complicated expressions. We got many precision problems when we disabled it, and we are still fixing them (e.g. there is a bunch of such fixes for dmap in upcoming 2.08). Now 80-bit floats are disabled both for 32-bit and 64-bit builds of TDM. So it turns out that 32-bit mode offers more floating point precision, although these 80-bit numbers cannot be used universally in Visual Studio anyway. (assembly geeks can also notice that 32-bit mode without 80-bit arithmetic has a tiny bit of overhead for passing floats into functions, due to old calling convention) Speaking of integers, both 32-bit and 64-bit modes offer integers of size up to 64-bit. The 64-bit integers are emulated on 32-bit platform and are pretty slow, but TDM never uses them. 64-bit GCC also offers builtin 128-bit integer type, but Visual Studio does not, and so TDM does not use them. Anyway, I can hardly imagine what we could use them for (assembly geeks can also notice that using 32-bit integers in 64-bit mode occasionally have a bit of overhead, due to some additional extending instructions) And of course bitness of executable does not affect GPU The main performance advantage of 64-bit mode is having 2x more registers in CPU: both GP registers and SSE/AVX registers. When compiler goes out of registers in a tight loop, it has to "spill" into memory. This memory is surely in L1 cache, but L1 cache accesses are still slower than registers, plus more dependencies between instructions. In TDM, there are many computationally heavy routines done in SSE/AVX (aka SIMD), which we had to rewrite for 64-bit mode. Because the original implementation by ID was written in inline assembly, and 1) you cannot use 32-bit assembly on 64-bit build, and 2) VC does not allow inline assembly at all in 64-bit build. So there are two completely different implementations of SIMD routines now: the first one (by ID) is used in 32-bit mode, and the second one (by us) is used in 64-bit mode. As far as I remember, the second one is often pretty low on registers, so if we start using it in 32-bit mode, it will work a bit slower. Some of the new routines written by us are already used in 32-bit mode, e.g. AVX code. Quite unlikely I would say. Only that 32-bit build will start working slower than 64-bit build. People with low-end machines should use 64-bit build, so it's not a big problem. As you see, performance difference is a very complicated question. Out of all I wrote, I think the most difference comes from: 64-bit build wastes more memory (pointers, heap overhead) 64-bit build has more registers 64-bit and 32-bit builds have different SIMD implementations To be honest, no idea which build wins now.
  19. 3 points
    The one on the left was Built in the year 1509, this Medieval home located in the Village of Argentan, France, has been standing for over 500 years. I don't know anything on the one on the right.
  20. 3 points
    Hmm, for some reason, while the texture files is present, the material entry seems to be missing from 2.08. Maybe it was just never uploaded? Not sure, but I've added it now.
  21. 3 points
    Dear fellow TDM members, as I recently came back to catch up with some TDM playing the question came to my mind: Why are so few missions using narrative elements like NPC dialogues or let the player's character expressing his thoughts by speaking to himself? In the original Thief games, NPCs talking to each other and Garrett commenting what happens added much to the story a mission would pursue. In most TDM missions, the narrative comes only from readables and NPCs just walk their routes up and down mumbling to themselves. Please note, that this is not meant to be as critique to those FMs and their authors! It's just my personal experience, that leads me to two things to discuss: Why are scripted dialogues / sequences used so sparingly in FMs? Which FMs do you know, that make use of these elements? I would like to hear your persnoal thoughts on this. Thank you!
  22. 3 points
    Hey, first of all thanks for all of your work! I'm having a blast with The Dark Mod and with learning DarkRadiant (I'm truly enjoying your Speed Build challenge by the way). I agree that penalty might not be the most appropriate word. What I meant was that the current stealth score is something that is supposed to be minimized. The breakdown of the score is actually a set of penalty points applied to different situations in which the AI was alerted, so this score is more like an "AI alerted points" (again, not the perfect words, but it's along those lines) than an actual stealth score. It could be converted into a score if it was presented over a total. For example, 0 could be converted to 100/100, a 1 to 99/100 and so on. That way, when a user sees: Stealth score: 97/100 they immediately understand it wasn't perfect but it was close. When they see: Stealth score: 3 the immediate reaction is confusion and that they played it terribly, especially the first time they see this, but again, if it was more like: Stealth [insert word referencing something negative that needs to be minimized]: 3 users could better understand they did minimize what was supposed to be minimized. Anyways, just my two cents. Thanks for reading.
  23. 3 points
  24. 3 points
    Uploaded a fix to SVN.
  25. 3 points
    OOps. That was me experimenting. I'll remove that property, change the mover, and update the prefab and re-link it. I'll also do one of the boat alone with the bobbing, etc. I had bound the boat to a mover bobbing, and that to a pendulum, and pendulum to door sliding. I was trying to make the AI get on the boat at one dock, have the boat move across the water to another dock, and have the AI get out at the other side. He can disembark at the original dock, but not at the second one, even when teleporting him to the center of the boat when he embarks. Lol. Anyway, that prefab was for fun. I'll post one with the door sliding mover changed to a regular door rotation and proper pendulum swing etc. And an AI with proper mass. And here it is with AI on team 5 so he won't get agitated when you test. His mass is normal. boat_elevator_bobbing_ai_01.pfb boat_elevator_bobbing_ai_01.zip
  26. 3 points
    Well, holy shmoly. Epic Store gives away GTA 5 at the moment. Get it while it's hot. Might take a while though, because, at the moment, they're getting quite the bombardment on their servers...
  27. 3 points
    I think we'll have to consider shadow maps an ongoing experimental feature. One significant hurdle (in my opinion) is that not all light types are implemented in shadow maps, which means that the engine will fall back to stencil for some lights and thus still generates stencil shadow volumes even when you select shadow maps. So in a way, you currently get the worst of both worlds with shadow maps
  28. 3 points
    Nvidia's SAO isn't really specific to Nvidia cards. All the techniques it uses are in some way also present in the FidelityFX implementation or Intel's ASSAO, those just add a couple additional advanced optimizations Reasons for SAO: it was well documented, had an OpenGL sample implementation, good license, was reasonably simple to implement in a reasonable amount of code (definitely much less than the afore-mentioned ones!) and offers reasonable quality at reasonable performance - not fully state of the art, but also significantly better than some basic implementations that you often find in tutorials (and which I started with in my first attempt)
  29. 3 points
    OFF: ON: OFF: ON:
  30. 3 points
    Ok. I'll check it out and see if there is anything to add. A boat bobbing on waves is easy. I'll make some prefabs and post here, but I did the following: For a regular existing boat model to bob, etc. This will rotate, bob, and undulate at the same time: Put an existing boat model in the map at its initial position in the water. Create a nodraw textured small brush, I use 4x4x4, and change it into a 'atdm:mover_door'. I set the following properties: 'auto_close_time' '.15' 'auto_open_time' '.15' 'frobable' '0' 'grabable' '0' 'locked' '' 'move_time' '1' 'pickable' '0' 'rotate' '0 .35 0' 'snd_close' 'nosound' 'snd_open' 'nosound' 'stop_when_blocked' '0' 'used_by' '-' Do the same method for creating an 'func_pendulum' with the following: 'bind' 'atdm_mover_door_5' (obviously, use the name of the mover_door created in the previous step) 'phase' '2' (OPTIONAL: best to use 'phase' if there are more than one pendulum in the same area and you want them to be out of sync from each other) 'speed' '4' (The lower the value for speed, the less the pendulum will swing) And one more little cube to become an 'func_bobbing': 'bind' 'func_pendulum_1' (your pendulum name) 'height' '.225' (play with this for how choppy the water is, along 'speed' value) 'speed' '1' Place the 'func_bobbing' and 'func_pendulum' in the center of the boat, at the water line. I placed the mover_door at the shore, where I attached a rope from dock to boat. The mover_door was placed at origin of rope at the dock. This will make the boat rotate in more of an arc in the water. If you want the boat to rotate more in place, put the mover_door under the boat. Bind the boat to the func_bobbing You should end up with the following binding: boat > bobbing > pendulum > door (rotator) Alternatively, the door entity could be a sliding type to move the boat across the water. Or the func_pendulum could be bound to a mover on a spline to make the boat go wherever you want. I'll attach my custom 'elevator' boat which an AI can stand upon and ride around. Attached. AI can ride in the boat_elevator_03.pfb while standing, but sitting will interfere with the entities moving the boat, causing the boat to randomly come to a dead stop. If an AI is positioned between the seats and given two path corners, stacked directly above him, each with a path_turn and a path_sit, then he can be made to sit on each seat in the boat. All of these path entities were bound to the boat so they aren't left behind when the boat moves. The AI will just turn in place and sit down. Adjust the AI sitting slide distance to get him over the seats and bind some cushions to the boat seats so he doesn't sit in mid air. I have not yet succeeded in making an AI do regular pathfinding on the boat. I tried to get him to walk from stern to bow and sit on each bench, facing forward. Can't make him move an inch. I even tried an aas_obstacle entity, as found in the 3-floor elevator, but can't get the AI to find a path. I'll make one more prefab including the movers, etc. already bound to the boat.... And now attached as boat_elevator_ahoymatey_01. Maybe someone can figure out how to make an AI path find whole being dragged around by a mover. In the meantime I'll test with a basic boat with no movers. If I can get AI to pathfind onto a static boat, then portals can be used to replace the AI with one with no paths, and the static boat with a moving one. The moving boat can take that AI to the other side of the river/dock, etc. where another set of portals places a static boat and AI with pathfinding in the new area. Better yet, perhaps only the boat itself needs the portal. AI pathfinds onto static boat at dock (no bobbing), triggers timer when entering boat and then portal when AI in position AI gets path_wait with time set for the time of the boat ride Boat replaced via portal with bobbing boat on a mover Bobbing boat moves to other side of the river, carrying the patiently waiting AI AI presence triggers portal to replace boat with no movers AI path_wait times out and sends AI on path on new side of river This should allow AI to pathfind to a boat, embark, ride, disembark, and continue to pathfind (apparently). boat_elevator_03.pfb boat_elevator_03.zip boat_elevator_ahoymatey_01.pfb boat_elevator_ahoymatey_01.zip
  31. 3 points
    Ahoy Matey! Eventually, the mover_sliding entity stops working when the AI is sitting, but if the AI is standing then the boat will move back and forth without issue. No audio due to TDM alsa audio not linking properly into pulseaudio output. So OBS gets no audio even though my speakers do
  32. 3 points
    Go for it. I also suggest trying different shapes for the cage, experiment. But my example is a good starting place. I tried it with monsterclip and it works. The ragdoll respects the static entity as long as it is an elevator! On a related note (using elevators to place AI where they normally won't stay): What does not yet work (as seen by me) is to convert a model, ie. the rowboat, into an elevator and have an AI sit in it (without using a separate elevator). The AI just falls through the boat, probably already having clipped the collision model. I suspect the AI might be able to be placed high above the boat, but would likely end up levitating above the boat due to the boat having a big rectangular collision model. But, putting a little elevator "cage" in the boat for an AI to sit upon does work. Then comes the issue of making the boat bob and such. If the AI is standing in the boat, the boat bobs, rotates, etc with all of its movers, unhindered. If the AI is sitting, the movement is intermittent and often stops for long periods of time. Since I'm currently working on siegeshop yet again, I think I will temporarily add an AI which does nothing but ride elevators. I'll put a chair in an elevator and have him sit on it when riding to see if elevator movement is impeded. DOH! The rowboat is such a simple model. Why don't I simply re-create it with brushwork and convert that to an elevator? Haha! A little project for later today. A basic small rowboat was created out of patches and made intro an elevator. So far tests with an standing AI look pretty good. A sitting AI looks even better until the movers for the boat stop moving. The AI needs to be a bit more stable, so I will make a flat bottom on the inside of the boat. It needs that anyway to hide the water in the hull. Sitting AI still interfere with the movers the boat is bound too, but I almost have a fisherman standing up which moves smoothly with the boat.
  33. 3 points
    For me, slowing working through my next map. It's about 2/3 done, and am currently working on the merchants region of Venice. It's slow progress, as every building has to be custom made, as there's not a lot of room for modules in a Venice map.
  34. 3 points
    Crovie, a villiage in Scotland. You have to leave your car at the entrance. Might make an interesting mission inspiration.
  35. 3 points
    Well. Everything just came to a screeching halt. I had done a bunch of work AFTER fixing rotation on many entities. Then when testing the map last night I decided to operate the drawbridge.That's when I discovered that the various chain segments which rotate and translate as the drawbridge lowers are now not rotating and transforming to where they need to be. So I will have to open a backup version of the map and copy the rotation values back to the many chain segments. A future TDM release might break the drawbridge, but for now it requires those bad rotation values to function. AHA! Those weren't the chains I fixed rotation on. Instead, the chains had become un-bound from the drawbridge due to two entities changing names. I have two metal rings on the drawbridge which the chains are bound to. They were both replaced with properly scaled models, so their names had changed and I had failed to update the binding of the chains. Drawbridge fixed. All is well.
  36. 2 points
    Unfortunately, not all asset contributors who have joined and left the project understood the need to define "diffusemap" for lit materials or have used other blend modes to overcome technical challenges in multi-stage materials. Some of these things were done for individual maps where the glow was not apparent since the texture was in a lit room (for example). I have been meaning to audit this for a few commonly used materials that are clearly fullbright in dark areas...
  37. 2 points
    Yeah, I can confirm that but I think I although noticed that sometimes hitting the space key actually creates a duplicate. Workaround: save the resized model as new model in the mission's model folder.
  38. 2 points
    One thing we might do is have the game send the server the stealth score tagged to the mission, and then it could compute a histogram that shows on the end game screen (if they're online), i.e., a bar graph of stealth scores for all players of that FM with a vertical line where the player's stealth score is, so they can see where they rate vis-a-vis the majority. That'd be cool to see and not too hard to set up.
  39. 2 points
    And if you have missed the stream, you can watch it again on aluminumhaste twitch recordings
  40. 2 points
    I would call it clumsiness score. Bigger is more clumsy.
  41. 2 points
    Those who say it is important are never able to show evidence that it is important, however. The only reason to use caulk is for personal viewing preference, as grayman described.
  42. 2 points
    Yeah. I understand the reasons, but, I also hope for some more scripted dialogues in FM's. Although it shouldn't be too excessive. Won't name names, but, in some FM's, I was tempted to move on, because the dialogues were just too long (and not very well written either). Also, I'd advocate against too much babble from the protagonist. Less is more. The way it was in the original Thief's is perfect really.
  43. 2 points
  44. 2 points
    It's a really nice mini documentary and a love letter to looking glass and the thief community.
  45. 2 points
    SSAO Comparisons: OFF: ON: OFF: ON: OFF: ON:
  46. 2 points
    Nice little mission, especially the sound placement for rain and background music. Also I loved the secrets, traps and ai. I had no problems with fps, voice sounds, doors or triggers. Really good job there - I would love to see more of your maps in the future. Thank you!
  47. 2 points
    Finished this up yesterday and very spooky atmosphere. Thanks for all your hard work and look forward to more.
  48. 2 points
    If we enable depth testing and disable the custom depth culling, it looks like this: Unfortunately, while that works fine for this particular particle effect, it makes many others look very ugly (particularly steam). There is no easy and quick solution to this, I'm afraid. At least nothing that could be squeezed into 2.08.
  49. 2 points
    I'll never be done with this map. "WARNING:Detected 114 func_static-s with bad rotation:" Hehe. I have some work cut out for me. ... So, I'm going through siegeshop one room at a time and checking all entities which have been rotated and possibly re-scaled via rotation. I am finding many entities which have only ever been rotated by 90 degrees on any axis, but having crazy looking rotation values. These are items which have not been re-scaled and only rotated. As an example, I have above the cook stove, 'models/darkmod/mechanical/pipes/steam_pipe02_bend2.lwo'. The current one has a rotation value of '-4.21469e-08 -1 0 4.21469e-08 -1.77636e-15 -1 1 -4.2147e-08 4.21469e-08'. I delete that rotation and then give the pipe 90 degree rotations on X and Y, ending up with rotation value '0 -1 0 0 0 -1 1 0 0'. The pipe ends up the exact size and position as before. I have no idea how those other rotation values had ended up like that. 85 to go, down from 114. About 1/3 of what I fixed so far were entities that I had simply rotated but not scaled.
  50. 2 points
    The br tags were added by me to the mission page. It works on the website but apparently it is rendering incorrectly in-game. I think we should fix that on the TDM side rather than living without basic line breaking on the website side and having all mission descriptions look like a wall-of-text...
  • Newsletter

    Want to keep up to date with all our latest news and information?
    Sign Up
×
×
  • Create New...