New mega-map-feature from acidia, National Guard Camp

I just recently landed an experimental implimentation of a HUUUGE new map feature by acadia (if you don’t remember acadia, he’s responsible for all of our large map features, the school, the mall, the sarcophagus, the refugee center, the farm, and all the missions related to them).
To try it out, start a new world with the “Beta National Guard Camp” mod enabled.
Please post any issues you encounter here so we can sort it out, it’s so huge the only way to really check it out thoroughly is to explore a bunch.

I upgraded from 6482 to 6496 to check it out and found that the Advanced Inventory is broken. When I try to pick up anything I get “This is too heavy”. Picking things up without using the Advanced Inventory works though.

I have a technical issue:
It significantly bumped up the size of the archive and the resulting unpacked game and also increases loading times with the mod enabled.
Reminder that Windows is not exactly good at file management and just because it works well on sane filesystem, doesn’t mean it works well on the most common one.

It is also unreviewably huge, violating the PR size rules we were supposed to have.
I know, I know, trusted contributors deserve extra slack and this is all safe content (jsons, no code) and I’m not even against the “release now, test (thoroughly) later, with help of users” approach, nor even the idea of ignoring known issues, but I feel it has to be noted and not treated as a fully acceptable state of things.

A great deal of that can be easily fixed by extracting the common palette, which pretty much the entire location has in common and adds a great deal of padding to the files, making them much harder to read. Palette can have overrides (say, one location with higher chance of grass) and one location can have multiple palettes (grassy floors and wooden walls, concrete floors and metal walls etc.), so extracting them would actually enhance readability by showing exactly what changed.

If acidia is reading this:
I assume you’ll want to follow up with updates. If you want to do something like the “transforming” camp (missions causing mapgen effects), warn about it first. I can write a mapgen overlay to make it more readable and less code-intensive. The transforming camp code is very hard to read (you need to compare coordinates to find what goes where) and thus hard to maintain and debug and this can be avoided with relatively little work. It would probably save your time too.
And make sure cars are actually placed - and placed where you expect them - if you want to move them around. This caused hard to reproduce crashes last time.
Don’t get my criticism wrong - it’s good that someone uses the mapgen for something more advanced, it’s just that it can be done in a more elegant way, by doing some extra work first to do much less later.

It seems palettes will now be the same for all map chunks.

