[MIRROR] Lobby Improvements

This commit is contained in:
Chompstation Bot
2021-03-09 22:32:57 +00:00
parent 4dafc3196e
commit 5a70c39b08
14 changed files with 1295 additions and 165 deletions

View File

@@ -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+="<DIV ALIGN='center'><B><FONT SIZE=6>The Griffon</FONT></B></div>"
dat+="<DIV ALIGN='center'><FONT SIZE=2>[using_map.company_name]-standard newspaper, for use on [using_map.company_name]© Space Facilities</FONT></div><HR>"
if(isemptylist(news_content))
if(important_message)
dat+="Contents:<BR><ul><B><FONT COLOR='red'>**</FONT>Important Security Announcement<FONT COLOR='red'>**</FONT></B> <FONT SIZE=2>\[page [pages+2]\]</FONT><BR></ul>"
else
dat+="<I>Other than the title, the rest of the newspaper is unprinted...</I>"
else
dat+="Contents:<BR><ul>"
for(var/datum/feed_channel/NP in news_content)
pages++
if(important_message)
dat+="<B><FONT COLOR='red'>**</FONT>Important Security Announcement<FONT COLOR='red'>**</FONT></B> <FONT SIZE=2>\[page [pages+2]\]</FONT><BR>"
var/temp_page=0
for(var/datum/feed_channel/NP in news_content)
temp_page++
dat+="<B>[NP.channel_name]</B> <FONT SIZE=2>\[page [temp_page+1]\]</FONT><BR>"
dat+="</ul>"
if(scribble_page==curr_page)
dat+="<BR><I>There is a small scribble near the end of this page... It reads: \"[scribble]\"</I>"
dat+= "<HR><DIV STYLE='float:right;'><A href='?src=\ref[src];next_page=1'>Next Page</A></DIV> <div style='float:left;'><A href='?src=\ref[human_user];mach_close=newspaper_main'>Done reading</A></DIV>"
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+="<FONT SIZE=4><B>[C.channel_name]</B></FONT><FONT SIZE=1> \[created by: <FONT COLOR='maroon'>[C.author]</FONT>\]</FONT><BR><BR>"
if(C.censored)
dat+="This channel was deemed dangerous to the general welfare of the station and therefore marked with a <B><FONT COLOR='red'>D-Notice</B></FONT>. 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+="<ul>"
var/i = 0
for(var/datum/feed_message/MESSAGE in C.messages)
i++
dat+="-[MESSAGE.body] <BR>"
if(MESSAGE.img)
user << browse_rsc(MESSAGE.img, "tmp_photo[i].png")
dat+="<img src='tmp_photo[i].png' width = '180'><BR>"
dat+="<FONT SIZE=1>\[[MESSAGE.message_type] by <FONT COLOR='maroon'>[MESSAGE.author]</FONT>\]</FONT><BR><BR>"
dat+="</ul>"
if(scribble_page==curr_page)
dat+="<BR><I>There is a small scribble near the end of this page... It reads: \"[scribble]\"</I>"
dat+= "<BR><HR><DIV STYLE='float:left;'><A href='?src=\ref[src];prev_page=1'>Previous Page</A></DIV> <DIV STYLE='float:right;'><A href='?src=\ref[src];next_page=1'>Next Page</A></DIV>"
if(2) //Last page
for(var/datum/feed_channel/NP in news_content)
pages++
if(important_message!=null)
dat+="<DIV STYLE='float:center;'><FONT SIZE=4><B>Wanted Issue:</B></FONT></DIV><BR><BR>"
dat+="<B>Criminal name</B>: <FONT COLOR='maroon'>[important_message.author]</FONT><BR>"
dat+="<B>Description</B>: [important_message.body]<BR>"
dat+="<B>Photo:</B>: "
if(important_message.img)
user << browse_rsc(important_message.img, "tmp_photow.png")
dat+="<BR><img src='tmp_photow.png' width = '180'>"
else
dat+="None"
else
dat+="<I>Apart from some uninteresting Classified ads, there's nothing on this page...</I>"
if(scribble_page==curr_page)
dat+="<BR><I>There is a small scribble near the end of this page... It reads: \"[scribble]\"</I>"
dat+= "<HR><DIV STYLE='float:left;'><A href='?src=\ref[src];prev_page=1'>Previous Page</A></DIV>"
else
dat+="I'm sorry to break your immersion. This shit's bugged. Report this bug to Agouri, polyxenitopalidou@gmail.com"
dat+="<BR><HR><div align='center'>[curr_page+1]</div>"
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, "<FONT COLOR='blue'>There's already a scribble in this page... You wouldn't want to make things too cluttered, would you?</FONT>")
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))

