diff --git a/code/game/machinery/newscaster.dm b/code/game/machinery/newscaster.dm index b15ef5753a..be3ebba12d 100644 --- a/code/game/machinery/newscaster.dm +++ b/code/game/machinery/newscaster.dm @@ -4,6 +4,7 @@ /datum/feed_message var/author ="" + var/title var/body ="" var/message_type ="Story" var/datum/feed_channel/parent_channel @@ -58,9 +59,6 @@ var/list/datum/feed_channel/network_channels = list() var/datum/feed_message/wanted_issue -/datum/feed_network/New() - CreateFeedChannel("Station Announcements", "SS13", 1, 1, "New Station Announcement Available") - /datum/feed_network/proc/CreateFeedChannel(var/channel_name, var/author, var/locked, var/adminChannel = 0, var/announcement_message) var/datum/feed_channel/newChannel = new /datum/feed_channel newChannel.channel_name = channel_name @@ -73,12 +71,16 @@ newChannel.announcement = "Breaking news from [channel_name]!" network_channels += newChannel -/datum/feed_network/proc/SubmitArticle(var/msg, var/author, var/channel_name, var/obj/item/weapon/photo/photo, var/adminMessage = 0, var/message_type = "") +/datum/feed_network/proc/SubmitArticle(var/msg, var/author, var/channel_name, var/obj/item/weapon/photo/photo, var/adminMessage = 0, var/message_type = "", var/title) var/datum/feed_message/newMsg = new /datum/feed_message newMsg.author = author newMsg.body = msg newMsg.time_stamp = "[stationtime2text()]" newMsg.is_admin_message = adminMessage + if(title) + newMsg.title = title + else + newMsg.title = "News Update" newMsg.post_time = round_duration_in_ds // Should be almost universally unique if(message_type) newMsg.message_type = message_type @@ -147,6 +149,7 @@ GLOBAL_LIST_BOILERPLATE(allCasters, /obj/machinery/newscaster) // 1 = there has var/scanned_user = "Unknown" //Will contain the name of the person who currently uses the newscaster var/msg = ""; //Feed message + var/title = ""; // Feed title var/datum/news_photo/photo_data = null var/channel_name = ""; //the feed channel which will be receiving the feed, or being created var/c_locked=0; //Will our new channel be locked to public submissions? @@ -371,7 +374,6 @@ GLOBAL_LIST_BOILERPLATE(allCasters, /obj/machinery/newscaster) /obj/machinery/newscaster/tgui_act(action, list/params, datum/tgui/ui, datum/tgui_state/state) if(..()) return TRUE - switch(action) if("cleartemp") temp = null @@ -434,6 +436,10 @@ GLOBAL_LIST_BOILERPLATE(allCasters, /obj/machinery/newscaster) msg = sanitize(input(usr, "Write your Feed story", "Network Channel Handler", "") as message|null) return TRUE + if("set_new_title") + title = sanitize(input(usr, "Enter your Feed title", "Network Channel Handler", "") as message|null) + return TRUE + if("set_attachment") AttachPhoto(usr) return TRUE @@ -449,10 +455,13 @@ GLOBAL_LIST_BOILERPLATE(allCasters, /obj/machinery/newscaster) if(channel_name == "") set_temp("Error: Could not submit feed message to network: No feed channel selected.", "danger", FALSE) return TRUE + if(title == "") + set_temp("Error: Invalid Title.", "danger", FALSE) + return TRUE var/image = photo_data ? photo_data.photo : null feedback_inc("newscaster_stories",1) - news_network.SubmitArticle(msg, our_user, channel_name, image, 0) + news_network.SubmitArticle(msg, our_user, channel_name, image, 0, "", title) set_temp("Feed message created successfully.", "success", FALSE) return TRUE @@ -629,153 +638,6 @@ GLOBAL_LIST_BOILERPLATE(allCasters, /obj/machinery/newscaster) photo_data = new(selection, 1) -//######################################################################################################################## -//###################################### NEWSPAPER! ###################################################################### -//######################################################################################################################## - -/obj/item/weapon/newspaper - name = "newspaper" - desc = "An issue of The Griffon, the newspaper circulating aboard most stations." - icon = 'icons/obj/bureaucracy.dmi' - icon_state = "newspaper" - w_class = ITEMSIZE_SMALL //Let's make it fit in trashbags! - attack_verb = list("bapped") - var/screen = 0 - var/pages = 0 - var/curr_page = 0 - var/list/datum/feed_channel/news_content = list() - var/datum/feed_message/important_message = null - var/scribble="" - var/scribble_page = null - drop_sound = 'sound/items/drop/wrapper.ogg' - pickup_sound = 'sound/items/pickup/wrapper.ogg' - -obj/item/weapon/newspaper/attack_self(mob/user) - if(ishuman(user)) - var/mob/living/carbon/human/human_user = user - var/dat - pages = 0 - switch(screen) - if(0) //Cover - dat+="
The Griffon
" - dat+="
[using_map.company_name]-standard newspaper, for use on [using_map.company_name]© Space Facilities

" - if(isemptylist(news_content)) - if(important_message) - dat+="Contents:
" - else - dat+="Other than the title, the rest of the newspaper is unprinted..." - else - dat+="Contents:
" - if(scribble_page==curr_page) - dat+="
There is a small scribble near the end of this page... It reads: \"[scribble]\"" - dat+= "
Next Page
Done reading
" - if(1) // X channel pages inbetween. - for(var/datum/feed_channel/NP in news_content) - pages++ //Let's get it right again. - var/datum/feed_channel/C = news_content[curr_page] - dat+="[C.channel_name] \[created by: [C.author]\]

" - if(C.censored) - dat+="This channel was deemed dangerous to the general welfare of the station and therefore marked with a D-Notice. Its contents were not transferred to the newspaper at the time of printing." - else - if(isemptylist(C.messages)) - dat+="No Feed stories stem from this channel..." - else - dat+="" - if(scribble_page==curr_page) - dat+="
There is a small scribble near the end of this page... It reads: \"[scribble]\"" - dat+= "

Previous Page
Next Page
" - if(2) //Last page - for(var/datum/feed_channel/NP in news_content) - pages++ - if(important_message!=null) - dat+="
Wanted Issue:


" - dat+="Criminal name: [important_message.author]
" - dat+="Description: [important_message.body]
" - dat+="Photo:: " - if(important_message.img) - user << browse_rsc(important_message.img, "tmp_photow.png") - dat+="
" - else - dat+="None" - else - dat+="Apart from some uninteresting Classified ads, there's nothing on this page..." - if(scribble_page==curr_page) - dat+="
There is a small scribble near the end of this page... It reads: \"[scribble]\"" - dat+= "
Previous Page
" - else - dat+="I'm sorry to break your immersion. This shit's bugged. Report this bug to Agouri, polyxenitopalidou@gmail.com" - - dat+="

[curr_page+1]
" - human_user << browse(dat, "window=newspaper_main;size=300x400") - onclose(human_user, "newspaper_main") - else - to_chat(user, "The paper is full of intelligible symbols!") - -obj/item/weapon/newspaper/Topic(href, href_list) - var/mob/living/U = usr - ..() - if((src in U.contents) || (istype(loc, /turf) && in_range(src, U))) - U.set_machine(src) - if(href_list["next_page"]) - if(curr_page == pages+1) - return //Don't need that at all, but anyway. - if(curr_page == pages) //We're at the middle, get to the end - screen = 2 - else - if(curr_page == 0) //We're at the start, get to the middle - screen = 1 - curr_page++ - playsound(src, "pageturn", 50, 1) - - else if(href_list["prev_page"]) - if(curr_page == 0) - return - if(curr_page == 1) - screen = 0 - - else - if(curr_page == pages+1) //we're at the end, let's go back to the middle. - screen = 1 - curr_page-- - playsound(src, "pageturn", 50, 1) - - if(istype(src.loc, /mob)) - attack_self(src.loc) - -obj/item/weapon/newspaper/attackby(obj/item/weapon/W as obj, mob/user) - if(istype(W, /obj/item/weapon/pen)) - if(scribble_page == curr_page) - to_chat(user, "There's already a scribble in this page... You wouldn't want to make things too cluttered, would you?") - else - var/s = sanitize(input(user, "Write something", "Newspaper", "")) - s = sanitize(s) - if(!s) - return - if(!in_range(src, usr) && src.loc != usr) - return - scribble_page = curr_page - scribble = s - attack_self(user) - return - ////////////////////////////////////helper procs /obj/machinery/newscaster/proc/tgui_user_name(mob/user) if(ishuman(user)) diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index 1a9bb0cdc5..9332efc8cf 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -407,7 +407,7 @@ proc/admin_notice(var/message, var/rights) dat+="ERROR: Could not submit Feed story to Network.

" if(src.admincaster_feed_channel.channel_name=="") dat+="•Invalid receiving channel name.
" - if(src.admincaster_feed_message.body == "" || src.admincaster_feed_message.body == "\[REDACTED\]") + if(src.admincaster_feed_message.body == "" || src.admincaster_feed_message.body == "\[REDACTED\]" || admincaster_feed_message.title == "") dat+="•Invalid message body.
" dat+="
Return
" if(7) @@ -436,11 +436,14 @@ proc/admin_notice(var/message, var/rights) var/i = 0 for(var/datum/feed_message/MESSAGE in src.admincaster_feed_channel.messages) i++ - dat+="-[MESSAGE.body]
" + //dat+="-[MESSAGE.body]
" + var/pic_data if(MESSAGE.img) usr << browse_rsc(MESSAGE.img, "tmp_photo[i].png") - dat+="

" - dat+="\[Story by [MESSAGE.author]\]
" + pic_data+="
" + dat+= get_newspaper_content(MESSAGE.title, MESSAGE.body, MESSAGE.author,"#d4cec1", pic_data) + dat+="
" + dat+="\[Story by [MESSAGE.author] - [MESSAGE.time_stamp]\]
" dat+={"

