Merge branch 'master' of https://github.com/VOREStation/VOREStation into izac-update

# Conflicts:
#	code/modules/mining/machine_stacking.dm
#       Resolved
#	code/modules/mob/living/silicon/robot/robot_modules/station_vr.dm #       Resolved mostly besides line 717 "plasteel: undefined var"
#       even though the only change in this line is removing the comment
#	icons/mob/widerobot_vr.dmi
#       Resolved
#	maps/tether/tether-07-station3.dmm
#       Resolved
This commit is contained in:
izac112
2020-01-31 18:23:34 +01:00
171 changed files with 53648 additions and 5640 deletions

5
SpacemanDMM.toml Normal file
View File

@@ -0,0 +1,5 @@
[diagnostics]
macro_redefined = "off"
macro_undefined_no_definition = "off"
as_local_var = "off"
tmp_no_effect = "off"

View File

@@ -20,7 +20,7 @@ Thus, the two variables affect pump operation are set in New():
level = 1 level = 1
name = "gas pump" name = "gas pump"
desc = "A pump" desc = "A pump that moves gas from one place to another."
var/target_pressure = ONE_ATMOSPHERE var/target_pressure = ONE_ATMOSPHERE

View File

@@ -6,7 +6,7 @@
level = 1 level = 1
name = "high power gas pump" name = "high power gas pump"
desc = "A pump. Has double the power rating of the standard gas pump." desc = "A pump that moves gas from one place to another. Has double the power rating of the standard gas pump."
power_rating = 15000 //15000 W ~ 20 HP power_rating = 15000 //15000 W ~ 20 HP

View File

@@ -3,6 +3,7 @@
//-------------------------------------------- //--------------------------------------------
/obj/machinery/atmospherics/omni/atmos_filter /obj/machinery/atmospherics/omni/atmos_filter
name = "omni gas filter" name = "omni gas filter"
desc = "An advanced version of the gas filter, able to be configured for filtering of multiple gasses."
icon_state = "map_filter" icon_state = "map_filter"
pipe_state = "omni_filter" pipe_state = "omni_filter"

View File

@@ -7,6 +7,7 @@
level = 1 level = 1
name = "Gas filter" name = "Gas filter"
desc = "Filters one type of gas from an input, and pushes it out the side."
use_power = 1 use_power = 1
idle_power_usage = 150 //internal circuitry, friction losses and stuff idle_power_usage = 150 //internal circuitry, friction losses and stuff

View File

@@ -140,6 +140,7 @@
// Heat Exchange Junction - Interfaces HE pipes to normal pipes // Heat Exchange Junction - Interfaces HE pipes to normal pipes
// //
/obj/machinery/atmospherics/pipe/simple/heat_exchanging/junction /obj/machinery/atmospherics/pipe/simple/heat_exchanging/junction
desc = "An adaptor to transfer gasses between regular pipes and heat transferring ones. It doesn't conduct heat all that well."
icon = 'icons/atmos/junction.dmi' icon = 'icons/atmos/junction.dmi'
icon_state = "intact" icon_state = "intact"
pipe_icon = "hejunction" pipe_icon = "hejunction"

View File

@@ -144,9 +144,8 @@ Class Procs:
merge(A.zone,B.zone) merge(A.zone,B.zone)
return return
var var/a_to_b = get_dir(A,B)
a_to_b = get_dir(A,B) var/b_to_a = get_dir(B,A)
b_to_a = get_dir(B,A)
if(!A.connections) A.connections = new if(!A.connections) A.connections = new
if(!B.connections) B.connections = new if(!B.connections) B.connections = new

View File

@@ -429,6 +429,8 @@ var/global/list/remainless_species = list(SPECIES_PROMETHEAN,
SPECIES_SHADEKIN, //Shadefluffers just poof away SPECIES_SHADEKIN, //Shadefluffers just poof away
SPECIES_SHADEKIN_YW) //YW edits SPECIES_SHADEKIN_YW) //YW edits
/var/global/list/existing_solargrubs = list()
/hook/startup/proc/init_vore_datum_ref_lists() /hook/startup/proc/init_vore_datum_ref_lists()
var/paths var/paths

View File

@@ -52,3 +52,16 @@
if(sender) if(sender)
query_string += "&from=[url_encode(sender)]" query_string += "&from=[url_encode(sender)]"
world.Export("[config.chat_webhook_url]?[query_string]") world.Export("[config.chat_webhook_url]?[query_string]")
/proc/admin_action_message(var/admin = "INVALID", var/user = "INVALID", var/action = "INVALID", var/reason = "INVALID", var/time = "INVALID")
if (!config.chat_webhook_url || !action)
return
spawn(0)
var/query_string = "type=adminaction"
query_string += "&key=[url_encode(config.chat_webhook_key)]"
query_string += "&admin=[url_encode(admin)]"
query_string += "&user=[url_encode(user)]"
query_string += "&action=[url_encode(action)]"
query_string += "&reason=[url_encode(reason)]"
query_string += "&time=[url_encode(time)]"
world.Export("[config.chat_webhook_url]?[query_string]")

View File

@@ -104,6 +104,13 @@ var/list/gamemode_cache = list()
var/panic_bunker = 0 var/panic_bunker = 0
var/paranoia_logging = 0 var/paranoia_logging = 0
var/ip_reputation = FALSE //Should we query IPs to get scores? Generates HTTP traffic to an API service.
var/ipr_email //Left null because you MUST specify one otherwise you're making the internet worse.
var/ipr_block_bad_ips = FALSE //Should we block anyone who meets the minimum score below? Otherwise we just log it (If paranoia logging is on, visibly in chat).
var/ipr_bad_score = 1 //The API returns a value between 0 and 1 (inclusive), with 1 being 'definitely VPN/Tor/Proxy'. Values equal/above this var are considered bad.
var/ipr_allow_existing = FALSE //Should we allow known players to use VPNs/Proxies? If the player is already banned then obviously they still can't connect.
var/ipr_minimum_age = 5 //How many days before a player is considered 'fine' for the purposes of allowing them to use VPNs.
var/serverurl var/serverurl
var/server var/server
var/banappeals var/banappeals
@@ -806,6 +813,24 @@ var/list/gamemode_cache = list()
if ("paranoia_logging") if ("paranoia_logging")
config.paranoia_logging = 1 config.paranoia_logging = 1
if("ip_reputation")
config.ip_reputation = 1
if("ipr_email")
config.ipr_email = value
if("ipr_block_bad_ips")
config.ipr_block_bad_ips = 1
if("ipr_bad_score")
config.ipr_bad_score = text2num(value)
if("ipr_allow_existing")
config.ipr_allow_existing = 1
if("ipr_minimum_age")
config.ipr_minimum_age = text2num(value)
if("random_submap_orientation") if("random_submap_orientation")
config.random_submap_orientation = 1 config.random_submap_orientation = 1

View File

@@ -21,7 +21,8 @@ SUBSYSTEM_DEF(events)
/datum/controller/subsystem/events/fire(resumed) /datum/controller/subsystem/events/fire(resumed)
for(var/datum/event/E in active_events) for(var/datum/event/E in active_events)
E.process() if(E.processing_active)
E.process()
for(var/i = EVENT_LEVEL_MUNDANE to EVENT_LEVEL_MAJOR) for(var/i = EVENT_LEVEL_MUNDANE to EVENT_LEVEL_MAJOR)
var/list/datum/event_container/EC = event_containers[i] var/list/datum/event_container/EC = event_containers[i]
@@ -46,7 +47,7 @@ SUBSYSTEM_DEF(events)
if(EM.add_to_queue) if(EM.add_to_queue)
EC.available_events += EM EC.available_events += EM
log_debug("Event '[EM.name]' has completed at [worldtime2stationtime(world.time)].") log_debug("Event '[EM.name]' has completed at [stationtime2text()].")
/datum/controller/subsystem/events/proc/delay_events(var/severity, var/delay) /datum/controller/subsystem/events/proc/delay_events(var/severity, var/delay)
var/list/datum/event_container/EC = event_containers[severity] var/list/datum/event_container/EC = event_containers[severity]

View File

@@ -87,7 +87,7 @@ var/list/outfits_decls_by_type_
/decl/hierarchy/outfit/proc/equip(mob/living/carbon/human/H, var/rank, var/assignment) /decl/hierarchy/outfit/proc/equip(mob/living/carbon/human/H, var/rank, var/assignment)
equip_base(H) equip_base(H)
rank = id_pda_assignment || rank rank = rank || id_pda_assignment
assignment = id_pda_assignment || assignment || rank assignment = id_pda_assignment || assignment || rank
var/obj/item/weapon/card/id/W = equip_id(H, rank, assignment) var/obj/item/weapon/card/id/W = equip_id(H, rank, assignment)
if(W) if(W)

View File

@@ -6,8 +6,8 @@
#define RETURN_PRECISE_POSITION(A) new /datum/position(A) #define RETURN_PRECISE_POSITION(A) new /datum/position(A)
#define RETURN_PRECISE_POINT(A) new /datum/point(A) #define RETURN_PRECISE_POINT(A) new /datum/point(A)
#define RETURN_POINT_VECTOR(ATOM, ANGLE, SPEED) {new /datum/point/vector(ATOM, null, null, null, null, ANGLE, SPEED)} #define RETURN_POINT_VECTOR(ATOM, ANGLE, SPEED) (new /datum/point/vector(ATOM, null, null, null, null, ANGLE, SPEED))
#define RETURN_POINT_VECTOR_INCREMENT(ATOM, ANGLE, SPEED, AMT) {new /datum/point/vector(ATOM, null, null, null, null, ANGLE, SPEED, AMT)} #define RETURN_POINT_VECTOR_INCREMENT(ATOM, ANGLE, SPEED, AMT) (new /datum/point/vector(ATOM, null, null, null, null, ANGLE, SPEED, AMT))
/datum/position //For positions with map x/y/z and pixel x/y so you don't have to return lists. Could use addition/subtraction in the future I guess. /datum/position //For positions with map x/y/z and pixel x/y so you don't have to return lists. Could use addition/subtraction in the future I guess.
var/x = 0 var/x = 0

View File

@@ -123,7 +123,7 @@
// food-related // food-related
/datum/recipe/proc/make_food(var/obj/container as obj) /datum/recipe/proc/make_food(var/obj/container as obj)
if(!result) if(!result)
world << "<span class='danger'>Recipe [type] is defined without a result, please bug this.</span>" world << "<span class='danger'>Recipe [type] is defined without a result, please bug report this.</span>"
return return
var/obj/result_obj = new result(container) var/obj/result_obj = new result(container)
if(istype(container, /obj/machinery)) if(istype(container, /obj/machinery))

View File

@@ -134,8 +134,8 @@
siemens_coefficient = 0 siemens_coefficient = 0
/obj/item/clothing/shoes/boots/combat/changeling //Noslips /obj/item/clothing/shoes/boots/combat/changeling //Noslips
desc = "chitinous boots" name = "chitinous boots"
name = "Footwear made out of a hard, black chitinous material. The bottoms of these appear to have spikes that can protrude or extract itself into and out \ desc = "Footwear made out of a hard, black chitinous material. The bottoms of these appear to have spikes that can protrude or extract itself into and out \
of the floor at will, granting the wearer stability." of the floor at will, granting the wearer stability."
icon_state = "lingboots" icon_state = "lingboots"
armor = list(melee = 75, bullet = 60, laser = 70,energy = 60, bomb = 60, bio = 0, rad = 0) armor = list(melee = 75, bullet = 60, laser = 70,energy = 60, bomb = 60, bio = 0, rad = 0)

View File

@@ -2,6 +2,9 @@
total_positions = 2 //IT TAKES A LOT TO MAKE A STEW total_positions = 2 //IT TAKES A LOT TO MAKE A STEW
spawn_positions = 2 //A PINCH OF SALT AND LAUGHTER, TOO spawn_positions = 2 //A PINCH OF SALT AND LAUGHTER, TOO
/datum/job/hydro
spawn_positions = 2
/datum/job/cargo_tech /datum/job/cargo_tech
total_positions = 3 total_positions = 3
spawn_positions = 3 spawn_positions = 3

View File

@@ -11,4 +11,11 @@
access_RC_announce, access_keycard_auth, access_tcomsat, access_gateway, access_xenoarch, access_eva, access_network, access_maint_tunnels) access_RC_announce, access_keycard_auth, access_tcomsat, access_gateway, access_xenoarch, access_eva, access_network, access_maint_tunnels)
/datum/job/scientist /datum/job/scientist
alt_titles = list("Xenoarcheologist", "Anomalist", "Phoron Researcher", "Circuit Designer") spawn_positions = 5
alt_titles = list("Xenoarcheologist", "Anomalist", "Phoron Researcher", "Circuit Designer")
/datum/job/xenobiologist
spawn_positions = 3
/datum/job/roboticist
total_positions = 3

View File

@@ -2,10 +2,14 @@
disallow_jobhop = TRUE disallow_jobhop = TRUE
access = list(access_security, access_eva, access_sec_doors, access_brig, access_armory, access = list(access_security, access_eva, access_sec_doors, access_brig, access_armory,
access_forensics_lockers, access_morgue, access_maint_tunnels, access_all_personal_lockers, access_forensics_lockers, access_morgue, access_maint_tunnels, access_all_personal_lockers,
access_research, access_engine, access_mining, access_construction, access_mailsorting, access_research, access_engine, access_mining, access_construction, access_mailsorting,
access_heads, access_hos, access_RC_announce, access_keycard_auth, access_gateway, access_external_airlocks) access_heads, access_hos, access_RC_announce, access_keycard_auth, access_gateway, access_external_airlocks)
minimal_access = list(access_security, access_eva, access_sec_doors, access_brig, access_armory, minimal_access = list(access_security, access_eva, access_sec_doors, access_brig, access_armory,
access_forensics_lockers, access_morgue, access_maint_tunnels, access_all_personal_lockers, access_forensics_lockers, access_morgue, access_maint_tunnels, access_all_personal_lockers,
access_research, access_engine, access_mining, access_construction, access_mailsorting, access_research, access_engine, access_mining, access_construction, access_mailsorting,
access_heads, access_hos, access_RC_announce, access_keycard_auth, access_gateway, access_external_airlocks) access_heads, access_hos, access_RC_announce, access_keycard_auth, access_gateway, access_external_airlocks)
/datum/job/officer
total_positions = 5
spawn_positions = 5

View File

@@ -1,5 +1,6 @@
/obj/machinery/sleep_console /obj/machinery/sleep_console
name = "sleeper console" name = "sleeper console"
desc = "A control panel to operate a linked sleeper with."
icon = 'icons/obj/Cryogenic2_vr.dmi' //VOREStation Edit - Better icon. icon = 'icons/obj/Cryogenic2_vr.dmi' //VOREStation Edit - Better icon.
icon_state = "sleeperconsole" icon_state = "sleeperconsole"
var/obj/machinery/sleeper/sleeper var/obj/machinery/sleeper/sleeper

View File

@@ -34,6 +34,7 @@
/obj/machinery/alarm /obj/machinery/alarm
name = "alarm" name = "alarm"
desc = "Used to control various station atmospheric systems. The light indicates the current air status of the area."
icon = 'icons/obj/monitors.dmi' icon = 'icons/obj/monitors.dmi'
icon_state = "alarm0" icon_state = "alarm0"
plane = TURF_PLANE plane = TURF_PLANE