View File

@@ -407,7 +407,7 @@ proc/admin_notice(var/message, var/rights)
dat+="<B><FONT COLOR='maroon'>ERROR: Could not submit Feed story to Network.</B></FONT><HR><BR>"
if(src.admincaster_feed_channel.channel_name=="")
dat+="<FONT COLOR='maroon'>•Invalid receiving channel name.</FONT><BR>"
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+="<FONT COLOR='maroon'>•Invalid message body.</FONT><BR>"
dat+="<BR><A href='?src=\ref[src];ac_setScreen=[3]'>Return</A><BR>"
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] <BR>"
//dat+="-[MESSAGE.body] <BR>"
var/pic_data
if(MESSAGE.img)
usr << browse_rsc(MESSAGE.img, "tmp_photo[i].png")
dat+="<img src='tmp_photo[i].png' width = '180'><BR><BR>"
dat+="<FONT SIZE=1>\[Story by <FONT COLOR='maroon'>[MESSAGE.author]</FONT>\]</FONT><BR>"
pic_data+="<img src='tmp_photo[i].png' width = '180'><BR>"
dat+= get_newspaper_content(MESSAGE.title, MESSAGE.body, MESSAGE.author,"#d4cec1", pic_data)
dat+="<BR>"
dat+="<FONT SIZE=1>\[Story by <FONT COLOR='maroon'>[MESSAGE.author] - [MESSAGE.time_stamp]</FONT>\]</FONT><BR>"
dat+={"
<BR><HR><A href='?src=\ref[src];ac_refresh=1'>Refresh</A>
<BR><A href='?src=\ref[src];ac_setScreen=[1]'>Back</A>

View File

@@ -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]!")

View File

@@ -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

View File

@@ -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'\
<br><br>\
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.\
<br><br>\
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.\
<br><br>\
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.\
<br><br>\
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.\
<br><br>\
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.\
<br><br>\
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.\
<br><br>\
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.'\
<br><br>\
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'.\
<br><br>\
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.\
<br><br>\
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.\
<br><br>\
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.\
<br><br>\
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.\
<br><br>\
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.\
<br><br>\
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.\
<br><br>\
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.\
<br><br>\
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'.\
<br><br>\
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.\
<br><br>\
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.\
<br><br>\
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.\
<br><br>\
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.\
<br><br>\
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.\
<br><br>\
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'.\
<br><br>\
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.\
<br><br>\
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.\
<br><br>\
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.\
<br><br>\
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.'\
<br><br>\
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.\
<br><br>\
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.\
<br><br>\
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."

View File

@@ -28,6 +28,7 @@
/mob/new_player/proc/new_player_panel_proc()
var/output = "<div align='center'>"
output += "[using_map.get_map_info()]"
output +="<hr>"
output += "<p><a href='byond://?src=\ref[src];show_preferences=1'>Character Setup</A></p>"
@@ -63,15 +64,22 @@
output += "<p><a href='byond://?src=\ref[src];showpoll=1'>Show Player Polls</A></p>"
if(client.check_for_new_server_news())
output += "<p><b><a href='byond://?src=\ref[src];shownews=1'>Show News</A> (NEW!)</b></p>"
output += "<p><b><a href='byond://?src=\ref[src];shownews=1'>Show Game Updates</A> (NEW!)</b></p>"
else
output += "<p><a href='byond://?src=\ref[src];shownews=1'>Show News</A></p>"
output += "<p><a href='byond://?src=\ref[src];shownews=1'>Show Game Updates</A></p>"
if(SSsqlite.can_submit_feedback(client))
output += "<p>[href(src, list("give_feedback" = 1), "Give Feedback")]</p>"
if(GLOB.news_data.station_newspaper)
output += "<a href='byond://?src=\ref[src];open_station_news=1'>Show [using_map.station_name] News</A>"
output += "</div>"
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()