Refresh
Back diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index 3fe1f52465..d92b3be0cb 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -1742,16 +1742,20 @@ src.admincaster_feed_channel.channel_name = sanitizeSafe(input(usr, "Choose receiving Feed Channel", "Network Channel Handler") in available_channels ) src.access_news_network() + else if(href_list["ac_set_new_title"]) + src.admincaster_feed_message.title = sanitize(input(usr, "Enter the Feed title", "Network Channel Handler", "")) + src.access_news_network() + else if(href_list["ac_set_new_message"]) - src.admincaster_feed_message.body = sanitize(input(usr, "Write your Feed story", "Network Channel Handler", "")) + src.admincaster_feed_message.body = sanitize(input(usr, "Write your Feed story", "Network Channel Handler", "") as message) src.access_news_network() else if(href_list["ac_submit_new_message"]) - if(src.admincaster_feed_message.body =="" || src.admincaster_feed_message.body =="\[REDACTED\]" || src.admincaster_feed_channel.channel_name == "" ) + if(src.admincaster_feed_message.body =="" || admincaster_feed_message.title == "" || admincaster_feed_message.body =="\[REDACTED\]" || admincaster_feed_channel.channel_name == "" ) src.admincaster_screen = 6 else feedback_inc("newscaster_stories",1) - news_network.SubmitArticle(src.admincaster_feed_message.body, src.admincaster_signature, src.admincaster_feed_channel.channel_name, null, 1) + news_network.SubmitArticle(admincaster_feed_message.body, admincaster_signature, admincaster_feed_channel.channel_name, null, 1, "", admincaster_feed_message.title) src.admincaster_screen=4 log_admin("[key_name_admin(usr)] submitted a feed story to channel: [src.admincaster_feed_channel.channel_name]!") diff --git a/code/modules/client/client defines.dm b/code/modules/client/client defines.dm index 6121bedb22..5c10eae367 100644 --- a/code/modules/client/client defines.dm +++ b/code/modules/client/client defines.dm @@ -26,6 +26,7 @@ var/datum/chatOutput/chatOutput var/datum/volume_panel/volume_panel = null // Initialized by /client/verb/volume_panel() var/chatOutputLoadedAt + var/seen_news = 0 var/adminhelped = 0 diff --git a/code/modules/lore_codex/news_data/main.dm b/code/modules/lore_codex/news_data/main.dm index b9f1be4b40..107e91ad3b 100644 --- a/code/modules/lore_codex/news_data/main.dm +++ b/code/modules/lore_codex/news_data/main.dm @@ -1,9 +1,22 @@ /datum/lore/codex/category/main_news // The top-level categories for the news thing name = "Index" - data = "Below you'll find a list of articles relevant to the current (as of 2564) political climate, especially concerning the Almach Rim \ + data = "Below you'll find a list of articles relevant to the current (as of 2565) political climate, especially concerning the local \ region. Each is labeled by date of publication and title. This list is self-updating, and from time to time the publisher will push new \ articles. You are encouraged to check back frequently." children = list( + /datum/lore/codex/page/article101, + /datum/lore/codex/page/article100, + /datum/lore/codex/page/article99, + /datum/lore/codex/page/article98, + /datum/lore/codex/page/article97, + /datum/lore/codex/page/article96, + /datum/lore/codex/page/article95, + /datum/lore/codex/page/article94, + /datum/lore/codex/page/article93, + /datum/lore/codex/page/article92, + /datum/lore/codex/page/article91, + /datum/lore/codex/page/article90, + /datum/lore/codex/page/article89, /datum/lore/codex/page/article88, /datum/lore/codex/page/article87, /datum/lore/codex/page/article86, @@ -1006,3 +1019,111 @@ Make no mistake, that is what our agreement today symbolizes. A new era of peace for us, where we no longer have to worry about the threat of piracy or invasion. We can return to our homes, rebuild our stations, and forge a new future for ourselves and our children'\

\ It was also announced that though the work of restoring order to the system is ongoing, they expect elections will be held for a new Assembly and President within the next few months, with the exact date announced once violence on the major stations has ceased and cooperation from the insubordinate stations is secured. Yong will head an interim government in the meantime." + +/datum/lore/codex/page/article89 + name = "08/15/64 - Almach Permits First Solar Inspection" + data = "Almost four months since its establishment as a Skrellian territory, the Almach Protectorate Government has extended its first formal invitation to Solar Confederate Government inspectors to ensure the fledgling state is complying with restrictions imposed by the Treaty of Whythe.\ +

\ + The composition of the official Solar Inspection Group has been a matter of much deliberation over the past several months, and owing to the ground to be covered now includes over 3,500 experts from a wide variety of fields. The bulk of the Group is comprised of Transgressive Technologies Commission agents, including the EIO, but also includes military officials, independent observers, and corporate representatives. The inclusion of the latter group spurred heated debate in the Colonial Assembly, but ultimately 'thought-leaders' from Ward-Takahashi, NanoTrasen, and Hephaestus Industries were admitted, while other interests will have to be satisfied to be represented by Sol Economic Organization liaisons.\ +

\ + The APG, currently based out of what is to be a neutral embassy on Carter in Relan pending the completion of the new government centre of Vigilance Station in Whythe, is not legally required to fully comply with Five Points regulation, though the Whythe terms ensure that any transgressive research is undertaken under the strictest guidelines. The Skrell have amiably agreed to ensure that any innovation by the protectorate is safe, controlled, and does not enter Solar territory. These terms are similar to those applied to such technologies developed by and for the Skrell themselves, whose expertise is considered unrivalled in the field, but has been widely criticised by certain human bioconservative groups.\ +

\ + The inspection is expected to take several weeks, and will begin tomorrow." + +/datum/lore/codex/page/article90 + name = "08/29/64 - Kaleidoscope Cosmetics Goes Trans-Stellar After Genix Merger" + data = "Personal care giant Kaleidoscope Cosmetics has been officially recognised by the Solar Galactic Exchange as a true Trans-stellar Corporation today, following a controversial merger with Genix Therapeutic Systems and expanding its corporate assets to over 20 key systems.\ +

\ + Genix, which will now be operating under the Kaleidoscope name while retaining some corporate autonomy, has come under some scrutiny from the Transgressive Technologies Commission in recent months following its aggressive acquisition of liquidated Almachi assets in the aftermath of the Association's dissolution in April. The company was cleared of suspected Five Points violations without fanfare just two weeks ago, and allowed to resume work on the development a variety of previously approved commercial genetic modification products.\ +

\ + Many cosmetic gene-modification products have been available for some time - primarily in the Almach Rim - but have remained targeted at a relatively niche market. These treatments, ranging from cosmetic anti-aging to 'fantasy' body features are now set to be marketed and available in 'hundreds' of Kaleidoscope clinics galaxy-wide in the coming months. The TTC has reported that they are 'Confident that no transgressive modification is being provided and that these modifications are strictly superficial'. They have officially wished Kaleidoscope's directors well in their ascent to the galactic stage." + +/datum/lore/codex/page/article91 + name = "09/21/64 - Almach Passes Inspection - Concerns Raised" + data = "The Solar Inspection Group has granted the Almach Protectorate a passing grade in the first official inspection of the territory under Skrellian rule, though ethical concerns have been raised by a number of independent observers involved in the process.\ +

\ + During the course of the month-long inspection, Skrell facilitators were cooperative in ensuring the SIG were given 'unlimited' access to all research and development facilities requested by Sol, as well as informing the group of numerous previously unidentified locations that had been flagged by the Almach Protectorate Government since assuming control of the region in April. Critics of protectorate have suggested that the 'official list' may not be as comprehensive as stated, but the SIG has stated that they are 'confident that no deception has been undertaken by the APG. We have observed no evidence of research being concealed from our teams, and to the best of our knowledge the only locations left undisturbed are those few still occupied by Association holdouts, beyond the control of either inspecting government.'\ +

\ + Also as a result of the inspection, concerns have been raised regarding the treatment of ex-Association citizens, particularly the often genetically modified residents of Angessa's Pearl. While Angessa Martei's location is still unknown, her legacy - a society described by some as a cult of personality with emphasis on the cult - poses a significant threat to Skrellian control of the Exalt's Light system, and the clash of 'strong ideologies' has allegedly resulted in mistreatment of detainees that, according to the official report 'would not be permitted in Solar jurisdictions'.\ +

\ + The Protectorate's passing grade opens the door for interstellar trade to resume between the two nations for the first time in several years. Manufacturing giant Ward-Takahashi has already released a public statement on its intent to deal with the APG, and several other trans-stellars are expected to follow suit." + +/datum/lore/codex/page/article92 + name = "09/24/64 - Kaleidoscope Announce Exclusive Almach Deal" + data = "Mere days after the announcement of the reopening of Almachi-Solar trade, the Kaleidoscope Cosmetics corporation has confirmed that they have secured 'exclusive rights' to genetic products produced by several major manufacturers in the Angessa's Pearl system formerly owned by The Exalt - the insular mercurial theocracy of Exalt's Light - and recently handed over to the Almach Protectorate Government.\ +

\ + The details of the company's trade agreement have not been made public, but have reportedly already been approved by both the APG and SCG. The promptness of the agreement suggests to some that negotitations had been underway well before the announcement of the Protectorate's passing grade. Though cooperation between trans-stellar interests and government entities is far from unusual, such dealings with foreign governments - such as those widely made as 'open secrets' with Eutopia - are considered distasteful by many within the Icarus Front.\ +

\ + The Angessan products Kaleidoscope intends to offer have also not been made public, but are all to be thoroughly screened by the Transgressive Technologies Commission before being made available, though 'failing' proposals may be approved for use exclusively within Protectorate territory." + +/datum/lore/codex/page/article93 + name = "10/04/64 - Yong Wins Relani Elections" + data = "Despite concerns about domestic unrest and potential Skrellian interference, elections in Relan have gone ahead, selecting a new President and System Assembly. Francis Harp Yong, leader of the interim government and previous governor of the city-station Ithaca, known for his leading role in negotiating the end of Skrellian occupation and calming riots and rebellions earlier this year, has won the Presidency in a landslide, receiving nearly seventy percent of the vote. His party, the Spacer Union, has secured a narrow majority in the Assembly. The New Federalists, led by former member of the Harper government Odoacer Mieville, are the largest opposition party.\ +