View File

@@ -2,6 +2,7 @@
icon = 'icons/obj/stationobjs.dmi' icon = 'icons/obj/stationobjs.dmi'
icon_state = "gsensor1" icon_state = "gsensor1"
name = "Gas Sensor" name = "Gas Sensor"
desc = "Senses atmospheric conditions."
anchored = 1 anchored = 1
var/state = 0 var/state = 0
@@ -77,6 +78,7 @@ obj/machinery/air_sensor/Destroy()
icon_keyboard = "atmos_key" icon_keyboard = "atmos_key"
icon_screen = "tank" icon_screen = "tank"
name = "Computer" name = "Computer"
desc = "Control atmospheric systems, remotely."
var/frequency = 1439 var/frequency = 1439
var/list/sensors = list() var/list/sensors = list()
var/list/sensor_information = list() var/list/sensor_information = list()

View File

@@ -1,5 +1,6 @@
/obj/machinery/portable_atmospherics/powered/scrubber /obj/machinery/portable_atmospherics/powered/scrubber
name = "Portable Air Scrubber" name = "Portable Air Scrubber"
desc = "Similar to room scrubbers, this device contains an internal tank to scrub gasses from the atmosphere."
icon = 'icons/obj/atmos.dmi' icon = 'icons/obj/atmos.dmi'
icon_state = "pscrubber:0" icon_state = "pscrubber:0"
@@ -144,6 +145,7 @@
//Huge scrubber //Huge scrubber
/obj/machinery/portable_atmospherics/powered/scrubber/huge /obj/machinery/portable_atmospherics/powered/scrubber/huge
name = "Huge Air Scrubber" name = "Huge Air Scrubber"
desc = "A larger variation of the portable scrubber, for industrial scrubbing of air. Must be turned on from a remote terminal."
icon = 'icons/obj/atmos_vr.dmi' //VOREStation Edit - New Sprite icon = 'icons/obj/atmos_vr.dmi' //VOREStation Edit - New Sprite
icon_state = "scrubber:0" icon_state = "scrubber:0"
anchored = 1 anchored = 1
@@ -239,6 +241,10 @@
/obj/machinery/portable_atmospherics/powered/scrubber/huge/stationary /obj/machinery/portable_atmospherics/powered/scrubber/huge/stationary
name = "Stationary Air Scrubber" name = "Stationary Air Scrubber"
/obj/machinery/portable_atmospherics/powered/scrubber/huge/stationary/Initialize()
. = ..()
desc += "This one seems to be tightly secured with large bolts."
/obj/machinery/portable_atmospherics/powered/scrubber/huge/stationary/attackby(var/obj/item/I as obj, var/mob/user as mob) /obj/machinery/portable_atmospherics/powered/scrubber/huge/stationary/attackby(var/obj/item/I as obj, var/mob/user as mob)
if(I.is_wrench()) if(I.is_wrench())
to_chat(user, "<span class='warning'>The bolts are too tight for you to unscrew!</span>") to_chat(user, "<span class='warning'>The bolts are too tight for you to unscrew!</span>")

View File

@@ -2,6 +2,7 @@
/obj/machinery/computer/operating /obj/machinery/computer/operating
name = "patient monitoring console" name = "patient monitoring console"
desc = "Used to monitor the vitals of a patient."
density = 1 density = 1
anchored = 1.0 anchored = 1.0
icon_keyboard = "med_key" icon_keyboard = "med_key"

View File

@@ -6,7 +6,7 @@
/obj/machinery/computer/rcon /obj/machinery/computer/rcon
name = "\improper RCON console" name = "\improper RCON console"
desc = "Console used to remotely control machinery on the station." desc = "Console used to remotely control electrical machinery on the station."
icon_keyboard = "power_key" icon_keyboard = "power_key"
icon_screen = "ai_fixer" //VOREStation Edit icon_screen = "ai_fixer" //VOREStation Edit
light_color = "#a97faa" light_color = "#a97faa"

View File

@@ -1,5 +1,6 @@
/obj/machinery/computer/aifixer /obj/machinery/computer/aifixer
name = "\improper AI system integrity restorer" name = "\improper AI system integrity restorer"
desc = "Restores AI units to working condition, assuming you have one inside!"
icon_keyboard = "rd_key" icon_keyboard = "rd_key"
icon_screen = "ai-fixer" icon_screen = "ai-fixer"
light_color = "#a97faa" light_color = "#a97faa"

View File

@@ -4,6 +4,7 @@
/obj/machinery/computer/atmoscontrol /obj/machinery/computer/atmoscontrol
name = "\improper Central Atmospherics Computer" name = "\improper Central Atmospherics Computer"
desc = "Control the station's atmospheric systems from afar! Certified atmospherics technicians only."
icon_keyboard = "generic_key" icon_keyboard = "generic_key"
icon_screen = "comm_logs" icon_screen = "comm_logs"
light_color = "#00b000" light_color = "#00b000"

View File

@@ -244,7 +244,7 @@
/obj/machinery/computer/security/wooden_tv /obj/machinery/computer/security/wooden_tv
name = "security camera monitor" name = "security camera monitor"
desc = "An old TV hooked into the stations camera network." desc = "An old TV hooked into the station's camera network."
icon_state = "television" icon_state = "television"
icon_keyboard = null icon_keyboard = null
icon_screen = "detective_tv" icon_screen = "detective_tv"
@@ -254,7 +254,7 @@
/obj/machinery/computer/security/mining /obj/machinery/computer/security/mining
name = "outpost camera monitor" name = "outpost camera monitor"
desc = "Used to access the various cameras on the outpost." desc = "Used to watch over mining operations."
icon_keyboard = "mining_key" icon_keyboard = "mining_key"
icon_screen = "mining" icon_screen = "mining"
network = list("Mining Outpost") network = list("Mining Outpost")

View File

@@ -1,5 +1,6 @@
/obj/machinery/computer/cloning /obj/machinery/computer/cloning
name = "cloning control console" name = "cloning control console"
desc = "Used to start cloning cycles, as well as manage clone records."
icon_keyboard = "med_key" icon_keyboard = "med_key"
icon_screen = "dna" icon_screen = "dna"
light_color = "#315ab4" light_color = "#315ab4"

View File

@@ -78,6 +78,7 @@
/obj/machinery/computer/guestpass /obj/machinery/computer/guestpass
name = "guest pass terminal" name = "guest pass terminal"
desc = "Used to print temporary passes for people. Handy!"
icon_state = "guest" icon_state = "guest"
plane = TURF_PLANE plane = TURF_PLANE
layer = ABOVE_TURF_LAYER layer = ABOVE_TURF_LAYER

View File

@@ -549,7 +549,7 @@
/obj/machinery/computer/med_data/laptop /obj/machinery/computer/med_data/laptop
name = "Medical Laptop" name = "Medical Laptop"
desc = "A cheap laptop." desc = "A cheap laptop. It seems to have only the medical records program."
icon_state = "laptop" icon_state = "laptop"
icon_keyboard = "laptop_key" icon_keyboard = "laptop_key"
icon_screen = "medlaptop" icon_screen = "medlaptop"

View File

@@ -2,6 +2,7 @@
/obj/machinery/computer/prisoner /obj/machinery/computer/prisoner
name = "prisoner management console" name = "prisoner management console"
desc = "Used to keep those sneaky prisoners in line, if they have an implant."
icon_keyboard = "security_key" icon_keyboard = "security_key"
icon_screen = "explosive" icon_screen = "explosive"
light_color = "#a91515" light_color = "#a91515"

View File

@@ -12,6 +12,7 @@ var/prison_shuttle_timeleft = 0
/obj/machinery/computer/prison_shuttle /obj/machinery/computer/prison_shuttle
name = "prison shuttle control console" name = "prison shuttle control console"
desc = "Used to move the prison shuttle to and from its destination."
icon_keyboard = "security_key" icon_keyboard = "security_key"
icon_screen = "syndishuttle" icon_screen = "syndishuttle"
light_color = "#00ffff" light_color = "#00ffff"

View File

@@ -5,6 +5,7 @@
// Supply requests console // Supply requests console
/obj/machinery/computer/supplycomp /obj/machinery/computer/supplycomp
name = "supply ordering console" name = "supply ordering console"
desc = "Request crates from here! Delivery not guaranteed."
icon_screen = "request" icon_screen = "request"
circuit = /obj/item/weapon/circuitboard/supplycomp circuit = /obj/item/weapon/circuitboard/supplycomp
var/authorization = 0 var/authorization = 0
@@ -18,6 +19,7 @@
// Supply control console // Supply control console
/obj/machinery/computer/supplycomp/control /obj/machinery/computer/supplycomp/control
name = "supply control console" name = "supply control console"
desc = "Control the cargo shuttle's functions remotely."
icon_keyboard = "tech_key" icon_keyboard = "tech_key"
icon_screen = "supply" icon_screen = "supply"
light_color = "#b88b2e" light_color = "#b88b2e"

View File

@@ -2,6 +2,7 @@
/obj/machinery/atmospherics/unary/cryo_cell /obj/machinery/atmospherics/unary/cryo_cell
name = "cryo cell" name = "cryo cell"
desc = "Used to cool people down for medical reasons. Totally."
icon = 'icons/obj/cryogenics.dmi' // map only icon = 'icons/obj/cryogenics.dmi' // map only
icon_state = "pod_preview" icon_state = "pod_preview"
density = 1 density = 1

View File

@@ -145,6 +145,7 @@ obj/machinery/airlock_sensor
icon = 'icons/obj/airlock_machines.dmi' icon = 'icons/obj/airlock_machines.dmi'
icon_state = "airlock_sensor_off" icon_state = "airlock_sensor_off"
name = "airlock sensor" name = "airlock sensor"
desc = "Sends atmospheric readings to a nearby controller."
anchored = 1 anchored = 1
power_channel = ENVIRON power_channel = ENVIRON

View File

@@ -1,5 +1,6 @@
/obj/machinery/floodlight /obj/machinery/floodlight
name = "Emergency Floodlight" name = "Emergency Floodlight"
desc = "Let there be light!"
icon = 'icons/obj/machines/floodlight.dmi' icon = 'icons/obj/machines/floodlight.dmi'
icon_state = "flood00" icon_state = "flood00"
density = 1 density = 1

View File

@@ -1,5 +1,6 @@
/obj/machinery/iv_drip /obj/machinery/iv_drip
name = "\improper IV drip" name = "\improper IV drip"
desc = "Helpful for giving someone blood! Or taking it away. It giveth, it taketh."
icon = 'icons/obj/iv_drip.dmi' icon = 'icons/obj/iv_drip.dmi'
anchored = 0 anchored = 0
density = 0 density = 0

View File

@@ -10,6 +10,7 @@
/obj/machinery/media/jukebox/ /obj/machinery/media/jukebox/
name = "space jukebox" name = "space jukebox"
desc = "Filled with songs both past and present!"
icon = 'icons/obj/jukebox.dmi' icon = 'icons/obj/jukebox.dmi'
icon_state = "jukebox2-nopower" icon_state = "jukebox2-nopower"
var/state_base = "jukebox2" var/state_base = "jukebox2"

View File

@@ -298,7 +298,7 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co
if(CHANNEL.is_admin_channel) if(CHANNEL.is_admin_channel)
dat+="<B><FONT style='BACKGROUND-COLOR: LightGreen '><A href='?src=\ref[src];show_channel=\ref[CHANNEL]'>[CHANNEL.channel_name]</A></FONT></B><BR>" dat+="<B><FONT style='BACKGROUND-COLOR: LightGreen '><A href='?src=\ref[src];show_channel=\ref[CHANNEL]'>[CHANNEL.channel_name]</A></FONT></B><BR>"
else else
dat+="<B><A href='?src=\ref[src];show_channel=\ref[CHANNEL]'>[CHANNEL.channel_name]</A> [(CHANNEL.censored) ? ("<FONT COLOR='red'>***</FONT>") : ()]<BR></B>" dat+="<B><A href='?src=\ref[src];show_channel=\ref[CHANNEL]'>[CHANNEL.channel_name]</A> [(CHANNEL.censored) ? ("<FONT COLOR='red'>***</FONT>") : null]<BR></B>"
dat+="<BR><HR><A href='?src=\ref[src];refresh=1'>Refresh</A>" dat+="<BR><HR><A href='?src=\ref[src];refresh=1'>Refresh</A>"
dat+="<BR><A href='?src=\ref[src];setScreen=[0]'>Back</A>" dat+="<BR><A href='?src=\ref[src];setScreen=[0]'>Back</A>"
if(2) if(2)
@@ -396,7 +396,7 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co
dat+="<I>No feed channels found active...</I><BR>" dat+="<I>No feed channels found active...</I><BR>"
else else
for(var/datum/feed_channel/CHANNEL in news_network.network_channels) for(var/datum/feed_channel/CHANNEL in news_network.network_channels)
dat+="<A href='?src=\ref[src];pick_censor_channel=\ref[CHANNEL]'>[CHANNEL.channel_name]</A> [(CHANNEL.censored) ? ("<FONT COLOR='red'>***</FONT>") : ()]<BR>" dat+="<A href='?src=\ref[src];pick_censor_channel=\ref[CHANNEL]'>[CHANNEL.channel_name]</A> [(CHANNEL.censored) ? ("<FONT COLOR='red'>***</FONT>") : null]<BR>"
dat+="<BR><A href='?src=\ref[src];setScreen=[0]'>Cancel</A>" dat+="<BR><A href='?src=\ref[src];setScreen=[0]'>Cancel</A>"
if(11) if(11)
dat+="<B>[using_map.company_name] D-Notice Handler</B><HR>" dat+="<B>[using_map.company_name] D-Notice Handler</B><HR>"
@@ -407,7 +407,7 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co
dat+="<I>No feed channels found active...</I><BR>" dat+="<I>No feed channels found active...</I><BR>"
else else
for(var/datum/feed_channel/CHANNEL in news_network.network_channels) for(var/datum/feed_channel/CHANNEL in news_network.network_channels)
dat+="<A href='?src=\ref[src];pick_d_notice=\ref[CHANNEL]'>[CHANNEL.channel_name]</A> [(CHANNEL.censored) ? ("<FONT COLOR='red'>***</FONT>") : ()]<BR>" dat+="<A href='?src=\ref[src];pick_d_notice=\ref[CHANNEL]'>[CHANNEL.channel_name]</A> [(CHANNEL.censored) ? ("<FONT COLOR='red'>***</FONT>") : null]<BR>"
dat+="<BR><A href='?src=\ref[src];setScreen=[0]'>Back</A>" dat+="<BR><A href='?src=\ref[src];setScreen=[0]'>Back</A>"
if(12) if(12)

View File