View File

@@ -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 += "<a href='?src=\ref[src];next_news=1;nextpage=\ref[CHANNEL]'>Older Issue</a>"
if(current_news_page > CHANNEL.messages.len || (CHANNEL.messages.len > 1) && !(current_news_page == 1))
dat += "<a href='?src=\ref[src];previous_news=1;prevpage=\ref[CHANNEL]'>Newer Issue</a> "
dat += " (Page <b>[current_news_page]</b> out of <b>[CHANNEL.messages.len]</b>)"
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 += "<I>No current articles for this newspaper.</I><BR>"
else
var/pic_data
if(MESSAGE.img)
usr << browse_rsc(MESSAGE.img, "tmp_photo[current_page].png")
pic_data+="<img src='tmp_photo[current_page].png' width = '180'><BR>"
dat += get_newspaper_content(MESSAGE.title, MESSAGE.body, MESSAGE.author, "#d4cec1", pic_data)
return dat

View File

@@ -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+="<DIV ALIGN='center'><B><FONT SIZE=6>The Griffon</FONT></B></div>"
dat+="<DIV ALIGN='center'><FONT SIZE=2>[using_map.company_name]-standard newspaper, for use on [using_map.company_name]© Space Facilities</FONT></div><HR>"
if(isemptylist(news_content))
if(important_message)
dat+="Contents:<BR><ul><B><FONT COLOR='red'>**</FONT>Important Security Announcement<FONT COLOR='red'>**</FONT></B> <FONT SIZE=2>\[page [pages+2]\]</FONT><BR></ul>"
else
dat+="<I>Other than the title, the rest of the newspaper is unprinted...</I>"
else
dat+="Contents:<BR><ul>"
for(var/datum/feed_channel/NP in news_content)
pages++
if(important_message)
dat+="<B><FONT COLOR='red'>**</FONT>Important Security Announcement<FONT COLOR='red'>**</FONT></B> <FONT SIZE=2>\[page [pages+2]\]</FONT><BR>"
var/temp_page=0
for(var/datum/feed_channel/NP in news_content)
temp_page++
dat+="<B>[NP.channel_name]</B> <FONT SIZE=2>\[page [temp_page+1]\]</FONT><BR>"
dat+="</ul>"
if(scribble_page==curr_page)
dat+="<BR><I>There is a small scribble near the end of this page... It reads: \"[scribble]\"</I>"
dat+= "<HR><DIV STYLE='float:right;'><A href='?src=\ref[src];next_page=1'>Next Page</A></DIV> <div style='float:left;'><A href='?src=\ref[human_user];mach_close=newspaper_main'>Done reading</A></DIV>"
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+="<FONT SIZE=4><B>[C.channel_name]</B></FONT><FONT SIZE=1> \[created by: <FONT COLOR='maroon'>[C.author]</FONT>\]</FONT><BR><BR>"
if(C.censored)
dat+="This channel was deemed dangerous to the general welfare of the station and therefore marked with a <B><FONT COLOR='red'>D-Notice</B></FONT>. 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+="<ul>"
var/i = 0
for(var/datum/feed_message/MESSAGE in C.messages)
i++
dat+="-[MESSAGE.body] <BR>"
if(MESSAGE.img)
user << browse_rsc(MESSAGE.img, "tmp_photo[i].png")
dat+="<img src='tmp_photo[i].png' width = '180'><BR>"
dat+="<FONT SIZE=1>\[[MESSAGE.message_type] by <FONT COLOR='maroon'>[MESSAGE.author]</FONT>\]</FONT><BR><BR>"
dat+="</ul>"
if(scribble_page==curr_page)
dat+="<BR><I>There is a small scribble near the end of this page... It reads: \"[scribble]\"</I>"
dat+= "<BR><HR><DIV STYLE='float:left;'><A href='?src=\ref[src];prev_page=1'>Previous Page</A></DIV> <DIV STYLE='float:right;'><A href='?src=\ref[src];next_page=1'>Next Page</A></DIV>"
if(2) //Last page
for(var/datum/feed_channel/NP in news_content)
pages++
if(important_message!=null)
dat+="<DIV STYLE='float:center;'><FONT SIZE=4><B>Wanted Issue:</B></FONT></DIV><BR><BR>"
dat+="<B>Criminal name</B>: <FONT COLOR='maroon'>[important_message.author]</FONT><BR>"
dat+="<B>Description</B>: [important_message.body]<BR>"
dat+="<B>Photo:</B>: "
if(important_message.img)
user << browse_rsc(important_message.img, "tmp_photow.png")
dat+="<BR><img src='tmp_photow.png' width = '180'>"
else
dat+="None"
else
dat+="<I>Apart from some uninteresting Classified ads, there's nothing on this page...</I>"
if(scribble_page==curr_page)
dat+="<BR><I>There is a small scribble near the end of this page... It reads: \"[scribble]\"</I>"
dat+= "<HR><DIV STYLE='float:left;'><A href='?src=\ref[src];prev_page=1'>Previous Page</A></DIV>"
else
dat+="I'm sorry to break your immersion. This shit's bugged. Report this bug to Agouri, polyxenitopalidou@gmail.com"
dat+="<BR><HR><div align='center'>[curr_page+1]</div>"
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, "<FONT COLOR='blue'>There's already a scribble in this page... You wouldn't want to make things too cluttered, would you?</FONT>")
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