\ + Yong has promised to reinforce Relani neutrality and rebuild the pre-war social system, forming a coalition of labor, technoprogressives, and anti-war activists. His victory likely means an end to the unrest that has plagued Relan since the end of the war with Almach." + +/datum/lore/codex/page/article94 + name = "12/23/64 - Two Vessels Feared Lost In Isavau's Gamble" + data = "Two Solar salvage vessels have been declared missing this week while undertaking operations in the remote Isavau's Gamble system. Locals also report that several smaller craft from the Eutopia system have 'vanished' under similar circumstances. Authorities are treating the disappearances as potential pirate attacks.\ +

\ + The XIV Sri Chamarajendra with crew of 32, and IIV Reimarus with 9 are both reported to have lost contact with the system's spaceport while undertaking far-orbit salvage operations on decommissioned and abandoned facilities, including the ILS Harvest Moon which detonated with all hands earlier this year. The disappearances have spurred the system government to request greater anti-piracy support from the SCG, which has been much reduced since the Almach War and increased tensions on the Hegemony border.\ +

\ + While Proximal to the independent and often 'lawless' Eutopia system, as well as the Rarkajar Rift, infamous prowl of the human-tajaran Jaguar Gang, the Isavau's System has rarely been a direct target for such large-scale apparent hijackings, and no group has yet claimed credit or demanded ransom." + +/datum/lore/codex/page/article95 + name = "12/27/64 - NanoTrasen Accused In Satisfaction Poll Fixing" + data = "The results of an annual system-wide corporate employee satisfaction poll in Vir have been called into question after a leak of internal employee contracts by an anonymous whistle blower. According to verified documents provided to the Vir News Network, NanoTrasen employees on annual employment contracts up for renewal are instructed to fill out an appended form expressing 'Extremely High' satisfaction with their employment at the company, or the contract will be deemed 'incomplete' and thus invalid.\ +

\ + NanoTrasen have been winners of the Vir Happy Employee Award for the 7 years running as of this year, and as such the legitimacy of the award, which has been run in major systems by the Sol Economic Organization since 2503, has been called seriously into question. The SEO has expressed regrets regarding the alleged fixing, but has stated that participating corporations are within their right to encourage employees to vote in a particular way.\ +

\ + According to NanoTrasen, the so-called 'Satisfaction Clause' in their contract renewal process is entirely permissible from a legal standpoint, and the company has no plans to make any changes at this time. When approached for comment, one anonymous employee stated that they 'had never even heard of' the award." + +/datum/lore/codex/page/article96 + name = "01/03/65 - VirGov Seals Security Deal With Local Firm" + data = "Governor Lusia Hainirsdottir has announced sweeping changes to government law enforcement in Vir, lynchpinned by the signing of a five-year contract with home-grown independent security and arms firm, Hedberg-Hammarstrom. The private enterprise will be assuming 'key duties' in local law enforcement and system security, in a move that Hainirsdottir says 'will save millions in taxpayer money, and encourages local, Virite businesses that we trust them every step of the way'.\ +

\ + While many colonies and facilities in Vir rely wholly on in-house security forces and will continue to do so, Hedberg-Hammarstrom is set to take over government patrol duties throughout the system, as well as administrating a large portion of previously government-run local law enforcement agencies including policing and wilderness garrisons.\ +

\ + CEO Gunnar Hammarstrom has reassured current SifGuard members at all levels that they need not fear for their jobs, and that for many the changes will be as simple as a slight change in uniform and a different name on their paychecks, but that H-H agents will be assuming managerial roles in most locations." + +/datum/lore/codex/page/article97 + name = "01/05/65 - Top NanoTrasen Executive Injured In Sif Bombing" + data = "Calvert Moravec, Chief Operations Officer for NanoTrasen Vir remains in a critical condition following a suspected assassination attempt on Saturday. The former gubernatorial candidate had been making a speech at a small NanoTrasen facility known for a prior terrorist attack by Boiling Point forces two years ago, when a small explosive device detonated close to the executive's leg, rendering him unconcious.\ +

\ + NanoTrasen security have elected to investigate the bombing internally, refusing to cooperate with SifGuard authorities on the grounds of disagreements with newly established Hedberg-Hammarstrom management. Mr. Moravec, nephew of NanoTrasen CEO Albary Moravec had reportedly been speaking out against H-H's involvement in national policing when the blast occurred.\ +

\ + Commander Spradling of NanoTrasen Internal Security has issued a company-wide active search order for one member of the audience who remains unaccounted for named 'Lae Vu', who is believed to be a journalist or posing as such, accompanied by images from communicator footage taken at the event.\ +

\ + This amateur footage also shows one member of the audience shouting an anti-corporate slogan and throwing a small electronic device at Moravec before being escorted from the room, just moments prior to the explosion. Spradling has stated that this individual, who is believed to be a disgruntled veteran of the Sif Defense Force, remains one of several persons of interest, but that the thrown item does not appear to be connected directly with the explosive device.\ +

\ + Reports from witnesses suggest that Mr. Moravec made a temporary recovery thanks to the fast action of medical staff aboard the NLS Southern Cross, but that a few hours later he appeared to suffer from a seizure, after which he was placed into a medically induced coma that he is yet to recover from. Unverified images from the Cross appear to show a disoriented individual resembling Moravec self-medicating with a cocktail of prescribed painkillers and alcoholic beverages, though the company strongly denies their veracity." + +/datum/lore/codex/page/article98 + name = "02/02/65 - NanoTrasen Announces Employee-Led Advisement Scheme" + data = "Trans-stellar giant NanoTrasen has today announced the launch of their brand-new 'NanoTrasen Employee Representation Committee' scheme, which will allow employee-selected representatives to have a say in company policy on a local basis. Initially launching as a pilot in 'a few key regions', the NERC is intended to provide an in-house method for those working for NanoTrasen to 'address grievances and provide valuable input without resorting to radical means'.\ +

\ + Vir is one of three size regions of varying scale but similar company presence selected for the pilot program, alongside the 'Deep Bowl' - including Stove, Viola and New Singapore, and 'South America', on Earth. Elections are expected to take place over the coming weeks, with each region electing representatives from core facilities in their locale. The Vir Branch will be expected to select five employees, one from each of; their New Reykjavik Head Office (Colloquially know as 'CentComm'), Karan colony the NCS Northern Star, Kalmar-based NMB Gullstrand medical research center, Sivian way-station NLS Southern Cross, and the company's sprawling Ekmanshalvo Fabrication Plant.\ +

\ + The Representation Committee is set to have quite significant powers over their region's day-to-day operations, ranging from Standard Operation Procedure, to security enforcement, to interior design." + +/datum/lore/codex/page/article99 + name = "02/06/65 - Calvert Moravec Dead At 58, Announces Withdrawal From Public Life" + data = "Just over a month since his injury in a brazen assassination attempt, NanoTrasen Vir's Chief Operations Officer Calvert Moravec has announced his 'temporary withdrawal' from public and corporate matters, in an inspiring speech given from his post-cloning recovery ward. The noted corporate executive passed away on Friday, following a long comatose period, but is expected to make a full recovery.\ +

\ + Mr. Moravec has stated that he believes a spell 'away from the public eye' will do wonders for his recovery, and 'expects to make a return some time in the coming years'. However, Moravec has reaffirmed that his stance on corporate policing, which is believed to have been the reason for the January bombing, remains unchanged; 'The refusal of Hedberg-Hammarstrom to allow our security teams to access government criminal records has been a significant hindrance to the investigation into my death. Allowing just one corporation exclusive access to this data is unequivocally wrong.'" + +/datum/lore/codex/page/article100 + name = "02/08/65 - NERC Campaigning Begins in Vir" + data = "NanoTrasen's latest employee initiative, the NanoTrasen Employee Representation Committee is set to hold their first in-house election this coming weekend, after 'respectable' signup rates for the positions across all participating Vir-based facilities.\ +

\ + According to those interviewed at a few sites, campaigning may be mixed. One potential committee member for the Gullstrand Medical Center described the competition as 'cut-throat' with staff looking to be split between the selection of already respected chief medical experts, and 'more represenative' service staff. Conversely, one worker at the Ekmanshalvo Fabrication Plant complex stated that he 'would probably just vote for whoever I've heard of.'\ +

\ + Final voting will take place on Saturday the 13th of February, with results announced by the following Monday." + +/datum/lore/codex/page/article101 + name = "02/11/65 - Top Astronomers Announce 'Alarming' Tachyon Downtick" + data = "The Galactic Survey Administration has today released a 'high priority' report on what is being described as a 'significant decline in core tachyon density' throughout the known galaxy. According to recent findings tachyon deterioration, which had previously been 'negligible' has undergone a 'rapid acceleration' which could begin to seriously affect interstellar transit in as soon as 30 to 50 years.\ +

\ + Tachyons are a naturally occurring particle present in varying density which form the primary mechanism for bluespace drive operation. In simple terms, the higher the density of tachyons, the more efficiently starship engines are capable of operating. Low-density regions such as the Rarkajar Rift have long posed a challenge to interstellar trade, and the expansion of such regions could prove devastating to galactic unity.\ +

\ + FTL industry leaders Focal Point Energistics have already announced 'immediate investigation' into the GSA's findings after taking a blow on the stock exchange, and have guaranteed a 'commitment to future-proofing' in all forthcoming products." \ No newline at end of file diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm index 092563280c..c127e03e08 100644 --- a/code/modules/mob/new_player/new_player.dm +++ b/code/modules/mob/new_player/new_player.dm @@ -28,6 +28,7 @@ /mob/new_player/proc/new_player_panel_proc() var/output = "
" + output += "[using_map.get_map_info()]" output +="
" output += "

