Added NanoUI from bay, hit string limit, ran string combiner again.

God have mercy on our souls.
This commit is contained in:
Rob Nelson
2013-09-24 19:46:45 -07:00
parent e8f80a46b3
commit b7fe9edb3b
74 changed files with 16373 additions and 320 deletions

View File

@@ -56,8 +56,12 @@
/obj/item/device/eftpos/attack_self(mob/user as mob)
if(get_dist(src,user) <= 1)
var/dat = "<b>[eftpos_name]</b><br>"
dat += "<i>This terminal is</i> [machine_id]. <i>Report this code when contacting NanoTrasen IT Support</i><br>"
// AUTOFIXED BY fix_string_idiocy.py
// C:\Users\Rob\Documents\Projects\vgstation13\code\WorkInProgress\Cael_Aislinn\Economy\EFTPOS.dm:59: var/dat = "<b>[eftpos_name]</b><br>"
var/dat = {"<b>[eftpos_name]</b><br>
<i>This terminal is</i> [machine_id]. <i>Report this code when contacting NanoTrasen IT Support</i><br>"}
// END AUTOFIX
if(transaction_locked)
// AUTOFIXED BY fix_string_idiocy.py

View File

@@ -19,7 +19,9 @@
//see if our location has custom event info for this event
newMsg.body = affected_dest.get_custom_eventstring()
if(!newMsg.body)
newMsg.body = ""
newMsg.body = "[affected_dest.name] doesn't have custom events. Bug a coder."
// Too many goddamn strings, Bay. - N3X
/*
switch(event_type)
if(RESEARCH_BREAKTHROUGH)
newMsg.body = "A major breakthough in the field of [pick("plasma research","super-compressed materials","nano-augmentation","bluespace research","volatile power manipulation")] \
@@ -126,6 +128,7 @@
newMsg.body += "Tourists are flocking to [affected_dest.name] after the surprise announcement of [pick("major shopping bargains by a wily retailer",\
"a huge new ARG by a popular entertainment company","a secret tour by popular artiste [random_name(pick(MALE,FEMALE))]")]. \
Tau Ceti Daily is offering discount tickets for two to see [random_name(pick(MALE,FEMALE))] live in return for eyewitness reports and up to the minute coverage."
*/
for(var/datum/feed_channel/FC in news_network.network_channels)
if(FC.channel_name == "Tau Ceti Daily")
@@ -143,90 +146,7 @@
newMsg.author = "Editor Mike Hammers"
//newMsg.is_admin_message = 1
var/datum/trade_destination/affected_dest = pick(weighted_mundaneevent_locations)
newMsg.body = pick(
"Tree stuck in tajaran; firefighters baffled.",\
"Armadillos want aardvarks removed from dictionary claims 'here first'.",\
"Angel found dancing on pinhead ordered to stop; cited for public nuisance.",\
"Letters claim they are better than number; 'Always have been'.",\
"Pens proclaim pencils obsolete, 'lead is dead'.",\
"Rock and paper sues scissors for discrimination.",\
"Steak tell-all book reveals he never liked sitting by potato.",\
"Woodchuck stops counting how many times he<68>s chucked 'Never again'.",\
"[affected_dest.name] clerk first person able to pronounce '@*$%!'.",\
"[affected_dest.name] delis serving boiled paperback dictionaries, 'Adjectives chewy' customers declare.",\
"[affected_dest.name] weather deemed 'boring'; meteors and rad storms to be imported.",\
"Most [affected_dest.name] security officers prefer cream over sugar.",\
"Palindrome speakers conference in [affected_dest.name]; 'Wow!' says Otto.",\
"Question mark worshipped as deity by ancient [affected_dest.name] dwellers.",\
"Spilled milk causes whole [affected_dest.name] populace to cry.",\
"World largest carp patty at display on [affected_dest.name].",\
"'Here kitty kitty' no longer preferred tajaran retrieval technique.",\
"Man travels 7000 light years to retrieve lost hankie, 'It was my favourite'.",\
"New bowling lane that shoots mini-meteors at bowlers very popular.",\
"[pick("Unathi","Spacer")] gets tattoo of Tau Ceti on chest '[pick("CentComm","star","starship","asteroid")] tickles most'.",\
"Skrell marries computer; wedding attended by 100 modems.",\
"Chef reports successfully using harmonica as cheese grater.",\
"NanoTrasen invents handkerchief that says 'Bless you' after sneeze.",\
"Clone accused of posing for other clones<65>s school photo.",\
"Clone accused of stealing other clones<65>s employee of the month award.",\
"Woman robs station with hair dryer; crewmen love new style.",\
"This space for rent.",\
"[affected_dest.name] Baker Wins Pickled Crumpet Toss Three Years Running",\
"Skrell Scientist Discovers Abacus Can Be Used To Dry Towels",\
"Survey: 'Cheese Louise' Voted Best Pizza Restaurant In Tau Ceti",\
"I Was Framed, jokes [affected_dest.name] artist",\
"Mysterious Loud Rumbling Noises In [affected_dest.name] Found To Be Mysterious Loud Rumblings",\
"Alien ambassador becomes lost on [affected_dest.name], refuses to ask for directions",\
"Swamp Gas Verified To Be Exhalations Of Stars--Movie Stars--Long Passed",\
"Tainted Broccoli Weapon Of Choice For Syndicate Assassins",\
"Chefs Find Broccoli Effective Tool For Cutting Cheese",\
"Broccoli Found To Cause Grumpiness In Monkeys",\
"Survey: 80% Of People on [affected_dest.name] Love Clog-Dancing",\
"Giant Hairball Has Perfect Grammar But Rolls rr's Too Much, Linguists Say",\
"[affected_dest.name] Phonebooks Print All Wrong Numbers; Results In 15 New Marriages",\
"Tajaran Burglar Spotted on [affected_dest.name], Mistaken For Dalmatian",\
"Gibson Gazette Updates Frequently Absurd, Poll Indicates",\
"Esoteric Verbosity Culminates In Communicative Ennui, [affected_dest.name] Academics Note",\
"Taj Demand Longer Breaks, Cleaner Litter, Slower Mice",\
"Survey: 3 Out Of 5 Skrell Loathe Modern Art",\
"Skrell Scientist Discovers Gravity While Falling Down Stairs",\
"Boy Saves Tajaran From Tree on [affected_dest.name], Thousands Cheer",\
"Shipment Of Apples Overturns, [affected_dest.name] Diner Offers Applesauce Special",\
"Spotted Owl Spotted on [affected_dest.name]",\
"Humans Everywhere Agree: Purring Tajarans Are Happy Tajarans",\
"From The Desk Of Wise Guy Sammy: One Word In This Gazette Is Sdrawkcab",\
"From The Desk Of Wise Guy Sammy: It's Hard To Have Too Much Shelf Space",\
"From The Desk Of Wise Guy Sammy: Wine And Friendships Get Better With Age",\
"From The Desk Of Wise Guy Sammy: The Insides Of Golf Balls Are Mostly Rubber Bands",\
"From The Desk Of Wise Guy Sammy: You Don't Have To Fool All The People, Just The Right Ones",\
"From The Desk Of Wise Guy Sammy: If You Made The Mess, You Clean It Up",\
"From The Desk Of Wise Guy Sammy: It Is Easier To Get Forgiveness Than Permission",\
"From The Desk Of Wise Guy Sammy: Check Your Facts Before Making A Fool Of Yourself",\
"From The Desk Of Wise Guy Sammy: You Can't Outwait A Bureaucracy",\
"From The Desk Of Wise Guy Sammy: It's Better To Yield Right Of Way Than To Demand It",\
"From The Desk Of Wise Guy Sammy: A Person Who Likes Cats Can't Be All Bad",\
"From The Desk Of Wise Guy Sammy: Help Is The Sunny Side Of Control",\
"From The Desk Of Wise Guy Sammy: Two Points Determine A Straight Line",\
"From The Desk Of Wise Guy Sammy: Reading Improves The Mind And Lifts The Spirit",\
"From The Desk Of Wise Guy Sammy: Better To Aim High And Miss Then To Aim Low And Hit",\
"From The Desk Of Wise Guy Sammy: Meteors Often Strike The Same Place More Than Once",\
"Tommy B. Saif Sez: Look Both Ways Before Boarding The Shuttle",\
"Tommy B. Saif Sez: Hold On; Sudden Stops Sometimes Necessary",\
"Tommy B. Saif Sez: Keep Fingers Away From Moving Panels",\
"Tommy B. Saif Sez: No Left Turn, Except Shuttles",\
"Tommy B. Saif Sez: Return Seats And Trays To Their Proper Upright Position",\
"Tommy B. Saif Sez: Eating And Drinking In Docking Bays Is Prohibited",\
"Tommy B. Saif Sez: Accept No Substitutes, And Don't Be Fooled By Imitations",\
"Tommy B. Saif Sez: Do Not Remove This Tag Under Penalty Of Law",\
"Tommy B. Saif Sez: Always Mix Thoroughly When So Instructed",\
"Tommy B. Saif Sez: Try To Keep Six Month's Expenses In Reserve",\
"Tommy B. Saif Sez: Change Not Given Without Purchase",\
"Tommy B. Saif Sez: If You Break It, You Buy It",\
"Tommy B. Saif Sez: Reservations Must Be Cancelled 48 Hours Prior To Event To Obtain Refund",\
"Doughnuts: Is There Anything They Can't Do",\
"If Tin Whistles Are Made Of Tin, What Do They Make Foghorns Out Of?",\
"Broccoli discovered to be colonies of tiny aliens with murder on their minds"\
)
newMsg.body = pick(file2list("config/news/trivial.txt"))
for(var/datum/feed_channel/FC in news_network.network_channels)
if(FC.channel_name == "The Gibson Gazette")

View File

@@ -36,8 +36,12 @@ var/const/max_assembly_amount = 300
user << browse(null, "window=fuelcomp")
return
var/t = "<B>Reactor Fuel Rod Compressor / Assembler</B><BR>"
t += "<A href='?src=\ref[src];close=1'>Close</A><BR>"
// AUTOFIXED BY fix_string_idiocy.py
// C:\Users\Rob\Documents\Projects\vgstation13\code\WorkInProgress\Cael_Aislinn\Rust\fuel_compressor.dm:39: var/t = "<B>Reactor Fuel Rod Compressor / Assembler</B><BR>"
var/t = {"<B>Reactor Fuel Rod Compressor / Assembler</B><BR>
<A href='?src=\ref[src];close=1'>Close</A><BR>"}
// END AUTOFIX
if(locked)
t += "Swipe your ID to unlock this console."
else

View File

@@ -30,8 +30,12 @@
user.machine = null
user << browse(null, "window=gyrotron_controller")
return
var/t = "<B>Gyrotron Remote Control Console</B><BR>"
t += "<hr>"
// AUTOFIXED BY fix_string_idiocy.py
// C:\Users\Rob\Documents\Projects\vgstation13\code\WorkInProgress\Cael_Aislinn\Rust\gyrotron_controller.dm:33: var/t = "<B>Gyrotron Remote Control Console</B><BR>"
var/t = {"<B>Gyrotron Remote Control Console</B><BR>
<hr>"}
// END AUTOFIX
for(var/obj/machinery/rust/gyrotron/gyro in world)
if(gyro.remoteenabled && gyro.on)
@@ -55,8 +59,12 @@
t += "<b><font color=red>Gyrotron unresponsive</font></b>"
t += "<hr>"
/*
var/t = "<B>Reactor Core Fuel Control</B><BR>"
t += "Current fuel injection stage: [active_stage]<br>"
// AUTOFIXED BY fix_string_idiocy.py
// C:\Users\Rob\Documents\Projects\vgstation13\code\WorkInProgress\Cael_Aislinn\Rust\gyrotron_controller.dm:58: var/t = "<B>Reactor Core Fuel Control</B><BR>"
var/t = {"<B>Reactor Core Fuel Control</B><BR>
Current fuel injection stage: [active_stage]<br>"}
// END AUTOFIX
if(active_stage == "Cooling")
//t += "<a href='?src=\ref[src];restart=1;'>Restart injection cycle</a><br>"
t += "----<br>"

View File

@@ -76,6 +76,7 @@
chemtraces += V
/obj/item/weapon/autopsy_scanner/verb/print_data()
set category = "Object"
set src in view(usr, 1)
set name = "Print Data"
if(usr.stat || !(istype(usr,/mob/living/carbon/human)))

View File

@@ -24,6 +24,7 @@ datum/controller/game_controller
var/objects_cost = 0
var/networks_cost = 0
var/powernets_cost = 0
var/nano_cost = 0
var/events_cost = 0
var/ticker_cost = 0
var/total_cost = 0
@@ -73,7 +74,7 @@ datum/controller/game_controller/proc/setup()
for(var/i=0, i<max_secret_rooms, i++)
make_mining_asteroid_secret()
if(config.socket_talk) spawn keepalive()
//if(config.socket_talk) spawn keepalive()
spawn(0)
if(ticker)
@@ -107,20 +108,6 @@ datum/controller/game_controller/proc/setup_objects()
sleep(-1)
datum/controller/game_controller/proc/set_ticker_state(var/state)
if(socket_talk)
socket_talk.set_ticker_state("AIR")
else
if(config.socket_talk)
socket_talk = new /datum/socket_talk()
datum/controller/game_controller/proc/keepalive()
spawn while(1)
sleep(10)
// Notify the other process that we're still there
socket_talk.send_keepalive()
datum/controller/game_controller/proc/process()
processing = 1
spawn(0)
@@ -143,11 +130,10 @@ datum/controller/game_controller/proc/process()
//AIR
if(!air_processing_killed)
set_ticker_state("AIR")
timer = world.timeofday
last_thing_processed = air_master.type
air_master.tick()
air_cost = (world.timeofday - timer) / 10 // this might make atmos slower
//air_master.tick()
//air_cost = (world.timeofday - timer) / 10 // this might make atmos slower
// 1. atmos won't process if the game is generally lagged out(no deadlocks)
// 2. if the server frequently crashes during atmos processing we will knowif(!kill_air)
//src.set_debug_state("Air Master")
@@ -167,7 +153,6 @@ datum/controller/game_controller/proc/process()
sleep(breather_ticks)
//SUN
set_ticker_state("SUN")
timer = world.timeofday
last_thing_processed = sun.type
sun.calc_position()
@@ -176,7 +161,6 @@ datum/controller/game_controller/proc/process()
sleep(breather_ticks)
//MOBS
set_ticker_state("MOBS")
timer = world.timeofday
process_mobs()
mobs_cost = (world.timeofday - timer) / 10
@@ -184,7 +168,6 @@ datum/controller/game_controller/proc/process()
sleep(breather_ticks)
//DISEASES
set_ticker_state("DISEASES")
timer = world.timeofday
process_diseases()
diseases_cost = (world.timeofday - timer) / 10
@@ -192,7 +175,6 @@ datum/controller/game_controller/proc/process()
sleep(breather_ticks)
//MACHINES
set_ticker_state("MACHINES")
timer = world.timeofday
process_machines()
machines_cost = (world.timeofday - timer) / 10
@@ -200,7 +182,6 @@ datum/controller/game_controller/proc/process()
sleep(breather_ticks)
//OBJECTS
set_ticker_state("OBJECTS")
timer = world.timeofday
process_objects()
objects_cost = (world.timeofday - timer) / 10
@@ -209,7 +190,6 @@ datum/controller/game_controller/proc/process()
//PIPENETS
if(!pipe_processing_killed)
set_ticker_state("PIPENETS")
timer = world.timeofday
process_pipenets()
networks_cost = (world.timeofday - timer) / 10
@@ -217,28 +197,32 @@ datum/controller/game_controller/proc/process()
sleep(breather_ticks)
//POWERNETS
set_ticker_state("POWERNETS")
timer = world.timeofday
process_powernets()
powernets_cost = (world.timeofday - timer) / 10
sleep(breather_ticks)
//NANO UIS
timer = world.timeofday
process_nano()
nano_cost = (world.timeofday - timer) / 10
sleep(breather_ticks)
//EVENTS
set_ticker_state("EVENTS")
timer = world.timeofday
process_events()
events_cost = (world.timeofday - timer) / 10
//TICKER
set_ticker_state("TIMING")
timer = world.timeofday
last_thing_processed = ticker.type
ticker.process()
ticker_cost = (world.timeofday - timer) / 10
//TIMING
total_cost = air_cost + sun_cost + mobs_cost + diseases_cost + machines_cost + objects_cost + networks_cost + powernets_cost + events_cost + ticker_cost
total_cost = air_cost + sun_cost + mobs_cost + diseases_cost + machines_cost + objects_cost + networks_cost + powernets_cost + nano_cost + events_cost + ticker_cost
var/end_time = world.timeofday
if(end_time < start_time)
@@ -316,6 +300,16 @@ datum/controller/game_controller/proc/process_powernets()
continue
powernets.Cut(i,i+1)
datum/controller/game_controller/proc/process_nano()
var/i = 1
while(i<=nanomanager.processing_uis.len)
var/datum/nanoui/ui = nanomanager.processing_uis[i]
if(ui && ui.src_object && ui.user)
ui.process()
i++
continue
nanomanager.processing_uis.Cut(i,i+1)
datum/controller/game_controller/proc/process_events()
last_thing_processed = /datum/event
var/i = 1

View File

@@ -227,10 +227,12 @@
/datum/game_mode/proc/send_intercept()
var/intercepttext = "<FONT size = 3><B>[command_name()] Update</B> Requested status information:</FONT><HR>"
intercepttext += "<B> In case you have misplaced your copy, attached is a list of personnel whom reliable sources&trade; suspect may be affiliated with the Syndicate:</B><br>"
// AUTOFIXED BY fix_string_idiocy.py
// C:\Users\Rob\Documents\Projects\vgstation13\code\game\gamemodes\game_mode.dm:230: var/intercepttext = "<FONT size = 3><B>[command_name()] Update</B> Requested status information:</FONT><HR>"
var/intercepttext = {"<FONT size = 3><B>[command_name()] Update</B> Requested status information:</FONT><HR>
<B> In case you have misplaced your copy, attached is a list of personnel whom reliable sources&trade; suspect may be affiliated with the Syndicate:</B><br>"}
// END AUTOFIX
var/list/suspects = list()
for(var/mob/living/carbon/human/man in player_list) if(man.client && man.mind)
// NT relation option

View File

@@ -67,7 +67,7 @@
/obj/machinery/alarm
name = "alarm"
icon = 'monitors.dmi'
icon = 'icons/obj/monitors.dmi'
icon_state = "alarm0"
anchored = 1
use_power = 1

View File

@@ -38,8 +38,12 @@
return
user.set_machine(src)
var/dat = "<HEAD><TITLE>Operating Computer</TITLE><META HTTP-EQUIV='Refresh' CONTENT='10'></HEAD><BODY>\n"
dat += "<A HREF='?src=\ref[user];mach_close=op'>Close</A><br><br>" //| <A HREF='?src=\ref[user];update=1'>Update</A>"
// AUTOFIXED BY fix_string_idiocy.py
// C:\Users\Rob\Documents\Projects\vgstation13\code\game\machinery\computer\Operating.dm:41: var/dat = "<HEAD><TITLE>Operating Computer</TITLE><META HTTP-EQUIV='Refresh' CONTENT='10'></HEAD><BODY>\n"
var/dat = {"<HEAD><TITLE>Operating Computer</TITLE><META HTTP-EQUIV='Refresh' CONTENT='10'></HEAD><BODY>\n
<A HREF='?src=\ref[user];mach_close=op'>Close</A><br><br>" //| <A HREF='?src=\ref[user];update=1'>Update</A>"}
// END AUTOFIX
if(src.table && (src.table.check_victim()))
src.victim = src.table.victim
dat += {"

View File

@@ -13,7 +13,7 @@ var/specops_shuttle_timeleft = 0
/obj/machinery/computer/specops_shuttle
name = "Spec. Ops. Shuttle Console"
icon = 'computer.dmi'
icon = 'icons/obj/computer.dmi'
icon_state = "shuttle"
req_access = list(access_cent_specops)
// req_access = list(ACCESS_CENT_SPECOPS)

View File

@@ -26,8 +26,12 @@
interact(mob/user)
usr.set_machine(src)
var/dat = "<HEAD><TITLE>Current Station Alerts</TITLE><META HTTP-EQUIV='Refresh' CONTENT='10'></HEAD><BODY>\n"
dat += "<A HREF='?src=\ref[user];mach_close=alerts'>Close</A><br><br>"
// AUTOFIXED BY fix_string_idiocy.py
// C:\Users\Rob\Documents\Projects\vgstation13\code\game\machinery\computer\station_alert.dm:29: var/dat = "<HEAD><TITLE>Current Station Alerts</TITLE><META HTTP-EQUIV='Refresh' CONTENT='10'></HEAD><BODY>\n"
var/dat = {"<HEAD><TITLE>Current Station Alerts</TITLE><META HTTP-EQUIV='Refresh' CONTENT='10'></HEAD><BODY>\n
<A HREF='?src=\ref[user];mach_close=alerts'>Close</A><br><br>"}
// END AUTOFIX
for (var/cat in src.alarms)
dat += text("<B>[]</B><BR>\n", cat)
var/list/L = src.alarms[cat]

View File

@@ -1,5 +1,5 @@
/obj/machinery/atmospherics/unary/cryo_cell
name = "cryo cell"
name = "Cryo Cell"
icon = 'icons/obj/cryogenics.dmi'
icon_state = "cell-off"
density = 1
@@ -62,37 +62,66 @@
go_out()
return
/obj/machinery/atmospherics/unary/cryo_cell/attack_hand(mob/user as mob)
user.set_machine(src)
var/beaker_text = ""
var/health_text = ""
var/temp_text = ""
if(occupant)
if(occupant.health <= -100)
health_text = "<FONT color=red>Dead</FONT>"
else if(occupant.health < 0)
health_text = "<FONT color=red>[round(occupant.health,0.1)]</FONT>"
else
health_text = "[round(occupant.health,0.1)]"
if(air_contents.temperature > T0C)
temp_text = "<FONT color=red>[air_contents.temperature]</FONT>"
/obj/machinery/atmospherics/unary/cryo_cell/attack_hand(mob/user)
ui_interact(user)
/obj/machinery/atmospherics/unary/cryo_cell/ui_interact(mob/user, ui_key = "main")
var/data[0]
data["isOperating"] = on
data["hasOccupant"] = occupant ? 1 : 0
var/occupantData[0]
if (!occupant)
occupantData["name"] = null
occupantData["stat"] = null
occupantData["health"] = null
occupantData["bruteLoss"] = null
occupantData["oxyLoss"] = null
occupantData["toxLoss"] = null
occupantData["fireLoss"] = null
occupantData["bodyTemperature"] = null
else
occupantData["name"] = occupant.name
occupantData["stat"] = occupant.stat
occupantData["health"] = round(occupant.health)
occupantData["bruteLoss"] = round(occupant.getBruteLoss())
occupantData["oxyLoss"] = round(occupant.getOxyLoss())
occupantData["toxLoss"] = round(occupant.getToxLoss())
occupantData["fireLoss"] = round(occupant.getFireLoss())
occupantData["bodyTemperature"] = round(occupant.bodytemperature)
data["occupant"] = occupantData;
data["cellTemperature"] = round(air_contents.temperature)
data["cellTemperatureStatus"] = "good"
if(air_contents.temperature > T0C) // if greater than 273.15 kelvin (0 celcius)
data["cellTemperatureStatus"] = "bad"
else if(air_contents.temperature > 225)
temp_text = "<FONT color=black>[air_contents.temperature]</FONT>"
data["cellTemperatureStatus"] = "average"
data["isBeakerLoaded"] = beaker ? 1 : 0
var beakerContents[0]
if(beaker && beaker:reagents && beaker:reagents.reagent_list.len)
for(var/datum/reagent/R in beaker:reagents.reagent_list)
beakerContents.Add(list(list("name" = R.name, "volume" = R.volume))) // list in a list because Byond merges the first list...
data["beakerContents"] = beakerContents
//user << list2json(data)
var/datum/nanoui/ui = nanomanager.get_open_ui(user, src, ui_key)
if (!ui)
ui = new(user, src, ui_key, "cryo.tmpl", "Cryo Cell Control System", 520, 410)
// When the UI is first opened this is the data it will use
ui.set_initial_data(data)
ui.open()
// Auto update every Master Controller tick
ui.set_auto_update(1)
else
temp_text = "<FONT color=blue>[air_contents.temperature]</FONT>"
if(beaker)
beaker_text = "<B>Beaker:</B> <A href='?src=\ref[src];eject=1'>Eject</A>"
else
beaker_text = "<B>Beaker:</B> <FONT color=red>No beaker loaded</FONT>"
var/dat = {"<B>Cryo cell control system</B><BR>
<B>Current cell temperature:</B> [temp_text]K<BR>
<B>Cryo status:</B> [ on ? "<A href='?src=\ref[src];start=1'>Off</A> <B>On</B>" : "<B>Off</B> <A href='?src=\ref[src];start=1'>On</A>"]<BR>
[beaker_text]<BR><BR>
<B>Current occupant:</B> [occupant ? "<BR>Name: [occupant]<BR>Health: [health_text]<BR>Oxygen deprivation: [round(occupant.getOxyLoss(),0.1)]<BR>Brute damage: [round(occupant.getBruteLoss(),0.1)]<BR>Fire damage: [round(occupant.getFireLoss(),0.1)]<BR>Toxin damage: [round(occupant.getToxLoss(),0.1)]<BR>Body temperature: [occupant.bodytemperature]" : "<FONT color=red>None</FONT>"]<BR>
"}
user.set_machine(src)
user << browse(dat, "window=cryo")
onclose(user, "cryo")
// The UI is already open so push the new data to it
ui.push_data(data)
return
//user.set_machine(src)
/obj/machinery/atmospherics/unary/cryo_cell/Topic(href, href_list)
if ((get_dist(src, usr) <= 1) || istype(usr, /mob/living/silicon/ai))
@@ -103,9 +132,9 @@
if (beaker)
var/obj/item/weapon/reagent_containers/glass/B = beaker
B.loc = get_step(loc, SOUTH)
beaker = null
beaker = null
updateUsrDialog()
nanomanager.update_uis(src) // update all UIs attached to this object
add_fingerprint(usr)
return

View File

@@ -2,7 +2,7 @@
/obj/machinery/floodlight
name = "Emergency Floodlight"
icon = 'floodlight.dmi'
icon = 'icons/obj/machines/floodlight.dmi'
icon_state = "flood00"
density = 1
var/on = 0

View File

@@ -493,7 +493,7 @@
// Cheating.
phazon/phase_array
name = "Phase Array"
name = "A peice of bluespace technology so advanced, it seems magical."
desc = "A peice of bluespace technology so advanced, it seems magical."
icon='icons/mecha/mecha_equipment.dmi'
icon_state = "mecha_phase_array"

View File

@@ -310,10 +310,12 @@ var/global/list/obj/item/device/pda/PDAs = list()
if(active_uplink_check(user))
return
var/dat = "<html><head><title>Personal Data Assistant</title></head><body bgcolor=\"#808000\"><style>a, a:link, a:visited, a:active, a:hover { color: #000000; }img {border-style:none;}</style>"
dat += "<a href='byond://?src=\ref[src];choice=Close'><img src=pda_exit.png> Close</a>"
// AUTOFIXED BY fix_string_idiocy.py
// C:\Users\Rob\Documents\Projects\vgstation13\code\game\objects\items\devices\PDA\PDA.dm:313: var/dat = "<html><head><title>Personal Data Assistant</title></head><body bgcolor=\"#808000\"><style>a, a:link, a:visited, a:active, a:hover { color: #000000; }img {border-style:none;}</style>"
var/dat = {"<html><head><title>Personal Data Assistant</title></head><body bgcolor=\"#808000\"><style>a, a:link, a:visited, a:active, a:hover { color: #000000; }img {border-style:none;}</style>
<a href='byond://?src=\ref[src];choice=Close'><img src=pda_exit.png> Close</a>"}
// END AUTOFIX
if ((!isnull(cartridge)) && (mode == 0))
dat += " | <a href='byond://?src=\ref[src];choice=Eject'><img src=pda_eject.png> Eject [cartridge]</a>"
if (mode)

View File

@@ -0,0 +1,22 @@
/obj/item/device/pipe_painter
name = "pipe painter"
icon = 'icons/obj/bureaucracy.dmi'
icon_state = "labeler1"
item_state = "flight"
var/list/modes = list("grey","red","blue","cyan","green","yellow","purple")
var/mode = "grey"
/obj/item/device/pipe_painter/afterattack(atom/A, mob/user as mob)
if(!istype(A,/obj/machinery/atmospherics/pipe) || istype(A,/obj/machinery/atmospherics/pipe/tank) || istype(A,/obj/machinery/atmospherics/pipe/vent) || istype(A,/obj/machinery/atmospherics/pipe/simple/heat_exchanging) || istype(A,/obj/machinery/atmospherics/pipe/simple/insulated))
return
var/obj/machinery/atmospherics/pipe/P = A
P._color = mode
user.visible_message("<span class='notice'>[user] paints \the [P] [mode].</span>","<span class='notice'>You paint \the [P] [mode].</span>")
P.update_icon()
/obj/item/device/pipe_painter/attack_self(mob/user as mob)
mode = input("Which colour do you want to use?","Pipe painter") in modes
/obj/item/device/pipe_painter/examine()
..()
usr << "It is in [mode] mode."

View File

@@ -55,8 +55,7 @@
if(!user.IsAdvancedToolUser())
user << "\red You don't have the dexterity to do this!"
return 0
var/title = "Sheet-Glass"
title += " ([src.amount] sheet\s left)"
var/title = "Sheet-Glass ([src.amount] sheet\s left)"
switch(alert(title, "Would you like full tile glass or one direction?", "One Direction", "Full Window", "Cancel", null))
if("One Direction")
if(!src) return 1
@@ -138,8 +137,7 @@
if(!user.IsAdvancedToolUser())
user << "\red You don't have the dexterity to do this!"
return 0
var/title = "Sheet Reinf. Glass"
title += " ([src.amount] sheet\s left)"
var/title = "Sheet Reinf. Glass ([src.amount] sheet\s left)"
switch(input(title, "Would you like full tile glass a one direction glass pane or a windoor?") in list("One Direction", "Full Window", "Windoor", "Cancel"))
if("One Direction")
if(!src) return 1

View File

@@ -74,8 +74,12 @@ FLOOR SAFES
/obj/structure/safe/attack_hand(mob/user as mob)
user.set_machine(src)
var/dat = "<center>"
dat += "<a href='?src=\ref[src];open=1'>[open ? "Close" : "Open"] [src]</a> | <a href='?src=\ref[src];decrement=1'>-</a> [dial * 5] <a href='?src=\ref[src];increment=1'>+</a>"
// AUTOFIXED BY fix_string_idiocy.py
// C:\Users\Rob\Documents\Projects\vgstation13\code\game\objects\structures\safe.dm:77: var/dat = "<center>"
var/dat = {"<center>
<a href='?src=\ref[src];open=1'>[open ? "Close" : "Open"] [src]</a> | <a href='?src=\ref[src];decrement=1'>-</a> [dial * 5] <a href='?src=\ref[src];increment=1'>+</a>"}
// END AUTOFIX
if(open)
dat += "<table>"
for(var/i = contents.len, i>=1, i--)

View File

@@ -167,6 +167,9 @@ var/shuttlecoming = 0
var/join_motd = null
var/forceblob = 0
// nanomanager, the manager for Nano UIs
var/datum/nanomanager/nanomanager = new()
//airlockWireColorToIndex takes a number representing the wire color, e.g. the orange wire is always 1, the dark red wire is always 2, etc. It returns the index for whatever that wire does.
//airlockIndexToWireColor does the opposite thing - it takes the index for what the wire does, for example AIRLOCK_WIRE_IDSCAN is 1, AIRLOCK_WIRE_POWER1 is 2, etc. It returns the wire color number.
//airlockWireColorToFlag takes the wire color number and returns the flag for it (1, 2, 4, 8, 16, etc)

View File

@@ -37,8 +37,12 @@ var/global/floorIsLava = 0
usr << "Error: you are not an admin!"
return
var/body = "<html><head><title>Options for [M.key]</title></head>"
body += "<body>Options panel for <b>[M]</b>"
// AUTOFIXED BY fix_string_idiocy.py
// C:\Users\Rob\Documents\Projects\vgstation13\code\modules\admin\admin.dm:40: var/body = "<html><head><title>Options for [M.key]</title></head>"
var/body = {"<html><head><title>Options for [M.key]</title></head>
<body>Options panel for <b>[M]</b>"}
// END AUTOFIX
if(M.client)
// AUTOFIXED BY fix_string_idiocy.py
@@ -244,9 +248,12 @@ var/global/floorIsLava = 0
if (!istype(src,/datum/admins))
usr << "Error: you are not an admin!"
return
var/dat = "<html><head><title>Info on [key]</title></head>"
dat += "<body>"
// AUTOFIXED BY fix_string_idiocy.py
// C:\Users\Rob\Documents\Projects\vgstation13\code\modules\admin\admin.dm:247: var/dat = "<html><head><title>Info on [key]</title></head>"
var/dat = {"<html><head><title>Info on [key]</title></head>
<body>"}
// END AUTOFIX
var/savefile/info = new("data/player_saves/[copytext(key, 1, 2)]/[key]/info.sav")
var/list/infos
info >> infos

View File

@@ -324,8 +324,12 @@
/datum/admins/proc/player_panel_old()
if (!usr.client.holder)
return
var/dat = "<html><head><title>Player Menu</title></head>"
dat += "<body><table border=1 cellspacing=5><B><tr><th>Name</th><th>Real Name</th><th>Assigned Job</th><th>Key</th><th>Options</th><th>PM</th><th>Traitor?</th></tr></B>"
// AUTOFIXED BY fix_string_idiocy.py
// C:\Users\Rob\Documents\Projects\vgstation13\code\modules\admin\player_panel.dm:327: var/dat = "<html><head><title>Player Menu</title></head>"
var/dat = {"<html><head><title>Player Menu</title></head>
<body><table border=1 cellspacing=5><B><tr><th>Name</th><th>Real Name</th><th>Assigned Job</th><th>Key</th><th>Options</th><th>PM</th><th>Traitor?</th></tr></B>"}
// END AUTOFIX
//add <th>IP:</th> to this if wanting to add back in IP checking
//add <td>(IP: [M.lastKnownIP])</td> if you want to know their ip to the lists below
var/list/mobs = sortmobs()

View File

@@ -2249,8 +2249,12 @@
alert("The game mode is [ticker.mode.name]")
else alert("For some reason there's a ticker, but not a game mode")
if("manifest")
var/dat = "<B>Showing Crew Manifest.</B><HR>"
dat += "<table cellspacing=5><tr><th>Name</th><th>Position</th></tr>"
// AUTOFIXED BY fix_string_idiocy.py
// C:\Users\Rob\Documents\Projects\vgstation13\code\modules\admin\topic.dm:2252: var/dat = "<B>Showing Crew Manifest.</B><HR>"
var/dat = {"<B>Showing Crew Manifest.</B><HR>
<table cellspacing=5><tr><th>Name</th><th>Position</th></tr>"}
// END AUTOFIX
for(var/mob/living/carbon/human/H in mob_list)
if(H.ckey)
dat += text("<tr><td>[]</td><td>[]</td></tr>", H.name, H.get_assignment())
@@ -2259,16 +2263,24 @@
if("check_antagonist")
check_antagonists()
if("DNA")
var/dat = "<B>Showing DNA from blood.</B><HR>"
dat += "<table cellspacing=5><tr><th>Name</th><th>DNA</th><th>Blood Type</th></tr>"
// AUTOFIXED BY fix_string_idiocy.py
// C:\Users\Rob\Documents\Projects\vgstation13\code\modules\admin\topic.dm:2262: var/dat = "<B>Showing DNA from blood.</B><HR>"
var/dat = {"<B>Showing DNA from blood.</B><HR>
<table cellspacing=5><tr><th>Name</th><th>DNA</th><th>Blood Type</th></tr>"}
// END AUTOFIX
for(var/mob/living/carbon/human/H in mob_list)
if(H.dna && H.ckey)
dat += "<tr><td>[H]</td><td>[H.dna.unique_enzymes]</td><td>[H.b_type]</td></tr>"
dat += "</table>"
usr << browse(dat, "window=DNA;size=440x410")
if("fingerprints")
var/dat = "<B>Showing Fingerprints.</B><HR>"
dat += "<table cellspacing=5><tr><th>Name</th><th>Fingerprints</th></tr>"
// AUTOFIXED BY fix_string_idiocy.py
// C:\Users\Rob\Documents\Projects\vgstation13\code\modules\admin\topic.dm:2270: var/dat = "<B>Showing Fingerprints.</B><HR>"
var/dat = {"<B>Showing Fingerprints.</B><HR>
<table cellspacing=5><tr><th>Name</th><th>Fingerprints</th></tr>"}
// END AUTOFIX
for(var/mob/living/carbon/human/H in mob_list)
if(H.ckey)
if(H.dna && H.dna.uni_identity)

View File

@@ -1280,9 +1280,12 @@ datum/preferences
character.gender = MALE
proc/open_load_dialog(mob/user)
var/dat = "<body>"
dat += "<tt><center>"
// AUTOFIXED BY fix_string_idiocy.py
// C:\Users\Rob\Documents\Projects\vgstation13\code\modules\client\preferences.dm:1283: var/dat = "<body>"
var/dat = {"<body>
<tt><center>"}
// END AUTOFIX
var/savefile/S = new /savefile(path)
if(S)
dat += "<b>Select a character slot to load</b><hr>"

View File

@@ -83,9 +83,12 @@
usr << "<span class='notice'>Something is there but you can't see it.</span>"
return
var/msg = "<span class='info'>*---------*\nThis is \icon[src] \a <EM>[src]</EM>!\n[desc]\n"
msg += "<span class='warning'>"
// AUTOFIXED BY fix_string_idiocy.py
// C:\Users\Rob\Documents\Projects\vgstation13\code\modules\mob\living\carbon\brain\posibrain.dm:86: var/msg = "<span class='info'>*---------*\nThis is \icon[src] \a <EM>[src]</EM>!\n[desc]\n"
var/msg = {"<span class='info'>*---------*\nThis is \icon[src] \a <EM>[src]</EM>!\n[desc]\n
<span class='warning'>"}
// END AUTOFIX
if(src.brainmob && src.brainmob.key)
switch(src.brainmob.stat)
if(CONSCIOUS)

View File

@@ -192,8 +192,12 @@ var/list/ai_list = list()
set category = "AI Commands"
set name = "Show Alerts"
var/dat = "<HEAD><TITLE>Current Station Alerts</TITLE><META HTTP-EQUIV='Refresh' CONTENT='10'></HEAD><BODY>\n"
dat += "<A HREF='?src=\ref[src];mach_close=aialerts'>Close</A><BR><BR>"
// AUTOFIXED BY fix_string_idiocy.py
// C:\Users\Rob\Documents\Projects\vgstation13\code\modules\mob\living\silicon\ai\ai.dm:195: var/dat = "<HEAD><TITLE>Current Station Alerts</TITLE><META HTTP-EQUIV='Refresh' CONTENT='10'></HEAD><BODY>\n"
var/dat = {"<HEAD><TITLE>Current Station Alerts</TITLE><META HTTP-EQUIV='Refresh' CONTENT='10'></HEAD><BODY>\n
<A HREF='?src=\ref[src];mach_close=aialerts'>Close</A><BR><BR>"}
// END AUTOFIX
for (var/cat in alarms)
dat += text("<B>[]</B><BR>\n", cat)
var/list/L = alarms[cat]

View File

@@ -580,9 +580,12 @@
// Camera Jack - Clearly not finished
/mob/living/silicon/pai/proc/softwareCamera()
var/dat = "<h3>Camera Jack</h3>"
dat += "Cable status : "
// AUTOFIXED BY fix_string_idiocy.py
// C:\Users\Rob\Documents\Projects\vgstation13\code\modules\mob\living\silicon\pai\software.dm:583: var/dat = "<h3>Camera Jack</h3>"
var/dat = {"<h3>Camera Jack</h3>
Cable status :"}
// END AUTOFIX
if(!src.cable)
dat += "<font color=#FF5555>Retracted</font> <br>"
return dat
@@ -599,8 +602,12 @@
// Door Jack
/mob/living/silicon/pai/proc/softwareDoor()
var/dat = "<h3>Airlock Jack</h3>"
dat += "Cable status : "
// AUTOFIXED BY fix_string_idiocy.py
// C:\Users\Rob\Documents\Projects\vgstation13\code\modules\mob\living\silicon\pai\software.dm:602: var/dat = "<h3>Airlock Jack</h3>"
var/dat = {"<h3>Airlock Jack</h3>
Cable status :"}
// END AUTOFIX
if(!src.cable)
// AUTOFIXED BY fix_string_idiocy.py

View File

@@ -6,8 +6,12 @@
usr << "<span class='notice'>Something is there but you can't see it.</span>"
return
var/msg = "<span class='info'>*---------*\nThis is \icon[src] \a <EM>[src]</EM>[custom_name ? ", [modtype] [braintype]" : ""]!\n"
msg += "<span class='warning'>"
// AUTOFIXED BY fix_string_idiocy.py
// C:\Users\Rob\Documents\Projects\vgstation13\code\modules\mob\living\silicon\robot\examine.dm:9: var/msg = "<span class='info'>*---------*\nThis is \icon[src] \a <EM>[src]</EM>[custom_name ? ", [modtype] [braintype]" : ""]!\n"
var/msg = {"<span class='info'>*---------*\nThis is \icon[src] \a <EM>[src]</EM>[custom_name ? ", [modtype] [braintype]" : ""]!\n
<span class='warning'>"}
// END AUTOFIX
if (src.getBruteLoss())
if (src.getBruteLoss() < 75)
msg += "It looks slightly dented.\n"

View File

@@ -319,8 +319,12 @@
/mob/living/silicon/robot/proc/robot_alerts()
var/dat = "<HEAD><TITLE>Current Station Alerts</TITLE><META HTTP-EQUIV='Refresh' CONTENT='10'></HEAD><BODY>\n"
dat += "<A HREF='?src=\ref[src];mach_close=robotalerts'>Close</A><BR><BR>"
// AUTOFIXED BY fix_string_idiocy.py
// C:\Users\Rob\Documents\Projects\vgstation13\code\modules\mob\living\silicon\robot\robot.dm:322: var/dat = "<HEAD><TITLE>Current Station Alerts</TITLE><META HTTP-EQUIV='Refresh' CONTENT='10'></HEAD><BODY>\n"
var/dat = {"<HEAD><TITLE>Current Station Alerts</TITLE><META HTTP-EQUIV='Refresh' CONTENT='10'></HEAD><BODY>\n
<A HREF='?src=\ref[src];mach_close=robotalerts'>Close</A><BR><BR>"}
// END AUTOFIX
for (var/cat in alarms)
dat += text("<B>[cat]</B><BR>\n")
var/list/L = alarms[cat]

View File

@@ -1,4 +1,5 @@
/mob/Logout()
nanomanager.user_logout(src) // this is used to clean up (remove) this user's Nano UIs
player_list -= src
log_access("Logout: [key_name(src)]")
if(admin_datums[src.ckey])

View File

@@ -1159,6 +1159,7 @@ note dizziness decrements automatically in the mob's Life() proc.
stat(null,"Mch-[master_controller.machines_cost]\t#[machines.len]")
stat(null,"Obj-[master_controller.objects_cost]\t#[processing_objects.len]")
stat(null,"Net-[master_controller.networks_cost]\tPnet-[master_controller.powernets_cost]")
stat(null,"NanoUI-[master_controller.nano_cost]\t#[nanomanager.processing_uis.len]")
stat(null,"Tick-[master_controller.ticker_cost]\tALL-[master_controller.total_cost]")
else
stat(null,"MasterController-ERROR")

View File

@@ -319,9 +319,12 @@
var/mins = (mills % 36000) / 600
var/hours = mills / 36000
var/dat = "<html><body><center>"
dat += "Round Duration: [round(hours)]h [round(mins)]m<br>"
// AUTOFIXED BY fix_string_idiocy.py
// C:\Users\Rob\Documents\Projects\vgstation13\code\modules\mob\new_player\new_player.dm:322: var/dat = "<html><body><center>"
var/dat = {"<html><body><center>
Round Duration: [round(hours)]h [round(mins)]m<br>"}
// END AUTOFIX
if(emergency_shuttle) //In case Nanotrasen decides reposess CentComm's shuttles.
if(emergency_shuttle.direction == 2) //Shuttle is going to centcomm, not recalled
dat += "<font color='red'><b>The station has been evacuated.</b></font><br>"
@@ -407,8 +410,12 @@
return new_character
proc/ViewManifest()
var/dat = "<html><body>"
dat += "<h4>Crew Manifest</h4>"
// AUTOFIXED BY fix_string_idiocy.py
// C:\Users\Rob\Documents\Projects\vgstation13\code\modules\mob\new_player\new_player.dm:410: var/dat = "<html><body>"
var/dat = {"<html><body>
<h4>Crew Manifest</h4>"}
// END AUTOFIX
dat += data_core.get_manifest(OOC = 1)
src << browse(dat, "window=manifest;size=370x420;can_close=1")

View File

@@ -53,9 +53,12 @@
var/DBQuery/select_query = dbcon.NewQuery("SELECT id, question FROM erro_poll_question WHERE [(isadmin ? "" : "adminonly = false AND")] Now() BETWEEN starttime AND endtime")
select_query.Execute()
var/output = "<div align='center'><B>Player polls</B>"
output +="<hr>"
// AUTOFIXED BY fix_string_idiocy.py
// C:\Users\Rob\Documents\Projects\vgstation13\code\modules\mob\new_player\poll.dm:56: var/output = "<div align='center'><B>Player polls</B>"
var/output = {"<div align='center'><B>Player polls</B>
<hr>"}
// END AUTOFIX
var/pollid
var/pollquestion

View File

@@ -0,0 +1,205 @@
json_token
var
value
New(v)
src.value = v
text
number
word
symbol
eof
json_reader
var
list
string = list("'", "\"")
symbols = list("{", "}", "\[", "]", ":", "\"", "'", ",")
sequences = list("b" = 8, "t" = 9, "n" = 10, "f" = 12, "r" = 13)
tokens
json
i = 1
proc
// scanner
ScanJson(json)
src.json = json
. = new/list()
src.i = 1
while(src.i <= lentext(json))
var/char = get_char()
if(is_whitespace(char))
i++
continue
if(string.Find(char))
. += read_string(char)
else if(symbols.Find(char))
. += new/json_token/symbol(char)
else if(is_digit(char))
. += read_number()
else
. += read_word()
i++
. += new/json_token/eof()
read_word()
var/val = ""
while(i <= lentext(json))
var/char = get_char()
if(is_whitespace(char) || symbols.Find(char))
i-- // let scanner handle this character
return new/json_token/word(val)
val += char
i++
read_string(delim)
var
escape = FALSE
val = ""
while(++i <= lentext(json))
var/char = get_char()
if(escape)
switch(char)
if("\\", "'", "\"", "/", "u")
val += char
else
// TODO: support octal, hex, unicode sequences
ASSERT(sequences.Find(char))
val += ascii2text(sequences[char])
else
if(char == delim)
return new/json_token/text(val)
else if(char == "\\")
escape = TRUE
else
val += char
CRASH("Unterminated string.")
read_number()
var/val = ""
var/char = get_char()
while(is_digit(char) || char == "." || lowertext(char) == "e")
val += char
i++
char = get_char()
i-- // allow scanner to read the first non-number character
return new/json_token/number(text2num(val))
check_char()
ASSERT(args.Find(get_char()))
get_char()
return copytext(json, i, i+1)
is_whitespace(char)
return char == " " || char == "\t" || char == "\n" || text2ascii(char) == 13
is_digit(char)
var/c = text2ascii(char)
return 48 <= c && c <= 57 || char == "+" || char == "-"
// parser
ReadObject(list/tokens)
src.tokens = tokens
. = new/list()
i = 1
read_token("{", /json_token/symbol)
while(i <= tokens.len)
var/json_token/K = get_token()
check_type(/json_token/word, /json_token/text)
next_token()
read_token(":", /json_token/symbol)
.[K.value] = read_value()
var/json_token/S = get_token()
check_type(/json_token/symbol)
switch(S.value)
if(",")
next_token()
continue
if("}")
next_token()
return
else
die()
get_token()
return tokens[i]
next_token()
return tokens[++i]
read_token(val, type)
var/json_token/T = get_token()
if(!(T.value == val && istype(T, type)))
CRASH("Expected '[val]', found '[T.value]'.")
next_token()
return T
check_type(...)
var/json_token/T = get_token()
for(var/type in args)
if(istype(T, type))
return
CRASH("Bad token type: [T.type].")
check_value(...)
var/json_token/T = get_token()
ASSERT(args.Find(T.value))
read_key()
var/char = get_char()
if(char == "\"" || char == "'")
return read_string(char)
read_value()
var/json_token/T = get_token()
switch(T.type)
if(/json_token/text, /json_token/number)
next_token()
return T.value
if(/json_token/word)
next_token()
switch(T.value)
if("true")
return TRUE
if("false")
return FALSE
if("null")
return null
if(/json_token/symbol)
switch(T.value)
if("\[")
return read_array()
if("{")
return ReadObject(tokens.Copy(i))
die()
read_array()
read_token("\[", /json_token/symbol)
. = new/list()
var/list/L = .
while(i <= tokens.len)
// Avoid using Add() or += in case a list is returned.
L.len++
L[L.len] = read_value()
var/json_token/T = get_token()
check_type(/json_token/symbol)
switch(T.value)
if(",")
next_token()
continue
if("]")
next_token()
return
else
die()
next_token()
CRASH("Unterminated array.")
die(json_token/T)
if(!T) T = get_token()
CRASH("Unexpected token: [T.value].")

View File

@@ -0,0 +1,54 @@
json_writer
proc
WriteObject(list/L)
. = "{"
var/i = 1
for(var/k in L)
var/val = L[k]
. += {"\"[k]\":[write(val)]"}
if(i++ < L.len)
. += ","
.+= "}"
write(val)
if(isnum(val))
return num2text(val, 100)
else if(isnull(val))
return "null"
else if(istype(val, /list))
if(is_associative(val))
return WriteObject(val)
else
return write_array(val)
else
. += write_string("[val]")
write_array(list/L)
. = "\["
for(var/i = 1 to L.len)
. += write(L[i])
if(i < L.len)
. += ","
. += "]"
write_string(txt)
var/static/list/json_escape = list("\\", "\"", "'", "\n")
for(var/targ in json_escape)
var/start = 1
while(start <= lentext(txt))
var/i = findtext(txt, targ, start)
if(!i)
break
if(targ == "\n")
txt = copytext(txt, 1, i) + "\\n" + copytext(txt, i+1)
else
txt = copytext(txt, 1, i) + "\\" + copytext(txt, i)
start = i + 2
return {""[txt]""}
is_associative(list/L)
for(var/key in L)
// if the key is a list that means it's actually an array of lists (stupid Byond...)
if(!isnum(key) && !istype(key, /list))
return TRUE

View File

@@ -0,0 +1,12 @@
/*
n_Json v11.3.21
*/
proc
json2list(json)
var/static/json_reader/_jsonr = new()
return _jsonr.ReadObject(_jsonr.ScanJson(json))
list2json(list/L)
var/static/json_writer/_jsonw = new()
return _jsonw.WriteObject(L)

View File

@@ -0,0 +1,6 @@
// All movable things can have a Nano UI, always use ui_interact to open/interact with a Nano UI
/atom/movable/proc/ui_interact(mob/user, ui_key = "main")
return
// Used by the Nano UI Manager (/datum/nanomanager) to track UIs opened by this mob
/mob/var/list/open_uis = list()

View File

@@ -0,0 +1,69 @@
// This is the window/UI manager for Nano UI
// There should only ever be one (global) instance of nanomanger
/datum/nanomanager
var/open_uis[0]
var/list/processing_uis = list()
/datum/nanomanager/New()
return
/datum/nanomanager/proc/get_open_ui(var/mob/user, src_object, ui_key)
var/src_object_key = "\ref[src_object]"
if (isnull(open_uis[src_object_key]) || !istype(open_uis[src_object_key], /list))
return null
else if (isnull(open_uis[src_object_key][ui_key]) || !istype(open_uis[src_object_key][ui_key], /list))
return null
for (var/datum/nanoui/ui in open_uis[src_object_key][ui_key])
if (ui.user == user)
return ui
return null
/datum/nanomanager/proc/update_uis(src_object)
var/src_object_key = "\ref[src_object]"
if (isnull(open_uis[src_object_key]) || !istype(open_uis[src_object_key], /list))
return 0
var/update_count = 0
for (var/ui_key in open_uis[src_object_key])
for (var/datum/nanoui/ui in open_uis[src_object_key][ui_key])
if(ui && ui.src_object && ui.user)
ui.process()
update_count++
return update_count
/datum/nanomanager/proc/ui_opened(var/datum/nanoui/ui)
var/src_object_key = "\ref[ui.src_object]"
if (isnull(open_uis[src_object_key]) || !istype(open_uis[src_object_key], /list))
open_uis[src_object_key] = list(ui.ui_key = list())
else if (isnull(open_uis[src_object_key][ui.ui_key]) || !istype(open_uis[src_object_key][ui.ui_key], /list))
open_uis[src_object_key][ui.ui_key] = list();
ui.user.open_uis.Add(ui)
var/list/uis = open_uis[src_object_key][ui.ui_key]
uis.Add(ui)
processing_uis.Add(ui)
/datum/nanomanager/proc/ui_closed(var/datum/nanoui/ui)
var/src_object_key = "\ref[ui.src_object]"
if (isnull(open_uis[src_object_key]) || !istype(open_uis[src_object_key], /list))
return 0 // wasn't open
else if (isnull(open_uis[src_object_key][ui.ui_key]) || !istype(open_uis[src_object_key][ui.ui_key], /list))
return 0 // wasn't open
processing_uis.Remove(ui)
ui.user.open_uis.Remove(ui)
var/list/uis = open_uis[src_object_key][ui.ui_key]
return uis.Remove(ui)
// user has logged out (or is switching mob) so close/clear all uis
/datum/nanomanager/proc/user_logout(var/mob/user)
if (isnull(user.open_uis) || !istype(user.open_uis, /list) || open_uis.len == 0)
return 0 // has no open uis
for (var/datum/nanoui/ui in user.open_uis)
ui.close();

251
code/modules/nano/nanoui.dm Normal file
View File

@@ -0,0 +1,251 @@
/datum/nanoui
var/mob/user
var/atom/movable/src_object
var/title
var/ui_key
var/window_id // window_id is used as the window name for browse and onclose
var/width = 0
var/height = 0
var/atom/ref = null
var/on_close_logic = 1
var/window_options = "focus=0;can_close=1;can_minimize=1;can_maximize=0;can_resize=1;titlebar=1;" // window option is set using window_id
var/list/stylesheets = list()
var/list/scripts = list()
var/templates[0]
var/title_image
var/head_elements
var/body_elements
var/head_content = ""
var/content = "<div id='mainTemplate'></div>" // the #mainTemplate div will contain the compiled "main" template html
var/list/initial_data[0]
var/is_auto_updating = 0
var/status = 2
/datum/nanoui/New(nuser, nsrc_object, nui_key, ntemplate, ntitle = 0, nwidth = 0, nheight = 0, var/atom/nref = null)
user = nuser
src_object = nsrc_object
ui_key = nui_key
window_id = "[ui_key]\ref[src_object]"
add_template("main", ntemplate)
if (ntitle)
title = ntitle
if (nwidth)
width = nwidth
if (nheight)
height = nheight
if (nref)
ref = nref
add_common_assets()
/datum/nanoui/proc/add_common_assets()
add_script("libraries.min.js") // The jQuery library
add_script("nano_update.js") // The NanoUpdate JS, this is used to receive updates and apply them.
add_script("nano_config.js") // The NanoUpdate JS, this is used to receive updates and apply them.
add_script("nano_base_helpers.js") // The NanoBaseHelpers JS, this is used to set up template helpers which are common to all templates
add_stylesheet("shared.css") // this CSS sheet is common to all UIs
add_stylesheet("icons.css") // this CSS sheet is common to all UIs
/datum/nanoui/proc/set_status(state)
if (state != status)
status = state
push_data(list(), 1) // Update the UI
else
status = state
/datum/nanoui/proc/set_auto_update(state = 1)
is_auto_updating = state
/datum/nanoui/proc/set_initial_data(data)
initial_data = modify_data(data)
/datum/nanoui/proc/add_head_content(nhead_content)
head_content = nhead_content
/datum/nanoui/proc/set_window_options(nwindow_options)
window_options = nwindow_options
/datum/nanoui/proc/set_title_image(ntitle_image)
//title_image = ntitle_image
/datum/nanoui/proc/add_stylesheet(file)
stylesheets.Add(file)
/datum/nanoui/proc/add_script(file)
scripts.Add(file)
/datum/nanoui/proc/add_template(name, file)
templates[name] = file
/datum/nanoui/proc/set_content(ncontent)
content = ncontent
/datum/nanoui/proc/add_content(ncontent)
content += ncontent
/datum/nanoui/proc/use_on_close_logic(nsetting)
on_close_logic = nsetting
/datum/nanoui/proc/get_header()
for (var/filename in stylesheets)
head_content += "<link rel='stylesheet' type='text/css' href='[filename]'>"
var/title_attributes = "id='uiTitle'"
if (title_image)
title_attributes = "id='uiTitle icon' style='background-image: url([title_image]);'"
var/templatel_data[0]
for (var/key in templates)
templatel_data[key] = templates[key];
var/template_data_json = "{}" // An empty JSON object
if (templatel_data.len > 0)
template_data_json = list2json(templatel_data)
var/initial_data_json = "{}" // An empty JSON object
if (initial_data.len > 0)
initial_data_json = list2json(initial_data)
var/url_parameters_json = list2json(list("src" = "\ref[src_object]"))
return {"<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<head>
[head_content]
</head>
<body scroll=auto data-url-parameters='[url_parameters_json]' data-template-data='[template_data_json]' data-initial-data='[initial_data_json]'>
<script type='text/javascript'>
function receiveUpdateData(jsonString)
{
// We need both jQuery and NanoUpdate to be able to recieve data
if (typeof NanoUpdate != 'undefined' && typeof jQuery != 'undefined')
{
NanoUpdate.receiveUpdateData(jsonString);
}
else
{
alert('receiveUpdateData error: something is not defined!');
if (typeof NanoUpdate == 'undefined')
{
alert('NanoUpdate not defined!');
}
if (typeof jQuery == 'undefined')
{
alert('jQuery not defined!');
}
}
// At the moment any data received before those libraries are loaded will be lost
}
</script>
<div id='uiWrapper'>
[title ? "<div id='uiTitleWrapper'><div id='uiStatusIcon' class='icon24 uiStatusGood'></div><div [title_attributes]>[title]</div><div id='uiTitleFluff'></div></div>" : ""]
<div id='uiContent'>
"}
/datum/nanoui/proc/get_footer()
var/scriptsContent = ""
for (var/filename in scripts)
scriptsContent += "<script type='text/javascript' src='[filename]'></script>"
return {"
[scriptsContent]
</div>
</div>
</body>
</html>"}
/datum/nanoui/proc/get_content()
return {"
[get_header()]
[content]
[get_footer()]
"}
/datum/nanoui/proc/open()
var/window_size = ""
if (width && height)
window_size = "size=[width]x[height];"
user << browse(get_content(), "window=[window_id];[window_size][window_options]")
on_close_winset()
//onclose(user, window_id)
nanomanager.ui_opened(src)
/datum/nanoui/proc/close()
is_auto_updating = 0
nanomanager.ui_closed(src)
user << browse(null, "window=[window_id]")
/datum/nanoui/proc/on_close_winset()
if(!user.client)
world << "ERROR: No user.client!?"
return
var/params = "\ref[src]"
winset(user, window_id, "on-close=\"nanoclose [params]\"")
/datum/nanoui/proc/process(update = 0)
var/dist = get_dist(src_object, user)
if (dist <= 1)
set_status(2) // interactive
else if (dist <= 2)
set_status(1) // update only
else if (dist <= 3)
set_status(0) // no updates, completely disabled
return // don't auto update
else
close()
return
if (update || is_auto_updating)
src_object.ui_interact(user, ui_key)
/datum/nanoui/proc/modify_data(data)
data["ui"] = list(
"status" = status,
"user" = list("name" = user.name)
)
//user << list2json(data)
return data
/datum/nanoui/proc/push_data(data, force_push = 0)
if (!status && !force_push)
user << "Cannot update UI, user out of range (status [status])"
return
data = modify_data(data)
user << output(list2params(list(list2json(data))),"[window_id].browser:receiveUpdateData")
on_close_winset()
/client/verb/nanoclose(var/uiref as text)
set hidden = 1 // hide this verb from the user's panel
set name = "nanoclose" // no autocomplete on cmd line
//world << "world [src] looking for [uiref]"
var/datum/nanoui/ui = locate(uiref)
if (ui)
//world << "[src] UI found [ui.window_id]"
ui.close()
if (ui.on_close_logic)
if(ui.ref)
var/href = "close=1"
//world << "[src] Topic [href] [ui.ref]"
src.Topic(href, params2list(href), ui.ref) // this will direct to the atom's
// Topic() proc via client.Topic()
else
// no atomref specified (or not found)
// so just reset the user mob's machine var
if(src && src.mob)
//world << "[src] was [src.mob.machine], setting to null"
src.mob.unset_machine()
else
world << "[src] UI not found"
return

View File

@@ -556,16 +556,16 @@
// AUTOFIXED BY fix_string_idiocy.py
// C:\Users\Rob\Documents\Projects\vgstation13\code\modules\power\apc.dm:555: t += "<I>(Swipe ID card to unlock inteface.)</I><BR>"
t += {"<I>(Swipe ID card to unlock inteface.)</I><BR>
Main breaker : <B>[operating ? "On" : "Off"]</B><BR>
External power : <B>[ main_status ? (main_status ==2 ? "<FONT COLOR=#004000>Good</FONT>" : "<FONT COLOR=#D09000>Low</FONT>") : "<FONT COLOR=#F00000>None</FONT>"]</B><BR>
Power cell: <B>[cell ? "[round(cell.percent())]%" : "<FONT COLOR=red>Not connected.</FONT>"]</B>"}
Main breaker : <B>[operating ? "On" : "Off"]</B><BR>
External power : <B>[ main_status ? (main_status ==2 ? "<FONT COLOR=#004000>Good</FONT>" : "<FONT COLOR=#D09000>Low</FONT>") : "<FONT COLOR=#F00000>None</FONT>"]</B><BR>
Power cell: <B>[cell ? "[round(cell.percent())]%" : "<FONT COLOR=red>Not connected.</FONT>"]</B>"}
// END AUTOFIX
if(cell)
// AUTOFIXED BY fix_string_idiocy.py
// C:\Users\Rob\Documents\Projects\vgstation13\code\modules\power\apc.dm:560: t += " ([charging ? ( charging == 1 ? "Charging" : "Fully charged" ) : "Not charging"])"
t += {"([charging ? ( charging == 1 ? "Charging" : "Fully charged" ) : "Not charging"])
([chargemode ? "Auto" : "Off"])"}
([chargemode ? "Auto" : "Off"])"}
// END AUTOFIX
t += "<BR><HR>Power channels<BR><PRE>"
@@ -575,12 +575,11 @@
// AUTOFIXED BY fix_string_idiocy.py
// C:\Users\Rob\Documents\Projects\vgstation13\code\modules\power\apc.dm:567: t += "Equipment: [add_lspace(lastused_equip, 6)] W : <B>[L[equipment+1]]</B><BR>"
t += {"Equipment: [add_lspace(lastused_equip, 6)] W : <B>[L[equipment+1]]</B>
Lighting: [add_lspace(lastused_light, 6)] W : <B>[L[lighting+1]]</B>
Environmental:[add_lspace(lastused_environ, 6)] W : <B>[L[environ+1]]</B>
Total load: [lastused_light + lastused_equip + lastused_environ] W</PRE>
<HR>Cover lock: <B>[coverlocked ? "Engaged" : "Disengaged"]</B>"}
t += {"Equipment: [add_lspace(lastused_equip, 6)] W : <B>[L[equipment+1]]</B><BR>
Lighting: [add_lspace(lastused_light, 6)] W : <B>[L[lighting+1]]</B><BR>
Environmental:[add_lspace(lastused_environ, 6)] W : <B>[L[environ+1]]</B><BR>
<BR>Total load: [lastused_light + lastused_equip + lastused_environ] W</PRE>
<HR>Cover lock: <B>[coverlocked ? "Engaged" : "Disengaged"]</B>"}
// END AUTOFIX
else
if (!istype(user, /mob/living/silicon))
@@ -589,15 +588,15 @@ Total load: [lastused_light + lastused_equip + lastused_environ] W</PRE>
// AUTOFIXED BY fix_string_idiocy.py
// C:\Users\Rob\Documents\Projects\vgstation13\code\modules\power\apc.dm:577: t += "Main breaker: [operating ? "<B>On</B> <A href='?src=\ref[src];breaker=1'>Off</A>" : "<A href='?src=\ref[src];breaker=1'>On</A> <B>Off</B>" ]<BR>"
t += {"Main breaker: [operating ? "<B>On</B> <A href='?src=\ref[src];breaker=1'>Off</A>" : "<A href='?src=\ref[src];breaker=1'>On</A> <B>Off</B>" ]<BR>
External power : <B>[ main_status ? (main_status ==2 ? "<FONT COLOR=#004000>Good</FONT>" : "<FONT COLOR=#D09000>Low</FONT>") : "<FONT COLOR=#F00000>None</FONT>"]</B><BR>"}
External power : <B>[ main_status ? (main_status ==2 ? "<FONT COLOR=#004000>Good</FONT>" : "<FONT COLOR=#D09000>Low</FONT>") : "<FONT COLOR=#F00000>None</FONT>"]</B><BR>"}
// END AUTOFIX
if(cell)
// AUTOFIXED BY fix_string_idiocy.py
// C:\Users\Rob\Documents\Projects\vgstation13\code\modules\power\apc.dm:580: t += "Power cell: <B>[round(cell.percent())]%</B>"
t += {"Power cell: <B>[round(cell.percent())]%</B>
([charging ? ( charging == 1 ? "Charging" : "Fully charged" ) : "Not charging"])
([chargemode ? "<A href='?src=\ref[src];cmode=1'>Off</A> <B>Auto</B>" : "<B>Off</B> <A href='?src=\ref[src];cmode=1'>Auto</A>"])"}
([charging ? ( charging == 1 ? "Charging" : "Fully charged" ) : "Not charging"])
([chargemode ? "<A href='?src=\ref[src];cmode=1'>Off</A> <B>Auto</B>" : "<B>Off</B> <A href='?src=\ref[src];cmode=1'>Auto</A>"])"}
// END AUTOFIX
else
t += "Power cell: <B><FONT COLOR=red>Not connected.</FONT></B>"
@@ -606,7 +605,7 @@ Total load: [lastused_light + lastused_equip + lastused_environ] W</PRE>
// AUTOFIXED BY fix_string_idiocy.py
// C:\Users\Rob\Documents\Projects\vgstation13\code\modules\power\apc.dm:587: t += "<BR><HR>Power channels<BR><PRE>"
t += {"<BR><HR>Power channels<BR><PRE>
Equipment: [add_lspace(lastused_equip, 6)] W : "}
Equipment: [add_lspace(lastused_equip, 6)] W :"}
// END AUTOFIX
switch(equipment)
if(0)
@@ -620,8 +619,8 @@ Equipment: [add_lspace(lastused_equip, 6)] W : "}
// AUTOFIXED BY fix_string_idiocy.py
// C:\Users\Rob\Documents\Projects\vgstation13\code\modules\power\apc.dm:600: t +="<BR>"
t += {"
Lighting: [add_lspace(lastused_light, 6)] W : "}
t += {"<BR>
Lighting: [add_lspace(lastused_light, 6)] W :"}
// END AUTOFIX
switch(lighting)
if(0)
@@ -635,8 +634,8 @@ Lighting: [add_lspace(lastused_light, 6)] W : "}
// AUTOFIXED BY fix_string_idiocy.py
// C:\Users\Rob\Documents\Projects\vgstation13\code\modules\power\apc.dm:613: t +="<BR>"
t += {"
Environmental:[add_lspace(lastused_environ, 6)] W : "}
t += {"<BR>
Environmental:[add_lspace(lastused_environ, 6)] W :"}
// END AUTOFIX
switch(environ)
if(0)
@@ -654,7 +653,7 @@ Environmental:[add_lspace(lastused_environ, 6)] W : "}
// AUTOFIXED BY fix_string_idiocy.py
// C:\Users\Rob\Documents\Projects\vgstation13\code\modules\power\apc.dm:629: t += "<BR>Total load: [lastused_light + lastused_equip + lastused_environ] W</PRE>"
t += {"<BR>Total load: [lastused_light + lastused_equip + lastused_environ] W</PRE>
<HR>Cover lock: [coverlocked ? "<B><A href='?src=\ref[src];lock=1'>Engaged</A></B>" : "<B><A href='?src=\ref[src];lock=1'>Disengaged</A></B>"]"}
<HR>Cover lock: [coverlocked ? "<B><A href='?src=\ref[src];lock=1'>Engaged</A></B>" : "<B><A href='?src=\ref[src];lock=1'>Disengaged</A></B>"]"}
// END AUTOFIX
if (istype(user, /mob/living/silicon))
t += "<BR><HR><A href='?src=\ref[src];overload=1'><I>Overload lighting circuit</I></A><BR>"
@@ -675,7 +674,7 @@ Environmental:[add_lspace(lastused_environ, 6)] W : "}
// AUTOFIXED BY fix_string_idiocy.py
// C:\Users\Rob\Documents\Projects\vgstation13\code\modules\power\apc.dm:648: t += "<BR><HR><A href='?src=\ref[src];close=1'>Close</A>"
t += {"<BR><HR><A href='?src=\ref[src];close=1'>Close</A>
</TT></body></html>"}
</TT></body></html>"}
// END AUTOFIX
user << browse(t, "window=apc")
onclose(user, "apc")

View File

@@ -404,14 +404,18 @@ var/list/solars_list = list()
add_fingerprint(user)
user.set_machine(src)
var/t = "<TT><B>Solar Generator Control</B><HR><PRE>"
t += "<B>Generated power</B> : [round(lastgen)] W<BR>"
t += "Station Rotational Period: [60/abs(sun.rate)] minutes<BR>"
t += "Station Rotational Direction: [sun.rate<0 ? "CCW" : "CW"]<BR>"
t += "Star Orientation: [sun.angle]&deg ([angle2text(sun.angle)])<BR>"
t += "Array Orientation: [rate_control(src,"cdir","[cdir]&deg",1,10,60)] ([angle2text(cdir)])<BR>"
t += "<BR><HR><BR>"
t += "Tracking: "
// AUTOFIXED BY fix_string_idiocy.py
// C:\Users\Rob\Documents\Projects\vgstation13\code\modules\power\solar.dm:407: var/t = "<TT><B>Solar Generator Control</B><HR><PRE>"
var/t = {"<TT><B>Solar Generator Control</B><HR><PRE>
<B>Generated power</B> : [round(lastgen)] W<BR>
Station Rotational Period: [60/abs(sun.rate)] minutes<BR>
Station Rotational Direction: [sun.rate<0 ? "CCW" : "CW"]<BR>
Star Orientation: [sun.angle]&deg ([angle2text(sun.angle)])<BR>
Array Orientation: [rate_control(src,"cdir","[cdir]&deg",1,10,60)] ([angle2text(cdir)])<BR>
<BR><HR><BR>
Tracking:"}
// END AUTOFIX
switch(track)
if(0)
t += "<B>Off</B> <A href='?src=\ref[src];track=1'>Manual</A> <A href='?src=\ref[src];track=2'>Automatic</A><BR>"
@@ -420,8 +424,12 @@ var/list/solars_list = list()
if(2)
t += "<A href='?src=\ref[src];track=0'>Off</A> <A href='?src=\ref[src];track=1'>Manual</A> <B>Automatic</B><BR>"
t += "Manual Tracking Rate: [rate_control(src,"tdir","[trackrate/10]&deg/min ([trackdir<0 ? "CCW" : "CW"])",1,10)]<BR>"
t += "Manual Tracking Direction: "
// AUTOFIXED BY fix_string_idiocy.py
// C:\Users\Rob\Documents\Projects\vgstation13\code\modules\power\solar.dm:423: t += "Manual Tracking Rate: [rate_control(src,"tdir","[trackrate/10]&deg/min ([trackdir<0 ? "CCW" : "CW"])",1,10)]<BR>"
t += {"Manual Tracking Rate: [rate_control(src,"tdir","[trackrate/10]&deg/min ([trackdir<0 ? "CCW" : "CW"])",1,10)]<BR>
Manual Tracking Direction:"}
// END AUTOFIX
switch(trackdir)
if(-1)
t += "<A href='?src=\ref[src];trackdir=1'>CW</A> <B>CCW</B><BR>"

View File

@@ -492,7 +492,7 @@
spawn()
has_sprites += user.client
for(var/i = 1 to MAX_PILL_SPRITE)
usr << browse_rsc(icon('chemical.dmi', "pill" + num2text(i)), "pill[i].png")
usr << browse_rsc(icon('icons/obj/chemical.dmi', "pill" + num2text(i)), "pill[i].png")
for(var/i = 1 to MAX_BOTTLE_SPRITE)
usr << browse_rsc(icon('chemical.dmi', "bottle" + num2text(i)), "bottle[i].png")
var/dat = ""
@@ -518,12 +518,12 @@
// AUTOFIXED BY fix_string_idiocy.py
// C:\Users\Rob\Documents\Projects\vgstation13\code\modules\reagents\Chemistry-Machinery.dm:518: dat += "[G.name] , [G.volume] Units - "
dat += {"[G.name] , [G.volume] Units -
<A href='?src=\ref[src];analyze=1;desc=[G.description];name=[G.name]'>(Analyze)</A>
<A href='?src=\ref[src];add=[G.id];amount=1'>(1)</A>
<A href='?src=\ref[src];add=[G.id];amount=5'>(5)</A>
<A href='?src=\ref[src];add=[G.id];amount=10'>(10)</A>
<A href='?src=\ref[src];add=[G.id];amount=[G.volume]'>(All)</A>
dat += {"[G.name] , [G.volume] Units -
<A href='?src=\ref[src];analyze=1;desc=[G.description];name=[G.name]'>(Analyze)</A>
<A href='?src=\ref[src];add=[G.id];amount=1'>(1)</A>
<A href='?src=\ref[src];add=[G.id];amount=5'>(5)</A>
<A href='?src=\ref[src];add=[G.id];amount=10'>(10)</A>
<A href='?src=\ref[src];add=[G.id];amount=[G.volume]'>(All)</A>
<A href='?src=\ref[src];addcustom=[G.id]'>(Custom)</A><BR>"}
// END AUTOFIX
@@ -533,12 +533,12 @@
// AUTOFIXED BY fix_string_idiocy.py
// C:\Users\Rob\Documents\Projects\vgstation13\code\modules\reagents\Chemistry-Machinery.dm:529: dat += "[N.name] , [N.volume] Units - "
dat += {"[N.name] , [N.volume] Units -
<A href='?src=\ref[src];analyze=1;desc=[N.description];name=[N.name]'>(Analyze)</A>
<A href='?src=\ref[src];remove=[N.id];amount=1'>(1)</A>
<A href='?src=\ref[src];remove=[N.id];amount=5'>(5)</A>
<A href='?src=\ref[src];remove=[N.id];amount=10'>(10)</A>
<A href='?src=\ref[src];remove=[N.id];amount=[N.volume]'>(All)</A>
dat += {"[N.name] , [N.volume] Units -
<A href='?src=\ref[src];analyze=1;desc=[N.description];name=[N.name]'>(Analyze)</A>
<A href='?src=\ref[src];remove=[N.id];amount=1'>(1)</A>
<A href='?src=\ref[src];remove=[N.id];amount=5'>(5)</A>
<A href='?src=\ref[src];remove=[N.id];amount=10'>(10)</A>
<A href='?src=\ref[src];remove=[N.id];amount=[N.volume]'>(All)</A>
<A href='?src=\ref[src];removecustom=[N.id]'>(Custom)</A><BR>"}
// END AUTOFIX
else

View File

@@ -171,9 +171,12 @@
slot_flags = SLOT_BELT
proc/openwindow(mob/user as mob)
var/dat = "<tt><center><h1><b>TagMaster 2.2</b></h1></center>"
dat += "<table style='width:100%; padding:4px;'><tr>"
// AUTOFIXED BY fix_string_idiocy.py
// C:\Users\Rob\Documents\Projects\vgstation13\code\modules\recycling\sortingmachinery.dm:174: var/dat = "<tt><center><h1><b>TagMaster 2.2</b></h1></center>"
var/dat = {"<tt><center><h1><b>TagMaster 2.2</b></h1></center>
<table style='width:100%; padding:4px;'><tr>"}
// END AUTOFIX
for (var/i = 1, i <= TAGGERLOCATIONS.len, i++)
dat += "<td><a href='?src=\ref[src];nextTag=[i]'>[TAGGERLOCATIONS[i]]</a></td>"

View File

@@ -96,8 +96,12 @@
interact(user)
/obj/machinery/replicator/interact(mob/user)
var/dat = "The control panel displays an incomprehensible selection of controls, many with unusual markings or text around them.<br>"
dat += "<br>"
// AUTOFIXED BY fix_string_idiocy.py
// C:\Users\Rob\Documents\Projects\vgstation13\code\modules\research\xenoarchaeology\artifact\artifact_replicator.dm:99: var/dat = "The control panel displays an incomprehensible selection of controls, many with unusual markings or text around them.<br>"
var/dat = {"The control panel displays an incomprehensible selection of controls, many with unusual markings or text around them.<br>
<br>"}
// END AUTOFIX
for(var/index=1, index<=construction.len, index++)
dat += "<A href='?src=\ref[src];activate=[index]'>\[[construction[index]]\]</a><br>"

View File

@@ -34,8 +34,12 @@
user.unset_machine(src)
return
var/dat = "<B>Anomalous material analyser</B><BR>"
dat += "<HR>"
// AUTOFIXED BY fix_string_idiocy.py
// C:\Users\Rob\Documents\Projects\vgstation13\code\modules\research\xenoarchaeology\machinery\artifact_analyser.dm:37: var/dat = "<B>Anomalous material analyser</B><BR>"
var/dat = {"<B>Anomalous material analyser</B><BR>
<HR>"}
// END AUTOFIX
if(!owned_scanner)
owned_scanner = locate() in orange(1, src)

View File

@@ -41,8 +41,12 @@
if(stat & (NOPOWER|BROKEN))
return
user.set_machine(src)
var/dat = "<B>Artifact Power Harvester</B><BR>"
dat += "<HR><BR>"
// AUTOFIXED BY fix_string_idiocy.py
// C:\Users\Rob\Documents\Projects\vgstation13\code\modules\research\xenoarchaeology\machinery\artifact_harvester.dm:44: var/dat = "<B>Artifact Power Harvester</B><BR>"
var/dat = {"<B>Artifact Power Harvester</B><BR>
<HR><BR>"}
// END AUTOFIX
//
if(owned_scanner)
if(harvesting)

View File

@@ -77,8 +77,12 @@
return src.interact(user)
/obj/item/device/depth_scanner/interact(var/mob/user as mob)
var/dat = "<b>Co-ordinates with positive matches</b><br>"
dat += "<A href='?src=\ref[src];clear=0'>== Clear all ==</a><br>"
// AUTOFIXED BY fix_string_idiocy.py
// C:\Users\Rob\Documents\Projects\vgstation13\code\modules\research\xenoarchaeology\tools\tools_depthscanner.dm:80: var/dat = "<b>Co-ordinates with positive matches</b><br>"
var/dat = {"<b>Co-ordinates with positive matches</b><br>
<A href='?src=\ref[src];clear=0'>== Clear all ==</a><br>"}
// END AUTOFIX
if(current)
// AUTOFIXED BY fix_string_idiocy.py

View File

@@ -162,7 +162,7 @@
/world/Reboot(var/reason)
spawn(0)
world << sound(pick('sound/AI/newroundsexy.ogg','sound/misc/apcdestroyed.ogg','sound/misc/bangindonk.ogg','slugmissioncomplete.ogg')) // random end sounds!! - LastyBatsy
world << sound(pick('sound/AI/newroundsexy.ogg','sound/misc/apcdestroyed.ogg','sound/misc/bangindonk.ogg','sound/misc/slugmissioncomplete.ogg')) // random end sounds!! - LastyBatsy
for(var/client/C in clients)
if(config.server) //if you set a server location in config.txt, it sends you there instead of trying to reconnect to the same world address. -- NeoFite