View File

@@ -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

View File

@@ -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+="<DIV ALIGN='center'><B><FONT SIZE=6>The Griffon</FONT></B></div>"
dat+="<DIV ALIGN='center'><FONT SIZE=2>[using_map.company_name]-standard newspaper, for use on [using_map.company_name]<5D> Space Facilities</FONT></div><HR>"
if(isemptylist(news_content))
if(important_message)
dat+="Contents:<BR><ul><B><FONT COLOR='red'>**</FONT>Important Security Announcement<FONT COLOR='red'>**</FONT></B> <FONT SIZE=2>\[page [pages+2]\]</FONT><BR></ul>"
else
dat+="<I>Other than the title, the rest of the newspaper is unprinted...</I>"
else
dat+="Contents:<BR><ul>"
for(var/datum/feed_channel/NP in news_content)
pages++
if(important_message)
dat+="<B><FONT COLOR='red'>**</FONT>Important Security Announcement<FONT COLOR='red'>**</FONT></B> <FONT SIZE=2>\[page [pages+2]\]</FONT><BR>"
var/temp_page=0
for(var/datum/feed_channel/NP in news_content)
temp_page++
dat+="<B>[NP.channel_name]</B> <FONT SIZE=2>\[page [temp_page+1]\]</FONT><BR>"
dat+="</ul>"
if(scribble_page==curr_page)
dat+="<BR><I>There is a small scribble near the end of this page... It reads: \"[scribble]\"</I>"
dat+= "<HR><DIV STYLE='float:right;'><A href='?src=\ref[src];next_page=1'>Next Page</A></DIV> <div style='float:left;'><A href='?src=\ref[human_user];mach_close=newspaper_main'>Done reading</A></DIV>"
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+="<FONT SIZE=4><B>[C.channel_name]</B></FONT><FONT SIZE=1> \[created by: <FONT COLOR='maroon'>[C.author]</FONT>\]</FONT><BR><BR>"
if(C.censored)
dat+="This channel was deemed dangerous to the general welfare of the station and therefore marked with a <B><FONT COLOR='red'>D-Notice</B></FONT>. 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+="<ul>"
var/i = 0
for(var/datum/feed_message/MESSAGE in C.messages)
i++
dat+="[MESSAGE.title] <BR>"
dat+="-[MESSAGE.body] <BR>"
if(MESSAGE.img)
user << browse_rsc(MESSAGE.img, "tmp_photo[i].png")
dat+="<img src='tmp_photo[i].png' width = '180'><BR>"
dat+="<FONT SIZE=1>\[[MESSAGE.message_type] by <FONT COLOR='maroon'>[MESSAGE.author]</FONT>\]</FONT><BR><BR>"
dat+="</ul>"
if(scribble_page==curr_page)
dat+="<BR><I>There is a small scribble near the end of this page... It reads: \"[scribble]\"</I>"
dat+= "<BR><HR><DIV STYLE='float:left;'><A href='?src=\ref[src];prev_page=1'>Previous Page</A></DIV> <DIV STYLE='float:right;'><A href='?src=\ref[src];next_page=1'>Next Page</A></DIV>"
if(2) //Last page
for(var/datum/feed_channel/NP in news_content)
pages++
if(important_message!=null)
dat+="<DIV STYLE='float:center;'><FONT SIZE=4><B>Wanted Issue:</B></FONT></DIV><BR><BR>"
dat+="<B>Criminal name</B>: <FONT COLOR='maroon'>[important_message.author]</FONT><BR>"
dat+="<B>Description</B>: [important_message.body]<BR>"
dat+="<B>Photo:</B>: "
if(important_message.img)
user << browse_rsc(important_message.img, "tmp_photow.png")
dat+="<BR><img src='tmp_photow.png' width = '180'>"
else
dat+="None"
else
dat+="<I>Apart from some uninteresting Classified ads, there's nothing on this page...</I>"
if(scribble_page==curr_page)
dat+="<BR><I>There is a small scribble near the end of this page... It reads: \"[scribble]\"</I>"
dat+= "<HR><DIV STYLE='float:left;'><A href='?src=\ref[src];prev_page=1'>Previous Page</A></DIV>"
else
dat+="I'm sorry to break your immersion. This shit's bugged. Report this bug to Agouri, polyxenitopalidou@gmail.com"
dat+="<BR><HR><div align='center'>[curr_page+1]</div>"
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, "<FONT COLOR='blue'>There's already a scribble in this page... You wouldn't want to make things too cluttered, would you?</FONT>")
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