Character Setup

" @@ -63,15 +64,22 @@ output += "

Show Player Polls

" if(client.check_for_new_server_news()) - output += "

Show News (NEW!)

" + output += "

Show Game Updates (NEW!)

" else - output += "

Show News

" + output += "

Show Game Updates

" if(SSsqlite.can_submit_feedback(client)) output += "

[href(src, list("give_feedback" = 1), "Give Feedback")]

" + + if(GLOB.news_data.station_newspaper) + output += "Show [using_map.station_name] News" + output += "
" - panel = new(src, "Welcome","Welcome", 210, 300, src) + if(GLOB.news_data.station_newspaper && !client.seen_news) + show_latest_news(GLOB.news_data.station_newspaper) + + panel = new(src, "Welcome","Welcome", 500, 480, src) panel.set_window_options("can_close=0") panel.set_content(output) panel.open() @@ -611,7 +619,9 @@ /mob/new_player/proc/close_spawn_windows() src << browse(null, "window=latechoices") //closes late choices window - src << browse(null, "window=preferences_window") //closes the player setup window + src << browse(null, "window=preferences_window") //VOREStation Edit? + src << browse(null, "window=News") //closes news window + //src << browse(null, "window=playersetup") //closes the player setup window panel.close() /mob/new_player/proc/has_admin_rights() diff --git a/code/modules/mob/new_player/news.dm b/code/modules/mob/new_player/news.dm new file mode 100644 index 0000000000..6af422e553 --- /dev/null +++ b/code/modules/mob/new_player/news.dm @@ -0,0 +1,86 @@ +/mob/new_player + var/current_news_page + +/mob/new_player/Topic(href, href_list[]) + . = ..() + + if(href_list["open_station_news"]) + show_latest_news(GLOB.news_data.station_newspaper) + + if(href_list["next_news"]) + var/datum/feed_channel/next_page = locate(href_list["nextpage"]) + if(!next_page) + return + if(!current_news_page) + return + if(!next_page.messages) + return + + if(current_news_page == next_page.messages.len) + return + else + current_news_page++ + playsound(src.loc, "pageturn", 50, 1) + show_latest_news(GLOB.news_data.station_newspaper) + + + if(href_list["previous_news"]) + var/datum/feed_channel/prev_page = locate(href_list["prevpage"]) + if(!prev_page) + return + if(!current_news_page) + return + if(!prev_page.messages) + return + if(1 >= current_news_page) + return + else + current_news_page-- + playsound(src.loc, "pageturn", 50, 1) + show_latest_news(GLOB.news_data.station_newspaper) + + +/mob/new_player/proc/show_latest_news(var/datum/feed_channel/CHANNEL) + if(!GLOB.news_data) return + if(!GLOB.news_data.station_newspaper) return + + var/dat + + if(!current_news_page) + if(CHANNEL.messages) + current_news_page = 1 //Start at the 'front' because of how the codex works. + + if(!current_news_page || isemptylist(CHANNEL.messages)) + dat += "No current available news on [GLOB.news_data.station_newspaper.channel_name], it may still be loading!" + else + dat += get_news_page(CHANNEL, CHANNEL.messages[current_news_page], current_news_page) + if(CHANNEL.messages.len > current_news_page) + dat += "Older Issue" + if(current_news_page > CHANNEL.messages.len || (CHANNEL.messages.len > 1) && !(current_news_page == 1)) + dat += "Newer Issue " + + dat += " (Page [current_news_page] out of [CHANNEL.messages.len])" + + var/datum/browser/popup = new(usr, "News", "Latest News", 640, 600, src) + popup.set_content(jointext(dat,null)) + popup.open() + + client.seen_news = 1 + +/proc/get_news_page(var/datum/feed_channel/CHANNEL, var/datum/feed_message/MESSAGE, current_page) + var/dat + + dat += get_newspaper_header(CHANNEL.channel_name, "Aggregated News", "#d4cec1") + + if(isemptylist(CHANNEL.messages)) + dat += "No current articles for this newspaper.
" + else + var/pic_data + + if(MESSAGE.img) + usr << browse_rsc(MESSAGE.img, "tmp_photo[current_page].png") + pic_data+="
" + + dat += get_newspaper_content(MESSAGE.title, MESSAGE.body, MESSAGE.author, "#d4cec1", pic_data) + + return dat \ No newline at end of file diff --git a/code/modules/news/new_newspaper.dm b/code/modules/news/new_newspaper.dm new file mode 100644 index 0000000000..c9759a5a83 --- /dev/null +++ b/code/modules/news/new_newspaper.dm @@ -0,0 +1,146 @@ +//######################################################################################################################## +//###################################### NEWSPAPER! ###################################################################### +//######################################################################################################################## + +/obj/item/weapon/newspaper + name = "newspaper" + desc = "An issue of The Griffon, the newspaper circulating aboard most stations." + icon = 'icons/obj/bureaucracy.dmi' + icon_state = "newspaper" + w_class = ITEMSIZE_SMALL //Let's make it fit in trashbags! + attack_verb = list("bapped") + var/screen = 0 + var/pages = 0 + var/curr_page = 0 + var/list/datum/feed_channel/news_content = list() + var/datum/feed_message/important_message = null + var/scribble="" + var/scribble_page = null + drop_sound = 'sound/items/drop/wrapper.ogg' + pickup_sound = 'sound/items/pickup/wrapper.ogg' + +obj/item/weapon/newspaper/attack_self(mob/user) + if(ishuman(user)) + var/mob/living/carbon/human/human_user = user + var/dat + pages = 0 + switch(screen) + if(0) //Cover + dat+="
The Griffon
" + dat+="
[using_map.company_name]-standard newspaper, for use on [using_map.company_name]© Space Facilities

" + if(isemptylist(news_content)) + if(important_message) + dat+="Contents:
" + else + dat+="Other than the title, the rest of the newspaper is unprinted..." + else + dat+="Contents:
" + if(scribble_page==curr_page) + dat+="
There is a small scribble near the end of this page... It reads: \"[scribble]\"" + dat+= "
Next Page
Done reading
" + if(1) // X channel pages inbetween. + for(var/datum/feed_channel/NP in news_content) + pages++ //Let's get it right again. + var/datum/feed_channel/C = news_content[curr_page] + dat+="[C.channel_name] \[created by: [C.author]\]

" + if(C.censored) + dat+="This channel was deemed dangerous to the general welfare of the station and therefore marked with a D-Notice. Its contents were not transferred to the newspaper at the time of printing." + else + if(isemptylist(C.messages)) + dat+="No Feed stories stem from this channel..." + else + dat+="" + if(scribble_page==curr_page) + dat+="
There is a small scribble near the end of this page... It reads: \"[scribble]\"" + dat+= "

Previous Page
Next Page
" + if(2) //Last page + for(var/datum/feed_channel/NP in news_content) + pages++ + if(important_message!=null) + dat+="
Wanted Issue:


" + dat+="Criminal name: [important_message.author]
" + dat+="Description: [important_message.body]
" + dat+="Photo:: " + if(important_message.img) + user << browse_rsc(important_message.img, "tmp_photow.png") + dat+="
" + else + dat+="None" + else + dat+="Apart from some uninteresting Classified ads, there's nothing on this page..." + if(scribble_page==curr_page) + dat+="
There is a small scribble near the end of this page... It reads: \"[scribble]\"" + dat+= "
Previous Page
" + else + dat+="I'm sorry to break your immersion. This shit's bugged. Report this bug to Agouri, polyxenitopalidou@gmail.com" + + dat+="

[curr_page+1]
" + human_user << browse(dat, "window=newspaper_main;size=300x400") + onclose(human_user, "newspaper_main") + else + to_chat(user, "The paper is full of intelligible symbols!") + +obj/item/weapon/newspaper/Topic(href, href_list) + var/mob/living/U = usr + ..() + if((src in U.contents) || (istype(loc, /turf) && in_range(src, U))) + U.set_machine(src) + if(href_list["next_page"]) + if(curr_page == pages+1) + return //Don't need that at all, but anyway. + if(curr_page == pages) //We're at the middle, get to the end + screen = 2 + else + if(curr_page == 0) //We're at the start, get to the middle + screen = 1 + curr_page++ + playsound(src, "pageturn", 50, 1) + + else if(href_list["prev_page"]) + if(curr_page == 0) + return + if(curr_page == 1) + screen = 0 + + else + if(curr_page == pages+1) //we're at the end, let's go back to the middle. + screen = 1 + curr_page-- + playsound(src, "pageturn", 50, 1) + + if(istype(src.loc, /mob)) + attack_self(src.loc) + +obj/item/weapon/newspaper/attackby(obj/item/weapon/W as obj, mob/user) + if(istype(W, /obj/item/weapon/pen)) + if(scribble_page == curr_page) + to_chat(user, "There's already a scribble in this page... You wouldn't want to make things too cluttered, would you?") + else + var/s = sanitize(input(user, "Write something", "Newspaper", "")) + s = sanitize(s) + if(!s) + return + if(!in_range(src, usr) && src.loc != usr) + return + scribble_page = curr_page + scribble = s + attack_self(user) + return diff --git a/code/modules/news/news_init.dm b/code/modules/news/news_init.dm new file mode 100644 index 0000000000..33adc2d530 --- /dev/null +++ b/code/modules/news/news_init.dm @@ -0,0 +1,34 @@ +GLOBAL_DATUM_INIT(news_data, /datum/lore/news, new) + +/datum/feed_network/New() + CreateFeedChannel("Station Announcements", "NanoTrasen", 1, 1, "New Station Announcement Available") + CreateFeedChannel("Vir News Network", "Oculum Broadcast", 1, 1, "Updates from the Vir News Network!") + +/datum/lore/news + var/datum/feed_channel/station_newspaper + var/datum/lore/codex/category/main_news/news_codex = new() + +/datum/lore/news/New() + ..() + spawn(50) //Give it a second or it gets fucky. + for(var/datum/feed_channel/F in news_network.network_channels) + if(F.channel_name == "Vir News Network") + station_newspaper = F + break + spawn(300) // Yes, again. + fill_codex_news() + +/datum/lore/news/proc/fill_codex_news() + if(!news_network) + log_debug("Load: Could not find newscaster network.") + return + + if(!station_newspaper) + log_debug("Load: Could not find news channel Vir News Network to populate news articles.") + return + + //Feed the Lore Codex into the News Machine + for(var/datum/lore/codex/child in news_codex.children) + news_network.SubmitArticle("[child.data]", "Oculum", "Vir News Network", null, 1, "", "[child.name]") + + return 1 \ No newline at end of file diff --git a/code/modules/news/newspaper.dm b/code/modules/news/newspaper.dm new file mode 100644 index 0000000000..330e505d51 --- /dev/null +++ b/code/modules/news/newspaper.dm @@ -0,0 +1,147 @@ +//######################################################################################################################## +//###################################### NEWSPAPER! ###################################################################### +//######################################################################################################################## + +/obj/item/weapon/newspaper + name = "newspaper" + desc = "An issue of The Griffon, the newspaper circulating aboard most stations." + icon = 'icons/obj/bureaucracy.dmi' + icon_state = "newspaper" + w_class = ITEMSIZE_SMALL //Let's make it fit in trashbags! + attack_verb = list("bapped") + var/screen = 0 + var/pages = 0 + var/curr_page = 0 + var/list/datum/feed_channel/news_content = list() + var/datum/feed_message/important_message = null + var/scribble="" + var/scribble_page = null + drop_sound = 'sound/items/drop/wrapper.ogg' + pickup_sound = 'sound/items/pickup/wrapper.ogg' + +obj/item/weapon/newspaper/attack_self(mob/user as mob) + if(ishuman(user)) + var/mob/living/carbon/human/human_user = user + var/dat + pages = 0 + switch(screen) + if(0) //Cover + dat+="
The Griffon
" + dat+="
[using_map.company_name]-standard newspaper, for use on [using_map.company_name]© Space Facilities