[
  {
    "type": "palette",
    "id": "national_guard_camp_palette",
    "terrain": {
        " ": "t_thconc_floor",
        "!": "t_metal_floor",
        "#": "t_thconc_floor",
        "$": "t_radio_tower",
        "%": "t_fence_barbed",
        "&": "t_gas_pump",
        "+": [
            "t_door_c",
            "t_door_c",
            "t_door_o",
            "t_door_locked",
            "t_door_locked_interior"
        ],
        ",": "t_pavement_y",
        "-": "t_brick_wall",
        ".": [
            "t_grass",
            "t_grass",
            "t_grass",
            "t_dirt",
            "t_grass",
            "t_grass",
            "t_grass",
            "t_dirt",
            "t_grass",
            "t_grass",
            "t_grass",
            "t_dirt",
            "t_grass",
            "t_grass",
            "t_grass",
            "t_dirt",
            "t_grass",
            "t_grass",
            "t_grass",
            "t_dirt",
            "t_grass",
            "t_grass",
            "t_grass",
            "t_dirt",
            "t_shrub"
        ],
        "0": "t_manhole_cover",
        "1": [
            "t_grass",
            "t_dirt",
            "t_dirt",
            "t_dirt",
            "t_dirt",
            "t_dirt"
        ],
        "2": [
            "t_grass",
            "t_grass",
            "t_dirt",
            "t_grass",
            "t_grass",
            "t_dirt",
            "t_shrub",
            "t_tree",
            "t_tree_young",
            "t_grass",
            "t_grass",
            "t_dirt",
            "t_grass",
            "t_grass",
            "t_dirt",
            "t_shrub",
            "t_tree",
            "t_grass",
            "t_tree_dead"
        ],
        "3": [
            "t_grass",
            "t_dirt",
            "t_dirt",
            "t_dirt",
            "t_dirt"
        ],
        "5": "t_gates_control_brick",
        "6": "t_console_broken",
        "7": "t_machinery_electronic",
        "8": "t_dirtmound",
        "9": "t_door_metal_c",
        "<": "t_stairs_up",
        "=": "t_door_metal_locked",
        ">": "t_stairs_down",
        "A": "t_thconc_floor",
        "B": "t_thconc_floor",
        "C": "t_thconc_floor",
        "D": "t_thconc_floor",
        "E": "t_elevator",
        "F": "t_chainfence_v",
        "G": "t_reinforced_glass",
        "H": "t_sidewalk",
        "I": "t_column",
        "L": "t_thconc_floor",
        "M": "t_wall_metal",
        "O": "t_thconc_floor",
        "Q": "t_dirt",
        "R": "t_thconc_floor",
        "S": "t_thconc_floor",
        "T": "t_thconc_floor",
        "V": "t_thconc_floor",
        "W": "t_window",
        "X": "t_pavement",
        "Y": "t_dirt",
        "Z": "t_dirt",
        "^": [
            "t_utility_light",
            "t_utility_light",
            "t_utility_light",
            "t_sidewalk"
        ],
        "_": "t_pavement",
        "a": "t_pavement",
        "b": "t_thconc_floor",
        "c": "t_thconc_floor",
        "d": "t_thconc_floor",
        "e": "t_strconc_wall",
        "f": "t_chainfence_h",
        "g": "t_thconc_floor",
        "h": "t_thconc_floor",
        "i": "t_sidewalk",
        "m": "t_wall_metal",
        "o": "t_thconc_floor",
        "q": "t_thconc_floor",
        "r": "t_thconc_floor",
        "s": "t_sidewalk",
        "t": "t_thconc_floor",
        "u": "t_thconc_floor",
        "v": "t_thconc_floor",
        "w": [
            "t_window_domestic",
            "t_window_domestic",
            "t_curtains",
            "t_window_domestic",
            "t_window_domestic",
            "t_curtains",
            "t_window_frame"
        ],
        "y": "t_thconc_floor",
        "z": "t_dirt",
        "|": "t_brick_wall",
        "~": "t_rock"
    },
    "furniture": {
        "#": "f_indoor_plant",
        "A": "f_sofa",
        "B": "f_bed",
        "C": "f_cupboard",
        "D": "f_fridge",
        "H": "f_table",
        "L": "f_locker",
        "O": [
            "f_crate_c",
            "f_crate_c",
            "f_crate_o"
        ],
        "Q": "f_sandbag_half",
        "R": "f_exercise",
        "S": "f_sink",
        "T": "f_table",
        "V": "f_vending_c",
        "X": "f_tank_trap",
        "Y": "f_rubble",
        "Z": "f_ash",
        "a": "f_sandbag_half",
        "b": "f_bench",
        "c": "f_counter",
        "d": "f_desk",
        "g": "f_glass_fridge",
        "h": "f_chair",
        "i": "f_bench",
        "o": "f_bookcase",
        "q": "f_sandbag_half",
        "r": "f_rack",
        "t": "f_toilet",
        "u": "f_shower",
        "v": "f_oven",
        "y": "f_treadmill"
    }
  }
]

Using palettes and linting will make json 5 times smaller.


Edit:

Basement chunks are using differrent palette:

  {
    "type": "palette",
    "id": "national_guard_camp_b1_palette1",
    "terrain": {
        " ": "t_thconc_floor",
        "!": "t_metal_floor",
        "#": "t_thconc_floor",
        "$": "t_lava",
        "%": "t_fence_barbed",
        "&": "t_radio_tower",
        "(": "t_sewage",
        ")": "t_bars",
        "*": "t_potential_trans",
        "+": [
            "t_door_c",
            "t_door_c",
            "t_door_o",
            "t_door_locked",
            "t_door_locked_interior"
        ],
        ",": "t_pavement_y",
        "-": "t_brick_wall",
        ".": [
            "t_grass",
            "t_grass",
            "t_grass",
            "t_dirt",
            "t_grass",
            "t_grass",
            "t_grass",
            "t_dirt",
            "t_grass",
            "t_grass",
            "t_grass",
            "t_dirt",
            "t_grass",
            "t_grass",
            "t_grass",
            "t_dirt",
            "t_grass",
            "t_grass",
            "t_grass",
            "t_dirt",
            "t_grass",
            "t_grass",
            "t_grass",
            "t_dirt",
            "t_shrub"
        ],
        "0": "t_ladder_up",
        "1": "t_machinery_light",
        "2": "t_machinery_heavy",
        "3": "t_conveyor",
        "4": "t_station_disc",
        "5": "t_gates_control_concrete",
        "6": "t_console_broken",
        "7": "t_machinery_electronic",
        "8": "t_current_trans",
        "9": [
            "t_door_metal_c",
            "t_door_metal_c",
            "t_door_metal_o"
        ],
        "<": "t_stairs_up",
        "=": [
            "t_door_metal_c",
            "t_door_metal_locked",
            "t_door_metal_locked",
            "t_door_metal_locked"
        ],
        ">": "t_stairs_down",
        "@": "t_sai_box",
        "A": "t_thconc_floor",
        "B": "t_thconc_floor",
        "C": "t_thconc_floor",
        "D": "t_thconc_floor",
        "E": "t_elevator",
        "F": "t_chainfence_v",
        "G": "t_reinforced_glass",
        "H": "t_sidewalk",
        "I": "t_column",
        "J": "t_recycler",
        "K": "t_searth_test",
        "L": "t_thconc_floor",
        "M": "t_wall_metal",
        "N": "t_sewage_pipe",
        "O": "t_thconc_floor",
        "P": "t_centrifuge",
        "Q": "t_thconc_floor",
        "R": "t_thconc_floor",
        "S": "t_thconc_floor",
        "T": "t_thconc_floor",
        "U": "t_door_bar_locked",
        "V": "t_thconc_floor",
        "W": "t_window",
        "Y": "t_wall_glass",
        "Z": "t_rock_floor",
        "^": [
            "t_utility_light",
            "t_utility_light",
            "t_utility_light",
            "t_thconc_floor"
        ],
        "_": "t_pavement",
        "`": "t_rock_floor",
        "a": "t_thconc_floor",
        "b": "t_thconc_floor",
        "c": "t_thconc_floor",
        "d": "t_thconc_floor",
        "e": "t_strconc_wall",
        "f": "t_chainfence_h",
        "g": "t_thconc_floor",
        "h": "t_thconc_floor",
        "i": "t_sidewalk",
        "j": "t_missile",
        "k": "t_thconc_floor",
        "l": "t_water_dp",
        "m": "t_wall_metal",
        "n": "t_sewage_pump",
        "o": "t_thconc_floor",
        "p": "t_vat",
        "q": "t_thconc_floor",
        "r": "t_thconc_floor",
        "s": "t_sidewalk",
        "t": "t_thconc_floor",
        "u": "t_thconc_floor",
        "v": "t_thconc_floor",
        "w": [
            "t_window_domestic",
            "t_window_domestic",
            "t_curtains",
            "t_window_domestic",
            "t_window_domestic",
            "t_curtains",
            "t_window_frame"
        ],
        "y": "t_thconc_floor",
        "z": "t_thconc_floor",
        "|": "t_brick_wall",
        "~": "t_rock"
    },
    "furniture": {
        "#": "f_indoor_plant",
        "A": "f_sofa",
        "B": "f_bed",
        "C": "f_cupboard",
        "D": "f_fridge",
        "H": "f_table",
        "L": "f_locker",
        "O": [
            "f_crate_c",
            "f_crate_c",
            "f_crate_o"
        ],
        "Q": "f_standing_tank",
        "R": "f_exercise",
        "S": "f_sink",
        "T": "f_table",
        "V": "f_vending_c",
        "Z": "f_rubble",
        "a": "f_robotic_arm",
        "b": "f_bench",
        "c": "f_counter",
        "d": "f_desk",
        "g": "f_glass_fridge",
        "h": "f_chair",
        "i": "f_bench",
        "k": "f_mannequin",
        "o": "f_bookcase",
        "q": "f_sandbag_half",
        "r": "f_rack",
        "t": "f_toilet",
        "u": "f_shower",
        "v": "f_oven",
        "y": "f_treadmill",
        "z": "f_trashcan"
    }
  }