View File

@@ -0,0 +1,41 @@
/proc/get_newspaper_header(newspaper, var/list/subjects, bgcolor)
var/dat
dat += "<br><table style=\"width: 100%;\">"
dat += "<tbody><tr>"
dat += "<td style=\"width: 100%; bgcolor='[bgcolor]';\>"
dat += "<h1 class=\"fr-text-uppercase\" style=\"text-align: center;\">"
dat += "<span style='font-family: \"Times New Roman\", Times, serif, -webkit-standard; font-size: 60px; text-align: center;'><strong>[newspaper]</strong></span></h1>"
dat += "<hr> "
if(subjects)
var/subject_list = jointext(subjects," - ")
dat += "<p style=\"text-align: center;\"><strong><span style=\"font-size: 14px; font-family: Arial, Helvetica, sans-serif;\">[subject_list]</span></strong></p><hr>"
dat += "</tr></tbody></table>"
return dat
/proc/get_newspaper_content(header, content, author, bgcolor, picture_data)
var/dat
dat += "<table style=\"width: 100%; background-color: \"[bgcolor]\"; margin-right: calc(0%);\">"
dat += "<td style=\"width: 100%;\">"
dat += "<table style=\"width: 100%;\">"
dat += "<td style=\"width: 100%; text-align: justify; vertical-align: middle;\">"
dat += "<center><span style=\"font-family: Impact, Charcoal, sans-serif; font-size: 36px;\">[header]</span><span style=\"font-size: 36px;\"><br></span></center>"
dat += "<p style=\"text-align: right;\">By <b>[author]</b></p><br>"
if(picture_data)
dat += "<center>[picture_data]</center>"
dat += "</td></table>"
dat += "<p style=\"margin-left: 40px; font-family: Arial, Helvetica, sans-serif; margin-right: 40px;\">[content]</p><br></td>"
dat += "</table><h1 style=\"text-align: center;\"><br></h1>"
return dat

View File

@@ -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.<br>"
. += "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. <br>"
. += "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.<br>"
. += "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(., "<br>")
>>>>>>> 2dac28c26b... Merge pull request #9773 from VOREStation/upstream-merge-7856

View File

@@ -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"

View File

@@ -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"