" + if(isemptylist(news_content)) + if(important_message) + dat+="Contents:
" + else + dat+="Other than the title, the rest of the newspaper is unprinted..." + else + dat+="Contents:
" + if(scribble_page==curr_page) + dat+="
There is a small scribble near the end of this page... It reads: \"[scribble]\"" + dat+= "
Next Page
Done reading
" + if(1) // X channel pages inbetween. + for(var/datum/feed_channel/NP in news_content) + pages++ //Let's get it right again. + var/datum/feed_channel/C = news_content[curr_page] + dat+="[C.channel_name] \[created by: [C.author]\]

" + if(C.censored) + dat+="This channel was deemed dangerous to the general welfare of the station and therefore marked with a D-Notice. Its contents were not transferred to the newspaper at the time of printing." + else + if(isemptylist(C.messages)) + dat+="No Feed stories stem from this channel..." + else + dat+="" + if(scribble_page==curr_page) + dat+="
There is a small scribble near the end of this page... It reads: \"[scribble]\"" + dat+= "

Previous Page
Next Page
" + if(2) //Last page + for(var/datum/feed_channel/NP in news_content) + pages++ + if(important_message!=null) + dat+="
Wanted Issue:


" + dat+="Criminal name: [important_message.author]
" + dat+="Description: [important_message.body]
" + dat+="Photo:: " + if(important_message.img) + user << browse_rsc(important_message.img, "tmp_photow.png") + dat+="
" + else + dat+="None" + else + dat+="Apart from some uninteresting Classified ads, there's nothing on this page..." + if(scribble_page==curr_page) + dat+="
There is a small scribble near the end of this page... It reads: \"[scribble]\"" + dat+= "
Previous Page
" + else + dat+="I'm sorry to break your immersion. This shit's bugged. Report this bug to Agouri, polyxenitopalidou@gmail.com" + + dat+="

[curr_page+1]
" + human_user << browse(dat, "window=newspaper_main;size=300x400") + onclose(human_user, "newspaper_main") + else + to_chat(user, "The paper is full of intelligible symbols!") + +obj/item/weapon/newspaper/Topic(href, href_list) + var/mob/living/U = usr + ..() + if((src in U.contents) || (istype(loc, /turf) && in_range(src, U))) + U.set_machine(src) + if(href_list["next_page"]) + if(curr_page == pages+1) + return //Don't need that at all, but anyway. + if(curr_page == pages) //We're at the middle, get to the end + screen = 2 + else + if(curr_page == 0) //We're at the start, get to the middle + screen = 1 + curr_page++ + playsound(src, "pageturn", 50, 1) + + else if(href_list["prev_page"]) + if(curr_page == 0) + return + if(curr_page == 1) + screen = 0 + + else + if(curr_page == pages+1) //we're at the end, let's go back to the middle. + screen = 1 + curr_page-- + playsound(src, "pageturn", 50, 1) + + if(istype(src.loc, /mob)) + attack_self(src.loc) + +obj/item/weapon/newspaper/attackby(obj/item/weapon/W as obj, mob/user as mob) + if(istype(W, /obj/item/weapon/pen)) + if(scribble_page == curr_page) + to_chat(user, "There's already a scribble in this page... You wouldn't want to make things too cluttered, would you?") + else + var/s = sanitize(input(user, "Write something", "Newspaper", "")) + s = sanitize(s) + if(!s) + return + if(!in_range(src, usr) && src.loc != usr) + return + scribble_page = curr_page + scribble = s + attack_self(user) + return \ No newline at end of file diff --git a/code/modules/news/newspaper_layout.dm b/code/modules/news/newspaper_layout.dm new file mode 100644 index 0000000000..224b8c6eca --- /dev/null +++ b/code/modules/news/newspaper_layout.dm @@ -0,0 +1,41 @@ +/proc/get_newspaper_header(newspaper, var/list/subjects, bgcolor) + + var/dat + + dat += "
" + dat += "" + dat += "
" + dat += "

" + dat += "[newspaper]

" + dat += "
" + + if(subjects) + var/subject_list = jointext(subjects," - ") + + dat += "

[subject_list]


" + dat += "
" + + return dat + + +/proc/get_newspaper_content(header, content, author, bgcolor, picture_data) + + var/dat + + dat += "" + dat += "" + + dat += "
" + dat += "" + dat += "
" + dat += "
[header]
" + + dat += "

By [author]


" + + if(picture_data) + dat += "
[picture_data]
" + + dat += "
" + dat += "

[content]