Following four basement chunks have small differences in terrain part of the palette ("=" symbol defines only “t_door_metal_locked”, while most basement chunks have 1 in 4 chance to be “t_door_metal_c”):

national_guard_camp_b1_38
national_guard_camp_b1_51
national_guard_camp_b1_52
national_guard_camp_b1_95

Updated version is here: https://www.dropbox.com/s/iv2p72fi6k97a6k/National_Guard_Camp_Linted_And_UsedPalettes.zip?dl=0

Are the W11 guys guarding the camp supposed to only drop storage batteries or regular batteries most of the time, even though they all have guns to shoot you with? It’s also kinda hard to tell them apart immediately, since the first few letters/numbers are quite similar.

Also, the whole camp is looking really sexy. Especially the weapons lab.

1 Like

Thanks Kevin, when the pr got suspended I didn’t think it was going to get reopened.
Zhilkin, thank you very much. Learned how palettes worked from the file you loaded. I’ll be sure to upload your changes as soon as I can.
Coolthulhu, thank you for adding the palette system, I’m using the shi t out of it now and it saves me a lot of time in addition to keeping code more manageable. I’ll totally take you up on the mapgen gen update system for missions… Would it be possible to have it reload a map/building .JSON? No rush, updating missions are At least a few months away.
Taberone, sorry the names are so similar. I went with army mos designators because names become too long when you essentially have “robotic combat engineer level 1 (flame thrower)” vs “robotic combat engineer level 2 (flamethrower + 1 law)”. I’ll certainly take another look at drop tables.

Currently on a “work trip” for the forseeable future. Only my phone has internet access so I’m in a bit of a pickle with getting anything up but I have had a bit of spare time to look at jsons. Is there a way to download the linter as a zip file, can’t get it to work on my phone? Took an hour to get the latest build. Testing some stuff now. Stupid phone.

So, I wasn’t sure if it was possible to have a monster (like the bots this adds) give the player a chance to escape, but then I saw that the anti-material turret uses a pretty good method. Indeed, testing their method in a mod I’m working on shows that it works fairly well, staggering the monster’s attacks and warning players that they’re about to get shot.

I propose that this method be used by the bots in the Camp, alongside substantial reduction in their numbers (as in, no more than one or two dozen per camp) and renaming them to something like “rifle bot” or similar, so the player knows what they’re getting into.

Actually, I reckon every enemy armed with guns (or any sufficiently lethal ranged attack) would benefit from this.

I can see a renaming being in order to emphasize the danger.
Warnings and warning shots are not always appropriate, in the national guard camp in particular, “shoot to kill” seems like exactly what we want.
Any rationale for cutting the numbers of bots?

There are hundreds of them. I don’t think anyone is even slightly likely to survive them without at least basic powered armour. As it is, it’s like having a base full of more-dangerous chicken walkers, and walkers are normally very rare.

The warning thing is just because it isn’t very fun to suddenly die a very difficult to avoid death. That is, to avoid killing the player effectively instantly as punishment for a single mistake.

Edit: To clarify, I don’t think it’s good design to have an area/enemy be so vastly more dangerous than the entire rest of the game.

Edited again: To expand, I think reducing their numbers would make the Camp a more tense experience, and overall more fun to actually play (more so, if combined with a warning system). Sneaking though the camp after destroying a dozen or so bots, never quite sure that they’re all gone sounds much more fun than killing a dozen and despairing at the thought that there are hundreds more.

Edited once more: To expand upon mistakes and the punishment thereof, you could argue that even entering the Camp is a mistake. And I would agree with that, however I do not believe that is a mistake that should be punished, as that would effectively be punishing curiosity (which could lead to players actively avoiding new places on the off chance they’re as lethal as the Camp).

Edited yet again: I’ve made a quick edit of the Camp mod, implementing my proposal. I’m finding the Camp dangerous, but quite surmountable with a mid-end game testing character, though I may’ve reduced bot numbers a bit too much.
Still, some quick testing has actually made me want to go to more Camps on my main character.

It can be found here: https://www.dropbox.com/s/pw6utlnghvx77vc/National_Guard_Camp_edit.7z?dl=0
Feedback would be appreciated.

1 Like