@@ -231,6 +231,7 @@
/obj/machinery/oxygen_pump/anesthetic /obj/machinery/oxygen_pump/anesthetic
name = "anesthetic pump" name = "anesthetic pump"
desc = "A wall mounted anesthetic pump with a retractable mask that someone can pull over your face to knock you out."
spawn_type = /obj/item/weapon/tank/anesthetic spawn_type = /obj/item/weapon/tank/anesthetic
icon_state = "anesthetic_tank" icon_state = "anesthetic_tank"
icon_state_closed = "anesthetic_tank" icon_state_closed = "anesthetic_tank"
@@ -266,6 +267,7 @@
/obj/machinery/oxygen_pump/mobile/anesthetic /obj/machinery/oxygen_pump/mobile/anesthetic
name = "portable anesthetic pump" name = "portable anesthetic pump"
desc = "A portable anesthetic pump with a retractable mask that someone can pull over your face to knock you out."
spawn_type = /obj/item/weapon/tank/anesthetic spawn_type = /obj/item/weapon/tank/anesthetic
icon_state = "medpump_n2o" icon_state = "medpump_n2o"
icon_state_closed = "medpump_n2o" icon_state_closed = "medpump_n2o"

View File

@@ -1,5 +1,6 @@
/obj/machinery/pipedispenser /obj/machinery/pipedispenser
name = "Pipe Dispenser" name = "Pipe Dispenser"
desc = "A large machine that can rapidly dispense pipes."
icon = 'icons/obj/stationobjs.dmi' icon = 'icons/obj/stationobjs.dmi'
icon_state = "pipe_d" icon_state = "pipe_d"
density = 1 density = 1
@@ -105,6 +106,7 @@
/obj/machinery/pipedispenser/disposal /obj/machinery/pipedispenser/disposal
name = "Disposal Pipe Dispenser" name = "Disposal Pipe Dispenser"
desc = "A large machine that can rapidly dispense pipes. This one seems to dispsense disposal pipes."
icon = 'icons/obj/stationobjs.dmi' icon = 'icons/obj/stationobjs.dmi'
icon_state = "pipe_d" icon_state = "pipe_d"
density = 1 density = 1

View File

@@ -5,6 +5,7 @@
/obj/machinery/computer/telecomms/server /obj/machinery/computer/telecomms/server
name = "Telecommunications Server Monitor" name = "Telecommunications Server Monitor"
desc = "View communication logs here. Translation not guaranteed."
icon_screen = "comm_logs" icon_screen = "comm_logs"
var/screen = 0 // the screen number: var/screen = 0 // the screen number:

View File

@@ -9,6 +9,7 @@
/obj/machinery/computer/telecomms/monitor /obj/machinery/computer/telecomms/monitor
name = "Telecommunications Monitor" name = "Telecommunications Monitor"
desc = "Used to traverse a telecommunication network. Helpful for debugging connection issues."
icon_screen = "comm_monitor" icon_screen = "comm_monitor"
var/screen = 0 // the screen number: var/screen = 0 // the screen number:

View File

@@ -6,6 +6,7 @@
/obj/machinery/computer/telecomms/traffic /obj/machinery/computer/telecomms/traffic
name = "Telecommunications Traffic Control" name = "Telecommunications Traffic Control"
desc = "Used to upload code to telecommunication consoles for execution."
icon_screen = "generic" icon_screen = "generic"
var/screen = 0 // the screen number: var/screen = 0 // the screen number:

View File

@@ -105,6 +105,7 @@
desc = "Used for building lights." desc = "Used for building lights."
icon = 'icons/obj/lighting.dmi' icon = 'icons/obj/lighting.dmi'
icon_state = "tube-construct-item" icon_state = "tube-construct-item"
refund_amt = 2 //TFF 17/1/20 - Oversight fix for infinite steel produciton.
build_machine_type = /obj/machinery/light_construct build_machine_type = /obj/machinery/light_construct
reverse = 1 reverse = 1
@@ -145,4 +146,4 @@
icon = 'icons/obj/closet.dmi' icon = 'icons/obj/closet.dmi'
icon_state = "fireaxe0101" icon_state = "fireaxe0101"
refund_amt = 4 refund_amt = 4
build_machine_type = /obj/structure/fireaxecabinet build_machine_type = /obj/structure/fireaxecabinet

View File

@@ -1,5 +1,6 @@
/obj/machinery/washing_machine /obj/machinery/washing_machine
name = "Washing Machine" name = "Washing Machine"
desc = "Not a hiding place."
icon = 'icons/obj/machines/washing_machine.dmi' icon = 'icons/obj/machines/washing_machine.dmi'
icon_state = "wm_10" icon_state = "wm_10"
density = 1 density = 1

View File

@@ -239,9 +239,9 @@
if(EQUIP_SPECIAL) if(EQUIP_SPECIAL)
chassis.special_equipment -= src chassis.special_equipment -= src
//VOREStation Addition begin: MICROMECHS //VOREStation Addition begin: MICROMECHS
if(EQUIP_UTILITY) if(EQUIP_MICRO_UTILITY)
chassis.micro_utility_equipment -= src chassis.micro_utility_equipment -= src
if(EQUIP_SPECIAL) if(EQUIP_MICRO_WEAPON)
chassis.micro_weapon_equipment -= src chassis.micro_weapon_equipment -= src
//VOREStation Addition end: MICROMECHS //VOREStation Addition end: MICROMECHS
if(chassis.selected == src) if(chassis.selected == src)

View File

@@ -1504,9 +1504,15 @@
output += "Universal Module: [W.name] <a href='?src=\ref[W];detach=1'>Detach</a><br>" output += "Universal Module: [W.name] <a href='?src=\ref[W];detach=1'>Detach</a><br>"
for(var/obj/item/mecha_parts/mecha_equipment/W in special_equipment) for(var/obj/item/mecha_parts/mecha_equipment/W in special_equipment)
output += "Special Module: [W.name] <a href='?src=\ref[W];detach=1'>Detach</a><br>" output += "Special Module: [W.name] <a href='?src=\ref[W];detach=1'>Detach</a><br>"
for(var/obj/item/mecha_parts/mecha_equipment/W in micro_utility_equipment) // VOREstation Edit - Adds micro equipent to the menu
output += "Micro Utility Module: [W.name] <a href='?src=\ref[W];detach=1'>Detach</a><br>"
for(var/obj/item/mecha_parts/mecha_equipment/W in micro_weapon_equipment)
output += "Micro Weapon Module: [W.name] <a href='?src=\ref[W];detach=1'>Detach</a><br>"
output += {"<b>Available hull slots:</b> [max_hull_equip-hull_equipment.len]<br> output += {"<b>Available hull slots:</b> [max_hull_equip-hull_equipment.len]<br>
<b>Available weapon slots:</b> [max_weapon_equip-weapon_equipment.len]<br> <b>Available weapon slots:</b> [max_weapon_equip-weapon_equipment.len]<br>
<b>Available micro weapon slots:</b> [max_micro_weapon_equip-micro_weapon_equipment.len]<br>
<b>Available utility slots:</b> [max_utility_equip-utility_equipment.len]<br> <b>Available utility slots:</b> [max_utility_equip-utility_equipment.len]<br>
<b>Available micro utility slots:</b> [max_micro_utility_equip-micro_utility_equipment.len]<br>
<b>Available universal slots:</b> [max_universal_equip-universal_equipment.len]<br> <b>Available universal slots:</b> [max_universal_equip-universal_equipment.len]<br>
<b>Available special slots:</b> [max_special_equip-special_equipment.len]<br> <b>Available special slots:</b> [max_special_equip-special_equipment.len]<br>
</div></div> </div></div>

View File

@@ -818,7 +818,6 @@
if(3) if(3)
if(diff==FORWARD) if(diff==FORWARD)
user.visible_message("[user] installs the external armor layer to [holder].", "You install the external armor layer to [holder].") user.visible_message("[user] installs the external armor layer to [holder].", "You install the external armor layer to [holder].")
qdel(I)
holder.icon_state = "gygax18" holder.icon_state = "gygax18"
else else
user.visible_message("[user] cuts internal armor layer from [holder].", "You cut the internal armor layer from [holder].") user.visible_message("[user] cuts internal armor layer from [holder].", "You cut the internal armor layer from [holder].")
@@ -829,7 +828,8 @@
holder.icon_state = "gygax19-s" holder.icon_state = "gygax19-s"
else else
user.visible_message("[user] pries the external armor layer from [holder].", "You pry the external armor layer from [holder].") user.visible_message("[user] pries the external armor layer from [holder].", "You pry the external armor layer from [holder].")
new /obj/item/mecha_parts/part/gygax_armour(get_turf(holder)) var/obj/item/stack/material/plasteel/MS = new /obj/item/stack/material/plasteel(get_turf(holder)) // Fixes serenity giving Gygax Armor Plates for the reverse action...
MS.amount = 5
holder.icon_state = "gygax17" holder.icon_state = "gygax17"
if(1) if(1)
if(diff==FORWARD) if(diff==FORWARD)

View File

@@ -1,5 +1,6 @@
/obj/machinery/computer/mecha /obj/machinery/computer/mecha
name = "Exosuit Control" name = "Exosuit Control"
desc = "Used to track exosuits, as well as view their logs and activate EMP beacons."
icon_keyboard = "rd_key" icon_keyboard = "rd_key"
icon_screen = "mecha" icon_screen = "mecha"
light_color = "#a97faa" light_color = "#a97faa"

View File

@@ -253,6 +253,7 @@
if(3) if(3)
if(diff==FORWARD) if(diff==FORWARD)
user.visible_message("[user] installs external reinforced armor layer to [holder].", "You install external reinforced armor layer to [holder].") user.visible_message("[user] installs external reinforced armor layer to [holder].", "You install external reinforced armor layer to [holder].")
qdel(used_atom)//CHOMPedit upstream port. Fixes polecat not useing it's armor plates up.
holder.icon_state = "polecat18" holder.icon_state = "polecat18"
else else
user.visible_message("[user] cuts internal armor layer from [holder].", "You cut the internal armor layer from [holder].") user.visible_message("[user] cuts internal armor layer from [holder].", "You cut the internal armor layer from [holder].")
@@ -262,9 +263,8 @@
user.visible_message("[user] secures external armor layer.", "You secure external reinforced armor layer.") user.visible_message("[user] secures external armor layer.", "You secure external reinforced armor layer.")
holder.icon_state = "polecat19" holder.icon_state = "polecat19"
else else
user.visible_message("[user] pries external armor layer from [holder].", "You prie external armor layer from [holder].") user.visible_message("[user] pries external armor layer from [holder].", "You pry the external armor layer from [holder].") // Rykka does smol grammar fix.
var/obj/item/stack/material/plasteel/MS = new /obj/item/stack/material/plasteel(get_turf(holder)) new /obj/item/mecha_parts/micro/part/polecat_armour(get_turf(holder))// Actually gives you the polecat's armored plates back instead of plasteel.
MS.amount = 5
holder.icon_state = "polecat17" holder.icon_state = "polecat17"
if(1) if(1)
if(diff==FORWARD) if(diff==FORWARD)

View File

@@ -68,6 +68,14 @@ var/global/list/obj/item/device/pda/PDAs = list()
if(..(user, 1)) if(..(user, 1))
to_chat(user, "The time [stationtime2text()] is displayed in the corner of the screen.") to_chat(user, "The time [stationtime2text()] is displayed in the corner of the screen.")
/obj/item/device/pda/CtrlClick()
if(issilicon(usr))
return
if(can_use(usr))
remove_pen()
return
..()
/obj/item/device/pda/AltClick() /obj/item/device/pda/AltClick()
if(issilicon(usr)) if(issilicon(usr))
@@ -1038,6 +1046,19 @@ var/global/list/obj/item/device/pda/PDAs = list()
id.loc = get_turf(src) id.loc = get_turf(src)
id = null id = null
/obj/item/device/pda/proc/remove_pen()
var/obj/item/weapon/pen/O = locate() in src
if(O)
if(istype(loc, /mob))
var/mob/M = loc
if(M.get_active_hand() == null)
M.put_in_hands(O)
to_chat(usr, "<span class='notice'>You remove \the [O] from \the [src].</span>")
return
O.loc = get_turf(src)
else
to_chat(usr, "<span class='notice'>This PDA does not have a pen in it.</span>")
/obj/item/device/pda/proc/create_message(var/mob/living/U = usr, var/obj/item/device/pda/P, var/tap = 1) /obj/item/device/pda/proc/create_message(var/mob/living/U = usr, var/obj/item/device/pda/P, var/tap = 1)
if(tap) if(tap)
U.visible_message("<span class='notice'>\The [U] taps on their PDA's screen.</span>") U.visible_message("<span class='notice'>\The [U] taps on their PDA's screen.</span>")
@@ -1198,17 +1219,7 @@ var/global/list/obj/item/device/pda/PDAs = list()
return return
if ( can_use(usr) ) if ( can_use(usr) )
var/obj/item/weapon/pen/O = locate() in src remove_pen()
if(O)
if (istype(loc, /mob))
var/mob/M = loc
if(M.get_active_hand() == null)
M.put_in_hands(O)
to_chat(usr, "<span class='notice'>You remove \the [O] from \the [src].</span>")
return
O.loc = get_turf(src)
else
to_chat(usr, "<span class='notice'>This PDA does not have a pen in it.</span>")
else else
to_chat(usr, "<span class='notice'>You cannot do this while restrained.</span>") to_chat(usr, "<span class='notice'>You cannot do this while restrained.</span>")

View File

@@ -1,5 +1,6 @@
/obj/item/device/pipe_painter /obj/item/device/pipe_painter
name = "pipe painter" name = "pipe painter"
desc = "Used to apply a even coat of paint to pipes. Atmospheric usage reccomended."
icon = 'icons/obj/bureaucracy.dmi' icon = 'icons/obj/bureaucracy.dmi'
icon_state = "labeler1" icon_state = "labeler1"
var/list/modes var/list/modes

View File

@@ -27,6 +27,7 @@ var/global/list/default_medbay_channels = list(
/obj/item/device/radio /obj/item/device/radio
icon = 'icons/obj/radio_vr.dmi' //VOREStation Edit icon = 'icons/obj/radio_vr.dmi' //VOREStation Edit
name = "shortwave radio" //VOREStation Edit name = "shortwave radio" //VOREStation Edit
desc = "Used to talk to people when headsets don't function. Range is limited."
suffix = "\[3\]" suffix = "\[3\]"
icon_state = "walkietalkie" icon_state = "walkietalkie"
item_state = "radio" item_state = "radio"

View File

@@ -249,3 +249,14 @@
/obj/item/weapon/stock_parts/capacitor = 1, /obj/item/weapon/stock_parts/capacitor = 1,
/obj/item/weapon/stock_parts/spring = 1, /obj/item/weapon/stock_parts/spring = 1,
/obj/item/stack/cable_coil = 5) /obj/item/stack/cable_coil = 5)
/obj/item/weapon/circuitboard/microwave/advanced
name = T_BOARD("deluxe microwave")
build_path = /obj/machinery/microwave/advanced
board_type = new /datum/frame/frame_types/microwave
matter = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50)
req_components = list(
/obj/item/weapon/stock_parts/console_screen = 1,
/obj/item/weapon/stock_parts/motor = 1,
/obj/item/weapon/stock_parts/capacitor = 1)

View File

@@ -7,4 +7,13 @@
/obj/item/weapon/circuitboard/aicore /obj/item/weapon/circuitboard/aicore
name = T_BOARD("AI core") name = T_BOARD("AI core")
origin_tech = list(TECH_DATA = 4, TECH_BIO = 2) origin_tech = list(TECH_DATA = 4, TECH_BIO = 2)
board_type = "other" board_type = "other"
/obj/item/weapon/circuitboard/chem_master
name = T_BOARD("ChemMaster 3000")
build_path = /obj/machinery/chem_master
board_type = new /datum/frame/frame_types/machine
origin_tech = list(TECH_DATA = 3, TECH_MAGNET = 2)
req_components = list(
/obj/item/weapon/stock_parts/matter_bin = 2,
/obj/item/weapon/stock_parts/manipulator = 2)