" + + return dat \ No newline at end of file diff --git a/maps/southern_cross/southern_cross_defines.dm b/maps/southern_cross/southern_cross_defines.dm index b4266d25e9..63ff66ee31 100644 --- a/maps/southern_cross/southern_cross_defines.dm +++ b/maps/southern_cross/southern_cross_defines.dm @@ -1,3 +1,4 @@ +<<<<<<< HEAD // To be filled out when more progress on the new map occurs. #define Z_LEVEL_STATION_ONE 1 @@ -370,3 +371,670 @@ model_text = "Pilot" req_access = null req_one_access = list(access_pilot,access_explorer) +||||||| parent of 2dac28c26b... Merge pull request #9773 from VOREStation/upstream-merge-7856 +// To be filled out when more progress on the new map occurs. + +#define Z_LEVEL_STATION_ONE 1 +#define Z_LEVEL_STATION_TWO 2 +#define Z_LEVEL_STATION_THREE 3 +#define Z_LEVEL_EMPTY_SPACE 4 +#define Z_LEVEL_SURFACE 5 +#define Z_LEVEL_SURFACE_MINE 6 +#define Z_LEVEL_MISC 7 +#define Z_LEVEL_CENTCOM 8 +#define Z_LEVEL_TRANSIT 9 +#define Z_LEVEL_SURFACE_WILD 10 + +/datum/map/southern_cross + name = "Southern Cross" + full_name = "Southern Cross" + path = "southern_cross" + + lobby_icon = 'icons/misc/title.dmi' + lobby_screens = list("mockingjay00") // New lobby screen if possible. + + holomap_smoosh = list(list( + Z_LEVEL_STATION_ONE, + Z_LEVEL_STATION_TWO, + Z_LEVEL_STATION_THREE)) + + zlevel_datum_type = /datum/map_z_level/southern_cross + + station_name = "NLS Southern Cross" + station_short = "Southern Cross" + dock_name = "NCS Northern Star" // Now we're the centcom! + boss_name = "Central Command" + boss_short = "Centcom" + company_name = "NanoTrasen" + company_short = "NT" + starsys_name = "Vir" + use_overmap = TRUE + + shuttle_docked_message = "The scheduled shuttle to the %dock_name% has docked with the station at docks one and two. It will depart in approximately %ETD%." + shuttle_leaving_dock = "The Crew Transfer Shuttle has left the station. Estimate %ETA% until the shuttle docks at %dock_name%." + shuttle_called_message = "A crew transfer to %dock_name% has been scheduled. The shuttle has been called. Those leaving should proceed to docks one and two in approximately %ETA%." + shuttle_recall_message = "The scheduled crew transfer has been cancelled." + emergency_shuttle_docked_message = "The Emergency Shuttle has docked with the station at docks one and two. You have approximately %ETD% to board the Emergency Shuttle." + emergency_shuttle_leaving_dock = "The Emergency Shuttle has left the station. Estimate %ETA% until the shuttle docks at %dock_name%." + emergency_shuttle_called_message = "An emergency evacuation shuttle has been called. It will arrive at docks one and two in approximately %ETA%." + emergency_shuttle_recall_message = "The emergency shuttle has been recalled." + + // Networks that will show up as options in the camera monitor program + station_networks = list( + NETWORK_CARGO, + NETWORK_CIRCUITS, + NETWORK_CIVILIAN, + NETWORK_COMMAND, + NETWORK_ENGINE, + NETWORK_ENGINEERING, + NETWORK_ENGINEERING_OUTPOST, + NETWORK_FIRST_DECK, + NETWORK_SECOND_DECK, + NETWORK_THIRD_DECK, + NETWORK_MAIN_OUTPOST, + NETWORK_MEDICAL, + NETWORK_MINE, + NETWORK_RESEARCH, + NETWORK_RESEARCH_OUTPOST, + NETWORK_ROBOTS, + NETWORK_PRISON, + NETWORK_SECURITY, + NETWORK_TELECOM + ) + // Camera networks that exist, but don't show on regular camera monitors. + secondary_networks = list( + NETWORK_ERT, + NETWORK_MERCENARY, + NETWORK_THUNDER, + NETWORK_COMMUNICATORS, + NETWORK_ALARM_ATMOS, + NETWORK_ALARM_POWER, + NETWORK_ALARM_FIRE, + NETWORK_SUPPLY + ) + usable_email_tlds = list("freemail.nt") + allowed_spawns = list("Arrivals Shuttle","Gateway", "Cryogenic Storage", "Cyborg Storage") + + default_skybox = /datum/skybox_settings/southern_cross + + unit_test_exempt_areas = list(/area/ninja_dojo, /area/ninja_dojo/firstdeck, /area/ninja_dojo/arrivals_dock) + unit_test_exempt_from_atmos = list(/area/tcomm/chamber) + + planet_datums_to_make = list(/datum/planet/sif) + + map_levels = list( + Z_LEVEL_STATION_ONE, + Z_LEVEL_STATION_TWO, + Z_LEVEL_STATION_THREE, + Z_LEVEL_SURFACE, + Z_LEVEL_SURFACE_MINE + ) + +// Commented out due to causing a lot of bugs. The base proc plus overmap achieves this functionality anyways. +/* +// Short range computers see only the six main levels, others can see the surrounding surface levels. +/datum/map/southern_cross/get_map_levels(var/srcz, var/long_range = TRUE) + if (long_range && (srcz in map_levels)) + return map_levels + else if (srcz == Z_LEVEL_TRANSIT && !long_range) + return list() // Nothing on these z-levels- sensors won't show, and GPSes won't see each other. + else if (srcz >= Z_LEVEL_STATION_ONE && srcz <= Z_LEVEL_STATION_THREE) // Station can see other decks. + return list( + Z_LEVEL_STATION_ONE, + Z_LEVEL_STATION_TWO, + Z_LEVEL_STATION_THREE, + ) + else if(srcz in list(Z_LEVEL_SURFACE, Z_LEVEL_SURFACE_MINE, Z_LEVEL_SURFACE_WILD)) // Being on the surface lets you see other surface Zs. + return list( + Z_LEVEL_SURFACE, + Z_LEVEL_SURFACE_MINE, + Z_LEVEL_SURFACE_WILD + ) + else + return list(srcz) //prevents runtimes when using CMC. any Z-level not defined above will be 'isolated' and only show to GPSes/CMCs on that same Z (e.g. CentCom). +*/ +/datum/map/southern_cross/perform_map_generation() + // First, place a bunch of submaps. This comes before tunnel/forest generation as to not interfere with the submap. + + // Cave submaps are first. + seed_submaps(list(Z_LEVEL_SURFACE_MINE), 75, /area/surface/cave/unexplored/normal, /datum/map_template/surface/mountains/normal) + seed_submaps(list(Z_LEVEL_SURFACE_MINE), 75, /area/surface/cave/unexplored/deep, /datum/map_template/surface/mountains/deep) + // Plains to make them less plain. + seed_submaps(list(Z_LEVEL_SURFACE), 100, /area/surface/outside/plains/normal, /datum/map_template/surface/plains) // Center area is WIP until map editing settles down. + // Wilderness is next. + seed_submaps(list(Z_LEVEL_SURFACE_WILD), 75, /area/surface/outside/wilderness/normal, /datum/map_template/surface/wilderness/normal) + seed_submaps(list(Z_LEVEL_SURFACE_WILD), 75, /area/surface/outside/wilderness/deep, /datum/map_template/surface/wilderness/deep) + // If Space submaps are made, add a line to make them here as well. + + // Now for the tunnels. + new /datum/random_map/automata/cave_system/no_cracks(null, 1, 1, Z_LEVEL_SURFACE_MINE, world.maxx, world.maxy) // Create the mining Z-level. + new /datum/random_map/noise/ore(null, 1, 1, Z_LEVEL_SURFACE_MINE, 64, 64) // Create the mining ore distribution map. + // Todo: Forest generation. + return 1 + +// Skybox Settings +/datum/skybox_settings/southern_cross + icon_state = "dyable" + random_color = TRUE + +// For making the 6-in-1 holomap, we calculate some offsets +#define SOUTHERN_CROSS_MAP_SIZE 160 // Width and height of compiled in Southern Cross z levels. +#define SOUTHERN_CROSS_HOLOMAP_CENTER_GUTTER 40 // 40px central gutter between columns +#define SOUTHERN_CROSS_HOLOMAP_MARGIN_X ((HOLOMAP_ICON_SIZE - (2*SOUTHERN_CROSS_MAP_SIZE) - SOUTHERN_CROSS_HOLOMAP_CENTER_GUTTER) / 2) // 100 +#define SOUTHERN_CROSS_HOLOMAP_MARGIN_Y ((HOLOMAP_ICON_SIZE - (3*SOUTHERN_CROSS_MAP_SIZE)) / 2) // 60 + +/datum/map_z_level/southern_cross/station + flags = MAP_LEVEL_STATION|MAP_LEVEL_CONTACT|MAP_LEVEL_PLAYER|MAP_LEVEL_CONSOLES + holomap_legend_x = 220 + holomap_legend_y = 160 + +/datum/map_z_level/southern_cross/station/station_one + z = Z_LEVEL_STATION_ONE + name = "Deck 1" + base_turf = /turf/space + transit_chance = 6 + holomap_offset_x = SOUTHERN_CROSS_HOLOMAP_MARGIN_X - 40 + holomap_offset_y = SOUTHERN_CROSS_HOLOMAP_MARGIN_Y + SOUTHERN_CROSS_MAP_SIZE*0 + +/datum/map_z_level/southern_cross/station/station_two + z = Z_LEVEL_STATION_TWO + name = "Deck 2" + base_turf = /turf/simulated/open + transit_chance = 6 + holomap_offset_x = SOUTHERN_CROSS_HOLOMAP_MARGIN_X - 40 + holomap_offset_y = SOUTHERN_CROSS_HOLOMAP_MARGIN_Y + SOUTHERN_CROSS_MAP_SIZE*1 + +/datum/map_z_level/southern_cross/station/station_three + z = Z_LEVEL_STATION_THREE + name = "Deck 3" + base_turf = /turf/simulated/open + transit_chance = 6 + holomap_offset_x = HOLOMAP_ICON_SIZE - SOUTHERN_CROSS_HOLOMAP_MARGIN_X - SOUTHERN_CROSS_MAP_SIZE - 40 + holomap_offset_y = SOUTHERN_CROSS_HOLOMAP_MARGIN_Y + SOUTHERN_CROSS_MAP_SIZE*1 + +/datum/map_z_level/southern_cross/empty_space + z = Z_LEVEL_EMPTY_SPACE + name = "Empty" + flags = MAP_LEVEL_PLAYER + transit_chance = 76 + +/datum/map_z_level/southern_cross/surface + z = Z_LEVEL_SURFACE + name = "Plains" + flags = MAP_LEVEL_CONTACT|MAP_LEVEL_PLAYER|MAP_LEVEL_SEALED|MAP_LEVEL_CONSOLES + base_turf = /turf/simulated/floor/outdoors/rocks + +/datum/map_z_level/southern_cross/surface_mine + z = Z_LEVEL_SURFACE_MINE + name = "Mountains" + flags = MAP_LEVEL_CONTACT|MAP_LEVEL_PLAYER|MAP_LEVEL_SEALED|MAP_LEVEL_CONSOLES + base_turf = /turf/simulated/floor/outdoors/rocks + +/datum/map_z_level/southern_cross/surface_wild + z = Z_LEVEL_SURFACE_WILD + name = "Wilderness" + flags = MAP_LEVEL_PLAYER|MAP_LEVEL_SEALED|MAP_LEVEL_CONTACT|MAP_LEVEL_CONSOLES + base_turf = /turf/simulated/floor/outdoors/rocks + +/datum/map_z_level/southern_cross/misc + z = Z_LEVEL_MISC + name = "Misc" + flags = MAP_LEVEL_PLAYER + transit_chance = 6 + +/datum/map_z_level/southern_cross/centcom + z = Z_LEVEL_CENTCOM + name = "Centcom" + flags = MAP_LEVEL_ADMIN|MAP_LEVEL_CONTACT + +/datum/map_z_level/southern_cross/transit + z = Z_LEVEL_TRANSIT + name = "Transit" + flags = MAP_LEVEL_ADMIN|MAP_LEVEL_SEALED|MAP_LEVEL_PLAYER|MAP_LEVEL_CONTACT + +//Teleport to Mine + +/obj/effect/step_trigger/teleporter/mine/to_mining/New() + ..() + teleport_x = src.x + teleport_y = 2 + teleport_z = Z_LEVEL_SURFACE_MINE + +/obj/effect/step_trigger/teleporter/mine/from_mining/New() + ..() + teleport_x = src.x + teleport_y = world.maxy - 1 + teleport_z = Z_LEVEL_SURFACE + +//Teleport to Wild + +/obj/effect/step_trigger/teleporter/wild/to_wild/New() + ..() + teleport_x = src.x + teleport_y = 2 + teleport_z = Z_LEVEL_SURFACE_WILD + +/obj/effect/step_trigger/teleporter/wild/from_wild/New() + ..() + teleport_x = src.x + teleport_y = world.maxy - 1 + teleport_z = Z_LEVEL_SURFACE_MINE + +/datum/planet/sif + expected_z_levels = list( + Z_LEVEL_SURFACE, + Z_LEVEL_SURFACE_MINE, + Z_LEVEL_SURFACE_WILD + ) + +/obj/effect/step_trigger/teleporter/bridge/east_to_west/Initialize() + teleport_x = src.x - 4 + teleport_y = src.y + teleport_z = src.z + return ..() + +/obj/effect/step_trigger/teleporter/bridge/east_to_west/small/Initialize() + teleport_x = src.x - 3 + teleport_y = src.y + teleport_z = src.z + return ..() + +/obj/effect/step_trigger/teleporter/bridge/west_to_east/Initialize() + teleport_x = src.x + 4 + teleport_y = src.y + teleport_z = src.z + return ..() + +/obj/effect/step_trigger/teleporter/bridge/west_to_east/small/Initialize() + teleport_x = src.x + 3 + teleport_y = src.y + teleport_z = src.z + return ..() + +/obj/effect/step_trigger/teleporter/bridge/north_to_south/Initialize() + teleport_x = src.x + teleport_y = src.y - 4 + teleport_z = src.z + return ..() + +/obj/effect/step_trigger/teleporter/bridge/south_to_north/Initialize() + teleport_x = src.x + teleport_y = src.y + 4 + teleport_z = src.z + return ..() + +/obj/effect/map_effect/portal/master/side_a/plains_to_caves + portal_id = "plains_caves-normal" + +/obj/effect/map_effect/portal/master/side_b/caves_to_plains + portal_id = "plains_caves-normal" + +/obj/effect/map_effect/portal/master/side_a/plains_to_caves/river + portal_id = "plains_caves-river" + +/obj/effect/map_effect/portal/master/side_b/caves_to_plains/river + portal_id = "plains_caves-river" + + +/obj/effect/map_effect/portal/master/side_a/caves_to_wilderness + portal_id = "caves_wilderness-normal" + +/obj/effect/map_effect/portal/master/side_b/wilderness_to_caves + portal_id = "caves_wilderness-normal" + +/obj/effect/map_effect/portal/master/side_a/caves_to_wilderness/river + portal_id = "caves_wilderness-river" + +/obj/effect/map_effect/portal/master/side_b/wilderness_to_caves/river + portal_id = "caves_wilderness-river" + +//Suit Storage Units + +/obj/machinery/suit_cycler/exploration + name = "Explorer suit cycler" + model_text = "Exploration" + req_one_access = list(access_pilot,access_explorer) + +/obj/machinery/suit_cycler/pilot + name = "Pilot suit cycler" + model_text = "Pilot" + req_access = null + req_one_access = list(access_pilot,access_explorer) +======= +// To be filled out when more progress on the new map occurs. + +#define Z_LEVEL_STATION_ONE 1 +#define Z_LEVEL_STATION_TWO 2 +#define Z_LEVEL_STATION_THREE 3 +#define Z_LEVEL_EMPTY_SPACE 4 +#define Z_LEVEL_SURFACE 5 +#define Z_LEVEL_SURFACE_MINE 6 +#define Z_LEVEL_MISC 7 +#define Z_LEVEL_CENTCOM 8 +#define Z_LEVEL_TRANSIT 9 +#define Z_LEVEL_SURFACE_WILD 10 + +/datum/map/southern_cross + name = "Southern Cross" + full_name = "Southern Cross" + path = "southern_cross" + + lobby_icon = 'icons/misc/title.dmi' + lobby_screens = list("mockingjay00") // New lobby screen if possible. + + holomap_smoosh = list(list( + Z_LEVEL_STATION_ONE, + Z_LEVEL_STATION_TWO, + Z_LEVEL_STATION_THREE)) + + zlevel_datum_type = /datum/map_z_level/southern_cross + + station_name = "NLS Southern Cross" + station_short = "Southern Cross" + dock_name = "NCS Northern Star" // Now we're the centcom! + boss_name = "Central Command" + boss_short = "Centcom" + company_name = "NanoTrasen" + company_short = "NT" + starsys_name = "Vir" + use_overmap = TRUE + + shuttle_docked_message = "The scheduled shuttle to the %dock_name% has docked with the station at docks one and two. It will depart in approximately %ETD%." + shuttle_leaving_dock = "The Crew Transfer Shuttle has left the station. Estimate %ETA% until the shuttle docks at %dock_name%." + shuttle_called_message = "A crew transfer to %dock_name% has been scheduled. The shuttle has been called. Those leaving should proceed to docks one and two in approximately %ETA%." + shuttle_recall_message = "The scheduled crew transfer has been cancelled." + emergency_shuttle_docked_message = "The Emergency Shuttle has docked with the station at docks one and two. You have approximately %ETD% to board the Emergency Shuttle." + emergency_shuttle_leaving_dock = "The Emergency Shuttle has left the station. Estimate %ETA% until the shuttle docks at %dock_name%." + emergency_shuttle_called_message = "An emergency evacuation shuttle has been called. It will arrive at docks one and two in approximately %ETA%." + emergency_shuttle_recall_message = "The emergency shuttle has been recalled." + + // Networks that will show up as options in the camera monitor program + station_networks = list( + NETWORK_CARGO, + NETWORK_CIRCUITS, + NETWORK_CIVILIAN, + NETWORK_COMMAND, + NETWORK_ENGINE, + NETWORK_ENGINEERING, + NETWORK_ENGINEERING_OUTPOST, + NETWORK_FIRST_DECK, + NETWORK_SECOND_DECK, + NETWORK_THIRD_DECK, + NETWORK_MAIN_OUTPOST, + NETWORK_MEDICAL, + NETWORK_MINE, + NETWORK_RESEARCH, + NETWORK_RESEARCH_OUTPOST, + NETWORK_ROBOTS, + NETWORK_PRISON, + NETWORK_SECURITY, + NETWORK_TELECOM + ) + // Camera networks that exist, but don't show on regular camera monitors. + secondary_networks = list( + NETWORK_ERT, + NETWORK_MERCENARY, + NETWORK_THUNDER, + NETWORK_COMMUNICATORS, + NETWORK_ALARM_ATMOS, + NETWORK_ALARM_POWER, + NETWORK_ALARM_FIRE, + NETWORK_SUPPLY + ) + usable_email_tlds = list("freemail.nt") + allowed_spawns = list("Arrivals Shuttle","Gateway", "Cryogenic Storage", "Cyborg Storage") + + default_skybox = /datum/skybox_settings/southern_cross + + unit_test_exempt_areas = list(/area/ninja_dojo, /area/ninja_dojo/firstdeck, /area/ninja_dojo/arrivals_dock) + unit_test_exempt_from_atmos = list(/area/tcomm/chamber) + + planet_datums_to_make = list(/datum/planet/sif) + + map_levels = list( + Z_LEVEL_STATION_ONE, + Z_LEVEL_STATION_TWO, + Z_LEVEL_STATION_THREE, + Z_LEVEL_SURFACE, + Z_LEVEL_SURFACE_MINE + ) + +// Commented out due to causing a lot of bugs. The base proc plus overmap achieves this functionality anyways. +/* +// Short range computers see only the six main levels, others can see the surrounding surface levels. +/datum/map/southern_cross/get_map_levels(var/srcz, var/long_range = TRUE) + if (long_range && (srcz in map_levels)) + return map_levels + else if (srcz == Z_LEVEL_TRANSIT && !long_range) + return list() // Nothing on these z-levels- sensors won't show, and GPSes won't see each other. + else if (srcz >= Z_LEVEL_STATION_ONE && srcz <= Z_LEVEL_STATION_THREE) // Station can see other decks. + return list( + Z_LEVEL_STATION_ONE, + Z_LEVEL_STATION_TWO, + Z_LEVEL_STATION_THREE, + ) + else if(srcz in list(Z_LEVEL_SURFACE, Z_LEVEL_SURFACE_MINE, Z_LEVEL_SURFACE_WILD)) // Being on the surface lets you see other surface Zs. + return list( + Z_LEVEL_SURFACE, + Z_LEVEL_SURFACE_MINE, + Z_LEVEL_SURFACE_WILD + ) + else + return list(srcz) //prevents runtimes when using CMC. any Z-level not defined above will be 'isolated' and only show to GPSes/CMCs on that same Z (e.g. CentCom). +*/ +/datum/map/southern_cross/perform_map_generation() + // First, place a bunch of submaps. This comes before tunnel/forest generation as to not interfere with the submap. + + // Cave submaps are first. + seed_submaps(list(Z_LEVEL_SURFACE_MINE), 75, /area/surface/cave/unexplored/normal, /datum/map_template/surface/mountains/normal) + seed_submaps(list(Z_LEVEL_SURFACE_MINE), 75, /area/surface/cave/unexplored/deep, /datum/map_template/surface/mountains/deep) + // Plains to make them less plain. + seed_submaps(list(Z_LEVEL_SURFACE), 100, /area/surface/outside/plains/normal, /datum/map_template/surface/plains) // Center area is WIP until map editing settles down. + // Wilderness is next. + seed_submaps(list(Z_LEVEL_SURFACE_WILD), 75, /area/surface/outside/wilderness/normal, /datum/map_template/surface/wilderness/normal) + seed_submaps(list(Z_LEVEL_SURFACE_WILD), 75, /area/surface/outside/wilderness/deep, /datum/map_template/surface/wilderness/deep) + // If Space submaps are made, add a line to make them here as well. + + // Now for the tunnels. + new /datum/random_map/automata/cave_system/no_cracks(null, 1, 1, Z_LEVEL_SURFACE_MINE, world.maxx, world.maxy) // Create the mining Z-level. + new /datum/random_map/noise/ore(null, 1, 1, Z_LEVEL_SURFACE_MINE, 64, 64) // Create the mining ore distribution map. + // Todo: Forest generation. + return 1 + +// Skybox Settings +/datum/skybox_settings/southern_cross + icon_state = "dyable" + random_color = TRUE + +// For making the 6-in-1 holomap, we calculate some offsets +#define SOUTHERN_CROSS_MAP_SIZE 160 // Width and height of compiled in Southern Cross z levels. +#define SOUTHERN_CROSS_HOLOMAP_CENTER_GUTTER 40 // 40px central gutter between columns +#define SOUTHERN_CROSS_HOLOMAP_MARGIN_X ((HOLOMAP_ICON_SIZE - (2*SOUTHERN_CROSS_MAP_SIZE) - SOUTHERN_CROSS_HOLOMAP_CENTER_GUTTER) / 2) // 100 +#define SOUTHERN_CROSS_HOLOMAP_MARGIN_Y ((HOLOMAP_ICON_SIZE - (3*SOUTHERN_CROSS_MAP_SIZE)) / 2) // 60 + +/datum/map_z_level/southern_cross/station + flags = MAP_LEVEL_STATION|MAP_LEVEL_CONTACT|MAP_LEVEL_PLAYER|MAP_LEVEL_CONSOLES + holomap_legend_x = 220 + holomap_legend_y = 160 + +/datum/map_z_level/southern_cross/station/station_one + z = Z_LEVEL_STATION_ONE + name = "Deck 1" + base_turf = /turf/space + transit_chance = 6 + holomap_offset_x = SOUTHERN_CROSS_HOLOMAP_MARGIN_X - 40 + holomap_offset_y = SOUTHERN_CROSS_HOLOMAP_MARGIN_Y + SOUTHERN_CROSS_MAP_SIZE*0 + +/datum/map_z_level/southern_cross/station/station_two + z = Z_LEVEL_STATION_TWO + name = "Deck 2" + base_turf = /turf/simulated/open + transit_chance = 6 + holomap_offset_x = SOUTHERN_CROSS_HOLOMAP_MARGIN_X - 40 + holomap_offset_y = SOUTHERN_CROSS_HOLOMAP_MARGIN_Y + SOUTHERN_CROSS_MAP_SIZE*1 + +/datum/map_z_level/southern_cross/station/station_three + z = Z_LEVEL_STATION_THREE + name = "Deck 3" + base_turf = /turf/simulated/open + transit_chance = 6 + holomap_offset_x = HOLOMAP_ICON_SIZE - SOUTHERN_CROSS_HOLOMAP_MARGIN_X - SOUTHERN_CROSS_MAP_SIZE - 40 + holomap_offset_y = SOUTHERN_CROSS_HOLOMAP_MARGIN_Y + SOUTHERN_CROSS_MAP_SIZE*1 + +/datum/map_z_level/southern_cross/empty_space + z = Z_LEVEL_EMPTY_SPACE + name = "Empty" + flags = MAP_LEVEL_PLAYER + transit_chance = 76 + +/datum/map_z_level/southern_cross/surface + z = Z_LEVEL_SURFACE + name = "Plains" + flags = MAP_LEVEL_CONTACT|MAP_LEVEL_PLAYER|MAP_LEVEL_SEALED|MAP_LEVEL_CONSOLES + base_turf = /turf/simulated/floor/outdoors/rocks + +/datum/map_z_level/southern_cross/surface_mine + z = Z_LEVEL_SURFACE_MINE + name = "Mountains" + flags = MAP_LEVEL_CONTACT|MAP_LEVEL_PLAYER|MAP_LEVEL_SEALED|MAP_LEVEL_CONSOLES + base_turf = /turf/simulated/floor/outdoors/rocks + +/datum/map_z_level/southern_cross/surface_wild + z = Z_LEVEL_SURFACE_WILD + name = "Wilderness" + flags = MAP_LEVEL_PLAYER|MAP_LEVEL_SEALED|MAP_LEVEL_CONTACT|MAP_LEVEL_CONSOLES + base_turf = /turf/simulated/floor/outdoors/rocks + +/datum/map_z_level/southern_cross/misc + z = Z_LEVEL_MISC + name = "Misc" + flags = MAP_LEVEL_PLAYER + transit_chance = 6 + +/datum/map_z_level/southern_cross/centcom + z = Z_LEVEL_CENTCOM + name = "Centcom" + flags = MAP_LEVEL_ADMIN|MAP_LEVEL_CONTACT + +/datum/map_z_level/southern_cross/transit + z = Z_LEVEL_TRANSIT + name = "Transit" + flags = MAP_LEVEL_ADMIN|MAP_LEVEL_SEALED|MAP_LEVEL_PLAYER|MAP_LEVEL_CONTACT + +//Teleport to Mine + +/obj/effect/step_trigger/teleporter/mine/to_mining/New() + ..() + teleport_x = src.x + teleport_y = 2 + teleport_z = Z_LEVEL_SURFACE_MINE + +/obj/effect/step_trigger/teleporter/mine/from_mining/New() + ..() + teleport_x = src.x + teleport_y = world.maxy - 1 + teleport_z = Z_LEVEL_SURFACE + +//Teleport to Wild + +/obj/effect/step_trigger/teleporter/wild/to_wild/New() + ..() + teleport_x = src.x + teleport_y = 2 + teleport_z = Z_LEVEL_SURFACE_WILD + +/obj/effect/step_trigger/teleporter/wild/from_wild/New() + ..() + teleport_x = src.x + teleport_y = world.maxy - 1 + teleport_z = Z_LEVEL_SURFACE_MINE + +/datum/planet/sif + expected_z_levels = list( + Z_LEVEL_SURFACE, + Z_LEVEL_SURFACE_MINE, + Z_LEVEL_SURFACE_WILD + ) + +/obj/effect/step_trigger/teleporter/bridge/east_to_west/Initialize() + teleport_x = src.x - 4 + teleport_y = src.y + teleport_z = src.z + return ..() + +/obj/effect/step_trigger/teleporter/bridge/east_to_west/small/Initialize() + teleport_x = src.x - 3 + teleport_y = src.y + teleport_z = src.z + return ..() + +/obj/effect/step_trigger/teleporter/bridge/west_to_east/Initialize() + teleport_x = src.x + 4 + teleport_y = src.y + teleport_z = src.z + return ..() + +/obj/effect/step_trigger/teleporter/bridge/west_to_east/small/Initialize() + teleport_x = src.x + 3 + teleport_y = src.y + teleport_z = src.z + return ..() + +/obj/effect/step_trigger/teleporter/bridge/north_to_south/Initialize() + teleport_x = src.x + teleport_y = src.y - 4 + teleport_z = src.z + return ..() + +/obj/effect/step_trigger/teleporter/bridge/south_to_north/Initialize() + teleport_x = src.x + teleport_y = src.y + 4 + teleport_z = src.z + return ..() + +/obj/effect/map_effect/portal/master/side_a/plains_to_caves + portal_id = "plains_caves-normal" + +/obj/effect/map_effect/portal/master/side_b/caves_to_plains + portal_id = "plains_caves-normal" + +/obj/effect/map_effect/portal/master/side_a/plains_to_caves/river + portal_id = "plains_caves-river" + +/obj/effect/map_effect/portal/master/side_b/caves_to_plains/river + portal_id = "plains_caves-river" + + +/obj/effect/map_effect/portal/master/side_a/caves_to_wilderness + portal_id = "caves_wilderness-normal" + +/obj/effect/map_effect/portal/master/side_b/wilderness_to_caves + portal_id = "caves_wilderness-normal" + +/obj/effect/map_effect/portal/master/side_a/caves_to_wilderness/river + portal_id = "caves_wilderness-river" + +/obj/effect/map_effect/portal/master/side_b/wilderness_to_caves/river + portal_id = "caves_wilderness-river" + +//Suit Storage Units + +/obj/machinery/suit_cycler/exploration + name = "Explorer suit cycler" + model_text = "Exploration" + req_one_access = list(access_pilot,access_explorer) + +/obj/machinery/suit_cycler/pilot + name = "Pilot suit cycler" + model_text = "Pilot" + req_access = null + req_one_access = list(access_pilot,access_explorer) + +/datum/map/southern_cross/get_map_info() + . = list() + . += "The NLS [full_name] is a small waystation in orbit of the frozen garden world of Sif, jewel of the Vir system.
" + . += "Humanity stands on the precipice of a technological singularity, and the vast majority of the Solar Confederate Government would rather it move firmly away from the edge.
" + . += "Though Vir is typically peaceful, the system has seen its fair share of conflict in the face of technological extremists, rogue drone intelligence, and worse.
" + . += "As an employee of NanoTrasen, operators of the Southern Cross and one of the galaxy's largest research corporations, you're probably just here to do a job." + return jointext(., "
") +>>>>>>> 2dac28c26b... Merge pull request #9773 from VOREStation/upstream-merge-7856 diff --git a/maps/~map_system/maps.dm b/maps/~map_system/maps.dm index 32901c8099..5ded15b95a 100644 --- a/maps/~map_system/maps.dm +++ b/maps/~map_system/maps.dm @@ -330,3 +330,6 @@ var/list/all_maps = list() if (using_map.zlevels["[z]"] == src) using_map.zlevels -= "[z]" return ..() + +/datum/map/proc/get_map_info() + return "No map information available" \ No newline at end of file diff --git a/vorestation.dme b/vorestation.dme index 7ad717348e..5acf3f2d5f 100644 --- a/vorestation.dme +++ b/vorestation.dme @@ -3157,6 +3157,7 @@ #include "code\modules\mob\new_player\logout.dm" #include "code\modules\mob\new_player\new_player.dm" #include "code\modules\mob\new_player\new_player_vr.dm" +#include "code\modules\mob\new_player\news.dm" #include "code\modules\mob\new_player\poll.dm" #include "code\modules\mob\new_player\preferences_setup.dm" #include "code\modules\mob\new_player\preferences_setup_vr.dm" @@ -3276,6 +3277,9 @@ #include "code\modules\nifsoft\software\13_soulcatcher.dm" #include "code\modules\nifsoft\software\14_commlink.dm" #include "code\modules\nifsoft\software\15_misc.dm" +#include "code\modules\news\news_init.dm" +#include "code\modules\news\newspaper.dm" +#include "code\modules\news\newspaper_layout.dm" #include "code\modules\organs\blood.dm" #include "code\modules\organs\misc.dm" #include "code\modules\organs\organ.dm"