Hey hey, sorry for not replying sooner. As you've figured out, ns->loc isn't the type of location as defined in locations.h, but the index of a specific location of that type in the locations[] array, and those don't match up; there can be multiple parks in the locations[] array, for example, all sharing the same type as defined in locations.h. Fortunately, there's a function that will track down an index corresponding to the type of location you want:
ns->loc = find_site_index_in_city(SITE_OUTDOOR_PUBLICPARK, -1);
As suggested by the function name, the second parameter allows you to pass the city you want to search within (like SITE_CITY_SEATTLE). However, you can pass -1 if you don't care about the city, and the second parameter is ignored either way if you're playing in single city mode. If there are multiple valid locations it could give you an index for, it'll just give you the first one it finds.
Let me know if this works for you or if you're having any other trouble.
Additional Edit: Also, take note of the squadstory_text_location() function in squadstory_text.cpp -- it provides alternate names for several possible locations when showing news stories about CCS hits. So, for example, the CCS won't raid the CEO's House, they'll raid the "Richard Dawkins Food Bank". This could be a source of surprises for you if you set custom CCS raid targets, or alternatively, it could be a target for modding if you want to set up some custom overrides.