View File

@@ -1,5 +1,5 @@
/obj/item/weapon/grenade/spawnergrenade /obj/item/weapon/grenade/spawnergrenade
desc = "It is set to detonate in 5 seconds. It will unleash unleash an unspecified anomaly into the vicinity." desc = "It is set to detonate in 5 seconds. It will unleash an unspecified anomaly into the vicinity."
name = "delivery grenade" name = "delivery grenade"
icon = 'icons/obj/grenade.dmi' icon = 'icons/obj/grenade.dmi'
icon_state = "delivery" icon_state = "delivery"
@@ -76,4 +76,4 @@
throw_speed = 1 throw_speed = 1
throw_range = 4 throw_range = 4
w_class = ITEMSIZE_LARGE w_class = ITEMSIZE_LARGE
deliveryamt = 6 deliveryamt = 6

View File

@@ -987,6 +987,7 @@
/obj/item/weapon/book/manual/barman_recipes /obj/item/weapon/book/manual/barman_recipes
name = "Barman Recipes" name = "Barman Recipes"
desc = "For the enterprising drink server."
icon_state = "barbook" icon_state = "barbook"
author = "Sir John Rose" author = "Sir John Rose"
title = "Barman Recipes" title = "Barman Recipes"

View File

@@ -103,6 +103,7 @@
/obj/item/weapon/storage/box/beakers /obj/item/weapon/storage/box/beakers
name = "box of beakers" name = "box of beakers"
desc = "A box full of beakers."
icon_state = "beaker" icon_state = "beaker"
starts_with = list(/obj/item/weapon/reagent_containers/glass/beaker = 7) starts_with = list(/obj/item/weapon/reagent_containers/glass/beaker = 7)

View File

@@ -357,6 +357,7 @@
icon_state = "vialbox6" icon_state = "vialbox6"
icon_type = "vial" icon_type = "vial"
name = "vial storage box" name = "vial storage box"
desc = "A helpful rack to hold test tubes."
storage_slots = 6 storage_slots = 6
can_hold = list(/obj/item/weapon/reagent_containers/glass/beaker/vial) can_hold = list(/obj/item/weapon/reagent_containers/glass/beaker/vial)
starts_with = list(/obj/item/weapon/reagent_containers/glass/beaker/vial = 6) starts_with = list(/obj/item/weapon/reagent_containers/glass/beaker/vial = 6)

View File

@@ -6,6 +6,7 @@
icon = 'icons/obj/food.dmi' icon = 'icons/obj/food.dmi'
icon_state = "donutbox" icon_state = "donutbox"
name = "donut box" name = "donut box"
desc = "A box that holds tasty donuts, if you're lucky."
max_storage_space = ITEMSIZE_COST_SMALL * 6 max_storage_space = ITEMSIZE_COST_SMALL * 6
can_hold = list(/obj/item/weapon/reagent_containers/food/snacks/donut) can_hold = list(/obj/item/weapon/reagent_containers/food/snacks/donut)
foldable = /obj/item/stack/material/cardboard foldable = /obj/item/stack/material/cardboard

View File

@@ -173,6 +173,7 @@
/obj/item/weapon/storage/secure/safe /obj/item/weapon/storage/secure/safe
name = "secure safe" name = "secure safe"
desc = "It doesn't seem all that secure. Oh well, it'll do."
icon = 'icons/obj/storage.dmi' icon = 'icons/obj/storage.dmi'
icon_state = "safe" icon_state = "safe"
icon_opened = "safe0" icon_opened = "safe0"

View File

@@ -1,5 +1,6 @@
/obj/structure/curtain /obj/structure/curtain
name = "curtain" name = "curtain"
desc = "The show must go on! At least, until you close these."
icon = 'icons/obj/curtain.dmi' icon = 'icons/obj/curtain.dmi'
icon_state = "closed" icon_state = "closed"
plane = MOB_PLANE plane = MOB_PLANE

View File

@@ -245,8 +245,7 @@
prob(1);/obj/item/weapon/material/knife/tacknife, prob(1);/obj/item/weapon/material/knife/tacknife,
prob(1);/obj/item/weapon/storage/box/survival/space, prob(1);/obj/item/weapon/storage/box/survival/space,
prob(1);/obj/item/weapon/storage/secure/briefcase/trashmoney, prob(1);/obj/item/weapon/storage/secure/briefcase/trashmoney,
prob(1);/obj/item/weapon/reagent_containers/syringe/steroid, prob(1);/obj/item/weapon/reagent_containers/syringe/steroid)
prob(1);/obj/item/seeds/gnomes)
var/obj/item/I = new path() var/obj/item/I = new path()
return I return I

View File

@@ -138,7 +138,7 @@
/turf/simulated/wall/attackby(obj/item/weapon/W as obj, mob/user as mob) /turf/simulated/wall/attackby(obj/item/weapon/W as obj, mob/user as mob)
user.setClickCooldown(user.get_attack_speed(W)) user.setClickCooldown(user.get_attack_speed(W))
if (!user.) if (!user.IsAdvancedToolUser())
to_chat(user, "<span class='warning'>You don't have the dexterity to do this!</span>") to_chat(user, "<span class='warning'>You don't have the dexterity to do this!</span>")
return return

View File

@@ -119,6 +119,7 @@ var/savefile/Banlist
Banlist["temp"] << temp Banlist["temp"] << temp
if (temp) if (temp)
Banlist["minutes"] << bantimestamp Banlist["minutes"] << bantimestamp
admin_action_message(bannedby, ckey, "banned", reason, temp ? minutes : -1) //VOREStation Add
return 1 return 1
/proc/RemoveBan(foldername) /proc/RemoveBan(foldername)
@@ -147,7 +148,7 @@ var/savefile/Banlist
Banlist.cd = "/base" Banlist.cd = "/base"
Banlist.dir.Remove(A) Banlist.dir.Remove(A)
continue continue
admin_action_message(usr.key, key, "unbanned", "\[Unban\]", 0) //VOREStation Add
return 1 return 1
/proc/GetExp(minutes as num) /proc/GetExp(minutes as num)

View File

