mirror of
https://github.com/CHOMPStation2/CHOMPStation2.git
synced 2025-12-11 02:34:00 +00:00
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:
5
SpacemanDMM.toml
Normal file
5
SpacemanDMM.toml
Normal file
@@ -0,0 +1,5 @@
|
||||
[diagnostics]
|
||||
macro_redefined = "off"
|
||||
macro_undefined_no_definition = "off"
|
||||
as_local_var = "off"
|
||||
tmp_no_effect = "off"
|
||||
@@ -20,7 +20,7 @@ Thus, the two variables affect pump operation are set in New():
|
||||
level = 1
|
||||
|
||||
name = "gas pump"
|
||||
desc = "A pump"
|
||||
desc = "A pump that moves gas from one place to another."
|
||||
|
||||
var/target_pressure = ONE_ATMOSPHERE
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
level = 1
|
||||
|
||||
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
|
||||
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
//--------------------------------------------
|
||||
/obj/machinery/atmospherics/omni/atmos_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"
|
||||
pipe_state = "omni_filter"
|
||||
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
level = 1
|
||||
|
||||
name = "Gas filter"
|
||||
desc = "Filters one type of gas from an input, and pushes it out the side."
|
||||
|
||||
use_power = 1
|
||||
idle_power_usage = 150 //internal circuitry, friction losses and stuff
|
||||
|
||||
@@ -140,6 +140,7 @@
|
||||
// Heat Exchange Junction - Interfaces HE pipes to normal pipes
|
||||
//
|
||||
/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_state = "intact"
|
||||
pipe_icon = "hejunction"
|
||||
|
||||
@@ -144,9 +144,8 @@ Class Procs:
|
||||
merge(A.zone,B.zone)
|
||||
return
|
||||
|
||||
var
|
||||
a_to_b = get_dir(A,B)
|
||||
b_to_a = get_dir(B,A)
|
||||
var/a_to_b = get_dir(A,B)
|
||||
var/b_to_a = get_dir(B,A)
|
||||
|
||||
if(!A.connections) A.connections = new
|
||||
if(!B.connections) B.connections = new
|
||||
|
||||
@@ -429,6 +429,8 @@ var/global/list/remainless_species = list(SPECIES_PROMETHEAN,
|
||||
SPECIES_SHADEKIN, //Shadefluffers just poof away
|
||||
SPECIES_SHADEKIN_YW) //YW edits
|
||||
|
||||
/var/global/list/existing_solargrubs = list()
|
||||
|
||||
/hook/startup/proc/init_vore_datum_ref_lists()
|
||||
var/paths
|
||||
|
||||
|
||||
@@ -52,3 +52,16 @@
|
||||
if(sender)
|
||||
query_string += "&from=[url_encode(sender)]"
|
||||
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]")
|
||||
|
||||
@@ -104,6 +104,13 @@ var/list/gamemode_cache = list()
|
||||
var/panic_bunker = 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/server
|
||||
var/banappeals
|
||||
@@ -806,6 +813,24 @@ var/list/gamemode_cache = list()
|
||||
if ("paranoia_logging")
|
||||
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")
|
||||
config.random_submap_orientation = 1
|
||||
|
||||
|
||||
@@ -21,7 +21,8 @@ SUBSYSTEM_DEF(events)
|
||||
|
||||
/datum/controller/subsystem/events/fire(resumed)
|
||||
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)
|
||||
var/list/datum/event_container/EC = event_containers[i]
|
||||
@@ -46,7 +47,7 @@ SUBSYSTEM_DEF(events)
|
||||
if(EM.add_to_queue)
|
||||
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)
|
||||
var/list/datum/event_container/EC = event_containers[severity]
|
||||
|
||||
@@ -87,7 +87,7 @@ var/list/outfits_decls_by_type_
|
||||
/decl/hierarchy/outfit/proc/equip(mob/living/carbon/human/H, var/rank, var/assignment)
|
||||
equip_base(H)
|
||||
|
||||
rank = id_pda_assignment || rank
|
||||
rank = rank || id_pda_assignment
|
||||
assignment = id_pda_assignment || assignment || rank
|
||||
var/obj/item/weapon/card/id/W = equip_id(H, rank, assignment)
|
||||
if(W)
|
||||
|
||||
@@ -6,8 +6,8 @@
|
||||
#define RETURN_PRECISE_POSITION(A) new /datum/position(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_INCREMENT(ATOM, ANGLE, SPEED, AMT) {new /datum/point/vector(ATOM, null, null, null, null, ANGLE, SPEED, AMT)}
|
||||
#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))
|
||||
|
||||
/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
|
||||
|
||||
@@ -123,7 +123,7 @@
|
||||
// food-related
|
||||
/datum/recipe/proc/make_food(var/obj/container as obj)
|
||||
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
|
||||
var/obj/result_obj = new result(container)
|
||||
if(istype(container, /obj/machinery))
|
||||
|
||||
@@ -134,8 +134,8 @@
|
||||
siemens_coefficient = 0
|
||||
|
||||
/obj/item/clothing/shoes/boots/combat/changeling //Noslips
|
||||
desc = "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 \
|
||||
name = "chitinous boots"
|
||||
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."
|
||||
icon_state = "lingboots"
|
||||
armor = list(melee = 75, bullet = 60, laser = 70,energy = 60, bomb = 60, bio = 0, rad = 0)
|
||||
|
||||
@@ -2,6 +2,9 @@
|
||||
total_positions = 2 //IT TAKES A LOT TO MAKE A STEW
|
||||
spawn_positions = 2 //A PINCH OF SALT AND LAUGHTER, TOO
|
||||
|
||||
/datum/job/hydro
|
||||
spawn_positions = 2
|
||||
|
||||
/datum/job/cargo_tech
|
||||
total_positions = 3
|
||||
spawn_positions = 3
|
||||
|
||||
@@ -11,4 +11,11 @@
|
||||
access_RC_announce, access_keycard_auth, access_tcomsat, access_gateway, access_xenoarch, access_eva, access_network, access_maint_tunnels)
|
||||
|
||||
/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
|
||||
@@ -2,10 +2,14 @@
|
||||
disallow_jobhop = TRUE
|
||||
|
||||
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_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_forensics_lockers, access_morgue, access_maint_tunnels, access_all_personal_lockers,
|
||||
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)
|
||||
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_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_forensics_lockers, access_morgue, access_maint_tunnels, access_all_personal_lockers,
|
||||
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)
|
||||
|
||||
/datum/job/officer
|
||||
total_positions = 5
|
||||
spawn_positions = 5
|
||||
@@ -1,5 +1,6 @@
|
||||
/obj/machinery/sleep_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_state = "sleeperconsole"
|
||||
var/obj/machinery/sleeper/sleeper
|
||||
|
||||
@@ -34,6 +34,7 @@
|
||||
|
||||
/obj/machinery/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_state = "alarm0"
|
||||
plane = TURF_PLANE
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
icon = 'icons/obj/stationobjs.dmi'
|
||||
icon_state = "gsensor1"
|
||||
name = "Gas Sensor"
|
||||
desc = "Senses atmospheric conditions."
|
||||
|
||||
anchored = 1
|
||||
var/state = 0
|
||||
@@ -77,6 +78,7 @@ obj/machinery/air_sensor/Destroy()
|
||||
icon_keyboard = "atmos_key"
|
||||
icon_screen = "tank"
|
||||
name = "Computer"
|
||||
desc = "Control atmospheric systems, remotely."
|
||||
var/frequency = 1439
|
||||
var/list/sensors = list()
|
||||
var/list/sensor_information = list()
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
/obj/machinery/portable_atmospherics/powered/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_state = "pscrubber:0"
|
||||
@@ -144,6 +145,7 @@
|
||||
//Huge scrubber
|
||||
/obj/machinery/portable_atmospherics/powered/scrubber/huge
|
||||
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_state = "scrubber:0"
|
||||
anchored = 1
|
||||
@@ -239,6 +241,10 @@
|
||||
/obj/machinery/portable_atmospherics/powered/scrubber/huge/stationary
|
||||
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)
|
||||
if(I.is_wrench())
|
||||
to_chat(user, "<span class='warning'>The bolts are too tight for you to unscrew!</span>")
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
|
||||
/obj/machinery/computer/operating
|
||||
name = "patient monitoring console"
|
||||
desc = "Used to monitor the vitals of a patient."
|
||||
density = 1
|
||||
anchored = 1.0
|
||||
icon_keyboard = "med_key"
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
|
||||
/obj/machinery/computer/rcon
|
||||
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_screen = "ai_fixer" //VOREStation Edit
|
||||
light_color = "#a97faa"
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
/obj/machinery/computer/aifixer
|
||||
name = "\improper AI system integrity restorer"
|
||||
desc = "Restores AI units to working condition, assuming you have one inside!"
|
||||
icon_keyboard = "rd_key"
|
||||
icon_screen = "ai-fixer"
|
||||
light_color = "#a97faa"
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
|
||||
/obj/machinery/computer/atmoscontrol
|
||||
name = "\improper Central Atmospherics Computer"
|
||||
desc = "Control the station's atmospheric systems from afar! Certified atmospherics technicians only."
|
||||
icon_keyboard = "generic_key"
|
||||
icon_screen = "comm_logs"
|
||||
light_color = "#00b000"
|
||||
|
||||
@@ -244,7 +244,7 @@
|
||||
|
||||
/obj/machinery/computer/security/wooden_tv
|
||||
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_keyboard = null
|
||||
icon_screen = "detective_tv"
|
||||
@@ -254,7 +254,7 @@
|
||||
|
||||
/obj/machinery/computer/security/mining
|
||||
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_screen = "mining"
|
||||
network = list("Mining Outpost")
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
/obj/machinery/computer/cloning
|
||||
name = "cloning control console"
|
||||
desc = "Used to start cloning cycles, as well as manage clone records."
|
||||
icon_keyboard = "med_key"
|
||||
icon_screen = "dna"
|
||||
light_color = "#315ab4"
|
||||
|
||||
@@ -78,6 +78,7 @@
|
||||
|
||||
/obj/machinery/computer/guestpass
|
||||
name = "guest pass terminal"
|
||||
desc = "Used to print temporary passes for people. Handy!"
|
||||
icon_state = "guest"
|
||||
plane = TURF_PLANE
|
||||
layer = ABOVE_TURF_LAYER
|
||||
|
||||
@@ -549,7 +549,7 @@
|
||||
|
||||
/obj/machinery/computer/med_data/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_keyboard = "laptop_key"
|
||||
icon_screen = "medlaptop"
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
|
||||
/obj/machinery/computer/prisoner
|
||||
name = "prisoner management console"
|
||||
desc = "Used to keep those sneaky prisoners in line, if they have an implant."
|
||||
icon_keyboard = "security_key"
|
||||
icon_screen = "explosive"
|
||||
light_color = "#a91515"
|
||||
|
||||
@@ -12,6 +12,7 @@ var/prison_shuttle_timeleft = 0
|
||||
|
||||
/obj/machinery/computer/prison_shuttle
|
||||
name = "prison shuttle control console"
|
||||
desc = "Used to move the prison shuttle to and from its destination."
|
||||
icon_keyboard = "security_key"
|
||||
icon_screen = "syndishuttle"
|
||||
light_color = "#00ffff"
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
// Supply requests console
|
||||
/obj/machinery/computer/supplycomp
|
||||
name = "supply ordering console"
|
||||
desc = "Request crates from here! Delivery not guaranteed."
|
||||
icon_screen = "request"
|
||||
circuit = /obj/item/weapon/circuitboard/supplycomp
|
||||
var/authorization = 0
|
||||
@@ -18,6 +19,7 @@
|
||||
// Supply control console
|
||||
/obj/machinery/computer/supplycomp/control
|
||||
name = "supply control console"
|
||||
desc = "Control the cargo shuttle's functions remotely."
|
||||
icon_keyboard = "tech_key"
|
||||
icon_screen = "supply"
|
||||
light_color = "#b88b2e"
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
|
||||
/obj/machinery/atmospherics/unary/cryo_cell
|
||||
name = "cryo cell"
|
||||
desc = "Used to cool people down for medical reasons. Totally."
|
||||
icon = 'icons/obj/cryogenics.dmi' // map only
|
||||
icon_state = "pod_preview"
|
||||
density = 1
|
||||
|
||||
@@ -145,6 +145,7 @@ obj/machinery/airlock_sensor
|
||||
icon = 'icons/obj/airlock_machines.dmi'
|
||||
icon_state = "airlock_sensor_off"
|
||||
name = "airlock sensor"
|
||||
desc = "Sends atmospheric readings to a nearby controller."
|
||||
|
||||
anchored = 1
|
||||
power_channel = ENVIRON
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
/obj/machinery/floodlight
|
||||
name = "Emergency Floodlight"
|
||||
desc = "Let there be light!"
|
||||
icon = 'icons/obj/machines/floodlight.dmi'
|
||||
icon_state = "flood00"
|
||||
density = 1
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
/obj/machinery/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'
|
||||
anchored = 0
|
||||
density = 0
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
|
||||
/obj/machinery/media/jukebox/
|
||||
name = "space jukebox"
|
||||
desc = "Filled with songs both past and present!"
|
||||
icon = 'icons/obj/jukebox.dmi'
|
||||
icon_state = "jukebox2-nopower"
|
||||
var/state_base = "jukebox2"
|
||||
|
||||
@@ -298,7 +298,7 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co
|
||||
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>"
|
||||
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><A href='?src=\ref[src];setScreen=[0]'>Back</A>"
|
||||
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>"
|
||||
else
|
||||
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>"
|
||||
if(11)
|
||||
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>"
|
||||
else
|
||||
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>"
|
||||
if(12)
|
||||
|
||||
@@ -231,6 +231,7 @@
|
||||
|
||||
/obj/machinery/oxygen_pump/anesthetic
|
||||
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
|
||||
icon_state = "anesthetic_tank"
|
||||
icon_state_closed = "anesthetic_tank"
|
||||
@@ -266,6 +267,7 @@
|
||||
|
||||
/obj/machinery/oxygen_pump/mobile/anesthetic
|
||||
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
|
||||
icon_state = "medpump_n2o"
|
||||
icon_state_closed = "medpump_n2o"
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
/obj/machinery/pipedispenser
|
||||
name = "Pipe Dispenser"
|
||||
desc = "A large machine that can rapidly dispense pipes."
|
||||
icon = 'icons/obj/stationobjs.dmi'
|
||||
icon_state = "pipe_d"
|
||||
density = 1
|
||||
@@ -105,6 +106,7 @@
|
||||
|
||||
/obj/machinery/pipedispenser/disposal
|
||||
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_state = "pipe_d"
|
||||
density = 1
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
|
||||
/obj/machinery/computer/telecomms/server
|
||||
name = "Telecommunications Server Monitor"
|
||||
desc = "View communication logs here. Translation not guaranteed."
|
||||
icon_screen = "comm_logs"
|
||||
|
||||
var/screen = 0 // the screen number:
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
|
||||
/obj/machinery/computer/telecomms/monitor
|
||||
name = "Telecommunications Monitor"
|
||||
desc = "Used to traverse a telecommunication network. Helpful for debugging connection issues."
|
||||
icon_screen = "comm_monitor"
|
||||
|
||||
var/screen = 0 // the screen number:
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
|
||||
/obj/machinery/computer/telecomms/traffic
|
||||
name = "Telecommunications Traffic Control"
|
||||
desc = "Used to upload code to telecommunication consoles for execution."
|
||||
icon_screen = "generic"
|
||||
|
||||
var/screen = 0 // the screen number:
|
||||
|
||||
@@ -105,6 +105,7 @@
|
||||
desc = "Used for building lights."
|
||||
icon = 'icons/obj/lighting.dmi'
|
||||
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
|
||||
reverse = 1
|
||||
|
||||
@@ -145,4 +146,4 @@
|
||||
icon = 'icons/obj/closet.dmi'
|
||||
icon_state = "fireaxe0101"
|
||||
refund_amt = 4
|
||||
build_machine_type = /obj/structure/fireaxecabinet
|
||||
build_machine_type = /obj/structure/fireaxecabinet
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
/obj/machinery/washing_machine
|
||||
name = "Washing Machine"
|
||||
desc = "Not a hiding place."
|
||||
icon = 'icons/obj/machines/washing_machine.dmi'
|
||||
icon_state = "wm_10"
|
||||
density = 1
|
||||
|
||||
@@ -239,9 +239,9 @@
|
||||
if(EQUIP_SPECIAL)
|
||||
chassis.special_equipment -= src
|
||||
//VOREStation Addition begin: MICROMECHS
|
||||
if(EQUIP_UTILITY)
|
||||
if(EQUIP_MICRO_UTILITY)
|
||||
chassis.micro_utility_equipment -= src
|
||||
if(EQUIP_SPECIAL)
|
||||
if(EQUIP_MICRO_WEAPON)
|
||||
chassis.micro_weapon_equipment -= src
|
||||
//VOREStation Addition end: MICROMECHS
|
||||
if(chassis.selected == src)
|
||||
|
||||
@@ -1504,9 +1504,15 @@
|
||||
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)
|
||||
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>
|
||||
<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 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 special slots:</b> [max_special_equip-special_equipment.len]<br>
|
||||
</div></div>
|
||||
|
||||
@@ -818,7 +818,6 @@
|
||||
if(3)
|
||||
if(diff==FORWARD)
|
||||
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"
|
||||
else
|
||||
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"
|
||||
else
|
||||
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"
|
||||
if(1)
|
||||
if(diff==FORWARD)
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
/obj/machinery/computer/mecha
|
||||
name = "Exosuit Control"
|
||||
desc = "Used to track exosuits, as well as view their logs and activate EMP beacons."
|
||||
icon_keyboard = "rd_key"
|
||||
icon_screen = "mecha"
|
||||
light_color = "#a97faa"
|
||||
|
||||
@@ -253,6 +253,7 @@
|
||||
if(3)
|
||||
if(diff==FORWARD)
|
||||
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"
|
||||
else
|
||||
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.")
|
||||
holder.icon_state = "polecat19"
|
||||
else
|
||||
user.visible_message("[user] pries external armor layer from [holder].", "You prie external armor layer from [holder].")
|
||||
var/obj/item/stack/material/plasteel/MS = new /obj/item/stack/material/plasteel(get_turf(holder))
|
||||
MS.amount = 5
|
||||
user.visible_message("[user] pries external armor layer from [holder].", "You pry the external armor layer from [holder].") // Rykka does smol grammar fix.
|
||||
new /obj/item/mecha_parts/micro/part/polecat_armour(get_turf(holder))// Actually gives you the polecat's armored plates back instead of plasteel.
|
||||
holder.icon_state = "polecat17"
|
||||
if(1)
|
||||
if(diff==FORWARD)
|
||||
|
||||
@@ -68,6 +68,14 @@ var/global/list/obj/item/device/pda/PDAs = list()
|
||||
if(..(user, 1))
|
||||
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()
|
||||
if(issilicon(usr))
|
||||
@@ -1038,6 +1046,19 @@ var/global/list/obj/item/device/pda/PDAs = list()
|
||||
id.loc = get_turf(src)
|
||||
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)
|
||||
if(tap)
|
||||
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
|
||||
|
||||
if ( can_use(usr) )
|
||||
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>")
|
||||
remove_pen()
|
||||
else
|
||||
to_chat(usr, "<span class='notice'>You cannot do this while restrained.</span>")
|
||||
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
/obj/item/device/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_state = "labeler1"
|
||||
var/list/modes
|
||||
|
||||
@@ -27,6 +27,7 @@ var/global/list/default_medbay_channels = list(
|
||||
/obj/item/device/radio
|
||||
icon = 'icons/obj/radio_vr.dmi' //VOREStation Edit
|
||||
name = "shortwave radio" //VOREStation Edit
|
||||
desc = "Used to talk to people when headsets don't function. Range is limited."
|
||||
suffix = "\[3\]"
|
||||
icon_state = "walkietalkie"
|
||||
item_state = "radio"
|
||||
|
||||
@@ -249,3 +249,14 @@
|
||||
/obj/item/weapon/stock_parts/capacitor = 1,
|
||||
/obj/item/weapon/stock_parts/spring = 1,
|
||||
/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)
|
||||
|
||||
|
||||
@@ -7,4 +7,13 @@
|
||||
/obj/item/weapon/circuitboard/aicore
|
||||
name = T_BOARD("AI core")
|
||||
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)
|
||||
@@ -1,5 +1,5 @@
|
||||
/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"
|
||||
icon = 'icons/obj/grenade.dmi'
|
||||
icon_state = "delivery"
|
||||
@@ -76,4 +76,4 @@
|
||||
throw_speed = 1
|
||||
throw_range = 4
|
||||
w_class = ITEMSIZE_LARGE
|
||||
deliveryamt = 6
|
||||
deliveryamt = 6
|
||||
|
||||
@@ -987,6 +987,7 @@
|
||||
|
||||
/obj/item/weapon/book/manual/barman_recipes
|
||||
name = "Barman Recipes"
|
||||
desc = "For the enterprising drink server."
|
||||
icon_state = "barbook"
|
||||
author = "Sir John Rose"
|
||||
title = "Barman Recipes"
|
||||
|
||||
@@ -103,6 +103,7 @@
|
||||
|
||||
/obj/item/weapon/storage/box/beakers
|
||||
name = "box of beakers"
|
||||
desc = "A box full of beakers."
|
||||
icon_state = "beaker"
|
||||
starts_with = list(/obj/item/weapon/reagent_containers/glass/beaker = 7)
|
||||
|
||||
|
||||
@@ -357,6 +357,7 @@
|
||||
icon_state = "vialbox6"
|
||||
icon_type = "vial"
|
||||
name = "vial storage box"
|
||||
desc = "A helpful rack to hold test tubes."
|
||||
storage_slots = 6
|
||||
can_hold = list(/obj/item/weapon/reagent_containers/glass/beaker/vial)
|
||||
starts_with = list(/obj/item/weapon/reagent_containers/glass/beaker/vial = 6)
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
icon = 'icons/obj/food.dmi'
|
||||
icon_state = "donutbox"
|
||||
name = "donut box"
|
||||
desc = "A box that holds tasty donuts, if you're lucky."
|
||||
max_storage_space = ITEMSIZE_COST_SMALL * 6
|
||||
can_hold = list(/obj/item/weapon/reagent_containers/food/snacks/donut)
|
||||
foldable = /obj/item/stack/material/cardboard
|
||||
|
||||
@@ -173,6 +173,7 @@
|
||||
|
||||
/obj/item/weapon/storage/secure/safe
|
||||
name = "secure safe"
|
||||
desc = "It doesn't seem all that secure. Oh well, it'll do."
|
||||
icon = 'icons/obj/storage.dmi'
|
||||
icon_state = "safe"
|
||||
icon_opened = "safe0"
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
/obj/structure/curtain
|
||||
name = "curtain"
|
||||
desc = "The show must go on! At least, until you close these."
|
||||
icon = 'icons/obj/curtain.dmi'
|
||||
icon_state = "closed"
|
||||
plane = MOB_PLANE
|
||||
|
||||
@@ -245,8 +245,7 @@
|
||||
prob(1);/obj/item/weapon/material/knife/tacknife,
|
||||
prob(1);/obj/item/weapon/storage/box/survival/space,
|
||||
prob(1);/obj/item/weapon/storage/secure/briefcase/trashmoney,
|
||||
prob(1);/obj/item/weapon/reagent_containers/syringe/steroid,
|
||||
prob(1);/obj/item/seeds/gnomes)
|
||||
prob(1);/obj/item/weapon/reagent_containers/syringe/steroid)
|
||||
|
||||
var/obj/item/I = new path()
|
||||
return I
|
||||
|
||||
@@ -138,7 +138,7 @@
|
||||
/turf/simulated/wall/attackby(obj/item/weapon/W as obj, mob/user as mob)
|
||||
|
||||
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>")
|
||||
return
|
||||
|
||||
|
||||
@@ -119,6 +119,7 @@ var/savefile/Banlist
|
||||
Banlist["temp"] << temp
|
||||
if (temp)
|
||||
Banlist["minutes"] << bantimestamp
|
||||
admin_action_message(bannedby, ckey, "banned", reason, temp ? minutes : -1) //VOREStation Add
|
||||
return 1
|
||||
|
||||
/proc/RemoveBan(foldername)
|
||||
@@ -147,7 +148,7 @@ var/savefile/Banlist
|
||||
Banlist.cd = "/base"
|
||||
Banlist.dir.Remove(A)
|
||||
continue
|
||||
|
||||
admin_action_message(usr.key, key, "unbanned", "\[Unban\]", 0) //VOREStation Add
|
||||
return 1
|
||||
|
||||
/proc/GetExp(minutes as num)
|
||||
|
||||
@@ -369,7 +369,7 @@ proc/admin_notice(var/message, var/rights)
|
||||
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>"
|
||||
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>
|
||||
<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>"
|
||||
else
|
||||
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>"
|
||||
if(11)
|
||||
dat+={"
|
||||
@@ -466,7 +466,7 @@ proc/admin_notice(var/message, var/rights)
|
||||
dat+="<I>No feed channels found active...</I><BR>"
|
||||
else
|
||||
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>"
|
||||
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>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)
|
||||
antag.update_current_antag_max()
|
||||
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>"
|
||||
|
||||
var/image/stampoverlay = image('icons/obj/bureaucracy.dmi')
|
||||
var/{x; y;}
|
||||
x = rand(-2, 0)
|
||||
y = rand(-1, 2)
|
||||
var/x = rand(-2, 0)
|
||||
var/y = rand(-1, 2)
|
||||
P.offset_x += x
|
||||
P.offset_y += y
|
||||
stampoverlay.pixel_x = x
|
||||
|
||||
@@ -28,10 +28,7 @@ var/datum/admin_secrets/admin_secrets = new()
|
||||
/datum/admin_secret_category
|
||||
var/name = ""
|
||||
var/desc = ""
|
||||
var/list/datum/admin_secret_item/items
|
||||
|
||||
/datum/admin_secret_category
|
||||
items = list()
|
||||
var/list/datum/admin_secret_item/items = list()
|
||||
|
||||
/datum/admin_secret_category/proc/can_view(var/mob/user)
|
||||
for(var/datum/admin_secret_item/item in items)
|
||||
|
||||
@@ -184,7 +184,8 @@ var/list/admin_verbs_server = list(
|
||||
/client/proc/modify_server_news,
|
||||
/client/proc/recipe_dump,
|
||||
/client/proc/panicbunker,
|
||||
/client/proc/paranoia_logging
|
||||
/client/proc/paranoia_logging,
|
||||
/client/proc/ip_reputation
|
||||
)
|
||||
|
||||
var/list/admin_verbs_debug = list(
|
||||
|
||||
@@ -154,7 +154,7 @@ var/savefile/Banlistjob
|
||||
Banlistjob["temp"] << temp
|
||||
if (temp)
|
||||
Banlistjob["minutes"] << bantimestamp
|
||||
|
||||
admin_action_message(bannedby, ckey, "jobbanned-"+rank, reason, temp ? minutes : -1) //VOREStation Add
|
||||
return 1
|
||||
|
||||
/proc/RemoveBanjob(foldername)
|
||||
@@ -185,7 +185,7 @@ var/savefile/Banlistjob
|
||||
Banlistjob.cd = "/base"
|
||||
Banlistjob.dir.Remove(A)
|
||||
continue
|
||||
|
||||
admin_action_message(usr.key, key, "unjobbanned-"+rank, "\[Unban\]", 0) //VOREStation Add
|
||||
return 1
|
||||
|
||||
/proc/GetBanExpjob(minutes as num)
|
||||
|
||||
@@ -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>")
|
||||
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
|
||||
|
||||
//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>")
|
||||
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)
|
||||
|
||||
/proc/show_player_info_irc(var/key as text)
|
||||
|
||||
@@ -827,6 +827,7 @@
|
||||
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)
|
||||
//M.client = null
|
||||
admin_action_message(usr.key, M.key, "kicked", reason, 0) //VOREStation Add
|
||||
qdel(M.client)
|
||||
|
||||
else if(href_list["removejobban"])
|
||||
|
||||
@@ -11,9 +11,9 @@
|
||||
|
||||
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()))
|
||||
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!
|
||||
|
||||
/client/proc/paranoia_logging()
|
||||
@@ -25,7 +25,21 @@
|
||||
|
||||
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()))
|
||||
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!
|
||||
|
||||
/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!
|
||||
|
||||
@@ -41,6 +41,7 @@
|
||||
var/received_irc_pm = -99999
|
||||
var/irc_admin //IRC admin that spoke with them last.
|
||||
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.
|
||||
|
||||
|
||||
////////////////////////////////////
|
||||
|
||||
@@ -169,10 +169,19 @@
|
||||
hook_vr("client_new",list(src)) //VOREStation Code
|
||||
|
||||
if(config.paranoia_logging)
|
||||
var/alert = FALSE //VOREStation Edit start.
|
||||
if(isnum(player_age) && player_age == 0)
|
||||
log_and_message_admins("PARANOIA: [key_name(src)] has connected here for the first time.")
|
||||
alert = TRUE
|
||||
if(isnum(account_age) && account_age <= 2)
|
||||
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//
|
||||
@@ -274,6 +283,31 @@
|
||||
qdel(src)
|
||||
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
|
||||
if(config.time_off)
|
||||
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))
|
||||
return FALSE
|
||||
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
|
||||
|
||||
@@ -273,10 +273,12 @@ var/list/gear_datums = list()
|
||||
/datum/gear/proc/spawn_item(var/location, var/metadata)
|
||||
var/datum/gear_data/gd = new(path, location)
|
||||
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)
|
||||
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
|
||||
if(istype(M) && exploitable) //Update exploitable info records for the mob without creating a duplicate object at their feet.
|
||||
M.amend_exploitable(item)
|
||||
|
||||
@@ -183,7 +183,7 @@
|
||||
/datum/gear/uniform/job_turtle/medical
|
||||
display_name = "turtleneck, medical"
|
||||
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
|
||||
display_name = "jeans, QM"
|
||||
|
||||
@@ -100,7 +100,6 @@
|
||||
slot_r_hand_str = "engiewelding",
|
||||
)
|
||||
|
||||
|
||||
/*
|
||||
* Cakehat
|
||||
*/
|
||||
|
||||
@@ -106,7 +106,6 @@
|
||||
/obj/item/rig_module/self_destruct
|
||||
)
|
||||
|
||||
|
||||
/obj/item/clothing/gloves/gauntlets/rig/light/ninja
|
||||
name = "insulated gloves"
|
||||
siemens_coefficient = 0
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
/obj/item/clothing/under/shorts
|
||||
name = "athletic shorts"
|
||||
desc = "95% Polyester, 5% Spandex!"
|
||||
icon_state = "redshorts" // Hackyfix for icon states until someone wants to come do a recolor later.
|
||||
gender = PLURAL
|
||||
body_parts_covered = LOWER_TORSO
|
||||
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
if(!land_target)
|
||||
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")
|
||||
|
||||
/datum/event/drone_pod_drop/start()
|
||||
|
||||
@@ -40,15 +40,16 @@
|
||||
return total_weight
|
||||
|
||||
/datum/event //NOTE: Times are measured in master controller ticks!
|
||||
var/startWhen = 0 //When in the lifetime to call start().
|
||||
var/announceWhen = 0 //When in the lifetime to call announce().
|
||||
var/endWhen = 0 //When in the lifetime the event should end.
|
||||
var/startWhen = 0 //When in the lifetime to call start().
|
||||
var/announceWhen = 0 //When in the lifetime to call announce().
|
||||
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/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/startedAt = 0 //When this event started.
|
||||
var/endedAt = 0 //When this event ended.
|
||||
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/isRunning = TRUE //If this event is currently running. You should not change this.
|
||||
var/startedAt = 0 //When this event started.
|
||||
var/endedAt = 0 //When this event ended.
|
||||
var/processing_active = TRUE
|
||||
var/datum/event_meta/event_meta = null
|
||||
|
||||
/datum/event/nothing
|
||||
@@ -96,18 +97,26 @@
|
||||
//This proc will handle the calls to the appropiate procs.
|
||||
/datum/event/process()
|
||||
if(activeFor > startWhen && activeFor < endWhen)
|
||||
processing_active = FALSE
|
||||
tick()
|
||||
processing_active = TRUE
|
||||
|
||||
if(activeFor == startWhen)
|
||||
isRunning = 1
|
||||
isRunning = TRUE
|
||||
processing_active = FALSE
|
||||
start()
|
||||
processing_active = TRUE
|
||||
|
||||
if(activeFor == announceWhen)
|
||||
processing_active = FALSE
|
||||
announce()
|
||||
processing_active = TRUE
|
||||
|
||||
if(activeFor == endWhen)
|
||||
isRunning = 0
|
||||
isRunning = FALSE
|
||||
processing_active = FALSE
|
||||
end()
|
||||
processing_active = TRUE
|
||||
|
||||
// Everything is done, let's clean up.
|
||||
if(activeFor >= lastProcessAt())
|
||||
|
||||
@@ -3,7 +3,6 @@
|
||||
endWhen = 200
|
||||
var/spawncount = 1
|
||||
var/list/vents = list()
|
||||
var/list/grubs = list()
|
||||
var/give_positions = 0
|
||||
|
||||
/datum/event/grub_infestation/setup()
|
||||
@@ -31,7 +30,7 @@
|
||||
|
||||
/datum/event/grub_infestation/end()
|
||||
var/list/area_names = list()
|
||||
for(var/grub in grubs)
|
||||
for(var/grub in existing_solargrubs)
|
||||
var/mob/living/G = grub
|
||||
if(!G || G.stat == DEAD)
|
||||
continue
|
||||
@@ -43,5 +42,4 @@
|
||||
area_names |= grub_area.name
|
||||
if(area_names.len)
|
||||
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')
|
||||
grubs.Cut()
|
||||
command_announcement.Announce("Sensors have narrowed down remaining active solargrubs to the followng areas: [english_list]", "Lifesign Alert", new_sound = 'sound/AI/aliens.ogg')
|
||||
@@ -66,9 +66,8 @@ proc/Ellipsis(original_msg, chance = 50)
|
||||
if(chance <= 0) return "..."
|
||||
if(chance >= 100) return original_msg
|
||||
|
||||
var/list
|
||||
words = splittext(original_msg," ")
|
||||
new_words = list()
|
||||
var/list/words = splittext(original_msg," ")
|
||||
var/list/new_words = list()
|
||||
|
||||
var/new_msg = ""
|
||||
|
||||
|
||||
@@ -550,3 +550,99 @@ Drinks Data
|
||||
/datum/reagent/drink/cider
|
||||
glass_icon_state = "ciderglass"
|
||||
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)
|
||||
280
code/modules/food/food/thecake.dm
Normal file
280
code/modules/food/food/thecake.dm
Normal 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?"
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
/obj/machinery/microwave
|
||||
name = "microwave"
|
||||
desc = "Studies are inconclusive on whether pressing your face against the glass is harmful."
|
||||
icon = 'icons/obj/kitchen.dmi'
|
||||
icon_state = "mw"
|
||||
density = 1
|
||||
@@ -12,8 +13,10 @@
|
||||
var/operating = 0 // Is it on?
|
||||
var/dirty = 0 // = {0..100} Does it need cleaning?
|
||||
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/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/max_n_of_items = 0
|
||||
var/datum/looping_sound/microwave/soundloop
|
||||
@@ -36,11 +39,11 @@
|
||||
|
||||
if (!available_recipes)
|
||||
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
|
||||
acceptable_items = 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)
|
||||
acceptable_items |= item
|
||||
for (var/reagent in recipe.reagents)
|
||||
@@ -124,7 +127,7 @@
|
||||
to_chat(user, "<span class='warning'>It's dirty!</span>")
|
||||
return 1
|
||||
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>")
|
||||
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
|
||||
@@ -254,7 +257,7 @@
|
||||
abort()
|
||||
return
|
||||
|
||||
var/datum/recipe/recipe = select_recipe(available_recipes,src)
|
||||
var/datum/recipe/microwave/recipe = select_recipe(available_recipes,src)
|
||||
var/obj/cooked
|
||||
if (!recipe)
|
||||
dirty += 1
|
||||
@@ -308,14 +311,26 @@
|
||||
sleep(5) //VOREStation Edit - Quicker Microwaves
|
||||
return 1
|
||||
|
||||
/obj/machinery/microwave/proc/has_extra_item()
|
||||
for (var/obj/O in ((contents - component_parts) - circuit))
|
||||
if ( \
|
||||
!istype(O,/obj/item/weapon/reagent_containers/food) && \
|
||||
!istype(O, /obj/item/weapon/grown) \
|
||||
)
|
||||
return 1
|
||||
return 0
|
||||
/obj/machinery/microwave/proc/has_extra_item() //- coded to have different microwaves be able to handle different items
|
||||
if(item_level == 0)
|
||||
for (var/obj/O in ((contents - component_parts) - circuit))
|
||||
if ( \
|
||||
!istype(O,/obj/item/weapon/reagent_containers/food) && \
|
||||
!istype(O, /obj/item/weapon/grown) \
|
||||
)
|
||||
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()
|
||||
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")
|
||||
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
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
qdel(CR)
|
||||
|
||||
//////////////////////// 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
|
||||
for(var/Rp in food_recipes)
|
||||
//Lists don't work with datum-stealing no-instance initial() so we have to.
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
/datum/recipe/unique_name
|
||||
/datum/recipe/microwave/unique_name
|
||||
fruit = list("example_fruit1" = 1, "example_fruit2" = 2)
|
||||
reagents = list("example_reagent1" = 10, "example_reagent2" = 5)
|
||||
items = list(
|
||||
@@ -9,23 +9,23 @@
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/path_to_some_food
|
||||
*/
|
||||
|
||||
/datum/recipe/jellydonut
|
||||
/datum/recipe/microwave/jellydonut
|
||||
items = list(
|
||||
/obj/item/weapon/reagent_containers/food/snacks/doughslice)
|
||||
|
||||
/datum/recipe/jellydonut/slime
|
||||
/datum/recipe/microwave/jellydonut/slime
|
||||
items = list(
|
||||
/obj/item/weapon/reagent_containers/food/snacks/doughslice)
|
||||
|
||||
/datum/recipe/jellydonut/cherry
|
||||
/datum/recipe/microwave/jellydonut/cherry
|
||||
items = list(
|
||||
/obj/item/weapon/reagent_containers/food/snacks/doughslice)
|
||||
|
||||
/datum/recipe/donut
|
||||
/datum/recipe/microwave/donut
|
||||
items = list(
|
||||
/obj/item/weapon/reagent_containers/food/snacks/doughslice)
|
||||
|
||||
/datum/recipe/sushi
|
||||
/datum/recipe/microwave/sushi
|
||||
fruit = list("cabbage" = 1)
|
||||
reagents = list("rice" = 20)
|
||||
items = list(
|
||||
@@ -35,7 +35,7 @@
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/sushi
|
||||
|
||||
/datum/recipe/lasagna
|
||||
/datum/recipe/microwave/lasagna
|
||||
fruit = list("tomato" = 2, "eggplant" = 1)
|
||||
items = list(
|
||||
/obj/item/weapon/reagent_containers/food/snacks/cutlet,
|
||||
@@ -45,7 +45,7 @@
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/lasagna
|
||||
|
||||
/datum/recipe/goulash
|
||||
/datum/recipe/microwave/goulash
|
||||
fruit = list("tomato" = 1)
|
||||
items = list(
|
||||
/obj/item/weapon/reagent_containers/food/snacks/cutlet,
|
||||
@@ -53,7 +53,7 @@
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/goulash
|
||||
|
||||
/datum/recipe/donerkebab
|
||||
/datum/recipe/microwave/donerkebab
|
||||
fruit = list("tomato" = 1, "cabbage" = 1)
|
||||
reagents = list("sodiumchloride" = 1)
|
||||
items = list(
|
||||
@@ -62,21 +62,21 @@
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/donerkebab
|
||||
|
||||
/datum/recipe/roastbeef
|
||||
/datum/recipe/microwave/roastbeef
|
||||
fruit = list("carrot" = 2, "potato" = 2)
|
||||
items = list(
|
||||
/obj/item/weapon/reagent_containers/food/snacks/meat
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/roastbeef
|
||||
|
||||
/datum/recipe/reishicup
|
||||
/datum/recipe/microwave/reishicup
|
||||
reagents = list("psilocybin" = 3, "sugar" = 3)
|
||||
items = list(
|
||||
/obj/item/weapon/reagent_containers/food/snacks/chocolatebar
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/reishicup
|
||||
|
||||
/datum/recipe/chickenwings
|
||||
/datum/recipe/microwave/chickenwings
|
||||
reagents = list("capsaicin" = 5, "flour" = 10)
|
||||
items = list(
|
||||
/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.
|
||||
|
||||
/datum/recipe/hotandsoursoup
|
||||
/datum/recipe/microwave/hotandsoursoup
|
||||
fruit = list("cabbage" = 1, "mushroom" = 1)
|
||||
reagents = list("sodiumchloride" = 2, "blackpepper" = 2, "water" = 10)
|
||||
items = list(
|
||||
@@ -94,7 +94,7 @@
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/hotandsoursoup
|
||||
|
||||
/datum/recipe/kitsuneudon
|
||||
/datum/recipe/microwave/kitsuneudon
|
||||
reagents = list("egg" = 3)
|
||||
items = list(
|
||||
/obj/item/weapon/reagent_containers/food/snacks/spagetti,
|
||||
@@ -102,7 +102,7 @@
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/kitsuneudon
|
||||
|
||||
/datum/recipe/generalschicken
|
||||
/datum/recipe/microwave/generalschicken
|
||||
reagents = list("capsaicin" = 2, "sugar" = 2, "flour" = 10)
|
||||
items = list(
|
||||
/obj/item/weapon/reagent_containers/food/snacks/meat,
|
||||
@@ -110,40 +110,40 @@
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/generalschicken
|
||||
|
||||
/datum/recipe/chocroizegg
|
||||
/datum/recipe/microwave/chocroizegg
|
||||
items = list(
|
||||
/obj/item/weapon/reagent_containers/food/snacks/chocolatebar,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/egg/roiz
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/chocolateegg/roiz
|
||||
|
||||
/datum/recipe/friedroizegg
|
||||
/datum/recipe/microwave/friedroizegg
|
||||
reagents = list("sodiumchloride" = 1, "blackpepper" = 1)
|
||||
items = list(
|
||||
/obj/item/weapon/reagent_containers/food/snacks/egg/roiz
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/friedegg/roiz
|
||||
|
||||
/datum/recipe/boiledroizegg
|
||||
/datum/recipe/microwave/boiledroizegg
|
||||
reagents = list("water" = 5)
|
||||
items = list(
|
||||
/obj/item/weapon/reagent_containers/food/snacks/egg/roiz
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/boiledegg/roiz
|
||||
|
||||
/datum/recipe/pillbugball
|
||||
/datum/recipe/microwave/pillbugball
|
||||
reagents = list("carbon" = 5)
|
||||
items = list(
|
||||
/obj/item/weapon/reagent_containers/food/snacks/meat/grubmeat
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/bugball
|
||||
|
||||
/datum/recipe/mammi
|
||||
/datum/recipe/microwave/mammi
|
||||
fruit = list("orange" = 1)
|
||||
reagents = list("water" = 10, "flour" = 10, "milk" = 5, "sodiumchloride" = 1)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/mammi
|
||||
|
||||
/datum/recipe/makaroni
|
||||
/datum/recipe/microwave/makaroni
|
||||
reagents = list("flour" = 15, "milk" = 5)
|
||||
items = list(
|
||||
/obj/item/weapon/reagent_containers/food/snacks/meat/grubmeat,
|
||||
@@ -153,34 +153,34 @@
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/makaroni
|
||||
|
||||
/datum/recipe/lobster
|
||||
/datum/recipe/microwave/lobster
|
||||
fruit = list("lemon" = 1, "cabbage" = 1)
|
||||
items = list(
|
||||
/obj/item/weapon/reagent_containers/food/snacks/lobster
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/lobstercooked
|
||||
|
||||
/datum/recipe/cuttlefish
|
||||
/datum/recipe/microwave/cuttlefish
|
||||
items = list(
|
||||
/obj/item/weapon/reagent_containers/food/snacks/cuttlefish
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/cuttlefishcooked
|
||||
|
||||
/datum/recipe/monkfish
|
||||
/datum/recipe/microwave/monkfish
|
||||
fruit = list("chili" = 1, "onion" = 1)
|
||||
items = list(
|
||||
/obj/item/weapon/reagent_containers/food/snacks/monkfishfillet
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/monkfishcooked
|
||||
|
||||
/datum/recipe/sharksteak
|
||||
/datum/recipe/microwave/sharksteak
|
||||
reagents = list("blackpepper"= 1, "sodiumchloride" = 1)
|
||||
items = list(
|
||||
/obj/item/weapon/reagent_containers/food/snacks/carpmeat/fish/sharkmeat
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/sharkmeatcooked
|
||||
|
||||
/datum/recipe/sharkdip
|
||||
/datum/recipe/microwave/sharkdip
|
||||
reagents = list("sodiumchloride" = 1)
|
||||
fruit = list("chili" = 1)
|
||||
items = list(
|
||||
@@ -188,7 +188,7 @@
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/sharkmeatdip
|
||||
|
||||
/datum/recipe/sharkcubes
|
||||
/datum/recipe/microwave/sharkcubes
|
||||
reagents = list("soysauce" = 5, "sodiumchloride" = 1)
|
||||
fruit = list("potato" = 1)
|
||||
items = list(
|
||||
@@ -196,28 +196,28 @@
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/sharkmeatcubes
|
||||
|
||||
/datum/recipe/margheritapizzacargo
|
||||
/datum/recipe/microwave/margheritapizzacargo
|
||||
reagents = list()
|
||||
items = list(
|
||||
/obj/item/weapon/reagent_containers/food/snacks/pizza/margfrozen
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/margcargo
|
||||
|
||||
/datum/recipe/mushroompizzacargo
|
||||
/datum/recipe/microwave/mushroompizzacargo
|
||||
reagents = list()
|
||||
items = list(
|
||||
/obj/item/weapon/reagent_containers/food/snacks/pizza/mushfrozen
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/mushcargo
|
||||
|
||||
/datum/recipe/meatpizzacargo
|
||||
/datum/recipe/microwave/meatpizzacargo
|
||||
reagents = list()
|
||||
items = list(
|
||||
/obj/item/weapon/reagent_containers/food/snacks/pizza/meatfrozen
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/meatcargo
|
||||
|
||||
/datum/recipe/vegtablepizzacargo
|
||||
/datum/recipe/microwave/vegtablepizzacargo
|
||||
reagents = list()
|
||||
items = list(
|
||||
/obj/item/weapon/reagent_containers/food/snacks/pizza/vegfrozen
|
||||
@@ -226,7 +226,7 @@
|
||||
|
||||
//// food cubes
|
||||
|
||||
/datum/recipe/foodcubes
|
||||
/datum/recipe/microwave/foodcubes
|
||||
reagents = list("enzyme" = 20,"virusfood" = 5, "nutriment" = 15, "protein" = 15) // labor intensive
|
||||
items = list()
|
||||
result = /obj/item/weapon/storage/box/wings/tray
|
||||
@@ -101,7 +101,7 @@
|
||||
if(action.length)
|
||||
spawn(action.length)
|
||||
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]
|
||||
|
||||
|
||||
|
||||
@@ -452,11 +452,15 @@
|
||||
var/additional_chems = rand(0,5)
|
||||
|
||||
if(additional_chems)
|
||||
|
||||
//VOREStation Edit Start TFF 24/1/20 - More chems to the blacklist for prefs reasoning.
|
||||
var/list/banned_chems = list(
|
||||
"adminordrazine",
|
||||
"nutriment"
|
||||
"nutriment",
|
||||
"macrocillin",
|
||||
"microcillin",
|
||||
"normalcillin"
|
||||
)
|
||||
//VOREStation Edit End
|
||||
|
||||
for(var/x=1;x<=additional_chems;x++)
|
||||
|
||||
|
||||
@@ -377,7 +377,7 @@
|
||||
return
|
||||
|
||||
// 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()
|
||||
return
|
||||
|
||||
|
||||
@@ -567,7 +567,8 @@
|
||||
LANGUAGE_SOL_COMMON,
|
||||
LANGUAGE_TRADEBAND,
|
||||
LANGUAGE_GUTTER,
|
||||
LANGUAGE_TERMINUS
|
||||
LANGUAGE_TERMINUS,
|
||||
LANGUAGE_SIGN
|
||||
)
|
||||
|
||||
/obj/item/integrated_circuit/input/microphone/sign/Initialize()
|
||||
@@ -587,7 +588,8 @@
|
||||
set_pin_data(IC_OUTPUT, 2, msg)
|
||||
|
||||
push_data()
|
||||
activate_pin(1)
|
||||
if(!translated)
|
||||
activate_pin(1)
|
||||
if(translated)
|
||||
activate_pin(2)
|
||||
|
||||
|
||||
@@ -13,6 +13,7 @@
|
||||
|
||||
/obj/structure/bookcase
|
||||
name = "bookcase"
|
||||
desc = "A set of wooden shelves, perfect for placing books on."
|
||||
icon = 'icons/obj/library.dmi'
|
||||
icon_state = "book-0"
|
||||
anchored = 1
|
||||
@@ -95,7 +96,34 @@
|
||||
else
|
||||
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
|
||||
name = "Medical Manuals bookcase"
|
||||
@@ -297,7 +325,7 @@
|
||||
user << browse(dat + "<html><head><title>[P.name]</title></head>" \
|
||||
+ "<body style='overflow:hidden'>" \
|
||||
+ "<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]")
|
||||
else if(!isnull(pages[page]))
|
||||
if(!(istype(usr, /mob/living/carbon/human) || isobserver(usr) || istype(usr, /mob/living/silicon)))
|
||||
|
||||
@@ -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.
|
||||
/obj/machinery/librarycomp
|
||||
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_state = "computer"
|
||||
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
|
||||
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())
|
||||
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
|
||||
name = "Book Binder"
|
||||
desc = "Bundles up a stack of inserted paper into a convenient book format."
|
||||
icon = 'icons/obj/library.dmi'
|
||||
icon_state = "binder"
|
||||
anchored = 1
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
/obj/item/weapon/coin
|
||||
icon = 'icons/obj/items.dmi'
|
||||
name = "Coin"
|
||||
desc = "A simple coin you can flip."
|
||||
icon_state = "coin"
|
||||
force = 0.0
|
||||
throwforce = 0.0
|
||||
|
||||
@@ -130,7 +130,7 @@
|
||||
S.amount = stack_amt
|
||||
stack_storage[sheet] -= stack_amt
|
||||
S.update_icon()
|
||||
|
||||
|
||||
if(console)
|
||||
console.updateUsrDialog()
|
||||
return
|
||||
|
||||
2
code/modules/mob/living/bot/bot_vr.dm
Normal file
2
code/modules/mob/living/bot/bot_vr.dm
Normal file
@@ -0,0 +1,2 @@
|
||||
/mob/living/bot
|
||||
no_vore = TRUE
|
||||
@@ -1186,7 +1186,7 @@
|
||||
if(LAZYLEN(species.descriptors))
|
||||
descriptors = list()
|
||||
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
|
||||
|
||||
spawn(0)
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user