@@ -369,7 +369,7 @@ proc/admin_notice(var/message, var/rights)
if(CHANNEL.is_admin_channel) if(CHANNEL.is_admin_channel)
dat+="<B><FONT style='BACKGROUND-COLOR: LightGreen'><A href='?src=\ref[src];ac_show_channel=\ref[CHANNEL]'>[CHANNEL.channel_name]</A></FONT></B><BR>" dat+="<B><FONT style='BACKGROUND-COLOR: LightGreen'><A href='?src=\ref[src];ac_show_channel=\ref[CHANNEL]'>[CHANNEL.channel_name]</A></FONT></B><BR>"
else else
dat+="<B><A href='?src=\ref[src];ac_show_channel=\ref[CHANNEL]'>[CHANNEL.channel_name]</A> [(CHANNEL.censored) ? ("<FONT COLOR='red'>***</FONT>") : ()]<BR></B>" dat+="<B><A href='?src=\ref[src];ac_show_channel=\ref[CHANNEL]'>[CHANNEL.channel_name]</A> [(CHANNEL.censored) ? ("<FONT COLOR='red'>***</FONT>") : null]<BR></B>"
dat+={"<BR><HR><A href='?src=\ref[src];ac_refresh=1'>Refresh</A> dat+={"<BR><HR><A href='?src=\ref[src];ac_refresh=1'>Refresh</A>
<BR><A href='?src=\ref[src];ac_setScreen=[0]'>Back</A> <BR><A href='?src=\ref[src];ac_setScreen=[0]'>Back</A>
"} "}
@@ -453,7 +453,7 @@ proc/admin_notice(var/message, var/rights)
dat+="<I>No feed channels found active...</I><BR>" dat+="<I>No feed channels found active...</I><BR>"
else else
for(var/datum/feed_channel/CHANNEL in news_network.network_channels) for(var/datum/feed_channel/CHANNEL in news_network.network_channels)
dat+="<A href='?src=\ref[src];ac_pick_censor_channel=\ref[CHANNEL]'>[CHANNEL.channel_name]</A> [(CHANNEL.censored) ? ("<FONT COLOR='red'>***</FONT>") : ()]<BR>" dat+="<A href='?src=\ref[src];ac_pick_censor_channel=\ref[CHANNEL]'>[CHANNEL.channel_name]</A> [(CHANNEL.censored) ? ("<FONT COLOR='red'>***</FONT>") : null]<BR>"
dat+="<BR><A href='?src=\ref[src];ac_setScreen=[0]'>Cancel</A>" dat+="<BR><A href='?src=\ref[src];ac_setScreen=[0]'>Cancel</A>"
if(11) if(11)
dat+={" dat+={"
@@ -466,7 +466,7 @@ proc/admin_notice(var/message, var/rights)
dat+="<I>No feed channels found active...</I><BR>" dat+="<I>No feed channels found active...</I><BR>"
else else
for(var/datum/feed_channel/CHANNEL in news_network.network_channels) for(var/datum/feed_channel/CHANNEL in news_network.network_channels)
dat+="<A href='?src=\ref[src];ac_pick_d_notice=\ref[CHANNEL]'>[CHANNEL.channel_name]</A> [(CHANNEL.censored) ? ("<FONT COLOR='red'>***</FONT>") : ()]<BR>" dat+="<A href='?src=\ref[src];ac_pick_d_notice=\ref[CHANNEL]'>[CHANNEL.channel_name]</A> [(CHANNEL.censored) ? ("<FONT COLOR='red'>***</FONT>") : null]<BR>"
dat+="<BR><A href='?src=\ref[src];ac_setScreen=[0]'>Back</A>" dat+="<BR><A href='?src=\ref[src];ac_setScreen=[0]'>Back</A>"
if(12) if(12)
@@ -1223,7 +1223,7 @@ var/datum/announcement/minor/admin_min_announcer = new
out += "<b>Autotraitor <a href='?src=\ref[ticker.mode];toggle=autotraitor'>disabled</a></b>.<br/>" out += "<b>Autotraitor <a href='?src=\ref[ticker.mode];toggle=autotraitor'>disabled</a></b>.<br/>"
out += "<b>All antag ids:</b>" out += "<b>All antag ids:</b>"
if(ticker.mode.antag_templates && ticker.mode.antag_templates.len). if(ticker.mode.antag_templates && ticker.mode.antag_templates.len)
for(var/datum/antagonist/antag in ticker.mode.antag_templates) for(var/datum/antagonist/antag in ticker.mode.antag_templates)
antag.update_current_antag_max() antag.update_current_antag_max()
out += " <a href='?src=\ref[ticker.mode];debug_antag=[antag.id]'>[antag.id]</a>" out += " <a href='?src=\ref[ticker.mode];debug_antag=[antag.id]'>[antag.id]</a>"
@@ -1532,9 +1532,8 @@ datum/admins/var/obj/item/weapon/paper/admin/faxreply // var to hold fax replies
P.stamps += "<hr><i>This paper has been stamped by the [P.origin] Quantum Relay.</i>" P.stamps += "<hr><i>This paper has been stamped by the [P.origin] Quantum Relay.</i>"
var/image/stampoverlay = image('icons/obj/bureaucracy.dmi') var/image/stampoverlay = image('icons/obj/bureaucracy.dmi')
var/{x; y;} var/x = rand(-2, 0)
x = rand(-2, 0) var/y = rand(-1, 2)
y = rand(-1, 2)
P.offset_x += x P.offset_x += x
P.offset_y += y P.offset_y += y
stampoverlay.pixel_x = x stampoverlay.pixel_x = x

View File

@@ -28,10 +28,7 @@ var/datum/admin_secrets/admin_secrets = new()
/datum/admin_secret_category /datum/admin_secret_category
var/name = "" var/name = ""
var/desc = "" var/desc = ""
var/list/datum/admin_secret_item/items var/list/datum/admin_secret_item/items = list()
/datum/admin_secret_category
items = list()
/datum/admin_secret_category/proc/can_view(var/mob/user) /datum/admin_secret_category/proc/can_view(var/mob/user)
for(var/datum/admin_secret_item/item in items) for(var/datum/admin_secret_item/item in items)

View File

@@ -184,7 +184,8 @@ var/list/admin_verbs_server = list(
/client/proc/modify_server_news, /client/proc/modify_server_news,
/client/proc/recipe_dump, /client/proc/recipe_dump,
/client/proc/panicbunker, /client/proc/panicbunker,
/client/proc/paranoia_logging /client/proc/paranoia_logging,
/client/proc/ip_reputation
) )
var/list/admin_verbs_debug = list( var/list/admin_verbs_debug = list(

View File

@@ -154,7 +154,7 @@ var/savefile/Banlistjob
Banlistjob["temp"] << temp Banlistjob["temp"] << temp
if (temp) if (temp)
Banlistjob["minutes"] << bantimestamp Banlistjob["minutes"] << bantimestamp
admin_action_message(bannedby, ckey, "jobbanned-"+rank, reason, temp ? minutes : -1) //VOREStation Add
return 1 return 1
/proc/RemoveBanjob(foldername) /proc/RemoveBanjob(foldername)
@@ -185,7 +185,7 @@ var/savefile/Banlistjob
Banlistjob.cd = "/base" Banlistjob.cd = "/base"
Banlistjob.dir.Remove(A) Banlistjob.dir.Remove(A)
continue continue
admin_action_message(usr.key, key, "unjobbanned-"+rank, "\[Unban\]", 0) //VOREStation Add
return 1 return 1
/proc/GetBanExpjob(minutes as num) /proc/GetBanExpjob(minutes as num)

View File

@@ -105,7 +105,7 @@ datum/admins/proc/notes_gethtml(var/ckey)
message_admins("<font color='blue'>[key_name_admin(user)] has edited [key]'s notes.</font>") message_admins("<font color='blue'>[key_name_admin(user)] has edited [key]'s notes.</font>")
log_admin("[key_name(user)] has edited [key]'s notes.") log_admin("[key_name(user)] has edited [key]'s notes.")
admin_action_message(user.key, key, "added note on", note, 0) //VOREStation Add
del(info) // savefile, so NOT qdel del(info) // savefile, so NOT qdel
//Updating list of keys with notes on them //Updating list of keys with notes on them
@@ -130,7 +130,7 @@ datum/admins/proc/notes_gethtml(var/ckey)
message_admins("<font color='blue'>[key_name_admin(usr)] deleted one of [key]'s notes.</font>") message_admins("<font color='blue'>[key_name_admin(usr)] deleted one of [key]'s notes.</font>")
log_admin("[key_name(usr)] deleted one of [key]'s notes.") log_admin("[key_name(usr)] deleted one of [key]'s notes.")
admin_action_message(usr.key, key, "deleted note on", "\[Note gone\]", 0) //VOREStation Add
qdel(info) qdel(info)
/proc/show_player_info_irc(var/key as text) /proc/show_player_info_irc(var/key as text)

View File

@@ -827,6 +827,7 @@
log_admin("[key_name(usr)] booted [key_name(M)] for reason: '[reason]'.") log_admin("[key_name(usr)] booted [key_name(M)] for reason: '[reason]'.")
message_admins("<font color='blue'>[key_name_admin(usr)] booted [key_name_admin(M)] for reason '[reason]'.</font>", 1) message_admins("<font color='blue'>[key_name_admin(usr)] booted [key_name_admin(M)] for reason '[reason]'.</font>", 1)
//M.client = null //M.client = null
admin_action_message(usr.key, M.key, "kicked", reason, 0) //VOREStation Add
qdel(M.client) qdel(M.client)
else if(href_list["removejobban"]) else if(href_list["removejobban"])

View File

@@ -11,9 +11,9 @@
config.panic_bunker = (!config.panic_bunker) config.panic_bunker = (!config.panic_bunker)
log_and_message_admins("[key_name(usr)] has toggled the Panic Bunker, it is now [(config.panic_bunker?"on":"off")]") log_and_message_admins("[key_name(usr)] has toggled the Panic Bunker, it is now [(config.panic_bunker?"on":"off")].")
if (config.panic_bunker && (!dbcon || !dbcon.IsConnected())) if (config.panic_bunker && (!dbcon || !dbcon.IsConnected()))
message_admins("The Database is not connected! Panic bunker will not work until the connection is reestablished.") message_admins("The database is not connected! Panic bunker will not work until the connection is reestablished.")
feedback_add_details("admin_verb","PANIC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! feedback_add_details("admin_verb","PANIC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/paranoia_logging() /client/proc/paranoia_logging()
@@ -25,7 +25,21 @@
config.paranoia_logging = (!config.paranoia_logging) config.paranoia_logging = (!config.paranoia_logging)
log_and_message_admins("[key_name(usr)] has toggled Paranoia Logging, it is now [(config.paranoia_logging?"on":"off")]") log_and_message_admins("[key_name(usr)] has toggled Paranoia Logging, it is now [(config.paranoia_logging?"on":"off")].")
if (config.paranoia_logging && (!dbcon || !dbcon.IsConnected())) if (config.paranoia_logging && (!dbcon || !dbcon.IsConnected()))
message_admins("The Database is not connected! Paranoia logging will not be able to give 'player age' (time since first connection) warnings, only Byond account warnings.") message_admins("The database is not connected! Paranoia logging will not be able to give 'player age' (time since first connection) warnings, only Byond account warnings.")
feedback_add_details("admin_verb","PARLOG") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! feedback_add_details("admin_verb","PARLOG") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/ip_reputation()
set category = "Server"
set name = "Toggle IP Rep Checks"
if(!check_rights(R_ADMIN))
return
config.ip_reputation = (!config.ip_reputation)
log_and_message_admins("[key_name(usr)] has toggled IP reputation checks, it is now [(config.ip_reputation?"on":"off")].")
if (config.ip_reputation && (!dbcon || !dbcon.IsConnected()))
message_admins("The database is not connected! IP reputation logging will not be able to allow existing players to bypass the reputation checks (if that is enabled).")
feedback_add_details("admin_verb","IPREP") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!

View File

@@ -41,6 +41,7 @@
var/received_irc_pm = -99999 var/received_irc_pm = -99999
var/irc_admin //IRC admin that spoke with them last. var/irc_admin //IRC admin that spoke with them last.
var/mute_irc = 0 var/mute_irc = 0
var/ip_reputation = 0 //Do we think they're using a proxy/vpn? Only if IP Reputation checking is enabled in config.
//////////////////////////////////// ////////////////////////////////////

View File

@@ -169,10 +169,19 @@
hook_vr("client_new",list(src)) //VOREStation Code hook_vr("client_new",list(src)) //VOREStation Code
if(config.paranoia_logging) if(config.paranoia_logging)
var/alert = FALSE //VOREStation Edit start.
if(isnum(player_age) && player_age == 0) if(isnum(player_age) && player_age == 0)
log_and_message_admins("PARANOIA: [key_name(src)] has connected here for the first time.") log_and_message_admins("PARANOIA: [key_name(src)] has connected here for the first time.")
alert = TRUE
if(isnum(account_age) && account_age <= 2) if(isnum(account_age) && account_age <= 2)
log_and_message_admins("PARANOIA: [key_name(src)] has a very new BYOND account ([account_age] days).") log_and_message_admins("PARANOIA: [key_name(src)] has a very new BYOND account ([account_age] days).")
alert = TRUE
if(alert)
for(var/client/X in admins)
if(X.is_preference_enabled(/datum/client_preference/holder/play_adminhelp_ping))
X << 'sound/voice/bcriminal.ogg'
window_flash(X)
//VOREStation Edit end.
////////////// //////////////
//DISCONNECT// //DISCONNECT//
@@ -274,6 +283,31 @@
qdel(src) qdel(src)
return 0 return 0
// IP Reputation Check
if(config.ip_reputation)
if(config.ipr_allow_existing && player_age >= config.ipr_minimum_age)
log_admin("Skipping IP reputation check on [key] with [address] because of player age")
else if(update_ip_reputation()) //It is set now
if(ip_reputation >= config.ipr_bad_score) //It's bad
//Log it
if(config.paranoia_logging) //We don't block, but we want paranoia log messages
log_and_message_admins("[key] at [address] has bad IP reputation: [ip_reputation]. Will be kicked if enabled in config.")
else //We just log it
log_admin("[key] at [address] has bad IP reputation: [ip_reputation]. Will be kicked if enabled in config.")
//Take action if required
if(config.ipr_block_bad_ips && config.ipr_allow_existing) //We allow players of an age, but you don't meet it
to_chat(src,"Sorry, we only allow VPN/Proxy/Tor usage for players who have spent at least [config.ipr_minimum_age] days on the server. If you are unable to use the internet without your VPN/Proxy/Tor, please contact an admin out-of-game to let them know so we can accommodate this.")
qdel(src)
return 0
else if(config.ipr_block_bad_ips) //We don't allow players of any particular age
to_chat(src,"Sorry, we do not accept connections from users via VPN/Proxy/Tor connections.")
qdel(src)
return 0
else
log_admin("Couldn't perform IP check on [key] with [address]")
// VOREStation Edit Start - Department Hours // VOREStation Edit Start - Department Hours
if(config.time_off) if(config.time_off)
var/DBQuery/query_hours = dbcon.NewQuery("SELECT department, hours FROM vr_player_hours WHERE ckey = '[sql_ckey]'") var/DBQuery/query_hours = dbcon.NewQuery("SELECT department, hours FROM vr_player_hours WHERE ckey = '[sql_ckey]'")
@@ -407,3 +441,63 @@ client/verb/character_setup()
if(var_name == NAMEOF(src, holder)) if(var_name == NAMEOF(src, holder))
return FALSE return FALSE
return ..() return ..()
//This is for getipintel.net.
//You're welcome to replace this proc with your own that does your own cool stuff.
//Just set the client's ip_reputation var and make sure it makes sense with your config settings (higher numbers are worse results)
/client/proc/update_ip_reputation()
var/request = "http://check.getipintel.net/check.php?ip=[address]&contact=[config.ipr_email]"
var/http[] = world.Export(request)
/* Debug
world.log << "Requested this: [request]"
for(var/entry in http)
world.log << "[entry] : [http[entry]]"
*/
if(!http || !islist(http)) //If we couldn't check, the service might be down, fail-safe.
log_admin("Couldn't connect to getipintel.net to check [address] for [key]")
return FALSE
//429 is rate limit exceeded
if(text2num(http["STATUS"]) == 429)
log_and_message_admins("getipintel.net reports HTTP status 429. IP reputation checking is now disabled. If you see this, let a developer know.")
config.ip_reputation = FALSE
return FALSE
var/content = file2text(http["CONTENT"]) //world.Export actually returns a file object in CONTENT
var/score = text2num(content)
if(isnull(score))
return FALSE
//Error handling
if(score < 0)
var/fatal = TRUE
var/ipr_error = "getipintel.net IP reputation check error while checking [address] for [key]: "
switch(score)
if(-1)
ipr_error += "No input provided"
if(-2)
fatal = FALSE
ipr_error += "Invalid IP provided"
if(-3)
fatal = FALSE
ipr_error += "Unroutable/private IP (spoofing?)"
if(-4)
fatal = FALSE
ipr_error += "Unable to reach database"
if(-5)
ipr_error += "Our IP is banned or otherwise forbidden"
if(-6)
ipr_error += "Missing contact info"
log_and_message_admins(ipr_error)
if(fatal)
config.ip_reputation = FALSE
log_and_message_admins("With this error, IP reputation checking is disabled for this shift. Let a developer know.")
return FALSE
//Went fine
else
ip_reputation = score
return TRUE

View File

@@ -273,10 +273,12 @@ var/list/gear_datums = list()
/datum/gear/proc/spawn_item(var/location, var/metadata) /datum/gear/proc/spawn_item(var/location, var/metadata)
var/datum/gear_data/gd = new(path, location) var/datum/gear_data/gd = new(path, location)
for(var/datum/gear_tweak/gt in gear_tweaks) for(var/datum/gear_tweak/gt in gear_tweaks)
gt.tweak_gear_data(metadata["[gt]"], gd) if(gear_tweaks.len)
gt.tweak_gear_data(metadata["[gt]"], gd)
var/item = new gd.path(gd.location) var/item = new gd.path(gd.location)
for(var/datum/gear_tweak/gt in gear_tweaks) for(var/datum/gear_tweak/gt in gear_tweaks)
gt.tweak_item(item, metadata["[gt]"]) if(gear_tweaks.len)
gt.tweak_item(item, metadata["[gt]"])
var/mob/M = location var/mob/M = location
if(istype(M) && exploitable) //Update exploitable info records for the mob without creating a duplicate object at their feet. if(istype(M) && exploitable) //Update exploitable info records for the mob without creating a duplicate object at their feet.
M.amend_exploitable(item) M.amend_exploitable(item)

View File

@@ -183,7 +183,7 @@
/datum/gear/uniform/job_turtle/medical /datum/gear/uniform/job_turtle/medical
display_name = "turtleneck, medical" display_name = "turtleneck, medical"
path = /obj/item/clothing/under/rank/medical/turtleneck path = /obj/item/clothing/under/rank/medical/turtleneck
allowed_roles = list("Chief Medical Officer", "Paramedic", "Medical Doctor", "Psychologist", "Search and Rescue", "Chemist") allowed_roles = list("Chief Medical Officer", "Paramedic", "Medical Doctor", "Psychiatrist", "Search and Rescue", "Chemist")
/datum/gear/uniform/jeans_qm /datum/gear/uniform/jeans_qm
display_name = "jeans, QM" display_name = "jeans, QM"

View File

@@ -100,7 +100,6 @@
slot_r_hand_str = "engiewelding", slot_r_hand_str = "engiewelding",
) )
/* /*
* Cakehat * Cakehat
*/ */

View File

@@ -106,7 +106,6 @@
/obj/item/rig_module/self_destruct /obj/item/rig_module/self_destruct
) )
/obj/item/clothing/gloves/gauntlets/rig/light/ninja /obj/item/clothing/gloves/gauntlets/rig/light/ninja
name = "insulated gloves" name = "insulated gloves"
siemens_coefficient = 0 siemens_coefficient = 0

View File

@@ -2,6 +2,7 @@
/obj/item/clothing/under/shorts /obj/item/clothing/under/shorts
name = "athletic shorts" name = "athletic shorts"
desc = "95% Polyester, 5% Spandex!" desc = "95% Polyester, 5% Spandex!"
icon_state = "redshorts" // Hackyfix for icon states until someone wants to come do a recolor later.
gender = PLURAL gender = PLURAL
body_parts_covered = LOWER_TORSO body_parts_covered = LOWER_TORSO

View File

@@ -18,7 +18,7 @@
if(!land_target) if(!land_target)
kill() kill()
/datum/event/meteor_strike/announce() /datum/event/drone_pod_drop/announce()
command_announcement.Announce("An unidentified drone pod has been detected landing near the surface facilty. Open and examine at your own risk.", "NanoTrasen Orbital Monitoring") command_announcement.Announce("An unidentified drone pod has been detected landing near the surface facilty. Open and examine at your own risk.", "NanoTrasen Orbital Monitoring")
/datum/event/drone_pod_drop/start() /datum/event/drone_pod_drop/start()

View File

@@ -40,15 +40,16 @@
return total_weight return total_weight
/datum/event //NOTE: Times are measured in master controller ticks! /datum/event //NOTE: Times are measured in master controller ticks!
var/startWhen = 0 //When in the lifetime to call start(). var/startWhen = 0 //When in the lifetime to call start().
var/announceWhen = 0 //When in the lifetime to call announce(). var/announceWhen = 0 //When in the lifetime to call announce().
var/endWhen = 0 //When in the lifetime the event should end. var/endWhen = 0 //When in the lifetime the event should end.
var/severity = 0 //Severity. Lower means less severe, higher means more severe. Does not have to be supported. Is set on New(). var/severity = 0 //Severity. Lower means less severe, higher means more severe. Does not have to be supported. Is set on New().
var/activeFor = 0 //How long the event has existed. You don't need to change this. var/activeFor = 0 //How long the event has existed. You don't need to change this.
var/isRunning = 1 //If this event is currently running. You should not change this. var/isRunning = TRUE //If this event is currently running. You should not change this.
var/startedAt = 0 //When this event started. var/startedAt = 0 //When this event started.
var/endedAt = 0 //When this event ended. var/endedAt = 0 //When this event ended.
var/processing_active = TRUE
var/datum/event_meta/event_meta = null var/datum/event_meta/event_meta = null
/datum/event/nothing /datum/event/nothing
@@ -96,18 +97,26 @@
//This proc will handle the calls to the appropiate procs. //This proc will handle the calls to the appropiate procs.
/datum/event/process() /datum/event/process()
if(activeFor > startWhen && activeFor < endWhen) if(activeFor > startWhen && activeFor < endWhen)
processing_active = FALSE
tick() tick()
processing_active = TRUE
if(activeFor == startWhen) if(activeFor == startWhen)
isRunning = 1 isRunning = TRUE
processing_active = FALSE
start() start()
processing_active = TRUE
if(activeFor == announceWhen) if(activeFor == announceWhen)
processing_active = FALSE
announce() announce()
processing_active = TRUE
if(activeFor == endWhen) if(activeFor == endWhen)
isRunning = 0 isRunning = FALSE
processing_active = FALSE
end() end()
processing_active = TRUE
// Everything is done, let's clean up. // Everything is done, let's clean up.
if(activeFor >= lastProcessAt()) if(activeFor >= lastProcessAt())

View File

@@ -3,7 +3,6 @@
endWhen = 200 endWhen = 200
var/spawncount = 1 var/spawncount = 1
var/list/vents = list() var/list/vents = list()
var/list/grubs = list()
var/give_positions = 0 var/give_positions = 0
/datum/event/grub_infestation/setup() /datum/event/grub_infestation/setup()
@@ -31,7 +30,7 @@
/datum/event/grub_infestation/end() /datum/event/grub_infestation/end()
var/list/area_names = list() var/list/area_names = list()
for(var/grub in grubs) for(var/grub in existing_solargrubs)
var/mob/living/G = grub var/mob/living/G = grub
if(!G || G.stat == DEAD) if(!G || G.stat == DEAD)
continue continue
@@ -43,5 +42,4 @@
area_names |= grub_area.name area_names |= grub_area.name
if(area_names.len) if(area_names.len)
var/english_list = english_list(area_names) var/english_list = english_list(area_names)
command_announcement.Announce("Sensors have narrowed down remaining active solargrubs to the followng areas: [english_list]", "Lifesign Alert", new_sound = 'sound/AI/aliens.ogg') command_announcement.Announce("Sensors have narrowed down remaining active solargrubs to the followng areas: [english_list]", "Lifesign Alert", new_sound = 'sound/AI/aliens.ogg')
grubs.Cut()

View File

@@ -66,9 +66,8 @@ proc/Ellipsis(original_msg, chance = 50)
if(chance <= 0) return "..." if(chance <= 0) return "..."
if(chance >= 100) return original_msg if(chance >= 100) return original_msg
var/list var/list/words = splittext(original_msg," ")
words = splittext(original_msg," ") var/list/new_words = list()
new_words = list()
var/new_msg = "" var/new_msg = ""

View File

@@ -550,3 +550,99 @@ Drinks Data
/datum/reagent/drink/cider /datum/reagent/drink/cider
glass_icon_state = "ciderglass" glass_icon_state = "ciderglass"
glass_center_of_mass = list("x"=16, "y"=8) glass_center_of_mass = list("x"=16, "y"=8)
/datum/reagent/drink/driverspunch
glass_icon_state = "driverspunch"
glass_center_of_mass = list("x"=16, "y"=8)
/datum/reagent/ethanol/coffee/elysiumfacepunch
glass_icon_state = "elysiumfacepunch"
glass_center_of_mass = list("x"=16, "y"=8)
/datum/reagent/drink/entdraught
glass_icon_state = "entdraught"
glass_center_of_mass = list("x"=16, "y"=8)
/datum/reagent/ethanol/erebusmoonrise
glass_icon_state = "erebusmoonrise"
glass_center_of_mass = list("x"=16, "y"=8)
/datum/reagent/ethanol/euphoria
glass_icon_state = "euphoria"
glass_center_of_mass = list("x"=16, "y"=8)
/datum/reagent/drink/collins_mix
glass_icon_state = "collinsmix"
glass_center_of_mass = list("x"=16, "y"=8)
/datum/reagent/ethanol/daiquiri
glass_icon_state = "daiquiri"
glass_center_of_mass = list("x"=16, "y"=8)
/datum/reagent/drink/dreamcream
glass_icon_state = "dreamcream"
glass_center_of_mass = list("x"=16, "y"=8)
/datum/reagent/ethanol/debugger
glass_icon_state = "debugger"
glass_center_of_mass = list("x"=16, "y"=8)
/datum/reagent/ethanol/binmanbliss
glass_icon_state = "binmanbliss"
glass_center_of_mass = list("x"=16, "y"=8)
/datum/reagent/ethanol/bitters
glass_icon_state = "bitters"
glass_center_of_mass = list("x"=16, "y"=8)
/datum/reagent/ethanol/chrysanthemum
glass_icon_state = "chrysanthemum"
glass_center_of_mass = list("x"=16, "y"=8)
/datum/reagent/ethanol/cloverclub
glass_icon_state = "cloverclub"
glass_center_of_mass = list("x"=16, "y"=8)
/datum/reagent/ethanol/coldfront
glass_icon_state = "coldfront"
glass_center_of_mass = list("x"=16, "y"=8)
/datum/reagent/ethanol/balloon
glass_icon_state = "balloon"
glass_center_of_mass = list("x"=16, "y"=8)
/datum/reagent/drink/berrycordial
glass_icon_state = "berrycordial"
glass_center_of_mass = list("x"=16, "y"=8)
/datum/reagent/drink/milkshake/chocoshake
glass_icon_state = "chocoshake"
glass_center_of_mass = list("x"=16, "y"=8)
/datum/reagent/drink/milkshake/coffeeshake
glass_icon_state = "coffeeshake"
glass_center_of_mass = list("x"=16, "y"=8)
/datum/reagent/drink/milkshake/berryshake
glass_icon_state = "berryshake"
glass_center_of_mass = list("x"=16, "y"=8)
/datum/reagent/drink/soda/melonade
glass_icon_state = "melonade"
glass_center_of_mass = list("x"=16, "y"=8)
/datum/reagent/drink/soda/appleade
glass_icon_state = "appleade"
glass_center_of_mass = list("x"=16, "y"=8)
/datum/reagent/drink/soda/pineappleade
glass_icon_state = "pineappleade"
glass_center_of_mass = list("x"=16, "y"=8)
/datum/reagent/drink/soda/lemonade
glass_icon_state = "lemonade"
glass_center_of_mass = list("x"=16, "y"=8)
/datum/reagent/drink/arnold_palmer
glass_icon_state = "arnoldpalmer"
glass_center_of_mass = list("x"=16, "y"=8)

View File

@@ -0,0 +1,280 @@
// Chaos cake
/datum/recipe/microwave/chaoscake_layerone
reagents = list("flour" = 300,"milk" = 200, "sugar" = 100, "egg" = 30)
fruit = list("poisonberries" = 15, "cherries" = 15)
items = list(
/obj/item/weapon/reagent_containers/food/snacks/meat/,
/obj/item/weapon/reagent_containers/food/snacks/meat/,
/obj/item/weapon/reagent_containers/food/snacks/meat/,
/obj/item/weapon/reagent_containers/food/snacks/meat/
)
result = /obj/structure/chaoscake
/datum/recipe/microwave/chaoscake_layertwo
reagents = list("flour" = 300, "milk" = 200, "sugar" = 100, "egg" = 30, )
fruit = list("vanilla" = 15, "banana" = 15)
items = list(
/obj/item/weapon/reagent_containers/food/snacks/dough,
/obj/item/weapon/reagent_containers/food/snacks/dough,
/obj/item/weapon/reagent_containers/food/snacks/dough,
/obj/item/weapon/reagent_containers/food/snacks/dough
)
result = /obj/item/weapon/chaoscake_layer
/datum/recipe/microwave/chaoscake_layerthree
reagents = list("flour" = 240, "milk" = 150, "sugar" = 80, "egg" = 24, "deathbell" = 100)
fruit = list("grapes" = 30)
items = list(
/obj/item/weapon/reagent_containers/food/snacks/dough,
/obj/item/weapon/reagent_containers/food/snacks/dough,
/obj/item/weapon/reagent_containers/food/snacks/dough
)
result = /obj/item/weapon/chaoscake_layer/three
/datum/recipe/microwave/chaoscake_layerfour
reagents = list("flour" = 240, "milk" = 150, "sugar" = 80, "egg" = 24, "milkshake" = 300)
fruit = list("rice" = 30)
items = list(
/obj/item/weapon/reagent_containers/food/snacks/dough,
/obj/item/weapon/reagent_containers/food/snacks/dough,
/obj/item/weapon/reagent_containers/food/snacks/dough
)
result = /obj/item/weapon/chaoscake_layer/four
/datum/recipe/microwave/chaoscake_layerfive
reagents = list("flour" = 180, "milk" = 100, "sugar" = 60, "egg" = 18, "blood" = 300)
fruit = list("tomato" = 20)
items = list() //supposed to be made with lobster, still has to be ported.
result = /obj/item/weapon/chaoscake_layer/five
/datum/recipe/microwave/chaoscake_layersix
reagents = list("flour" = 180, "milk" = 100, "sugar" = 60, "egg" = 18, "sprinkles" = 10)
fruit = list("apple" = 30)
items = list(
/obj/item/weapon/reagent_containers/food/snacks/dough,
/obj/item/weapon/reagent_containers/food/snacks/dough,
/obj/item/weapon/reagent_containers/food/snacks/dough,
/obj/item/weapon/reagent_containers/food/snacks/chocolatebar,
/obj/item/weapon/reagent_containers/food/snacks/chocolatebar,
/obj/item/weapon/reagent_containers/food/snacks/chocolatebar
)
result = /obj/item/weapon/chaoscake_layer/six
/datum/recipe/microwave/chaoscake_layerseven
reagents = list("flour" = 120, "milk" = 50, "sugar" = 40, "egg" = 12, "devilskiss" = 200)
fruit = list("potato" = 10)
items = list(
/obj/item/weapon/reagent_containers/food/snacks/dough,
/obj/item/weapon/reagent_containers/food/snacks/dough,
/obj/item/weapon/reagent_containers/food/snacks/dough
)
result = /obj/item/weapon/chaoscake_layer/seven
/datum/recipe/microwave/chaoscake_layereight
reagents = list("flour" = 120, "milk" = 50, "sugar" = 40, "egg" = 12, "cream" = 200)
fruit = list("lemon" = 10)
items = list(
/obj/item/weapon/reagent_containers/food/snacks/dough,
/obj/item/weapon/reagent_containers/food/snacks/dough,
/obj/item/weapon/reagent_containers/food/snacks/dough
)
result = /obj/item/weapon/chaoscake_layer/eight
/datum/recipe/microwave/chaoscake_layernine
reagents = list("water" = 100, "blood" = 100)
fruit = list("goldapple" = 50)
items = list()
result = /obj/item/weapon/chaoscake_layer/nine
/obj/structure/chaoscake
name = "An unfinished cake"
desc = "A single layer of a strange cake, you can see the cherry paste ooze, but it feels very incomplete..."
icon = 'icons/obj/food64x64.dmi'
icon_state = "chaoscake_unfinished-1"
pixel_x = -16
var/slices = 6
var/maxslices = 6
var/stage = 1
var/maxstages = 9
var/edible = 0
var/regentime = 1000
var/interval = 0
var/static/list/desclist2 = list(
"The first layer of a strange cake, you can see the cherry paste ooze.",
"The second layer of the cake sits in place now, smelling of pear with delicious colourful cream.",
"The third layer of cake adds a strange purple layer, glazed over with frosting. It smells of grapes, but with a hint of something foul underneath.",
"With the fourth layer added the cake looks happier again. Reeking of vanilla, it brings up memories of childhood joy.",
"The fifth layer is extremely disturbing on that cake. Smelling of pure copper, it seems that bright blood clots are forming on top.",
"The cake is getting closer with the sixth layer added, the pink hue smelling of chocolate, with colourful sprinkles on top.",
"The first pair of triplets rest on the cake, despite being mostly similar to the first three, an evil aura becomes noticable.",
"The second pair of triplets rest on the cake, if you stand on the bright side, you can feel a good aura lifting your mood.",
"A chaos cake. Both a creation of dark and light, the two cakes are kept in a careful balance by that mystical coin in the middle. It's said its effects would dissipate if the balance is ever tipped in favour of one side too much, so both sides much be cut equally."
)
/obj/item/weapon/chaoscake_layer
name = "A layer of cake"
desc = "a layer of cake, it is made out of colourful cream."
icon = 'icons/obj/food.dmi'
icon_state = "chaoscake_layer-2"
var/layer_stage = 1
/obj/item/weapon/chaoscake_layer/three
desc = "a layer of cake, glazed in purple."
icon_state = "chaoscake_layer-3"
layer_stage = 2
/obj/item/weapon/chaoscake_layer/four
desc = "a layer of cake, reminding you of a colouring book."
icon_state = "chaoscake_layer-4"
layer_stage = 3
/obj/item/weapon/chaoscake_layer/five
desc = "A layer of cake, smells like copper."
icon_state = "chaoscake_layer-5"
layer_stage = 4
/obj/item/weapon/chaoscake_layer/six
desc = "A layer of cake, featuring colourful sprinkles."
icon_state = "chaoscake_layer-6"
layer_stage = 5
/obj/item/weapon/chaoscake_layer/seven
desc = "A triplet of evil cake parts."
icon_state = "chaoscake_layer-7"
layer_stage = 6
/obj/item/weapon/chaoscake_layer/eight
desc = "A triplet of good cake parts."
icon_state = "chaoscake_layer-8"
layer_stage = 7
/obj/item/weapon/chaoscake_layer/nine
name = "A coin of balance"
desc = "A very peculiar coin, it seems to stabilise the air around it."
icon_state = "chaoscake_layer-9"
layer_stage = 8
/obj/structure/chaoscake/proc/HasSliceMissing()
..()
if(slices < maxslices)
if(interval >= regentime)
interval = 0
slices++
HasSliceMissing()
else
interval++
HasSliceMissing()
else
return
/obj/item/weapon/reagent_containers/food/snacks/chaoscakeslice
name = "The Chaos Cake Slice"
desc = "A slice from The Chaos Cake, it pulses weirdly, as if angry to be seperated from the whole"
icon_state = "chaoscake_slice-1"
center_of_mass = list("x"=16, "y"=10)
nutriment_desc = list()
nutriment_amt = 4
volume = 80
/obj/item/weapon/reagent_containers/food/snacks/chaoscakeslice/Initialize()
..()
var/i = rand(1,6)
icon_state = "chaoscake_slice-[i]"
switch(i)
if(1)
name = "Slice Of Evil" //Pretty damn poisonous, takes a lot of work to make safe for consumption, useful for medical.
desc = "An odd slice, despite the grease and cherries oozing off the top, it smells delicious."
nutriment_desc = list("The desire to consume" = 10) // You won't even taste the poison.
reagents.add_reagent("neurotoxic_protein", 2)
reagents.add_reagent("shockchem", 2)
reagents.add_reagent("amatoxin", 2)
reagents.add_reagent("carpotoxin", 2)
reagents.add_reagent("spidertoxin", 2)
bitesize = 7
if(2)
name = "Slice Of Evil" //A bad trip
desc = "A mysterious slice, coated in purple frosting that smells like grapes."
nutriment_desc = list("The desire to show off an party" = 10)
reagents.add_reagent("stoxin", 2)
reagents.add_reagent("space_drugs", 10)
reagents.add_reagent("serotrotium", 4)
reagents.add_reagent("cryptobiolin", 8)
reagents.add_reagent("mindbreaker", 10)
reagents.add_reagent("psilocybin", 10)
bitesize = 30 //even a single bite won't make you escape fate.
if(3)
name = "Slice Of Evil" //acidic
desc = "A menacing slice, smelling clearly of copper, blood clots float on top."
nutriment_desc = list("Infernal Rage" = 10)
reagents.add_reagent("blood", 20)
reagents.add_reagent("stomacid", 10)
reagents.add_reagent("mutagen", 4)
reagents.add_reagent("thirteenloko", 20)
reagents.add_reagent("hyperzine", 10)
bitesize = 30
if(4)
name = "Slice Of Good" //anti-tox
desc = "A colourful slice, smelling of pear and coated in delicious cream."
nutriment_desc = list("Hapiness" = 10)
reagents.add_reagent("anti_toxin", 2)
reagents.add_reagent("tricordrazine", 2)
bitesize = 3
if(5)
name = "Slice Of Good" //anti-oxy
desc = "A light slice, it's pretty to look at and smells of vanilla."
nutriment_desc = list("Freedom" = 10)
reagents.add_reagent("dexalinp", 2)
reagents.add_reagent("tricordrazine", 2)
bitesize = 3
if(6)
name = "Slice Of Good" //anti-burn/brute
desc = "A hearty slice, it smells of chocolate and strawberries."
nutriment_desc = list("Love" = 10)
reagents.add_reagent("bicaridine", 2)
reagents.add_reagent("tricordrazine", 2)
reagents.add_reagent("kelotane", 2)
bitesize = 4
/obj/structure/chaoscake/attackby(var/obj/item/weapon/W, var/mob/living/user)
if(istype(W,/obj/item/weapon/material/knife))
if(edible == 1)
HasSliceMissing()
if(slices <= 0)
user << "The cake hums away quietly as the chaos powered goodness slowly recovers the large amount of lost mass, best to give it a moment before cutting another slice."
return
else
user << "You cut a slice of the cake. The slice looks like the cake was just baked, and you can see before your eyes as the spot where you cut the slice slowly regenerates!"
slices = slices - 1
icon_state = "chaoscake-[slices]"
new /obj/item/weapon/reagent_containers/food/snacks/chaoscakeslice(src.loc)
else
to_chat(user, "<span class='notice'>It looks so good... But it feels so wrong to eat it before it's finished...</span>")
return
if(istype(W,/obj/item/weapon/chaoscake_layer))
var/obj/item/weapon/chaoscake_layer/C = W
if(C.layer_stage == 8)
user << "Finally! The coin on the top, the almighty chaos cake is complete!"
qdel(W)
stage++
desc = desclist2[stage]
icon_state = "chaoscake-6"
edible = 1
name = "The Chaos Cake!"
else if(stage == maxstages)
user << "The cake is already done!"
else if(stage == C.layer_stage)
user << "You add another layer to the cake, nice."
qdel(W)
stage++
desc = desclist2[stage]
icon_state = "chaoscake_stage-[stage]"
else
user << "Hmm, doesnt seem like this layer is supposed to be added there?"

View File

@@ -1,5 +1,6 @@
/obj/machinery/microwave /obj/machinery/microwave
name = "microwave" name = "microwave"
desc = "Studies are inconclusive on whether pressing your face against the glass is harmful."
icon = 'icons/obj/kitchen.dmi' icon = 'icons/obj/kitchen.dmi'
icon_state = "mw" icon_state = "mw"
density = 1 density = 1
@@ -12,8 +13,10 @@
var/operating = 0 // Is it on? var/operating = 0 // Is it on?
var/dirty = 0 // = {0..100} Does it need cleaning? var/dirty = 0 // = {0..100} Does it need cleaning?
var/broken = 0 // ={0,1,2} How broken is it??? var/broken = 0 // ={0,1,2} How broken is it???
var/global/list/datum/recipe/available_recipes // List of the recipes you can use var/circuit_item_capacity = 1 //how many items does the circuit add to max number of items
var/item_level = 0 // items microwave can handle, 0 foodstuff, 1 materials
var/global/list/acceptable_items // List of the items you can put in var/global/list/acceptable_items // List of the items you can put in
var/global/list/datum/recipe/microwave/available_recipes // List of the recipes you can use
var/global/list/acceptable_reagents // List of the reagents you can put in var/global/list/acceptable_reagents // List of the reagents you can put in
var/global/max_n_of_items = 0 var/global/max_n_of_items = 0
var/datum/looping_sound/microwave/soundloop var/datum/looping_sound/microwave/soundloop
@@ -36,11 +39,11 @@
if (!available_recipes) if (!available_recipes)
available_recipes = new available_recipes = new
for (var/type in (typesof(/datum/recipe)-/datum/recipe)) for (var/type in (typesof(/datum/recipe/microwave)-/datum/recipe/microwave))
available_recipes+= new type available_recipes+= new type
acceptable_items = new acceptable_items = new
acceptable_reagents = new acceptable_reagents = new
for (var/datum/recipe/recipe in available_recipes) for (var/datum/recipe/microwave/recipe in available_recipes)
for (var/item in recipe.items) for (var/item in recipe.items)
acceptable_items |= item acceptable_items |= item
for (var/reagent in recipe.reagents) for (var/reagent in recipe.reagents)
@@ -124,7 +127,7 @@
to_chat(user, "<span class='warning'>It's dirty!</span>") to_chat(user, "<span class='warning'>It's dirty!</span>")
return 1 return 1
else if(is_type_in_list(O,acceptable_items)) else if(is_type_in_list(O,acceptable_items))
if (contents.len>=(max_n_of_items + component_parts.len + 1)) //Adds component_parts to the maximum number of items. The 1 is from the circuit if (contents.len>=(max_n_of_items + component_parts.len + circuit_item_capacity)) //Adds component_parts to the maximum number of items. changed 1 to actually just be the circuit item capacity var.
to_chat(user, "<span class='warning'>This [src] is full of ingredients, you cannot put more.</span>") to_chat(user, "<span class='warning'>This [src] is full of ingredients, you cannot put more.</span>")
return 1 return 1
if(istype(O, /obj/item/stack) && O:get_amount() > 1) // This is bad, but I can't think of how to change it if(istype(O, /obj/item/stack) && O:get_amount() > 1) // This is bad, but I can't think of how to change it
@@ -254,7 +257,7 @@
abort() abort()
return return
var/datum/recipe/recipe = select_recipe(available_recipes,src) var/datum/recipe/microwave/recipe = select_recipe(available_recipes,src)
var/obj/cooked var/obj/cooked
if (!recipe) if (!recipe)
dirty += 1 dirty += 1
@@ -308,14 +311,26 @@
sleep(5) //VOREStation Edit - Quicker Microwaves sleep(5) //VOREStation Edit - Quicker Microwaves
return 1 return 1
/obj/machinery/microwave/proc/has_extra_item() /obj/machinery/microwave/proc/has_extra_item() //- coded to have different microwaves be able to handle different items
for (var/obj/O in ((contents - component_parts) - circuit)) if(item_level == 0)
if ( \ for (var/obj/O in ((contents - component_parts) - circuit))
!istype(O,/obj/item/weapon/reagent_containers/food) && \ if ( \
!istype(O, /obj/item/weapon/grown) \ !istype(O,/obj/item/weapon/reagent_containers/food) && \
) !istype(O, /obj/item/weapon/grown) \
return 1 )
return 0 return 1
return 0
if(item_level == 1)
for (var/obj/O in ((contents - component_parts) - circuit))
if ( \
!istype(O, /obj/item/weapon/reagent_containers/food) && \
!istype(O, /obj/item/weapon/grown) && \
!istype(O, /obj/item/slime_extract) && \
!istype(O, /obj/item/organ) && \
!istype(O, /obj/item/stack/material) \
)
return 1
return 0
/obj/machinery/microwave/proc/start() /obj/machinery/microwave/proc/start()
src.visible_message("<span class='notice'>The microwave turns on.</span>", "<span class='notice'>You hear a microwave.</span>") src.visible_message("<span class='notice'>The microwave turns on.</span>", "<span class='notice'>You hear a microwave.</span>")
@@ -395,4 +410,16 @@
if ("dispose") if ("dispose")
dispose() dispose()
return return
/obj/machinery/microwave/advanced // specifically for complex recipes
name = "deluxe microwave"
icon = 'icons/obj/kitchen.dmi'
icon_state = "mw-deluxe"
circuit = /obj/item/weapon/circuitboard/microwave/advanced
circuit_item_capacity = 100
item_level = 1
/obj/machinery/microwave/advanced/Initialize()
..()
reagents.maximum_volume = 1000

View File

@@ -16,7 +16,7 @@
qdel(CR) qdel(CR)
//////////////////////// FOOD //////////////////////// FOOD
var/list/food_recipes = typesof(/datum/recipe) - /datum/recipe var/list/food_recipes = typesof(/datum/recipe/microwave) - /datum/recipe/microwave
//Build a useful list //Build a useful list
for(var/Rp in food_recipes) for(var/Rp in food_recipes)
//Lists don't work with datum-stealing no-instance initial() so we have to. //Lists don't work with datum-stealing no-instance initial() so we have to.

File diff suppressed because it is too large Load Diff

View File

@@ -1,5 +1,5 @@
/* /*
/datum/recipe/unique_name /datum/recipe/microwave/unique_name
fruit = list("example_fruit1" = 1, "example_fruit2" = 2) fruit = list("example_fruit1" = 1, "example_fruit2" = 2)
reagents = list("example_reagent1" = 10, "example_reagent2" = 5) reagents = list("example_reagent1" = 10, "example_reagent2" = 5)
items = list( items = list(
@@ -9,23 +9,23 @@
result = /obj/item/weapon/reagent_containers/food/snacks/path_to_some_food result = /obj/item/weapon/reagent_containers/food/snacks/path_to_some_food
*/ */
/datum/recipe/jellydonut /datum/recipe/microwave/jellydonut
items = list( items = list(
/obj/item/weapon/reagent_containers/food/snacks/doughslice) /obj/item/weapon/reagent_containers/food/snacks/doughslice)
/datum/recipe/jellydonut/slime /datum/recipe/microwave/jellydonut/slime
items = list( items = list(
/obj/item/weapon/reagent_containers/food/snacks/doughslice) /obj/item/weapon/reagent_containers/food/snacks/doughslice)
/datum/recipe/jellydonut/cherry /datum/recipe/microwave/jellydonut/cherry
items = list( items = list(
/obj/item/weapon/reagent_containers/food/snacks/doughslice) /obj/item/weapon/reagent_containers/food/snacks/doughslice)
/datum/recipe/donut /datum/recipe/microwave/donut
items = list( items = list(
/obj/item/weapon/reagent_containers/food/snacks/doughslice) /obj/item/weapon/reagent_containers/food/snacks/doughslice)
/datum/recipe/sushi /datum/recipe/microwave/sushi
fruit = list("cabbage" = 1) fruit = list("cabbage" = 1)
reagents = list("rice" = 20) reagents = list("rice" = 20)
items = list( items = list(
@@ -35,7 +35,7 @@
) )
result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/sushi result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/sushi
/datum/recipe/lasagna /datum/recipe/microwave/lasagna
fruit = list("tomato" = 2, "eggplant" = 1) fruit = list("tomato" = 2, "eggplant" = 1)
items = list( items = list(
/obj/item/weapon/reagent_containers/food/snacks/cutlet, /obj/item/weapon/reagent_containers/food/snacks/cutlet,
@@ -45,7 +45,7 @@
) )
result = /obj/item/weapon/reagent_containers/food/snacks/lasagna result = /obj/item/weapon/reagent_containers/food/snacks/lasagna
/datum/recipe/goulash /datum/recipe/microwave/goulash
fruit = list("tomato" = 1) fruit = list("tomato" = 1)
items = list( items = list(
/obj/item/weapon/reagent_containers/food/snacks/cutlet, /obj/item/weapon/reagent_containers/food/snacks/cutlet,
@@ -53,7 +53,7 @@
) )
result = /obj/item/weapon/reagent_containers/food/snacks/goulash result = /obj/item/weapon/reagent_containers/food/snacks/goulash
/datum/recipe/donerkebab /datum/recipe/microwave/donerkebab
fruit = list("tomato" = 1, "cabbage" = 1) fruit = list("tomato" = 1, "cabbage" = 1)
reagents = list("sodiumchloride" = 1) reagents = list("sodiumchloride" = 1)
items = list( items = list(
@@ -62,21 +62,21 @@
) )
result = /obj/item/weapon/reagent_containers/food/snacks/donerkebab result = /obj/item/weapon/reagent_containers/food/snacks/donerkebab
/datum/recipe/roastbeef /datum/recipe/microwave/roastbeef
fruit = list("carrot" = 2, "potato" = 2) fruit = list("carrot" = 2, "potato" = 2)
items = list( items = list(
/obj/item/weapon/reagent_containers/food/snacks/meat /obj/item/weapon/reagent_containers/food/snacks/meat
) )
result = /obj/item/weapon/reagent_containers/food/snacks/roastbeef result = /obj/item/weapon/reagent_containers/food/snacks/roastbeef
/datum/recipe/reishicup /datum/recipe/microwave/reishicup
reagents = list("psilocybin" = 3, "sugar" = 3) reagents = list("psilocybin" = 3, "sugar" = 3)
items = list( items = list(
/obj/item/weapon/reagent_containers/food/snacks/chocolatebar /obj/item/weapon/reagent_containers/food/snacks/chocolatebar
) )
result = /obj/item/weapon/reagent_containers/food/snacks/reishicup result = /obj/item/weapon/reagent_containers/food/snacks/reishicup
/datum/recipe/chickenwings /datum/recipe/microwave/chickenwings
reagents = list("capsaicin" = 5, "flour" = 10) reagents = list("capsaicin" = 5, "flour" = 10)
items = list( items = list(
/obj/item/weapon/reagent_containers/food/snacks/meat, /obj/item/weapon/reagent_containers/food/snacks/meat,
@@ -86,7 +86,7 @@
) )
result = /obj/item/weapon/storage/box/wings //This is kinda like the donut box. result = /obj/item/weapon/storage/box/wings //This is kinda like the donut box.
/datum/recipe/hotandsoursoup /datum/recipe/microwave/hotandsoursoup
fruit = list("cabbage" = 1, "mushroom" = 1) fruit = list("cabbage" = 1, "mushroom" = 1)
reagents = list("sodiumchloride" = 2, "blackpepper" = 2, "water" = 10) reagents = list("sodiumchloride" = 2, "blackpepper" = 2, "water" = 10)
items = list( items = list(
@@ -94,7 +94,7 @@
) )
result = /obj/item/weapon/reagent_containers/food/snacks/hotandsoursoup result = /obj/item/weapon/reagent_containers/food/snacks/hotandsoursoup
/datum/recipe/kitsuneudon /datum/recipe/microwave/kitsuneudon
reagents = list("egg" = 3) reagents = list("egg" = 3)
items = list( items = list(
/obj/item/weapon/reagent_containers/food/snacks/spagetti, /obj/item/weapon/reagent_containers/food/snacks/spagetti,
@@ -102,7 +102,7 @@
) )
result = /obj/item/weapon/reagent_containers/food/snacks/kitsuneudon result = /obj/item/weapon/reagent_containers/food/snacks/kitsuneudon
/datum/recipe/generalschicken /datum/recipe/microwave/generalschicken
reagents = list("capsaicin" = 2, "sugar" = 2, "flour" = 10) reagents = list("capsaicin" = 2, "sugar" = 2, "flour" = 10)
items = list( items = list(
/obj/item/weapon/reagent_containers/food/snacks/meat, /obj/item/weapon/reagent_containers/food/snacks/meat,
@@ -110,40 +110,40 @@
) )
result = /obj/item/weapon/reagent_containers/food/snacks/generalschicken result = /obj/item/weapon/reagent_containers/food/snacks/generalschicken
/datum/recipe/chocroizegg /datum/recipe/microwave/chocroizegg
items = list( items = list(
/obj/item/weapon/reagent_containers/food/snacks/chocolatebar, /obj/item/weapon/reagent_containers/food/snacks/chocolatebar,
/obj/item/weapon/reagent_containers/food/snacks/egg/roiz /obj/item/weapon/reagent_containers/food/snacks/egg/roiz
) )
result = /obj/item/weapon/reagent_containers/food/snacks/chocolateegg/roiz result = /obj/item/weapon/reagent_containers/food/snacks/chocolateegg/roiz
/datum/recipe/friedroizegg /datum/recipe/microwave/friedroizegg
reagents = list("sodiumchloride" = 1, "blackpepper" = 1) reagents = list("sodiumchloride" = 1, "blackpepper" = 1)
items = list( items = list(
/obj/item/weapon/reagent_containers/food/snacks/egg/roiz /obj/item/weapon/reagent_containers/food/snacks/egg/roiz
) )
result = /obj/item/weapon/reagent_containers/food/snacks/friedegg/roiz result = /obj/item/weapon/reagent_containers/food/snacks/friedegg/roiz
/datum/recipe/boiledroizegg /datum/recipe/microwave/boiledroizegg
reagents = list("water" = 5) reagents = list("water" = 5)
items = list( items = list(
/obj/item/weapon/reagent_containers/food/snacks/egg/roiz /obj/item/weapon/reagent_containers/food/snacks/egg/roiz
) )
result = /obj/item/weapon/reagent_containers/food/snacks/boiledegg/roiz result = /obj/item/weapon/reagent_containers/food/snacks/boiledegg/roiz
/datum/recipe/pillbugball /datum/recipe/microwave/pillbugball
reagents = list("carbon" = 5) reagents = list("carbon" = 5)
items = list( items = list(
/obj/item/weapon/reagent_containers/food/snacks/meat/grubmeat /obj/item/weapon/reagent_containers/food/snacks/meat/grubmeat
) )
result = /obj/item/weapon/reagent_containers/food/snacks/bugball result = /obj/item/weapon/reagent_containers/food/snacks/bugball
/datum/recipe/mammi /datum/recipe/microwave/mammi
fruit = list("orange" = 1) fruit = list("orange" = 1)
reagents = list("water" = 10, "flour" = 10, "milk" = 5, "sodiumchloride" = 1) reagents = list("water" = 10, "flour" = 10, "milk" = 5, "sodiumchloride" = 1)
result = /obj/item/weapon/reagent_containers/food/snacks/mammi result = /obj/item/weapon/reagent_containers/food/snacks/mammi
/datum/recipe/makaroni /datum/recipe/microwave/makaroni
reagents = list("flour" = 15, "milk" = 5) reagents = list("flour" = 15, "milk" = 5)
items = list( items = list(
/obj/item/weapon/reagent_containers/food/snacks/meat/grubmeat, /obj/item/weapon/reagent_containers/food/snacks/meat/grubmeat,
@@ -153,34 +153,34 @@
) )
result = /obj/item/weapon/reagent_containers/food/snacks/makaroni result = /obj/item/weapon/reagent_containers/food/snacks/makaroni
/datum/recipe/lobster /datum/recipe/microwave/lobster
fruit = list("lemon" = 1, "cabbage" = 1) fruit = list("lemon" = 1, "cabbage" = 1)
items = list( items = list(
/obj/item/weapon/reagent_containers/food/snacks/lobster /obj/item/weapon/reagent_containers/food/snacks/lobster
) )
result = /obj/item/weapon/reagent_containers/food/snacks/lobstercooked result = /obj/item/weapon/reagent_containers/food/snacks/lobstercooked
/datum/recipe/cuttlefish /datum/recipe/microwave/cuttlefish
items = list( items = list(
/obj/item/weapon/reagent_containers/food/snacks/cuttlefish /obj/item/weapon/reagent_containers/food/snacks/cuttlefish
) )
result = /obj/item/weapon/reagent_containers/food/snacks/cuttlefishcooked result = /obj/item/weapon/reagent_containers/food/snacks/cuttlefishcooked
/datum/recipe/monkfish /datum/recipe/microwave/monkfish
fruit = list("chili" = 1, "onion" = 1) fruit = list("chili" = 1, "onion" = 1)
items = list( items = list(
/obj/item/weapon/reagent_containers/food/snacks/monkfishfillet /obj/item/weapon/reagent_containers/food/snacks/monkfishfillet
) )
result = /obj/item/weapon/reagent_containers/food/snacks/monkfishcooked result = /obj/item/weapon/reagent_containers/food/snacks/monkfishcooked
/datum/recipe/sharksteak /datum/recipe/microwave/sharksteak
reagents = list("blackpepper"= 1, "sodiumchloride" = 1) reagents = list("blackpepper"= 1, "sodiumchloride" = 1)
items = list( items = list(
/obj/item/weapon/reagent_containers/food/snacks/carpmeat/fish/sharkmeat /obj/item/weapon/reagent_containers/food/snacks/carpmeat/fish/sharkmeat
) )
result = /obj/item/weapon/reagent_containers/food/snacks/sharkmeatcooked result = /obj/item/weapon/reagent_containers/food/snacks/sharkmeatcooked
/datum/recipe/sharkdip /datum/recipe/microwave/sharkdip
reagents = list("sodiumchloride" = 1) reagents = list("sodiumchloride" = 1)
fruit = list("chili" = 1) fruit = list("chili" = 1)
items = list( items = list(
@@ -188,7 +188,7 @@
) )
result = /obj/item/weapon/reagent_containers/food/snacks/sharkmeatdip result = /obj/item/weapon/reagent_containers/food/snacks/sharkmeatdip
/datum/recipe/sharkcubes /datum/recipe/microwave/sharkcubes
reagents = list("soysauce" = 5, "sodiumchloride" = 1) reagents = list("soysauce" = 5, "sodiumchloride" = 1)
fruit = list("potato" = 1) fruit = list("potato" = 1)
items = list( items = list(
@@ -196,28 +196,28 @@
) )
result = /obj/item/weapon/reagent_containers/food/snacks/sharkmeatcubes result = /obj/item/weapon/reagent_containers/food/snacks/sharkmeatcubes
/datum/recipe/margheritapizzacargo /datum/recipe/microwave/margheritapizzacargo
reagents = list() reagents = list()
items = list( items = list(
/obj/item/weapon/reagent_containers/food/snacks/pizza/margfrozen /obj/item/weapon/reagent_containers/food/snacks/pizza/margfrozen
) )
result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/margcargo result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/margcargo
/datum/recipe/mushroompizzacargo /datum/recipe/microwave/mushroompizzacargo
reagents = list() reagents = list()
items = list( items = list(
/obj/item/weapon/reagent_containers/food/snacks/pizza/mushfrozen /obj/item/weapon/reagent_containers/food/snacks/pizza/mushfrozen
) )
result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/mushcargo result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/mushcargo
/datum/recipe/meatpizzacargo /datum/recipe/microwave/meatpizzacargo
reagents = list() reagents = list()
items = list( items = list(
/obj/item/weapon/reagent_containers/food/snacks/pizza/meatfrozen /obj/item/weapon/reagent_containers/food/snacks/pizza/meatfrozen
) )
result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/meatcargo result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/meatcargo
/datum/recipe/vegtablepizzacargo /datum/recipe/microwave/vegtablepizzacargo
reagents = list() reagents = list()
items = list( items = list(
/obj/item/weapon/reagent_containers/food/snacks/pizza/vegfrozen /obj/item/weapon/reagent_containers/food/snacks/pizza/vegfrozen
@@ -226,7 +226,7 @@
//// food cubes //// food cubes
/datum/recipe/foodcubes /datum/recipe/microwave/foodcubes
reagents = list("enzyme" = 20,"virusfood" = 5, "nutriment" = 15, "protein" = 15) // labor intensive reagents = list("enzyme" = 20,"virusfood" = 5, "nutriment" = 15, "protein" = 15) // labor intensive
items = list() items = list()
result = /obj/item/weapon/storage/box/wings/tray result = /obj/item/weapon/storage/box/wings/tray

View File

@@ -101,7 +101,7 @@
if(action.length) if(action.length)
spawn(action.length) spawn(action.length)
action.end() action.end()
next_action = world.time + rand(15 MINUTES, 30 MINUTES) next_action = world.time + rand(5 MINUTES, 20 MINUTES)
last_department_used = action.departments[1] last_department_used = action.departments[1]

View File

@@ -452,11 +452,15 @@
var/additional_chems = rand(0,5) var/additional_chems = rand(0,5)
if(additional_chems) if(additional_chems)
//VOREStation Edit Start TFF 24/1/20 - More chems to the blacklist for prefs reasoning.
var/list/banned_chems = list( var/list/banned_chems = list(
"adminordrazine", "adminordrazine",
"nutriment" "nutriment",
"macrocillin",
"microcillin",
"normalcillin"
) )
//VOREStation Edit End
for(var/x=1;x<=additional_chems;x++) for(var/x=1;x<=additional_chems;x++)

View File

@@ -377,7 +377,7 @@
return return
// Check if we should even bother working on the current seed datum. // Check if we should even bother working on the current seed datum.
if(seed.mutants. && seed.mutants.len && severity > 1) if(seed.mutants && seed.mutants.len && severity > 1)
mutate_species() mutate_species()
return return

View File

@@ -567,7 +567,8 @@
LANGUAGE_SOL_COMMON, LANGUAGE_SOL_COMMON,
LANGUAGE_TRADEBAND, LANGUAGE_TRADEBAND,
LANGUAGE_GUTTER, LANGUAGE_GUTTER,
LANGUAGE_TERMINUS LANGUAGE_TERMINUS,
LANGUAGE_SIGN
) )
/obj/item/integrated_circuit/input/microphone/sign/Initialize() /obj/item/integrated_circuit/input/microphone/sign/Initialize()
@@ -587,7 +588,8 @@
set_pin_data(IC_OUTPUT, 2, msg) set_pin_data(IC_OUTPUT, 2, msg)
push_data() push_data()
activate_pin(1) if(!translated)
activate_pin(1)
if(translated) if(translated)
activate_pin(2) activate_pin(2)

View File

@@ -13,6 +13,7 @@
/obj/structure/bookcase /obj/structure/bookcase
name = "bookcase" name = "bookcase"
desc = "A set of wooden shelves, perfect for placing books on."
icon = 'icons/obj/library.dmi' icon = 'icons/obj/library.dmi'
icon_state = "book-0" icon_state = "book-0"
anchored = 1 anchored = 1
@@ -95,7 +96,34 @@
else else
icon_state = "book-5" icon_state = "book-5"
/*
Book Cart
*/
/obj/structure/bookcase/bookcart
name = "book cart"
icon = 'icons/obj/library.dmi'
icon_state = "bookcart-0"
anchored = 0
opacity = 0
/obj/structure/bookcase/bookcart/attackby(obj/item/O as obj, mob/user as mob)
if(istype(O, /obj/item/weapon/book))
user.drop_item()
O.loc = src
update_icon()
else
return
/obj/structure/bookcase/bookcart/update_icon()
if(contents.len < 5)
icon_state = "bookcart-[contents.len]"
else
icon_state = "bookcart-5"
/*
Book Cart End
*/
/obj/structure/bookcase/manuals/medical /obj/structure/bookcase/manuals/medical
name = "Medical Manuals bookcase" name = "Medical Manuals bookcase"
@@ -297,7 +325,7 @@
user << browse(dat + "<html><head><title>[P.name]</title></head>" \ user << browse(dat + "<html><head><title>[P.name]</title></head>" \
+ "<body style='overflow:hidden'>" \ + "<body style='overflow:hidden'>" \
+ "<div> <img src='tmp_photo.png' width = '180'" \ + "<div> <img src='tmp_photo.png' width = '180'" \
+ "[P.scribble ? "<div> Written on the back:<br><i>[P.scribble]</i>" : ]"\ + "[P.scribble ? "<div> Written on the back:<br><i>[P.scribble]</i>" : null]"\
+ "</body></html>", "window=[name]") + "</body></html>", "window=[name]")
else if(!isnull(pages[page])) else if(!isnull(pages[page]))
if(!(istype(usr, /mob/living/carbon/human) || isobserver(usr) || istype(usr, /mob/living/silicon))) if(!(istype(usr, /mob/living/carbon/human) || isobserver(usr) || istype(usr, /mob/living/silicon)))

View File

@@ -116,6 +116,7 @@ datum/borrowbook // Datum used to keep track of who has borrowed what when and f
// It is August 22nd, 2012... This TODO has already been here for months.. I wonder how long it'll last before someone does something about it. // Nov 2019. Nope. // It is August 22nd, 2012... This TODO has already been here for months.. I wonder how long it'll last before someone does something about it. // Nov 2019. Nope.
/obj/machinery/librarycomp /obj/machinery/librarycomp
name = "Check-In/Out Computer" name = "Check-In/Out Computer"
desc = "Print books from the archives! (You aren't quite sure how they're printed by it, though.)"
icon = 'icons/obj/library.dmi' icon = 'icons/obj/library.dmi'
icon_state = "computer" icon_state = "computer"
anchored = 1 anchored = 1
@@ -228,7 +229,7 @@ datum/borrowbook // Datum used to keep track of who has borrowed what when and f
dat += "<h3>External Archive</h3>" //VOREStation Edit dat += "<h3>External Archive</h3>" //VOREStation Edit
establish_old_db_connection() establish_old_db_connection()
dat += "<h3><font color=red>Warning: System Administrator has slated this archive for removal. Personal uploads should be taken to the NT board of internal literature.</font></h3>" // dat += "<h3><font color=red>Warning: System Administrator has slated this archive for removal. Personal uploads should be taken to the NT board of internal literature.</font></h3>" //VOREStation Removal TFF 29/1/20 - Redundant warning, we're not removing our library entries.
if(!dbcon_old.IsConnected()) if(!dbcon_old.IsConnected())
dat += "<font color=red><b>ERROR</b>: Unable to contact External Archive. Please contact your system administrator for assistance.</font>" dat += "<font color=red><b>ERROR</b>: Unable to contact External Archive. Please contact your system administrator for assistance.</font>"
@@ -521,6 +522,7 @@ datum/borrowbook // Datum used to keep track of who has borrowed what when and f
*/ */
/obj/machinery/bookbinder /obj/machinery/bookbinder
name = "Book Binder" name = "Book Binder"
desc = "Bundles up a stack of inserted paper into a convenient book format."
icon = 'icons/obj/library.dmi' icon = 'icons/obj/library.dmi'
icon_state = "binder" icon_state = "binder"
anchored = 1 anchored = 1

View File

@@ -3,6 +3,7 @@
/obj/item/weapon/coin /obj/item/weapon/coin
icon = 'icons/obj/items.dmi' icon = 'icons/obj/items.dmi'
name = "Coin" name = "Coin"
desc = "A simple coin you can flip."
icon_state = "coin" icon_state = "coin"
force = 0.0 force = 0.0
throwforce = 0.0 throwforce = 0.0

View File

@@ -130,7 +130,7 @@
S.amount = stack_amt S.amount = stack_amt
stack_storage[sheet] -= stack_amt stack_storage[sheet] -= stack_amt
S.update_icon() S.update_icon()
if(console) if(console)
console.updateUsrDialog() console.updateUsrDialog()
return return

View File

@@ -0,0 +1,2 @@
/mob/living/bot
no_vore = TRUE

View File

@@ -1186,7 +1186,7 @@
if(LAZYLEN(species.descriptors)) if(LAZYLEN(species.descriptors))
descriptors = list() descriptors = list()
for(var/desctype in species.descriptors) for(var/desctype in species.descriptors)
var/datum/mob_descriptor.descriptor = species.descriptors[desctype] var/datum/mob_descriptor/descriptor = species.descriptors[desctype]
descriptors[desctype] = descriptor.default_value descriptors[desctype] = descriptor.default_value
spawn(0) spawn(0)

Some files were not shown because too many files have changed in this diff Show More