Merge branch 'master' into upstream-merge-8808

This commit is contained in:
Nadyr
2021-03-06 00:55:02 -05:00
committed by GitHub
278 changed files with 133211 additions and 1756 deletions

View File

@@ -1,6 +1,6 @@
name: Autochangelog name: Autochangelog
on: on:
pull_request: pull_request_target:
types: closed types: closed
branches: branches:
- master - master
@@ -15,6 +15,10 @@ jobs:
if: github.event.pull_request.merged == true if: github.event.pull_request.merged == true
steps: steps:
- uses: /actions/checkout@v2 - uses: /actions/checkout@v2
with:
ref: master
- name: Update repository to master
run: git pull "origin" master
- name: Ensure +x on CI directory - name: Ensure +x on CI directory
run: | run: |
chmod -R +x ./tools/ci chmod -R +x ./tools/ci

View File

@@ -62,3 +62,7 @@
#define INFECTION_LEVEL_TWO 500 #define INFECTION_LEVEL_TWO 500
#define INFECTION_LEVEL_THREE 1000 #define INFECTION_LEVEL_THREE 1000
#define INFECTION_LEVEL_MAX 1500 #define INFECTION_LEVEL_MAX 1500
#define MODULAR_BODYPART_INVALID 0 // Cannot be detached or reattached.
#define MODULAR_BODYPART_PROSTHETIC 1 // Can be detached or reattached freely.
#define MODULAR_BODYPART_CYBERNETIC 2 // Can be detached or reattached to compatible parent organs.

View File

@@ -8,3 +8,4 @@ GLOBAL_LIST_EMPTY(wire_color_directory) // This is an associative list with the
GLOBAL_LIST_EMPTY(tagger_locations) GLOBAL_LIST_EMPTY(tagger_locations)
GLOBAL_LIST_INIT(char_directory_tags, list("Pred", "Prey", "Switch", "Non-Vore", "Unset")) GLOBAL_LIST_INIT(char_directory_tags, list("Pred", "Prey", "Switch", "Non-Vore", "Unset"))
GLOBAL_LIST_INIT(char_directory_erptags, list("Top", "Bottom", "Switch", "No ERP", "Unset"))

View File

@@ -93,7 +93,6 @@ var/global/list/string_slot_flags = list(
"holster" = SLOT_HOLSTER "holster" = SLOT_HOLSTER
) )
//CHOMP Edit: This fix is taken from citadel station pr #2779. Fixes a "pretty horrific memory leak" that is called any time someone opens character creator.
GLOBAL_LIST_EMPTY(mannequins) GLOBAL_LIST_EMPTY(mannequins)
/proc/get_mannequin(var/ckey = "NULL") /proc/get_mannequin(var/ckey = "NULL")
var/mob/living/carbon/human/dummy/mannequin/M = GLOB.mannequins[ckey] var/mob/living/carbon/human/dummy/mannequin/M = GLOB.mannequins[ckey]

View File

@@ -539,4 +539,22 @@ var/global/list/remainless_species = list(SPECIES_PROMETHEAN,
for(var/species_name in whitelisted_icons) for(var/species_name in whitelisted_icons)
custom_species_bases += species_name custom_species_bases += species_name
// Weaver recipe stuff
paths = typesof(/datum/weaver_recipe/structure) - /datum/weaver_recipe/structure
for(var/path in paths)
var/datum/weaver_recipe/instance = new path()
if(!instance.title)
continue //A prototype or something
weavable_structures[instance.title] = instance
paths = typesof(/datum/weaver_recipe/item) - /datum/weaver_recipe/item
for(var/path in paths)
var/datum/weaver_recipe/instance = new path()
if(!instance.title)
continue //A prototype or something
weavable_items[instance.title] = instance
return 1 // Hooks must return 1 return 1 // Hooks must return 1
var/global/list/weavable_structures = list()
var/global/list/weavable_items = list()

View File

@@ -122,14 +122,18 @@ Proc for attack log creation, because really why not
if(ismob(user)) //CHOMPEdit Begin if(ismob(user)) //CHOMPEdit Begin
//user.attack_log += text("\[[time_stamp()]\] <font color='red'>Attacked [target_str]: [what_done]</font>") //user.attack_log += text("\[[time_stamp()]\] <font color='red'>Attacked [target_str]: [what_done]</font>")
var/DBQuery/query_insert = SSdbcore.NewQuery("INSERT INTO erro_attacklog (id, time, ckey, mob, message) VALUES (null, NOW(), :t_ckey, :t_mob, :t_content)", list("t_ckey" = user.ckey, "t_mob" = user.real_name, "t_content" = "<font color='red'>Attacked [target_str]: [what_done]</font>")) //var/DBQuery/query_insert = SSdbcore.NewQuery("INSERT INTO erro_attacklog (id, time, ckey, mob, message) VALUES (null, NOW(), :t_ckey, :t_mob, :t_content)", list("t_ckey" = user.ckey, "t_mob" = user.real_name, "t_content" = "<font color='red'>Attacked [target_str]: [what_done]</font>"))
query_insert.Execute(async=use_async) //query_insert.Execute(async=use_async)
qdel(query_insert) //qdel(query_insert)
if(SSdbcore.Connect())
rustg_sql_query_async(SSdbcore.connection, "INSERT INTO erro_attacklog (id, time, ckey, mob, message) VALUES (null, NOW(), :t_ckey, :t_mob, :t_content)", json_encode(list("t_ckey" = user.ckey, "t_mob" = user.real_name, "t_content" = "<font color='red'>Attacked [target_str]: [what_done]</font>")))
if(ismob(target)) if(ismob(target))
//target.attack_log += text("\[[time_stamp()]\] <font color='orange'>Attacked by [user_str]: [what_done]</font>") //target.attack_log += text("\[[time_stamp()]\] <font color='orange'>Attacked by [user_str]: [what_done]</font>")
var/DBQuery/query_insert = SSdbcore.NewQuery("INSERT INTO erro_attacklog (id, time, ckey, mob, message) VALUES (null, NOW(), :t_ckey, :t_mob, :t_content)", list("t_ckey" = target.ckey, "t_mob" = target.real_name, "t_content" = "<font color='orange'>Attacked by [user_str]: [what_done]</font>")) //var/DBQuery/query_insert = SSdbcore.NewQuery("INSERT INTO erro_attacklog (id, time, ckey, mob, message) VALUES (null, NOW(), :t_ckey, :t_mob, :t_content)", list("t_ckey" = target.ckey, "t_mob" = target.real_name, "t_content" = "<font color='orange'>Attacked by [user_str]: [what_done]</font>"))
query_insert.Execute(async=use_async) //query_insert.Execute(async=use_async)
qdel(query_insert) //qdel(query_insert)
if(SSdbcore.Connect())
rustg_sql_query_async(SSdbcore.connection, "INSERT INTO erro_attacklog (id, time, ckey, mob, message) VALUES (null, NOW(), :t_ckey, :t_mob, :t_content)", json_encode(list("t_ckey" = target.ckey, "t_mob" = target.real_name, "t_content" = "<font color='orange'>Attacked by [user_str]: [what_done]</font>")))
//CHOMPEdit End //CHOMPEdit End
log_attack(user_str,target_str,what_done) log_attack(user_str,target_str,what_done)
if(admin_notify) if(admin_notify)

View File

@@ -60,6 +60,8 @@
// Cyborgs have no range-checking unless there is item use // Cyborgs have no range-checking unless there is item use
if(!W) if(!W)
if(bolt && !bolt.malfunction && A.loc != module)
return
A.add_hiddenprint(src) A.add_hiddenprint(src)
A.attack_robot(src) A.attack_robot(src)
return return
@@ -119,35 +121,56 @@
/atom/proc/BorgCtrlShiftClick(var/mob/living/silicon/robot/user) //forward to human click if not overriden /atom/proc/BorgCtrlShiftClick(var/mob/living/silicon/robot/user) //forward to human click if not overriden
CtrlShiftClick(user) CtrlShiftClick(user)
/obj/machinery/door/airlock/BorgCtrlShiftClick(mob/user) /obj/machinery/door/airlock/BorgCtrlShiftClick(var/mob/living/silicon/robot/user)
if(user.bolt && !user.bolt.malfunction)
return
AICtrlShiftClick(user) AICtrlShiftClick(user)
/atom/proc/BorgShiftClick(var/mob/living/silicon/robot/user) //forward to human click if not overriden /atom/proc/BorgShiftClick(var/mob/living/silicon/robot/user) //forward to human click if not overriden
ShiftClick(user) ShiftClick(user)
/obj/machinery/door/airlock/BorgShiftClick(mob/user) // Opens and closes doors! Forwards to AI code. /obj/machinery/door/airlock/BorgShiftClick(var/mob/living/silicon/robot/user) // Opens and closes doors! Forwards to AI code.
if(user.bolt && !user.bolt.malfunction)
return
AIShiftClick(user) AIShiftClick(user)
/atom/proc/BorgCtrlClick(var/mob/living/silicon/robot/user) //forward to human click if not overriden /atom/proc/BorgCtrlClick(var/mob/living/silicon/robot/user) //forward to human click if not overriden
CtrlClick(user) CtrlClick(user)
/obj/machinery/door/airlock/BorgCtrlClick(mob/user) // Bolts doors. Forwards to AI code. /obj/machinery/door/airlock/BorgCtrlClick(var/mob/living/silicon/robot/user) // Bolts doors. Forwards to AI code.
if(user.bolt && !user.bolt.malfunction)
return
AICtrlClick(user) AICtrlClick(user)
/obj/machinery/power/apc/BorgCtrlClick(mob/user) // turns off/on APCs. Forwards to AI code. /obj/machinery/power/apc/BorgCtrlClick(var/mob/living/silicon/robot/user) // turns off/on APCs. Forwards to AI code.
if(user.bolt && !user.bolt.malfunction)
return
AICtrlClick(user) AICtrlClick(user)
/obj/machinery/turretid/BorgCtrlClick(mob/user) //turret control on/off. Forwards to AI code. /obj/machinery/turretid/BorgCtrlClick(var/mob/living/silicon/robot/user) //turret control on/off. Forwards to AI code.
if(user.bolt && !user.bolt.malfunction)
return
AICtrlClick(user) AICtrlClick(user)
/atom/proc/BorgAltClick(var/mob/living/silicon/robot/user) /atom/proc/BorgAltClick(var/mob/living/silicon/robot/user)
AltClick(user) AltClick(user)
return return
/obj/machinery/door/airlock/BorgAltClick(mob/user) // Eletrifies doors. Forwards to AI code. /obj/machinery/door/airlock/BorgAltClick(var/mob/living/silicon/robot/user) // Eletrifies doors. Forwards to AI code.
if(user.bolt && !user.bolt.malfunction)
return
AIAltClick(user) AIAltClick(user)
/obj/machinery/turretid/BorgAltClick(mob/user) //turret lethal on/off. Forwards to AI code. /obj/machinery/turretid/BorgAltClick(var/mob/living/silicon/robot/user) //turret lethal on/off. Forwards to AI code.
if(user.bolt && !user.bolt.malfunction)
return
AIAltClick(user) AIAltClick(user)
/* /*

View File

@@ -5,7 +5,6 @@ SUBSYSTEM_DEF(overlays)
priority = FIRE_PRIORITY_OVERLAYS priority = FIRE_PRIORITY_OVERLAYS
init_order = INIT_ORDER_OVERLAY init_order = INIT_ORDER_OVERLAY
var/initialized = FALSE
var/list/queue // Queue of atoms needing overlay compiling (TODO-VERIFY!) var/list/queue // Queue of atoms needing overlay compiling (TODO-VERIFY!)
var/list/stats var/list/stats
var/list/overlay_icon_state_caches // Cache thing var/list/overlay_icon_state_caches // Cache thing
@@ -22,7 +21,6 @@ var/global/image/appearance_bro = new() // Temporarily super-global because of B
stats = list() stats = list()
/datum/controller/subsystem/overlays/Initialize() /datum/controller/subsystem/overlays/Initialize()
initialized = TRUE
fire(mc_check = FALSE) fire(mc_check = FALSE)
..() ..()

View File

@@ -22,6 +22,7 @@ PROCESSING_SUBSYSTEM_DEF(chemistry)
/datum/controller/subsystem/processing/chemistry/Initialize() /datum/controller/subsystem/processing/chemistry/Initialize()
initialize_chemical_reactions() initialize_chemical_reactions()
initialize_chemical_reagents() initialize_chemical_reagents()
..()
//Chemical Reactions - Initialises all /datum/chemical_reaction into a list //Chemical Reactions - Initialises all /datum/chemical_reaction into a list
// It is filtered into multiple lists within a list. // It is filtered into multiple lists within a list.

View File

@@ -510,8 +510,9 @@
//HUMAN //HUMAN
/mob/living/carbon/human/mind_initialize() /mob/living/carbon/human/mind_initialize()
..() . = ..()
if(!mind.assigned_role) mind.assigned_role = USELESS_JOB //defualt //VOREStation Edit - Visitor not Assistant if(!mind.assigned_role)
mind.assigned_role = USELESS_JOB //defualt //VOREStation Edit - Visitor not Assistant
//slime //slime
/mob/living/simple_mob/slime/mind_initialize() /mob/living/simple_mob/slime/mind_initialize()

View File

@@ -0,0 +1,101 @@
GLOBAL_LIST(department_goals)
GLOBAL_LIST(active_department_goals)
/hook/startup/proc/initializeDepartmentGoals()
GLOB.department_goals = list(GOAL_GENERAL, GOAL_MEDICAL, GOAL_SECURITY, GOAL_ENGINEERING, GOAL_CARGO, GOAL_RESEARCH)
GLOB.active_department_goals = list(GOAL_GENERAL, GOAL_MEDICAL, GOAL_SECURITY, GOAL_ENGINEERING, GOAL_CARGO, GOAL_RESEARCH)
for(var/category in GLOB.department_goals)
GLOB.department_goals[category] = list()
for(var/subtype in subtypesof(/datum/goal))
var/datum/goal/SG = new subtype()
if(SG.name == "goal")
continue
if(SG.category == category)
GLOB.department_goals[category] |= SG
for(var/category in GLOB.active_department_goals)
GLOB.active_department_goals[category] = list()
var/list/cat_goals = GLOB.department_goals[category]
var/goal_count = rand(2,4)
for(var/count = 1 to goal_count)
var/datum/goal/G
if(LAZYLEN(cat_goals))
G = pick(cat_goals)
if(G)
G.active_goal = TRUE
cat_goals -= G
GLOB.active_department_goals[category] |= G
return 1
/hook/roundend/proc/checkDepartmentGoals()
for(var/category in GLOB.active_department_goals)
var/list/cat_goals = GLOB.active_department_goals[category]
to_world("<span class='filter_system'><b>[category]</b></span>")
if(!LAZYLEN(cat_goals))
to_world("<span class='filter_system'>There were no assigned goals!</span>")
else
for(var/datum/goal/G in cat_goals)
var/success = G.check_completion()
to_world("<span class='filter_system'>[success ? "<span class='notice'>[G.name]</span>" : "<span class='warning'>[G.name]</span>"]</span>")
to_world("<span class='filter_system'>[G.goal_text]</span>")
return 1
/datum/goal
var/name = "goal"
var/goal_text = "Do nothing! Congratulations."
var/active_goal = FALSE
var/category = GOAL_GENERAL
/datum/goal/proc/check_completion()
return FALSE
/datum/goal/common
name = "goal"
goal_text = "Congratulations, you still do nothing."
/datum/goal/medical
name = "goal"
goal_text = "Congratulations, you still do nothing."
category = GOAL_MEDICAL
/datum/goal/security
name = "goal"
goal_text = "Congratulations, you still do nothing."
category = GOAL_SECURITY
/datum/goal/engineering
name = "goal"
goal_text = "Congratulations, you still do nothing."
category = GOAL_ENGINEERING
/datum/goal/cargo
name = "goal"
goal_text = "Congratulations, you still do nothing."
category = GOAL_CARGO
/datum/goal/research
name = "goal"
goal_text = "Congratulations, you still do nothing."
category = GOAL_RESEARCH

View File

@@ -189,6 +189,17 @@
containername = "Jumper kit crate" containername = "Jumper kit crate"
access = access_robotics access = access_robotics
/datum/supply_pack/robotics/restrainingbolt
name = "Restraining bolt crate"
contains = list(
/obj/item/weapon/implanter = 1,
/obj/item/weapon/implantcase/restrainingbolt = 2
)
cost = 40
containertype = /obj/structure/closet/crate/secure/cybersolutions
containername = "Restraining bolt crate"
access = access_robotics
/datum/supply_pack/robotics/bike /datum/supply_pack/robotics/bike
name = "Spacebike Crate" name = "Spacebike Crate"
contains = list() contains = list()

View File

@@ -187,3 +187,13 @@
/datum/category_item/underwear/undershirt/pinkblack_tshirt /datum/category_item/underwear/undershirt/pinkblack_tshirt
name = "Pink and Black T-Shirt" name = "Pink and Black T-Shirt"
icon_state = "pinkblack_tshirt" icon_state = "pinkblack_tshirt"
/datum/category_item/underwear/undershirt/turtle
name = "Turtleneck"
icon_state = "turtleneck"
has_color = TRUE
/datum/category_item/underwear/undershirt/sleevelessturtle
name = "Turtleneck, Sleeveless"
icon_state = "sleevelessturtle"
has_color = TRUE

View File

@@ -50,13 +50,12 @@
var/turf/base_turf //The base turf type of the area, which can be used to override the z-level's base turf var/turf/base_turf //The base turf type of the area, which can be used to override the z-level's base turf
var/forbid_events = FALSE // If true, random events will not start inside this area. var/forbid_events = FALSE // If true, random events will not start inside this area.
var/no_spoilers = FALSE // If true, makes it much more difficult to see what is inside an area with things like mesons. var/no_spoilers = FALSE // If true, makes it much more difficult to see what is inside an area with things like mesons.
var/soundproofed = FALSE // If true, blocks sounds from other areas and prevents hearers on other areas from hearing the sounds within.
/area/Initialize() /area/Initialize()
. = ..() . = ..()
luminosity = !(dynamic_lighting) luminosity = !(dynamic_lighting)
icon_state = "" icon_state = ""
return INITIALIZE_HINT_LATELOAD // Areas tradiationally are initialized AFTER other atoms. return INITIALIZE_HINT_LATELOAD // Areas tradiationally are initialized AFTER other atoms.
/area/LateInitialize() /area/LateInitialize()
@@ -67,7 +66,6 @@
power_change() // all machines set to current power level, also updates lighting icon power_change() // all machines set to current power level, also updates lighting icon
if(no_spoilers) if(no_spoilers)
set_spoiler_obfuscation(TRUE) set_spoiler_obfuscation(TRUE)
return INITIALIZE_HINT_LATELOAD
// Changes the area of T to A. Do not do this manually. // Changes the area of T to A. Do not do this manually.
// Area is expected to be a non-null instance. // Area is expected to be a non-null instance.

View File

@@ -134,7 +134,7 @@
for(var/i in loc) for(var/i in loc)
var/atom/movable/thing = i var/atom/movable/thing = i
// We don't call parent so we are calling this for byond // We don't call parent so we are calling this for byond
thing.Crossed(src) thing.Crossed(src, oldloc)
// We're a multi-tile object (multiple locs) // We're a multi-tile object (multiple locs)
else if(. && newloc) else if(. && newloc)
@@ -462,6 +462,8 @@
minor_dir = dx minor_dir = dx
minor_dist = dist_x minor_dist = dist_x
range = min(dist_x + dist_y, range)
while(src && target && src.throwing && istype(src.loc, /turf) \ while(src && target && src.throwing && istype(src.loc, /turf) \
&& ((abs(target.x - src.x)+abs(target.y - src.y) > 0 && dist_travelled < range) \ && ((abs(target.x - src.x)+abs(target.y - src.y) > 0 && dist_travelled < range) \
|| (a && a.has_gravity == 0) \ || (a && a.has_gravity == 0) \

View File

@@ -118,6 +118,10 @@ var/global/list/datum/dna/gene/dna_genes[0]
var/base_species = "Human" var/base_species = "Human"
var/list/species_traits = list() var/list/species_traits = list()
var/blood_color = "#A10808" var/blood_color = "#A10808"
var/custom_say
var/custom_ask
var/custom_whisper
var/custom_exclaim
// VOREStation // VOREStation
// New stuff // New stuff
@@ -139,6 +143,10 @@ var/global/list/datum/dna/gene/dna_genes[0]
new_dna.custom_species=custom_species //VOREStaton Edit new_dna.custom_species=custom_species //VOREStaton Edit
new_dna.species_traits=species_traits.Copy() //VOREStation Edit new_dna.species_traits=species_traits.Copy() //VOREStation Edit
new_dna.blood_color=blood_color //VOREStation Edit new_dna.blood_color=blood_color //VOREStation Edit
new_dna.custom_say=custom_say //VOREStaton Edit
new_dna.custom_ask=custom_ask //VOREStaton Edit
new_dna.custom_whisper=custom_whisper //VOREStaton Edit
new_dna.custom_exclaim=custom_exclaim //VOREStaton Edit
for(var/b=1;b<=DNA_SE_LENGTH;b++) for(var/b=1;b<=DNA_SE_LENGTH;b++)
new_dna.SE[b]=SE[b] new_dna.SE[b]=SE[b]
if(b<=DNA_UI_LENGTH) if(b<=DNA_UI_LENGTH)
@@ -200,15 +208,15 @@ var/global/list/datum/dna/gene/dna_genes[0]
size_multiplier = player_sizes_list.Find(N) size_multiplier = player_sizes_list.Find(N)
break break
var/taurtype = /datum/sprite_accessory/tail/taur/spider
if(istype(character.tail_style, taurtype))
character.verbs += /mob/living/proc/weaveWebBindings
// Technically custom_species is not part of the UI, but this place avoids merge problems. // Technically custom_species is not part of the UI, but this place avoids merge problems.
src.custom_species = character.custom_species src.custom_species = character.custom_species
src.base_species = character.species.base_species src.base_species = character.species.base_species
src.blood_color = character.species.blood_color src.blood_color = character.species.blood_color
src.species_traits = character.species.traits.Copy() src.species_traits = character.species.traits.Copy()
src.custom_say = character.custom_say
src.custom_ask = character.custom_ask
src.custom_whisper = character.custom_whisper
src.custom_exclaim = character.custom_exclaim
// +1 to account for the none-of-the-above possibility // +1 to account for the none-of-the-above possibility
SetUIValueRange(DNA_UI_EAR_STYLE, ear_style + 1, ear_styles_list.len + 1, 1) SetUIValueRange(DNA_UI_EAR_STYLE, ear_style + 1, ear_styles_list.len + 1, 1)

View File

@@ -237,6 +237,10 @@
// Technically custom_species is not part of the UI, but this place avoids merge problems. // Technically custom_species is not part of the UI, but this place avoids merge problems.
H.custom_species = dna.custom_species H.custom_species = dna.custom_species
H.custom_say = dna.custom_say
H.custom_ask = dna.custom_ask
H.custom_whisper = dna.custom_whisper
H.custom_exclaim = dna.custom_exclaim
H.species.blood_color = dna.blood_color H.species.blood_color = dna.blood_color
var/datum/species/S = H.species var/datum/species/S = H.species
S.produceCopy(dna.base_species,dna.species_traits,src) S.produceCopy(dna.base_species,dna.species_traits,src)

View File

@@ -34,7 +34,7 @@
var/last_activation = 0 var/last_activation = 0
/obj/structure/cult/pylon/Initialize() /obj/structure/cult/pylon/Initialize()
..() . = ..()
START_PROCESSING(SSobj, src) START_PROCESSING(SSobj, src)
/obj/structure/cult/pylon/attack_hand(mob/M as mob) /obj/structure/cult/pylon/attack_hand(mob/M as mob)

View File

@@ -0,0 +1,9 @@
/datum/job/entertainer
alt_titles = list("Performer" = /datum/alt_title/performer, "Musician" = /datum/alt_title/musician, "Stagehand" = /datum/alt_title/stagehand,
"Actor" = /datum/alt_title/actor, "Dancer" = /datum/alt_title/dancer, "Singer" = /datum/alt_title/singer,
"Magician" = /datum/alt_title/magician, "Comedian" = /datum/alt_title/comedian, "Tragedian" = /datum/alt_title/tragedian,
"Fitness Instructor" = /datum/alt_title/fitness)
/datum/alt_title/fitness
title = "Fitness Instructor"
title_blurb = "A Fitness Instructor's goal is to keep the station in shape. Get the crew shaving up those built up pounds and get them to eat something other than chocolate bars and burgers for once"

View File

@@ -529,5 +529,5 @@
stasis_level = 100 //Just one setting stasis_level = 100 //Just one setting
/obj/machinery/sleeper/survival_pod/Initialize() /obj/machinery/sleeper/survival_pod/Initialize()
..() . = ..()
RefreshParts(1) RefreshParts(1)

View File

@@ -1,4 +1,4 @@
/obj/machinery/computer/arcade/ /obj/machinery/computer/arcade
name = "random arcade" name = "random arcade"
desc = "random arcade machine" desc = "random arcade machine"
icon_state = "arcade" icon_state = "arcade"
@@ -25,15 +25,15 @@
/obj/item/toy/stickhorse = 2 /obj/item/toy/stickhorse = 2
) )
/obj/machinery/computer/arcade/New() /obj/machinery/computer/arcade/Initialize()
..() . = ..()
// If it's a generic arcade machine, pick a random arcade // If it's a generic arcade machine, pick a random arcade
// circuit board for it and make the new machine // circuit board for it and make the new machine
if(!circuit) if(!circuit)
var/choice = pick(subtypesof(/obj/item/weapon/circuitboard/arcade) - /obj/item/weapon/circuitboard/arcade/clawmachine) var/choice = pick(subtypesof(/obj/item/weapon/circuitboard/arcade) - /obj/item/weapon/circuitboard/arcade/clawmachine)
var/obj/item/weapon/circuitboard/CB = new choice() var/obj/item/weapon/circuitboard/CB = new choice()
new CB.build_path(loc, CB) new CB.build_path(loc, CB)
qdel(src) return INITIALIZE_HINT_QDEL
/obj/machinery/computer/arcade/proc/prizevend() /obj/machinery/computer/arcade/proc/prizevend()
if(!(contents-circuit).len) if(!(contents-circuit).len)

View File

@@ -26,7 +26,7 @@
light_color = "#315ab4" light_color = "#315ab4"
/obj/machinery/computer/cloning/Initialize() /obj/machinery/computer/cloning/Initialize()
..() . = ..()
pods = list() pods = list()
records = list() records = list()
set_scan_temp("Scanner ready.", "good") set_scan_temp("Scanner ready.", "good")

View File

@@ -29,7 +29,7 @@
/obj/machinery/computer/med_data/Initialize() /obj/machinery/computer/med_data/Initialize()
..() . = ..()
field_edit_questions = list( field_edit_questions = list(
// General // General
"sex" = "Please select new sex:", "sex" = "Please select new sex:",

View File

@@ -335,7 +335,7 @@
name = "Monitor Decryption Key" name = "Monitor Decryption Key"
/obj/item/weapon/paper/monitorkey/Initialize() /obj/item/weapon/paper/monitorkey/Initialize()
..() //Late init ..()
return INITIALIZE_HINT_LATELOAD return INITIALIZE_HINT_LATELOAD
/obj/item/weapon/paper/monitorkey/LateInitialize() /obj/item/weapon/paper/monitorkey/LateInitialize()

View File

@@ -13,7 +13,7 @@
var/title = "Mass Driver Controls" var/title = "Mass Driver Controls"
/obj/machinery/computer/pod/Initialize() /obj/machinery/computer/pod/Initialize()
..() //Not returning parent because lateload ..()
return INITIALIZE_HINT_LATELOAD return INITIALIZE_HINT_LATELOAD
/obj/machinery/computer/pod/LateInitialize() /obj/machinery/computer/pod/LateInitialize()

View File

@@ -25,7 +25,7 @@
var/static/list/field_edit_choices var/static/list/field_edit_choices
/obj/machinery/computer/secure_data/Initialize() /obj/machinery/computer/secure_data/Initialize()
..() . = ..()
field_edit_questions = list( field_edit_questions = list(
// General // General
"name" = "Please enter new name:", "name" = "Please enter new name:",

View File

@@ -30,7 +30,7 @@
var/static/list/field_edit_choices var/static/list/field_edit_choices
/obj/machinery/computer/skills/Initialize() /obj/machinery/computer/skills/Initialize()
..() . = ..()
field_edit_questions = list( field_edit_questions = list(
// General // General
"name" = "Please input new name:", "name" = "Please input new name:",

View File

@@ -40,7 +40,6 @@
/obj/machinery/door_timer/Initialize() /obj/machinery/door_timer/Initialize()
..() ..()
//Doors need to go first, and can't rely on init order, so come back to me.
return INITIALIZE_HINT_LATELOAD return INITIALIZE_HINT_LATELOAD
/obj/machinery/door_timer/LateInitialize() /obj/machinery/door_timer/LateInitialize()

View File

@@ -164,7 +164,7 @@ GLOBAL_LIST_BOILERPLATE(allCasters, /obj/machinery/newscaster)
securityCaster = 1 securityCaster = 1
/obj/machinery/newscaster/Initialize() /obj/machinery/newscaster/Initialize()
..() //Not returning . because lateload below ..()
GLOB.allCasters += src GLOB.allCasters += src
unit_no = ++unit_no_cur unit_no = ++unit_no_cur
paper_remaining = 15 paper_remaining = 15

View File

@@ -0,0 +1,72 @@
//This is meant for essentially linking a separate z-level to the rest with telecomms
/obj/machinery/telecomms/allinone/link
name = "Telecommunications Mainframe"
icon = 'icons/obj/stationobjs.dmi'
icon_state = "allinone"
desc = "A compact machine used for portable subspace telecommuniations processing."
density = 1
use_power = USE_POWER_IDLE
idle_power_usage = 20
anchored = 1
machinetype = 6
produces_heat = 0
/obj/machinery/telecomms/allinone/link/receive_signal(datum/signal/signal)
// Has to be on to receive messages
if(!on)
return
// Why did you use this subtype?
if(!using_map.use_overmap)
return
// Is there a valid signal
if(!signal)
return
// Where are we able to hear from (and talk to, since we're AIO) anyway?
//var/map_levels = using_map.get_map_levels(z, TRUE, overmap_range)
if("[signal.data["level"]]" == "[z]")
signal.data["level"] = list(0)
else
signal.data["level"] = list(z)
if(is_freq_listening(signal)) // detect subspace signals
signal.data["done"] = 1 // mark the signal as being broadcasted since we're a broadcaster
signal.data["compression"] = 0 // decompress since we're a processor
if(signal.data["slow"] > 0)
sleep(signal.data["slow"]) // simulate the network lag if necessary
/* ###### Broadcast a message using signal.data ###### */
var/datum/radio_frequency/connection = signal.data["connection"]
var/list/forced_radios
for(var/weakref/wr in linked_radios_weakrefs)
var/obj/item/device/radio/R = wr.resolve()
if(istype(R))
LAZYDISTINCTADD(forced_radios, R)
Broadcast_Message(
signal.data["connection"],
signal.data["mob"],
signal.data["vmask"],
signal.data["vmessage"],
signal.data["radio"],
signal.data["message"],
signal.data["name"],
signal.data["job"],
signal.data["realname"],
signal.data["vname"],
DATA_NORMAL,
signal.data["compression"],
signal.data["level"],
connection.frequency,
signal.data["verb"],
signal.data["language"],
forced_radios
)

View File

@@ -32,7 +32,7 @@
sleep(2) sleep(2)
go_out() go_out()
sleep(2) sleep(2)
del(src) qdel(src)
/obj/machinery/transportpod/relaymove(mob/user as mob) /obj/machinery/transportpod/relaymove(mob/user as mob)
if(user.stat) if(user.stat)

View File

@@ -31,7 +31,7 @@
thrusters_possible = 1 thrusters_possible = 1
/obj/mecha/combat/gorilla/Initialize() /obj/mecha/combat/gorilla/Initialize()
..() . = ..()
var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/tesla_energy_relay(src) // This thing basically cannot function without an external power supply. var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/tesla_energy_relay(src) // This thing basically cannot function without an external power supply.
ME.attach(src) ME.attach(src)
ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/cannon(src) ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/cannon(src)

View File

@@ -40,7 +40,7 @@
switch_dmg_type_possible = TRUE switch_dmg_type_possible = TRUE
/obj/mecha/combat/phazon/equipped/Initialize() /obj/mecha/combat/phazon/equipped/Initialize()
..() . = ..()
starting_equipment = list( starting_equipment = list(
/obj/item/mecha_parts/mecha_equipment/tool/rcd, /obj/item/mecha_parts/mecha_equipment/tool/rcd,
/obj/item/mecha_parts/mecha_equipment/gravcatapult /obj/item/mecha_parts/mecha_equipment/gravcatapult

View File

@@ -43,7 +43,7 @@
. += "<span class='warning'><b>It is completely destroyed.</b></span>" . += "<span class='warning'><b>It is completely destroyed.</b></span>"
/obj/item/mecha_parts/component/Initialize() /obj/item/mecha_parts/component/Initialize()
..() . = ..()
integrity = max_integrity integrity = max_integrity
if(start_damaged) if(start_damaged)

View File

@@ -14,7 +14,7 @@
var/obj/item/weapon/inflatable_dispenser/my_deployer = null var/obj/item/weapon/inflatable_dispenser/my_deployer = null
/obj/item/mecha_parts/mecha_equipment/tool/powertool/inflatables/Initialize() /obj/item/mecha_parts/mecha_equipment/tool/powertool/inflatables/Initialize()
..() . = ..()
my_deployer = my_tool my_deployer = my_tool
/obj/item/mecha_parts/mecha_equipment/tool/powertool/inflatables/Topic(href, href_list) /obj/item/mecha_parts/mecha_equipment/tool/powertool/inflatables/Topic(href, href_list)

View File

@@ -318,7 +318,7 @@
equip_type = EQUIP_HULL equip_type = EQUIP_HULL
/obj/item/mecha_parts/mecha_equipment/crisis_drone/Initialize() /obj/item/mecha_parts/mecha_equipment/crisis_drone/Initialize()
..() . = ..()
drone_overlay = new(src.icon, icon_state = droid_state) drone_overlay = new(src.icon, icon_state = droid_state)
/obj/item/mecha_parts/mecha_equipment/crisis_drone/Destroy() /obj/item/mecha_parts/mecha_equipment/crisis_drone/Destroy()

View File

@@ -198,7 +198,7 @@
var/weapons_only_cycle = FALSE //So combat mechs don't switch to their equipment at times. var/weapons_only_cycle = FALSE //So combat mechs don't switch to their equipment at times.
/obj/mecha/Initialize() /obj/mecha/Initialize()
..() . = ..()
for(var/path in starting_components) for(var/path in starting_components)
var/obj/item/mecha_parts/component/C = new path(src) var/obj/item/mecha_parts/component/C = new path(src)

View File

@@ -127,7 +127,7 @@
C.images += holder C.images += holder
*/ */
/obj/mecha/medical/odysseus/loaded/Initialize() /obj/mecha/medical/odysseus/loaded/Initialize()
..() . = ..()
var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/tool/sleeper var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/tool/sleeper
ME.attach(src) ME.attach(src)
ME = new /obj/item/mecha_parts/mecha_equipment/tool/sleeper ME = new /obj/item/mecha_parts/mecha_equipment/tool/sleeper

View File

@@ -70,7 +70,7 @@
max_special_equip = 1 max_special_equip = 1
/obj/mecha/working/ripley/deathripley/Initialize() /obj/mecha/working/ripley/deathripley/Initialize()
..() . = ..()
var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/tool/hydraulic_clamp/safety var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/tool/hydraulic_clamp/safety
ME.attach(src) ME.attach(src)
return return
@@ -80,7 +80,7 @@
name = "APLU \"Miner\"" name = "APLU \"Miner\""
/obj/mecha/working/ripley/mining/Initialize() /obj/mecha/working/ripley/mining/Initialize()
..() . = ..()
//Attach drill //Attach drill
if(prob(25)) //Possible diamond drill... Feeling lucky? if(prob(25)) //Possible diamond drill... Feeling lucky?
var/obj/item/mecha_parts/mecha_equipment/tool/drill/diamonddrill/D = new /obj/item/mecha_parts/mecha_equipment/tool/drill/diamonddrill var/obj/item/mecha_parts/mecha_equipment/tool/drill/diamonddrill/D = new /obj/item/mecha_parts/mecha_equipment/tool/drill/diamonddrill

View File

@@ -40,10 +40,7 @@
return TRUE return TRUE
/atom/movable/proc/has_buckled_mobs() /atom/movable/proc/has_buckled_mobs()
if(!buckled_mobs) return LAZYLEN(buckled_mobs)
return FALSE
if(buckled_mobs.len)
return TRUE
/atom/movable/Destroy() /atom/movable/Destroy()
unbuckle_all_mobs() unbuckle_all_mobs()

View File

@@ -11,7 +11,7 @@
create_reagents(100) create_reagents(100)
/obj/effect/decal/cleanable/chemcoating/Initialize() /obj/effect/decal/cleanable/chemcoating/Initialize()
..() . = ..()
var/turf/T = get_turf(src) var/turf/T = get_turf(src)
if(T) if(T)
for(var/obj/O in get_turf(src)) for(var/obj/O in get_turf(src))

View File

@@ -1,10 +1,10 @@
/obj/effect/decal/warning_stripes /obj/effect/decal/warning_stripes
icon = 'icons/effects/warning_stripes.dmi' icon = 'icons/effects/warning_stripes.dmi'
/obj/effect/decal/warning_stripes/New() /obj/effect/decal/warning_stripes/Initialize()
. = ..() . = ..()
var/turf/T=get_turf(src) var/turf/T=get_turf(src)
var/image/I=image(icon, icon_state = icon_state, dir = dir) var/image/I=image(icon, icon_state = icon_state, dir = dir)
I.color=color I.color=color
T.overlays += I T.overlays += I
qdel(src) return INITIALIZE_HINT_QDEL

View File

@@ -10,32 +10,37 @@
var/obj/item/weapon/mine/mineitemtype = /obj/item/weapon/mine var/obj/item/weapon/mine/mineitemtype = /obj/item/weapon/mine
var/panel_open = 0 var/panel_open = 0
var/datum/wires/mines/wires = null var/datum/wires/mines/wires = null
register_as_dangerous_object = TRUE
var/camo_net = FALSE // Will the mine 'cloak' on deployment? var/camo_net = FALSE // Will the mine 'cloak' on deployment?
// The trap item will be triggered in some manner when detonating. Default only checks for grenades. // The trap item will be triggered in some manner when detonating. Default only checks for grenades.
var/obj/item/trap = null var/obj/item/trap = null
/obj/effect/mine/New() /obj/effect/mine/Initialize()
icon_state = "uglyminearmed" icon_state = "uglyminearmed"
wires = new(src) wires = new(src)
. = ..()
if(ispath(trap)) if(ispath(trap))
trap = new trap(src) trap = new trap(src)
register_dangerous_to_step()
/obj/effect/mine/Initialize()
..()
if(camo_net) if(camo_net)
alpha = 50 alpha = 50
/obj/effect/mine/Destroy() /obj/effect/mine/Destroy()
unregister_dangerous_to_step()
if(trap) if(trap)
QDEL_NULL(trap) QDEL_NULL(trap)
qdel_null(wires) qdel_null(wires)
return ..() return ..()
/obj/effect/mine/Moved(atom/oldloc)
. = ..()
if(.)
var/turf/old_turf = get_turf(oldloc)
var/turf/new_turf = get_turf(src)
if(old_turf != new_turf)
old_turf.unregister_dangerous_object(src)
new_turf.register_dangerous_object(src)
/obj/effect/mine/proc/explode(var/mob/living/M) /obj/effect/mine/proc/explode(var/mob/living/M)
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread() var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread()
triggered = 1 triggered = 1

View File

@@ -17,7 +17,7 @@
..() ..()
/obj/effect/temporary_effect/eruption/Initialize() /obj/effect/temporary_effect/eruption/Initialize()
..() . = ..()
flick("[icon_state]_create",src) flick("[icon_state]_create",src)
/obj/effect/temporary_effect/eruption/Destroy() /obj/effect/temporary_effect/eruption/Destroy()

View File

@@ -159,7 +159,6 @@
/obj/effect/spawner/newbomb/Initialize(newloc) /obj/effect/spawner/newbomb/Initialize(newloc)
..(newloc) ..(newloc)
var/obj/item/device/transfer_valve/V = new(src.loc) var/obj/item/device/transfer_valve/V = new(src.loc)
var/obj/item/weapon/tank/phoron/PT = new(V) var/obj/item/weapon/tank/phoron/PT = new(V)
var/obj/item/weapon/tank/oxygen/OT = new(V) var/obj/item/weapon/tank/oxygen/OT = new(V)
@@ -183,19 +182,14 @@
OT.air_contents.temperature = PHORON_MINIMUM_BURN_TEMPERATURE+1 OT.air_contents.temperature = PHORON_MINIMUM_BURN_TEMPERATURE+1
OT.air_contents.update_values() OT.air_contents.update_values()
var/obj/item/device/assembly/S = new assembly_type(V) var/obj/item/device/assembly/S = new assembly_type(V)
V.attached_device = S V.attached_device = S
S.holder = V S.holder = V
S.toggle_secure() S.toggle_secure()
V.update_icon() V.update_icon()
return INITIALIZE_HINT_QDEL
qdel(src)
/////////////////////// ///////////////////////

View File

@@ -20,10 +20,14 @@
/obj/effect/simple_portal/proc/handle_teleport(atom/movable/AM) /obj/effect/simple_portal/proc/handle_teleport(atom/movable/AM)
if(destination) if(destination)
AM.forceMove(destination) AM.forceMove(destination)
if(!AM.is_incorporeal()) if(!AM.is_incorporeal() && !istype(AM,/mob/observer))
playsound(get_turf(src),teleport_sound,60,1) playsound(get_turf(src),teleport_sound,60,1)
playsound(get_turf(destination),teleport_sound,60,1) playsound(get_turf(destination),teleport_sound,60,1)
/obj/effect/simple_portal/attack_ghost(var/mob/observer/dead/user)
. = ..()
handle_teleport(user)
/obj/effect/simple_portal/coords /obj/effect/simple_portal/coords
var/tele_x var/tele_x
var/tele_y var/tele_y

View File

@@ -33,7 +33,7 @@
var/cell_type = /obj/item/weapon/cell/device var/cell_type = /obj/item/weapon/cell/device
/obj/item/device/flash/Initialize() /obj/item/device/flash/Initialize()
..() . = ..()
power_supply = new cell_type(src) power_supply = new cell_type(src)
/obj/item/device/flash/attackby(var/obj/item/W, var/mob/user) /obj/item/device/flash/attackby(var/obj/item/W, var/mob/user)

View File

@@ -7,15 +7,12 @@
var/obj/item/stack/type_to_spawn = null var/obj/item/stack/type_to_spawn = null
/obj/fiftyspawner/Initialize() /obj/fiftyspawner/Initialize()
..() //We're not returning . because we're going to ask to be deleted. ..()
var/turf/T = get_turf(src) var/turf/T = get_turf(src)
var/obj/item/stack/M = new type_to_spawn(T) var/obj/structure/closet/C = locate() in T
var/obj/item/stack/M = new type_to_spawn(C || T)
M.amount = M.max_amount //some stuff spawns with 60, we're still calling it fifty M.amount = M.max_amount //some stuff spawns with 60, we're still calling it fifty
M.update_icon() // Some stacks have different sprites depending on how full they are. M.update_icon() // Some stacks have different sprites depending on how full they are.
var/obj/structure/closet/C = locate() in T
if(C)
C.contents += M
return INITIALIZE_HINT_QDEL //Bye! return INITIALIZE_HINT_QDEL //Bye!
/obj/fiftyspawner/rods /obj/fiftyspawner/rods

View File

@@ -24,8 +24,8 @@
stacktype = /obj/item/stack/rods stacktype = /obj/item/stack/rods
no_variants = TRUE no_variants = TRUE
/obj/item/stack/rods/New() /obj/item/stack/rods/Initialize()
..() . = ..()
recipes = rods_recipes recipes = rods_recipes
update_icon() update_icon()

View File

@@ -32,19 +32,15 @@
bag_material = MAT_SYNCLOTH bag_material = MAT_SYNCLOTH
/obj/item/stack/sandbags/New(var/newloc, var/amt, var/bag_mat) /obj/item/stack/sandbags/Initialize(var/ml, var/amt, var/bag_mat)
..() . = ..(ml, amt)
recipes = sandbag_recipes recipes = sandbag_recipes
update_icon() update_icon()
if(bag_mat) if(bag_mat)
bag_material = bag_mat bag_material = bag_mat
var/datum/material/M = get_material_by_name("[bag_material]") var/datum/material/M = get_material_by_name("[bag_material]")
if(!M) if(!M)
qdel(src) return INITIALIZE_HINT_QDEL
return
color = M.icon_colour color = M.icon_colour
/obj/item/stack/sandbags/update_icon() /obj/item/stack/sandbags/update_icon()
@@ -136,17 +132,13 @@ var/global/list/datum/stack_recipe/sandbag_recipes = list( \
var/bag_material = "cloth" var/bag_material = "cloth"
/obj/item/stack/emptysandbag/New(var/newloc, var/amt, var/bag_mat) /obj/item/stack/emptysandbag/Initialize(var/ml, var/amt, var/bag_mat)
..(newloc, amt) . = ..(ml, amt)
if(bag_mat) if(bag_mat)
bag_material = bag_mat bag_material = bag_mat
var/datum/material/M = get_material_by_name("[bag_material]") var/datum/material/M = get_material_by_name("[bag_material]")
if(!M) if(!M)
qdel(src) return INITIALIZE_HINT_QDEL
return
color = M.icon_colour color = M.icon_colour
/obj/item/stack/emptysandbag/attack_self(var/mob/user) /obj/item/stack/emptysandbag/attack_self(var/mob/user)

View File

@@ -29,14 +29,13 @@
var/pass_color = FALSE // Will the item pass its own color var to the created item? Dyed cloth, wood, etc. var/pass_color = FALSE // Will the item pass its own color var to the created item? Dyed cloth, wood, etc.
var/strict_color_stacking = FALSE // Will the stack merge with other stacks that are different colors? (Dyed cloth, wood, etc) var/strict_color_stacking = FALSE // Will the stack merge with other stacks that are different colors? (Dyed cloth, wood, etc)
/obj/item/stack/New(var/loc, var/amount=null) /obj/item/stack/Initialize(var/ml, var/amount)
..() . = ..()
if (!stacktype) if(!stacktype)
stacktype = type stacktype = type
if (amount) if(amount)
src.amount = amount src.amount = amount
update_icon() update_icon()
return
/obj/item/stack/Destroy() /obj/item/stack/Destroy()
if(uses_charge) if(uses_charge)

View File

@@ -7,7 +7,7 @@
w_class = ITEMSIZE_TINY w_class = ITEMSIZE_TINY
max_amount = 30 max_amount = 30
/obj/item/stack/arcadeticket/New(loc, amount = null) /obj/item/stack/arcadeticket/Initialize()
. = ..() . = ..()
update_icon() update_icon()

View File

@@ -25,8 +25,8 @@
var/perunit = SHEET_MATERIAL_AMOUNT var/perunit = SHEET_MATERIAL_AMOUNT
var/apply_colour //CHOMPEDIT: End var/apply_colour //CHOMPEDIT: End
/obj/item/stack/tile/New() /obj/item/stack/tile/Initialize()
..() . = ..()
randpixel_xy() randpixel_xy()
/* /*

View File

@@ -0,0 +1,10 @@
/obj/item/weapon/card/emag/examine(mob/user)
. = ..()
. += "[uses] uses remaining."
/obj/item/weapon/card/emag/used
uses = 1
/obj/item/weapon/card/emag/used/Initialize()
. = ..()
uses = rand(1, 5)

View File

@@ -299,3 +299,13 @@
src.imp = new /obj/item/weapon/implant/organ/limbaugment/wrist/blade( src ) src.imp = new /obj/item/weapon/implant/organ/limbaugment/wrist/blade( src )
..() ..()
return return
/obj/item/weapon/implantcase/restrainingbolt
name = "glass case - 'Restraining Bolt'"
desc = "A case containing a restraining bolt."
icon_state = "implantcase-b"
/obj/item/weapon/implantcase/restrainingbolt/New()
src.imp = new /obj/item/weapon/implant/restrainingbolt( src )
..()
return

View File

@@ -150,3 +150,12 @@
S.remove_from_storage(A) S.remove_from_storage(A)
A.loc.contents.Remove(A) A.loc.contents.Remove(A)
update() update()
/obj/item/weapon/implanter/restrainingbolt
name = "implanter (bolt)"
/obj/item/weapon/implanter/restrainingbolt/New()
src.imp = new /obj/item/weapon/implant/restrainingbolt( src )
..()
update()
return

View File

@@ -0,0 +1,5 @@
/obj/item/weapon/implant/restrainingbolt
name = "\improper restraining bolt"
icon = 'icons/obj/device.dmi'
icon_state = "implant"

View File

@@ -103,9 +103,9 @@
<h2>Meat Pie:</h2> <h2>Meat Pie:</h2>
Flat Dough and Meat in an Oven Pan, same way you use the Grill; take the Pan out, put the ingredients in, and place it back to cook. Simple, but very good looking and tasty! Flat Dough and Meat in an Oven Pan, same way you use the Grill; take the Pan out, put the ingredients in, and place it back to cook. Simple, but very good looking and tasty!
<h2>Burritos:</h2> <h2>Burritos:</h2>
A personal favorite due to flexibility of options: Use a Tortilla as a base for all of these. For a meaty one, add 2 cooked cutlets to the Microwave; very simple and filling! To add some cheese to that meaty burrito use 2 meatballs and 1 cheese wedge <b>((For some reason only the base meaty burrito uses cutlets all the other recipies uses meatballs... please let someone in #wiki or #dev know if this changes.))</b> For a Breakfast Wrap, add a whole Egg, Cooked Bacon (Raw Bacon cooked in the Microwave), and Cheese in with the Tortilla. For Vegan Burritos, just cook a Tortilla and Tofu together in the Microwave. Burritos: A personal favorite due to flexibility of options: Use a Tortilla as a base for all of these. For a Chili one, add 2 Meatballs and 1 Space Spice (found near the Flour) to the Microwave; very simple and filling! Add a Cheese Wedge instead of the spice to make a queso burrito. For a Breakfast Wrap, add a whole Egg, Cooked Bacon (Raw Bacon cooked in the Microwave), and Cheese in with the Tortilla. For Vegan Burritos, just cook a Tortilla and Tofu together in the Microwave.
<h2>Tacos:</h2> <h2>Tacos:</h2>
Either a Tortilla or Dough Slice as the base, then 1 cooked Cutlet, and a Cheese Wedge. Very easy to mass produce, great in a pinch! Use a tortilla then 1 cooked Cutlet, and a Cheese Wedge. Very easy to mass produce, great in a pinch!
<h2>Cheesy Nachos:</h2> <h2>Cheesy Nachos:</h2>
Tortilla, Cheese and 1 unit of Salt in the microwave, the perfect Finger Food! Tortilla, Cheese and 1 unit of Salt in the microwave, the perfect Finger Food!
<h2>Spaghetti:</h2> <h2>Spaghetti:</h2>
@@ -126,11 +126,10 @@
<h4>((The websites linked above are also on our stations wiki. Which is always in need of helping heads to fix it up. The recipes listed on the web link may not be fully accurate so please don't be afraid to pop into the discord wiki channel and lend a hand!))</h4> <h4>((The websites linked above are also on our stations wiki. Which is always in need of helping heads to fix it up. The recipes listed on the web link may not be fully accurate so please don't be afraid to pop into the discord wiki channel and lend a hand!))</h4>
</body> </body>
</html> </html>
"} "}
//accurate as of 2/17/21 //accurate as of 2/23/21
/obj/item/weapon/book/manual//bar_guide /obj/item/weapon/book/manual/bar_guide
name = "How to Alcohol (And other Drinks)" name = "How to Alcohol (And other Drinks)"
desc = "A helpful guide to the world of barkeeping." desc = "A helpful guide to the world of barkeeping."
icon_state = "bar-guide" icon_state = "bar-guide"
@@ -214,7 +213,7 @@
1 part Beer, 2 parts Ale 1 part Beer, 2 parts Ale
<h3>Whiskey Cola:</h3> <h3>Whiskey Cola:</h3>
2 parts Whiskey, 1 part Space Cola 2 parts Whiskey, 1 part Space Cola
<h3>Binman Bliss: <h3>Binman Bliss:</h3>
1 part Sake, 1 part Tequila 1 part Sake, 1 part Tequila
<h1>High Alcohol</h1> <h1>High Alcohol</h1>

View File

@@ -77,14 +77,14 @@
//visible_message("[user] has smashed the snowball in their hand!", "You smash the snowball in your hand.") //visible_message("[user] has smashed the snowball in their hand!", "You smash the snowball in your hand.")
to_chat(user, "<span class='notice'>You smash the snowball in your hand.</span>") to_chat(user, "<span class='notice'>You smash the snowball in your hand.</span>")
var/atom/S = new /obj/item/stack/material/snow(user.loc) var/atom/S = new /obj/item/stack/material/snow(user.loc)
del(src) qdel(src)
user.put_in_hands(S) user.put_in_hands(S)
else else
//visible_message("[user] starts compacting the snowball.", "You start compacting the snowball.") //visible_message("[user] starts compacting the snowball.", "You start compacting the snowball.")
to_chat(user, "<span class='notice'>You start compacting the snowball.</span>") to_chat(user, "<span class='notice'>You start compacting the snowball.</span>")
if(do_after(user, 2 SECONDS)) if(do_after(user, 2 SECONDS))
var/atom/S = new /obj/item/weapon/material/snow/snowball/reinforced(user.loc) var/atom/S = new /obj/item/weapon/material/snow/snowball/reinforced(user.loc)
del(src) qdel(src)
user.put_in_hands(S) user.put_in_hands(S)
/obj/item/weapon/material/snow/snowball/reinforced /obj/item/weapon/material/snow/snowball/reinforced

View File

@@ -174,7 +174,7 @@
gauge_icon = "indicator_emergency" gauge_icon = "indicator_emergency"
/obj/item/weapon/tank/emergency/nitrogen/Initialize() /obj/item/weapon/tank/emergency/nitrogen/Initialize()
..() . = ..()
src.air_contents.adjust_gas("nitrogen", (10*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)) src.air_contents.adjust_gas("nitrogen", (10*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C))
/obj/item/weapon/tank/emergency/nitrogen/double /obj/item/weapon/tank/emergency/nitrogen/double

View File

@@ -671,7 +671,7 @@
always_process = TRUE always_process = TRUE
/obj/item/weapon/weldingtool/electric/mounted/exosuit/Initialize() /obj/item/weapon/weldingtool/electric/mounted/exosuit/Initialize()
..() . = ..()
if(istype(loc, /obj/item/mecha_parts/mecha_equipment)) if(istype(loc, /obj/item/mecha_parts/mecha_equipment))
equip_mount = loc equip_mount = loc

View File

@@ -19,29 +19,11 @@
var/can_speak = 0 //For MMIs and admin trickery. If an object has a brainmob in its contents, set this to 1 to allow it to speak. var/can_speak = 0 //For MMIs and admin trickery. If an object has a brainmob in its contents, set this to 1 to allow it to speak.
var/show_examine = TRUE // Does this pop up on a mob when the mob is examined? var/show_examine = TRUE // Does this pop up on a mob when the mob is examined?
var/register_as_dangerous_object = FALSE // Should this tell its turf that it is dangerous automatically?
/obj/Initialize()
if(register_as_dangerous_object)
register_dangerous_to_step()
return ..()
/obj/Destroy() /obj/Destroy()
STOP_PROCESSING(SSobj, src) STOP_PROCESSING(SSobj, src)
if(register_as_dangerous_object)
unregister_dangerous_to_step()
return ..() return ..()
/obj/Moved(atom/oldloc)
. = ..()
if(register_as_dangerous_object)
var/turf/old_turf = get_turf(oldloc)
var/turf/new_turf = get_turf(src)
if(old_turf != new_turf)
old_turf.unregister_dangerous_object(src)
new_turf.register_dangerous_object(src)
/obj/Topic(href, href_list, var/datum/tgui_state/state = GLOB.tgui_default_state) /obj/Topic(href, href_list, var/datum/tgui_state/state = GLOB.tgui_default_state)
if(usr && ..()) if(usr && ..())
return 1 return 1

View File

@@ -8,7 +8,7 @@
// creates a new object and deletes itself // creates a new object and deletes itself
/obj/random/Initialize() /obj/random/Initialize()
. = ..() ..()
if (!prob(spawn_nothing_percentage)) if (!prob(spawn_nothing_percentage))
spawn_item() spawn_item()
return INITIALIZE_HINT_QDEL return INITIALIZE_HINT_QDEL

View File

@@ -34,7 +34,6 @@ two tiles on initialization, and which way a cliff is facing may change during m
climbable = TRUE climbable = TRUE
climb_delay = 10 SECONDS climb_delay = 10 SECONDS
block_turf_edges = TRUE // Don't want turf edges popping up from the cliff edge. block_turf_edges = TRUE // Don't want turf edges popping up from the cliff edge.
register_as_dangerous_object = TRUE
var/icon_variant = null // Used to make cliffs less repeative by having a selection of sprites to display. var/icon_variant = null // Used to make cliffs less repeative by having a selection of sprites to display.
var/corner = FALSE // Used for icon things. var/corner = FALSE // Used for icon things.
@@ -44,6 +43,23 @@ two tiles on initialization, and which way a cliff is facing may change during m
var/is_double_cliff = FALSE // Set to true when making the two-tile cliffs, used for projectile checks. var/is_double_cliff = FALSE // Set to true when making the two-tile cliffs, used for projectile checks.
var/uphill_penalty = 30 // Odds of a projectile not making it up the cliff. var/uphill_penalty = 30 // Odds of a projectile not making it up the cliff.
/obj/structure/cliff/Initialize()
. = ..()
register_dangerous_to_step()
/obj/structure/cliff/Destroy()
unregister_dangerous_to_step()
. = ..()
/obj/structure/cliff/Moved(atom/oldloc)
. = ..()
if(.)
var/turf/old_turf = get_turf(oldloc)
var/turf/new_turf = get_turf(src)
if(old_turf != new_turf)
old_turf.unregister_dangerous_object(src)
new_turf.register_dangerous_object(src)
// These arrange their sprites at runtime, as opposed to being statically placed in the map file. // These arrange their sprites at runtime, as opposed to being statically placed in the map file.
/obj/structure/cliff/automatic /obj/structure/cliff/automatic
icon_state = "cliffbuilder" icon_state = "cliffbuilder"

View File

@@ -37,7 +37,6 @@
/obj/structure/closet/Initialize() /obj/structure/closet/Initialize()
..() ..()
// Closets need to come later because of spawners potentially creating objects during init.
return INITIALIZE_HINT_LATELOAD return INITIALIZE_HINT_LATELOAD
/obj/structure/closet/LateInitialize() /obj/structure/closet/LateInitialize()

View File

@@ -0,0 +1,25 @@
//Dance pole
/obj/structure/dancepole
name = "dance pole"
desc = "Engineered for your entertainment"
icon = 'icons/obj/objects_vr.dmi'
icon_state = "dancepole"
density = 0
anchored = 1
/obj/structure/dancepole/attackby(var/obj/item/O as obj, var/mob/user as mob)
if(O.is_screwdriver())
anchored = !anchored
playsound(src, O.usesound, 50, 1)
if(anchored)
to_chat(user, "<font color='blue'>You secure \the [src].</font>")
else
to_chat(user, "<font color='blue'>You unsecure \the [src].</font>")
if(O.is_wrench())
playsound(src, O.usesound, 50, 1)
to_chat(user, "<span class='notice'>Now disassembling \the [src]...</span>")
if(do_after(user, 30 * O.toolspeed))
if(!src) return
to_chat(user, "<span class='notice'>You dissasembled \the [src]!</span>")
new /obj/item/stack/material/steel(src.loc, 1)
qdel(src)

View File

@@ -14,7 +14,7 @@
var/smashed = 0 var/smashed = 0
/obj/structure/fireaxecabinet/Initialize() /obj/structure/fireaxecabinet/Initialize()
..() . = ..()
fireaxe = new /obj/item/weapon/material/twohanded/fireaxe() fireaxe = new /obj/item/weapon/material/twohanded/fireaxe()
/obj/structure/fireaxecabinet/attackby(var/obj/item/O as obj, var/mob/user as mob) //Marker -Agouri /obj/structure/fireaxecabinet/attackby(var/obj/item/O as obj, var/mob/user as mob) //Marker -Agouri

View File

@@ -22,7 +22,7 @@
var/list/harvest_loot = null // Should be an associative list for things to spawn, and their weights. An example would be a branch from a tree. var/list/harvest_loot = null // Should be an associative list for things to spawn, and their weights. An example would be a branch from a tree.
/obj/structure/flora/Initialize() /obj/structure/flora/Initialize()
..() . = ..()
if(randomize_size) if(randomize_size)
icon_scale_x = rand(min_x_scale * 100, max_x_scale * 100) / 100 icon_scale_x = rand(min_x_scale * 100, max_x_scale * 100) / 100

View File

@@ -28,7 +28,7 @@
icon_state = icon_state_opened icon_state = icon_state_opened
if(needscharger) if(needscharger)
new /obj/machinery/recharge_station/ghost_pod_recharger(src.loc) new /obj/machinery/recharge_station/ghost_pod_recharger(src.loc)
del(src) qdel(src)
return TRUE return TRUE
else else
return FALSE return FALSE

View File

@@ -25,7 +25,7 @@
var/list/clothing_possibilities var/list/clothing_possibilities
/obj/structure/ghost_pod/ghost_activated/human/Initialize() /obj/structure/ghost_pod/ghost_activated/human/Initialize()
..() . = ..()
handle_clothing_setup() handle_clothing_setup()
@@ -153,7 +153,7 @@
var/list/clothing_possibilities var/list/clothing_possibilities
/obj/structure/ghost_pod/manual/human/Initialize() /obj/structure/ghost_pod/manual/human/Initialize()
..() . = ..()
handle_clothing_setup() handle_clothing_setup()

View File

@@ -89,7 +89,7 @@
qdel(src) qdel(src)
/obj/structure/ghost_pod/ghost_activated/swarm_drone/event/Initialize() /obj/structure/ghost_pod/ghost_activated/swarm_drone/event/Initialize()
..() . = ..()
var/turf/T = get_turf(src) var/turf/T = get_turf(src)
say_dead_object("A <span class='notice'>[drone_class] swarm drone</span> shell is now available in \the [T.loc].", src) say_dead_object("A <span class='notice'>[drone_class] swarm drone</span> shell is now available in \the [T.loc].", src)

View File

@@ -20,7 +20,7 @@
var/total_creature_max //If set, it can spawn this many creatures, total, ever. var/total_creature_max //If set, it can spawn this many creatures, total, ever.
/obj/structure/prop/nest/Initialize() /obj/structure/prop/nest/Initialize()
..() . = ..()
den_mobs = list() den_mobs = list()
START_PROCESSING(SSobj, src) START_PROCESSING(SSobj, src)
last_spawn = world.time last_spawn = world.time

View File

@@ -23,7 +23,7 @@
return ..() return ..()
/obj/structure/cult/pylon/swarm/Initialize() /obj/structure/cult/pylon/swarm/Initialize()
..() . = ..()
active_beams = list() active_beams = list()
/obj/structure/cult/pylon/swarm/Destroy() /obj/structure/cult/pylon/swarm/Destroy()

View File

@@ -27,11 +27,10 @@
return FALSE return FALSE
/obj/effect/wingrille_spawn/Initialize() /obj/effect/wingrille_spawn/Initialize()
. = ..() if(win_path && ticker && ticker.current_state < GAME_STATE_PLAYING)
if(!win_path)
return
if(ticker && ticker.current_state < GAME_STATE_PLAYING)
activate() activate()
..()
return INITIALIZE_HINT_QDEL
/obj/effect/wingrille_spawn/proc/activate() /obj/effect/wingrille_spawn/proc/activate()
if(activated) return if(activated) return
@@ -58,7 +57,8 @@
activated = 1 activated = 1
for(var/obj/effect/wingrille_spawn/other in neighbours) for(var/obj/effect/wingrille_spawn/other in neighbours)
if(!other.activated) other.activate() if(!other.activated) other.activate()
qdel(src) if(initialized && !QDELETED(src))
qdel(src)
/obj/effect/wingrille_spawn/proc/handle_window_spawn(var/obj/structure/window/W) /obj/effect/wingrille_spawn/proc/handle_window_spawn(var/obj/structure/window/W)
return return

View File

@@ -4,6 +4,9 @@
return return
var/turf/turf_source = get_turf(source) var/turf/turf_source = get_turf(source)
if(!turf_source)
return
var/area/area_source = turf_source.loc
//allocate a channel if necessary now so its the same for everyone //allocate a channel if necessary now so its the same for everyone
channel = channel || open_sound_channel() channel = channel || open_sound_channel()
@@ -19,6 +22,11 @@
if(!M || !M.client) if(!M || !M.client)
continue continue
var/turf/T = get_turf(M) var/turf/T = get_turf(M)
if(!T)
continue
var/area/A = T.loc
if((A.soundproofed || area_source.soundproofed) && (A != area_source))
continue
var/distance = get_dist(T, turf_source) var/distance = get_dist(T, turf_source)
if(distance <= maxdistance) if(distance <= maxdistance)

View File

@@ -12,9 +12,13 @@ var/list/floor_decals = list()
/obj/effect/floor_decal/New(var/newloc, var/newdir, var/newcolour) /obj/effect/floor_decal/New(var/newloc, var/newdir, var/newcolour)
supplied_dir = newdir supplied_dir = newdir
if(newcolour) color = newcolour if(newcolour)
color = newcolour
..(newloc) ..(newloc)
// TODO: identify what is causing these atoms to be qdeleted in New()/Initialize()
// somewhere in this chain. Alternatively repath to /obj/floor_decal or some other
// abstract handler that explicitly doesn't invoke any obj behavior.
/obj/effect/floor_decal/Initialize() /obj/effect/floor_decal/Initialize()
add_to_turf_decals() add_to_turf_decals()
initialized = TRUE initialized = TRUE
@@ -42,11 +46,11 @@ var/list/floor_decals = list()
name = "reset marker" name = "reset marker"
/obj/effect/floor_decal/reset/Initialize() /obj/effect/floor_decal/reset/Initialize()
..()
var/turf/T = get_turf(src) var/turf/T = get_turf(src)
if(T.decals && T.decals.len) if(T.decals && T.decals.len)
T.decals.Cut() T.decals.Cut()
T.update_icon() T.update_icon()
initialized = TRUE
return INITIALIZE_HINT_QDEL return INITIALIZE_HINT_QDEL
/obj/effect/floor_decal/corner /obj/effect/floor_decal/corner

View File

@@ -317,7 +317,6 @@
name = "tiles" name = "tiles"
icon_state = "freezer" icon_state = "freezer"
initial_flooring = /decl/flooring/tiling/freezer initial_flooring = /decl/flooring/tiling/freezer
temperature = T0C - 5 // VOREStation Edit: Chillier Freezer Tiles on-start
/turf/simulated/floor/lino /turf/simulated/floor/lino
name = "lino" name = "lino"

View File

@@ -24,3 +24,6 @@
/decl/flooring/grass/outdoors/forest /decl/flooring/grass/outdoors/forest
icon = 'icons/turf/outdoors.dmi' icon = 'icons/turf/outdoors.dmi'
icon_base = "grass-dark" icon_base = "grass-dark"
/turf/simulated/floor/tiled/freezer/cold
temperature = T0C - 5

View File

@@ -86,7 +86,7 @@
var/static/list/antilight_cache var/static/list/antilight_cache
/turf/simulated/shuttle/Initialize(mapload) /turf/simulated/shuttle/Initialize(mapload)
..() . = ..()
if(!antilight_cache) if(!antilight_cache)
antilight_cache = list() antilight_cache = list()
for(var/diag in cornerdirs) for(var/diag in cornerdirs)

View File

@@ -1014,10 +1014,3 @@
oxygen = 0 oxygen = 0
nitrogen = 0 nitrogen = 0
temperature = TCMB temperature = TCMB
/*
/turf/simulated/floor/hull/New()
if(icon_state != "hullcenter0")
overrided_icon_state = icon_state
..()
*/

View File

@@ -31,7 +31,8 @@
to_chat(user, "<span class='notice'>You begin to remove \the [src] with your [W].</span>") to_chat(user, "<span class='notice'>You begin to remove \the [src] with your [W].</span>")
if(do_after(user, 4 SECONDS * W.toolspeed)) if(do_after(user, 4 SECONDS * W.toolspeed))
to_chat(user, "<span class='notice'>\The [src] has been dug up, and now lies in a pile nearby.</span>") to_chat(user, "<span class='notice'>\The [src] has been dug up, and now lies in a pile nearby.</span>")
new /obj/item/stack/material/snow(src) var/obj/item/stack/material/snow/S = new(src)
S.amount = 10
demote() demote()
else else
to_chat(user, "<span class='notice'>You decide to not finish removing \the [src].</span>") to_chat(user, "<span class='notice'>You decide to not finish removing \the [src].</span>")

View File

@@ -11,9 +11,3 @@
/turf/space/cracked_asteroid/is_space() // So people don't start floating when standing on it. /turf/space/cracked_asteroid/is_space() // So people don't start floating when standing on it.
return FALSE return FALSE
// u wot m8? ~Leshana
// /turf/space/cracked_asteroid/New()
// ..()
// spawn(2 SECONDS)
// overlays.Cut()

View File

@@ -2,7 +2,13 @@
name = "command" name = "command"
oxygen = MOLES_O2STANDARD oxygen = MOLES_O2STANDARD
nitrogen = MOLES_N2STANDARD nitrogen = MOLES_N2STANDARD
initialized = TRUE // Don't call init on unsimulated turfs (at least not yet) var/skip_init = TRUE // Don't call down the chain, apparently for performance when loading maps at runtime.
/turf/unsimulated/Initialize(mapload)
if(skip_init)
initialized = TRUE
return INITIALIZE_HINT_NORMAL
. = ..()
//VOREStation Add //VOREStation Add
/turf/unsimulated/fake_space /turf/unsimulated/fake_space

View File

@@ -14,7 +14,7 @@
/turf/unsimulated/beach/water /turf/unsimulated/beach/water
name = "Water" name = "Water"
icon_state = "water" icon_state = "water"
initialized = FALSE skip_init = FALSE
movement_cost = 4 // Water should slow you down, just like simulated turf. movement_cost = 4 // Water should slow you down, just like simulated turf.
/turf/unsimulated/beach/water/Initialize() /turf/unsimulated/beach/water/Initialize()

View File

@@ -9,7 +9,6 @@
density = 1 density = 1
alpha = 0 alpha = 0
blocks_air = 0 blocks_air = 0
initialized = FALSE
// Set these to get your desired planetary atmosphere. // Set these to get your desired planetary atmosphere.
oxygen = 0 oxygen = 0
@@ -17,6 +16,7 @@
carbon_dioxide = 0 carbon_dioxide = 0
phoron = 0 phoron = 0
temperature = T20C temperature = T20C
skip_init = FALSE
/turf/unsimulated/wall/planetary/Initialize() /turf/unsimulated/wall/planetary/Initialize()
. = ..() . = ..()

View File

@@ -86,6 +86,7 @@
entry += " - <span class='blue'>In Lobby</span><br>" entry += " - <span class='blue'>In Lobby</span><br>"
else else
entry += " - <span class='green'>Playing</span><br>" entry += " - <span class='green'>Playing</span><br>"
Lines += entry Lines += entry
msg += "<table>" msg += "<table>"

View File

@@ -31,7 +31,8 @@ GLOBAL_DATUM(character_directory, /datum/character_directory)
var/list/data = ..() var/list/data = ..()
data["personalVisibility"] = user?.client?.prefs?.show_in_directory data["personalVisibility"] = user?.client?.prefs?.show_in_directory
data["personalTag"] = user?.client?.prefs?.directory_tag data["personalTag"] = user?.client?.prefs?.directory_tag || "Unset"
data["personalErpTag"] = user?.client?.prefs?.directory_erptag || "Unset"
return data return data
@@ -49,7 +50,8 @@ GLOBAL_DATUM(character_directory, /datum/character_directory)
var/name = null var/name = null
var/ooc_notes = null var/ooc_notes = null
var/flavor_text = null var/flavor_text = null
var/tag = C.prefs.directory_tag var/tag = C.prefs.directory_tag || "Unset"
var/erptag = C.prefs.directory_erptag || "Unset"
var/character_ad = C.prefs.directory_ad var/character_ad = C.prefs.directory_ad
if(ishuman(C.mob)) if(ishuman(C.mob))
@@ -85,6 +87,7 @@ GLOBAL_DATUM(character_directory, /datum/character_directory)
"name" = name, "name" = name,
"ooc_notes" = ooc_notes, "ooc_notes" = ooc_notes,
"tag" = tag, "tag" = tag,
"erptag" = erptag,
"character_ad" = character_ad, "character_ad" = character_ad,
"flavor_text" = flavor_text, "flavor_text" = flavor_text,
))) )))
@@ -109,11 +112,17 @@ GLOBAL_DATUM(character_directory, /datum/character_directory)
update_tgui_static_data(usr, ui) update_tgui_static_data(usr, ui)
return TRUE return TRUE
if("setTag") if("setTag")
var/list/new_tag = input(usr, "Pick a new tag for the character directory", "Character Tag", usr?.client?.prefs?.directory_tag) as null|anything in GLOB.char_directory_tags var/list/new_tag = input(usr, "Pick a new Vore tag for the character directory", "Character Tag", usr?.client?.prefs?.directory_tag) as null|anything in GLOB.char_directory_tags
if(!new_tag) if(!new_tag)
return return
usr?.client?.prefs?.directory_tag = new_tag usr?.client?.prefs?.directory_tag = new_tag
return TRUE return TRUE
if("setErpTag")
var/list/new_erptag = input(usr, "Pick a new ERP tag for the character directory", "Character ERP Tag", usr?.client?.prefs?.directory_erptag) as null|anything in GLOB.char_directory_erptags
if(!new_erptag)
return
usr?.client?.prefs?.directory_erptag = new_erptag
return TRUE
if("setVisible") if("setVisible")
usr?.client?.prefs?.show_in_directory = !usr?.client?.prefs?.show_in_directory usr?.client?.prefs?.show_in_directory = !usr?.client?.prefs?.show_in_directory
to_chat(usr, "<span class='notice'>You are now [usr.client.prefs.show_in_directory ? "shown" : "not shown"] in the directory.</span>") to_chat(usr, "<span class='notice'>You are now [usr.client.prefs.show_in_directory ? "shown" : "not shown"] in the directory.</span>")

View File

@@ -1,4 +1,3 @@
/client/verb/who() /client/verb/who()
set name = "Who" set name = "Who"
set category = "OOC" set category = "OOC"
@@ -206,3 +205,4 @@
msg += "\n<span class='info'>Adminhelps are also sent to Discord. If no admins are available in game try anyway and an admin on Discord may see it and respond.</span>" msg += "\n<span class='info'>Adminhelps are also sent to Discord. If no admins are available in game try anyway and an admin on Discord may see it and respond.</span>"
return msg return msg

View File

@@ -2,7 +2,7 @@
name = "Form - Inventory Requisition r10.7.1E" name = "Form - Inventory Requisition r10.7.1E"
/obj/item/weapon/paper/carbon/cursedform/Initialize() /obj/item/weapon/paper/carbon/cursedform/Initialize()
..() . = ..()
info = {"<font face="Comic Sans MS" color=#DA0000><b><center></center><BR><center><I><B>Form - Inventory Requisition r10.7.1E</I></B></center><BR><center><font size="4">General Request Form</font></center><BR><BR><center><B>General</B></center><BR><BR>Name: <span class="paper_field"></span><BR>Department: <span class="paper_field"></span><BR>Departmental Rank: <span class="paper_field"></span><BR>Organization(If not Nanotrasen): <span class="paper_field"></span><BR>Date: <span class="paper_field"></span><BR><BR><BR><BR>Requested Item(s): <span class="paper_field"></span><BR>Quantity: <span class="paper_field"></span><BR>Reason for request: <span class="paper_field"></span><BR>Is this replacement equipment?: <span class="paper_field"></span><BR>If `Yes`; above, specify equiment and reason for replacement: <span class="paper_field"></span><BR><BR><BR><center><B>Authorization</B></center><BR><BR>Authorizing Department: <span class="paper_field"></span><BR>Authorizing Dept. Head: <span class="paper_field"></span><BR><BR><BR><center><B>Contact and Delivery</B></center><BR><BR>EPv2 Address of requesting party(Do not leave blank): <span class="paper_field"></span><BR>Delivery location or department: <span class="paper_field"></span><BR><BR><BR>Nanotrasen Employee Identification Number: <span class="paper_field"></span><BR><U>Signature of Requester and Date</U><BR><BR><span class="paper_field"></span><BR><BR><BR><BR>Authorizor`s Nanotrasen Employee Identification Number: <span class="paper_field"></span><BR><U>Authorizing Signature and Date(Include authorizing department`s stamp below)</U><BR><BR><span class="paper_field"></span><BR><BR><BR><center><B>Shipping Department Only</B></center><BR><center><I>(Do not write below this line)</I></center><BR>Nanotrasen Purchasing Approval Code: <span class="paper_field"></span><BR>Nanotrasen Employee Identification Number: <span class="paper_field"></span><BR>Receiving Shipping Employee: <span class="paper_field"></span><BR><U>Signature and Date</U><BR><BR><span class="paper_field"></span><BR></b></font>"} info = {"<font face="Comic Sans MS" color=#DA0000><b><center></center><BR><center><I><B>Form - Inventory Requisition r10.7.1E</I></B></center><BR><center><font size="4">General Request Form</font></center><BR><BR><center><B>General</B></center><BR><BR>Name: <span class="paper_field"></span><BR>Department: <span class="paper_field"></span><BR>Departmental Rank: <span class="paper_field"></span><BR>Organization(If not Nanotrasen): <span class="paper_field"></span><BR>Date: <span class="paper_field"></span><BR><BR><BR><BR>Requested Item(s): <span class="paper_field"></span><BR>Quantity: <span class="paper_field"></span><BR>Reason for request: <span class="paper_field"></span><BR>Is this replacement equipment?: <span class="paper_field"></span><BR>If `Yes`; above, specify equiment and reason for replacement: <span class="paper_field"></span><BR><BR><BR><center><B>Authorization</B></center><BR><BR>Authorizing Department: <span class="paper_field"></span><BR>Authorizing Dept. Head: <span class="paper_field"></span><BR><BR><BR><center><B>Contact and Delivery</B></center><BR><BR>EPv2 Address of requesting party(Do not leave blank): <span class="paper_field"></span><BR>Delivery location or department: <span class="paper_field"></span><BR><BR><BR>Nanotrasen Employee Identification Number: <span class="paper_field"></span><BR><U>Signature of Requester and Date</U><BR><BR><span class="paper_field"></span><BR><BR><BR><BR>Authorizor`s Nanotrasen Employee Identification Number: <span class="paper_field"></span><BR><U>Authorizing Signature and Date(Include authorizing department`s stamp below)</U><BR><BR><span class="paper_field"></span><BR><BR><BR><center><B>Shipping Department Only</B></center><BR><center><I>(Do not write below this line)</I></center><BR>Nanotrasen Purchasing Approval Code: <span class="paper_field"></span><BR>Nanotrasen Employee Identification Number: <span class="paper_field"></span><BR>Receiving Shipping Employee: <span class="paper_field"></span><BR><U>Signature and Date</U><BR><BR><span class="paper_field"></span><BR></b></font>"}
info_links = {"<font face="Comic Sans MS" color=#FF9300><b><center></center><BR><center><I><B>Form - Inventory Requisition r10.7.1E</I></B></center><BR><center><font size="4">General Request Form</font></center><BR><BR><center><B>General</B></center><BR><BR>Name: <span class="paper_field"><font face="Verdana"><A href='?src=[0x2057e0c];write=1'>write</A></font></span><BR>Department: <span class="paper_field"><font face="Verdana"><A href='?src=[0x2057e0c];write=2'>write</A></font></span><BR>Departmental Rank: <span class="paper_field"><font face="Verdana"><A href='?src=[0x2057e0c];write=3'>write</A></font></span><BR>Organization(If not Nanotrasen): <span class="paper_field"><font face="Verdana"><A href='?src=[0x2057e0c];write=4'>write</A></font></span><BR>Date: <span class="paper_field"><font face="Verdana"><A href='?src=[0x2057e0c];write=5'>write</A></font></span><BR><BR><BR><BR>Requested Item(s): <span class="paper_field"><font face="Verdana"><A href='?src=[0x2057e0c];write=6'>write</A></font></span><BR>Quantity: <span class="paper_field"><font face="Verdana"><A href='?src=[0x2057e0c];write=7'>write</A></font></span><BR>Reason for request: <span class="paper_field"><font face="Verdana"><A href='?src=[0x2057e0c];write=8'>write</A></font></span><BR>Is this replacement equipment?: <span class="paper_field"><font face="Verdana"><A href='?src=[0x2057e0c];write=9'>write</A></font></span><BR>If `Yes` above, specify equiment and reason for replacement: <span class="paper_field"><font face="Verdana"><A href='?src=[0x2057e0c];write=10'>write</A></font></span><BR><BR><BR><center><B>Authorization</B></center><BR><BR>Authorizing Department: <span class="paper_field"><font face="Verdana"><A href='?src=[0x2057e0c];write=11'>write</A></font></span><BR>Authorizing Dept. Head: <span class="paper_field"><font face="Verdana"><A href='?src=[0x2057e0c];write=12'>write</A></font></span><BR><BR><BR><center><B>Contact and Delivery</B></center><BR><BR>EPv2 Address of requesting party(Do not leave blank): <span class="paper_field"><font face="Verdana"><A href='?src=[0x2057e0c];write=13'>write</A></font></span><BR>Delivery location or department: <span class="paper_field"><font face="Verdana"><A href='?src=[0x2057e0c];write=14'>write</A></font></span><BR><BR><BR>Nanotrasen Employee Identification Number: <span class="paper_field"><font face="Verdana"><A href='?src=[0x2057e0c];write=15'>write</A></font></span><BR><U>Signature of Requester and Date</U><BR><BR><span class="paper_field"><font face="Verdana"><A href='?src=[0x2057e0c];write=16'>write</A></font></span><BR><BR><BR><BR>Authorizor`s Nanotrasen Employee Identification Number: <span class="paper_field"><font face="Verdana"><A href='?src=[0x2057e0c];write=17'>write</A></font></span><BR><U>Authorizing Signature and Date(Include authorizing department`s stamp below)</U><BR><BR><span class="paper_field"><font face="Verdana"><A href='?src=[0x2057e0c];write=18'>write</A></font></span><BR><BR><BR><center><B>Shipping Department Only</B></center><BR><center><I>(Do not write below this line)</I></center><BR>Nanotrasen Purchasing Approval Code: <span class="paper_field"><font face="Verdana"><A href='?src=[0x2057e0c];write=19'>write</A></font></span><BR>Nanotrasen Employee Identification Number: <span class="paper_field"><font face="Verdana"><A href='?src=[0x2057e0c];write=20'>write</A></font></span><BR>Receiving Shipping Employee: <span class="paper_field"><font face="Verdana"><A href='?src=[0x2057e0c];write=21'>write</A></font></span><BR><U>Signature and Date</U><BR><BR><span class="paper_field"><font face="Verdana"><A href='?src=[0x2057e0c];write=22'>write</A></font></span><BR></b></font><font face="Verdana"><A href='?src=[0x2057e0c];write=end'>write</A></font>"} info_links = {"<font face="Comic Sans MS" color=#FF9300><b><center></center><BR><center><I><B>Form - Inventory Requisition r10.7.1E</I></B></center><BR><center><font size="4">General Request Form</font></center><BR><BR><center><B>General</B></center><BR><BR>Name: <span class="paper_field"><font face="Verdana"><A href='?src=[0x2057e0c];write=1'>write</A></font></span><BR>Department: <span class="paper_field"><font face="Verdana"><A href='?src=[0x2057e0c];write=2'>write</A></font></span><BR>Departmental Rank: <span class="paper_field"><font face="Verdana"><A href='?src=[0x2057e0c];write=3'>write</A></font></span><BR>Organization(If not Nanotrasen): <span class="paper_field"><font face="Verdana"><A href='?src=[0x2057e0c];write=4'>write</A></font></span><BR>Date: <span class="paper_field"><font face="Verdana"><A href='?src=[0x2057e0c];write=5'>write</A></font></span><BR><BR><BR><BR>Requested Item(s): <span class="paper_field"><font face="Verdana"><A href='?src=[0x2057e0c];write=6'>write</A></font></span><BR>Quantity: <span class="paper_field"><font face="Verdana"><A href='?src=[0x2057e0c];write=7'>write</A></font></span><BR>Reason for request: <span class="paper_field"><font face="Verdana"><A href='?src=[0x2057e0c];write=8'>write</A></font></span><BR>Is this replacement equipment?: <span class="paper_field"><font face="Verdana"><A href='?src=[0x2057e0c];write=9'>write</A></font></span><BR>If `Yes` above, specify equiment and reason for replacement: <span class="paper_field"><font face="Verdana"><A href='?src=[0x2057e0c];write=10'>write</A></font></span><BR><BR><BR><center><B>Authorization</B></center><BR><BR>Authorizing Department: <span class="paper_field"><font face="Verdana"><A href='?src=[0x2057e0c];write=11'>write</A></font></span><BR>Authorizing Dept. Head: <span class="paper_field"><font face="Verdana"><A href='?src=[0x2057e0c];write=12'>write</A></font></span><BR><BR><BR><center><B>Contact and Delivery</B></center><BR><BR>EPv2 Address of requesting party(Do not leave blank): <span class="paper_field"><font face="Verdana"><A href='?src=[0x2057e0c];write=13'>write</A></font></span><BR>Delivery location or department: <span class="paper_field"><font face="Verdana"><A href='?src=[0x2057e0c];write=14'>write</A></font></span><BR><BR><BR>Nanotrasen Employee Identification Number: <span class="paper_field"><font face="Verdana"><A href='?src=[0x2057e0c];write=15'>write</A></font></span><BR><U>Signature of Requester and Date</U><BR><BR><span class="paper_field"><font face="Verdana"><A href='?src=[0x2057e0c];write=16'>write</A></font></span><BR><BR><BR><BR>Authorizor`s Nanotrasen Employee Identification Number: <span class="paper_field"><font face="Verdana"><A href='?src=[0x2057e0c];write=17'>write</A></font></span><BR><U>Authorizing Signature and Date(Include authorizing department`s stamp below)</U><BR><BR><span class="paper_field"><font face="Verdana"><A href='?src=[0x2057e0c];write=18'>write</A></font></span><BR><BR><BR><center><B>Shipping Department Only</B></center><BR><center><I>(Do not write below this line)</I></center><BR>Nanotrasen Purchasing Approval Code: <span class="paper_field"><font face="Verdana"><A href='?src=[0x2057e0c];write=19'>write</A></font></span><BR>Nanotrasen Employee Identification Number: <span class="paper_field"><font face="Verdana"><A href='?src=[0x2057e0c];write=20'>write</A></font></span><BR>Receiving Shipping Employee: <span class="paper_field"><font face="Verdana"><A href='?src=[0x2057e0c];write=21'>write</A></font></span><BR><U>Signature and Date</U><BR><BR><span class="paper_field"><font face="Verdana"><A href='?src=[0x2057e0c];write=22'>write</A></font></span><BR></b></font><font face="Verdana"><A href='?src=[0x2057e0c];write=end'>write</A></font>"}

View File

@@ -8,18 +8,14 @@
/obj/effect/spawner/lootdrop/Initialize() /obj/effect/spawner/lootdrop/Initialize()
..() ..()
var/list/things = params2list(loot) var/list/things = params2list(loot)
if(things && things.len) if(things && things.len)
for(var/i = lootcount, i > 0, i--) for(var/i = lootcount, i > 0, i--)
if(!things.len) if(!things.len)
return return
var/loot_spawn = pick(things) var/loot_spawn = pick(things)
var/loot_path = text2path(loot_spawn) var/loot_path = text2path(loot_spawn)
if(!loot_path || !lootdoubles) if(!loot_path || !lootdoubles)
things.Remove(loot_spawn) things.Remove(loot_spawn)
continue continue
new loot_path(get_turf(src)) new loot_path(get_turf(src))
return INITIALIZE_HINT_QDEL return INITIALIZE_HINT_QDEL

View File

@@ -45,7 +45,6 @@
if( findtext(href,"<script",1,0) ) if( findtext(href,"<script",1,0) )
to_world_log("Attempted use of scripts within a topic call, by [src]") to_world_log("Attempted use of scripts within a topic call, by [src]")
message_admins("Attempted use of scripts within a topic call, by [src]") message_admins("Attempted use of scripts within a topic call, by [src]")
//del(usr)
return return
// Tgui Topic middleware // Tgui Topic middleware

View File

@@ -23,7 +23,8 @@
// Physical traits are what they sound like, and involve the character's physical body, as opposed to their mental state. // Physical traits are what they sound like, and involve the character's physical body, as opposed to their mental state.
/datum/trait/modifier/physical /datum/trait/modifier/physical
category = "Physical Quirks" //VOREStation Edit name = "Physical"
category = "Physical"
/datum/trait/modifier/physical/flimsy /datum/trait/modifier/physical/flimsy
@@ -194,6 +195,7 @@
// 'Mental' traits are just those that only sapients can have, for now, and generally involves fears. // 'Mental' traits are just those that only sapients can have, for now, and generally involves fears.
// So far, all of them are just for fluff/don't have mechanical effects. // So far, all of them are just for fluff/don't have mechanical effects.
/datum/trait/modifier/mental /datum/trait/modifier/mental
name = "Mental"
category = "Mental" category = "Mental"
/datum/trait/modifier/mental/test_for_invalidity(var/datum/category_item/player_setup_item/traits/setup) /datum/trait/modifier/mental/test_for_invalidity(var/datum/category_item/player_setup_item/traits/setup)

View File

@@ -45,7 +45,6 @@
character.weight_gain = pref.weight_gain character.weight_gain = pref.weight_gain
character.weight_loss = pref.weight_loss character.weight_loss = pref.weight_loss
character.fuzzy = pref.fuzzy character.fuzzy = pref.fuzzy
character.appearance_flags -= pref.fuzzy*PIXEL_SCALE
character.resize(pref.size_multiplier, animate = FALSE) character.resize(pref.size_multiplier, animate = FALSE)
/datum/category_item/player_setup_item/vore/size/content(var/mob/user) /datum/category_item/player_setup_item/vore/size/content(var/mob/user)
@@ -70,7 +69,7 @@
else if(href_list["toggle_fuzzy"]) else if(href_list["toggle_fuzzy"])
pref.fuzzy = pref.fuzzy ? 0 : 1; pref.fuzzy = pref.fuzzy ? 0 : 1;
return TOPIC_REFRESH return TOPIC_REFRESH_UPDATE_PREVIEW
else if(href_list["weight"]) else if(href_list["weight"])
var/new_weight = input(user, "Choose your character's relative body weight.\n\ var/new_weight = input(user, "Choose your character's relative body weight.\n\

View File

@@ -2,11 +2,19 @@
#define NEUTRAL_MODE 2 #define NEUTRAL_MODE 2
#define NEGATIVE_MODE 3 #define NEGATIVE_MODE 3
#define ORGANICS 1
#define SYNTHETICS 2
/datum/preferences /datum/preferences
var/custom_species // Custom species name, can't be changed due to it having been used in savefiles already. var/custom_species // Custom species name, can't be changed due to it having been used in savefiles already.
var/custom_base // What to base the custom species on var/custom_base // What to base the custom species on
var/blood_color = "#A10808" var/blood_color = "#A10808"
var/custom_say = null
var/custom_whisper = null
var/custom_ask = null
var/custom_exclaim = null
var/list/pos_traits = list() // What traits they've selected for their custom species var/list/pos_traits = list() // What traits they've selected for their custom species
var/list/neu_traits = list() var/list/neu_traits = list()
var/list/neg_traits = list() var/list/neg_traits = list()
@@ -15,6 +23,7 @@
var/starting_trait_points = STARTING_SPECIES_POINTS var/starting_trait_points = STARTING_SPECIES_POINTS
var/max_traits = MAX_SPECIES_TRAITS var/max_traits = MAX_SPECIES_TRAITS
var/dirty_synth = 0 //Are you a synth var/dirty_synth = 0 //Are you a synth
var/gross_meatbag = 0 //Where'd I leave my Voight-Kampff test kit?
// Definition of the stuff for Ears // Definition of the stuff for Ears
/datum/category_item/player_setup_item/vore/traits /datum/category_item/player_setup_item/vore/traits
@@ -29,10 +38,15 @@
S["neg_traits"] >> pref.neg_traits S["neg_traits"] >> pref.neg_traits
S["blood_color"] >> pref.blood_color S["blood_color"] >> pref.blood_color
S["traits_cheating"]>> pref.traits_cheating S["traits_cheating"] >> pref.traits_cheating
S["max_traits"] >> pref.max_traits S["max_traits"] >> pref.max_traits
S["trait_points"] >> pref.starting_trait_points S["trait_points"] >> pref.starting_trait_points
S["custom_say"] >> pref.custom_say
S["custom_whisper"] >> pref.custom_whisper
S["custom_ask"] >> pref.custom_ask
S["custom_exclaim"] >> pref.custom_exclaim
/datum/category_item/player_setup_item/vore/traits/save_character(var/savefile/S) /datum/category_item/player_setup_item/vore/traits/save_character(var/savefile/S)
S["custom_species"] << pref.custom_species S["custom_species"] << pref.custom_species
S["custom_base"] << pref.custom_base S["custom_base"] << pref.custom_base
@@ -41,10 +55,15 @@
S["neg_traits"] << pref.neg_traits S["neg_traits"] << pref.neg_traits
S["blood_color"] << pref.blood_color S["blood_color"] << pref.blood_color
S["traits_cheating"]<< pref.traits_cheating S["traits_cheating"] << pref.traits_cheating
S["max_traits"] << pref.max_traits S["max_traits"] << pref.max_traits
S["trait_points"] << pref.starting_trait_points S["trait_points"] << pref.starting_trait_points
S["custom_say"] << pref.custom_say
S["custom_whisper"] << pref.custom_whisper
S["custom_ask"] << pref.custom_ask
S["custom_exclaim"] << pref.custom_exclaim
/datum/category_item/player_setup_item/vore/traits/sanitize_character() /datum/category_item/player_setup_item/vore/traits/sanitize_character()
if(!pref.pos_traits) pref.pos_traits = list() if(!pref.pos_traits) pref.pos_traits = list()
if(!pref.neu_traits) pref.neu_traits = list() if(!pref.neu_traits) pref.neu_traits = list()
@@ -82,11 +101,17 @@
/datum/category_item/player_setup_item/vore/traits/copy_to_mob(var/mob/living/carbon/human/character) /datum/category_item/player_setup_item/vore/traits/copy_to_mob(var/mob/living/carbon/human/character)
character.custom_species = pref.custom_species character.custom_species = pref.custom_species
character.custom_say = pref.custom_say
character.custom_ask = pref.custom_ask
character.custom_whisper = pref.custom_whisper
character.custom_exclaim = pref.custom_exclaim
if(character.isSynthetic()) //Checking if we have a synth on our hands, boys. if(character.isSynthetic()) //Checking if we have a synth on our hands, boys.
pref.dirty_synth = 1 pref.dirty_synth = 1
else //CHOMPEdit pref.gross_meatbag = 0
pref.dirty_synth = 0 //CHOMPEdit else
pref.gross_meatbag = 1
pref.dirty_synth = 0
var/datum/species/S = character.species var/datum/species/S = character.species
var/SB var/SB
@@ -153,6 +178,16 @@
. += "<b>Blood Color: </b>" //People that want to use a certain species to have that species traits (xenochimera/promethean/spider) should be able to set their own blood color. . += "<b>Blood Color: </b>" //People that want to use a certain species to have that species traits (xenochimera/promethean/spider) should be able to set their own blood color.
. += "<a href='?src=\ref[src];blood_color=1'>Set Color</a>" . += "<a href='?src=\ref[src];blood_color=1'>Set Color</a>"
. += "<a href='?src=\ref[src];blood_reset=1'>R</a><br>" . += "<a href='?src=\ref[src];blood_reset=1'>R</a><br>"
. += "<br>"
. += "<b>Custom Say: </b>"
. += "<a href='?src=\ref[src];custom_say=1'>Set Say Verb</a><br>"
. += "<b>Custom Whisper: </b>"
. += "<a href='?src=\ref[src];custom_whisper=1'>Set Whisper Verb</a><br>"
. += "<b>Custom Ask: </b>"
. += "<a href='?src=\ref[src];custom_ask=1'>Set Ask Verb</a><br>"
. += "<b>Custom Exclaim: </b>"
. += "<a href='?src=\ref[src];custom_exclaim=1'>Set Exclaim Verb</a><br>"
/datum/category_item/player_setup_item/vore/traits/OnTopic(var/href,var/list/href_list, var/mob/user) /datum/category_item/player_setup_item/vore/traits/OnTopic(var/href,var/list/href_list, var/mob/user)
if(!CanUseTopic(user)) if(!CanUseTopic(user))
@@ -216,6 +251,30 @@
pref.neg_traits -= trait pref.neg_traits -= trait
return TOPIC_REFRESH return TOPIC_REFRESH
else if(href_list["custom_say"])
var/say_choice = sanitize(input(usr, "This word or phrase will appear instead of 'says': [pref.real_name] says, \"Hi.\"", "Custom Say", pref.custom_say) as null|text, 12)
if(say_choice)
pref.custom_say = say_choice
return TOPIC_REFRESH
else if(href_list["custom_whisper"])
var/whisper_choice = sanitize(input(usr, "This word or phrase will appear instead of 'whispers': [pref.real_name] whispers, \"Hi...\"", "Custom Whisper", pref.custom_whisper) as null|text, 12)
if(whisper_choice)
pref.custom_whisper = whisper_choice
return TOPIC_REFRESH
else if(href_list["custom_ask"])
var/ask_choice = sanitize(input(usr, "This word or phrase will appear instead of 'asks': [pref.real_name] asks, \"Hi?\"", "Custom Ask", pref.custom_ask) as null|text, 12)
if(ask_choice)
pref.custom_ask = ask_choice
return TOPIC_REFRESH
else if(href_list["custom_exclaim"])
var/exclaim_choice = sanitize(input(usr, "This word or phrase will appear instead of 'exclaims', 'shouts' or 'yells': [pref.real_name] exclaims, \"Hi!\"", "Custom Exclaim", pref.custom_exclaim) as null|text, 12)
if(exclaim_choice)
pref.custom_exclaim = exclaim_choice
return TOPIC_REFRESH
else if(href_list["add_trait"]) else if(href_list["add_trait"])
var/mode = text2num(href_list["add_trait"]) var/mode = text2num(href_list["add_trait"])
var/list/picklist var/list/picklist
@@ -276,13 +335,19 @@
var/conflict = FALSE var/conflict = FALSE
user.isSynthetic() //Recheck just to be sure if(pref.dirty_synth && !(instance.can_take & SYNTHETICS))
if(pref.dirty_synth && instance.not_for_synths)//if you are a synth you can't take this trait. alert("The trait you've selected can only be taken by organic characters!","Error")
alert("You cannot take this trait as a SYNTH.\ //pref.dirty_synth = 0 //Just to be sure //CHOMPEdit this shit broke, stop.
Please remove that trait, or pick another trait to add.","Error")
//pref.dirty_synth = 0 //Just to be sure // Commented out because it allow for someone to take a synth-blacklisted trait CHOMP Edit
return TOPIC_REFRESH return TOPIC_REFRESH
if(pref.gross_meatbag && !(instance.can_take & ORGANICS))
alert("The trait you've selected can only be taken by synthetic characters!","Error")
pref.gross_meatbag = 0 //Just to be sure
return TOPIC_REFRESH
if(pref.species in instance.banned_species)
alert("The trait you've selected cannot be taken by the species you've chosen!","Error")
return TOPIC_REFRESH
if(trait_choice in pref.pos_traits + pref.neu_traits + pref.neg_traits) if(trait_choice in pref.pos_traits + pref.neu_traits + pref.neg_traits)
conflict = instance.name conflict = instance.name

View File

@@ -7,12 +7,14 @@
/datum/category_item/player_setup_item/vore/misc/load_character(var/savefile/S) /datum/category_item/player_setup_item/vore/misc/load_character(var/savefile/S)
S["show_in_directory"] >> pref.show_in_directory S["show_in_directory"] >> pref.show_in_directory
S["directory_tag"] >> pref.directory_tag S["directory_tag"] >> pref.directory_tag
S["directory_erptag"] >> pref.directory_erptag
S["directory_ad"] >> pref.directory_ad S["directory_ad"] >> pref.directory_ad
S["sensorpref"] >> pref.sensorpref //TFF 5/8/19 - add sensor pref setting to load after saved S["sensorpref"] >> pref.sensorpref //TFF 5/8/19 - add sensor pref setting to load after saved
/datum/category_item/player_setup_item/vore/misc/save_character(var/savefile/S) /datum/category_item/player_setup_item/vore/misc/save_character(var/savefile/S)
S["show_in_directory"] << pref.show_in_directory S["show_in_directory"] << pref.show_in_directory
S["directory_tag"] << pref.directory_tag S["directory_tag"] << pref.directory_tag
S["directory_erptag"] << pref.directory_erptag
S["directory_ad"] << pref.directory_ad S["directory_ad"] << pref.directory_ad
S["sensorpref"] << pref.sensorpref //TFF 5/8/19 - add sensor pref setting to be saveable S["sensorpref"] << pref.sensorpref //TFF 5/8/19 - add sensor pref setting to be saveable
@@ -25,12 +27,14 @@
/datum/category_item/player_setup_item/vore/misc/sanitize_character() /datum/category_item/player_setup_item/vore/misc/sanitize_character()
pref.show_in_directory = sanitize_integer(pref.show_in_directory, 0, 1, initial(pref.show_in_directory)) pref.show_in_directory = sanitize_integer(pref.show_in_directory, 0, 1, initial(pref.show_in_directory))
pref.directory_tag = sanitize_inlist(pref.directory_tag, GLOB.char_directory_tags, initial(pref.directory_tag)) pref.directory_tag = sanitize_inlist(pref.directory_tag, GLOB.char_directory_tags, initial(pref.directory_tag))
pref.directory_erptag = sanitize_inlist(pref.directory_erptag, GLOB.char_directory_erptags, initial(pref.directory_erptag))
pref.sensorpref = sanitize_integer(pref.sensorpref, 1, sensorpreflist.len, initial(pref.sensorpref)) //TFF - 5/8/19 - add santisation for sensor prefs pref.sensorpref = sanitize_integer(pref.sensorpref, 1, sensorpreflist.len, initial(pref.sensorpref)) //TFF - 5/8/19 - add santisation for sensor prefs
/datum/category_item/player_setup_item/vore/misc/content(var/mob/user) /datum/category_item/player_setup_item/vore/misc/content(var/mob/user)
. += "<br>" . += "<br>"
. += "<b>Appear in Character Directory:</b> <a [pref.show_in_directory ? "class='linkOn'" : ""] href='?src=\ref[src];toggle_show_in_directory=1'><b>[pref.show_in_directory ? "Yes" : "No"]</b></a><br>" . += "<b>Appear in Character Directory:</b> <a [pref.show_in_directory ? "class='linkOn'" : ""] href='?src=\ref[src];toggle_show_in_directory=1'><b>[pref.show_in_directory ? "Yes" : "No"]</b></a><br>"
. += "<b>Character Directory Tag:</b> <a href='?src=\ref[src];directory_tag=1'><b>[pref.directory_tag]</b></a><br>" . += "<b>Character Directory Vore Tag:</b> <a href='?src=\ref[src];directory_tag=1'><b>[pref.directory_tag]</b></a><br>"
. += "<b>Character Directory ERP Tag:</b> <a href='?src=\ref[src];directory_erptag=1'><b>[pref.directory_erptag]</b></a><br>"
. += "<b>Character Directory Advertisement:</b> <a href='?src=\ref[src];directory_ad=1'><b>Set Directory Ad</b></a><br>" . += "<b>Character Directory Advertisement:</b> <a href='?src=\ref[src];directory_ad=1'><b>Set Directory Ad</b></a><br>"
. += "<b>Suit Sensors Preference:</b> <a [pref.sensorpref ? "" : ""] href='?src=\ref[src];toggle_sensor_setting=1'><b>[sensorpreflist[pref.sensorpref]]</b></a><br>" //TFF 5/8/19 - Allow selection of sensor settings from off, binary, vitals, tracking, or random . += "<b>Suit Sensors Preference:</b> <a [pref.sensorpref ? "" : ""] href='?src=\ref[src];toggle_sensor_setting=1'><b>[sensorpreflist[pref.sensorpref]]</b></a><br>" //TFF 5/8/19 - Allow selection of sensor settings from off, binary, vitals, tracking, or random
@@ -39,11 +43,17 @@
pref.show_in_directory = pref.show_in_directory ? 0 : 1; pref.show_in_directory = pref.show_in_directory ? 0 : 1;
return TOPIC_REFRESH return TOPIC_REFRESH
else if(href_list["directory_tag"]) else if(href_list["directory_tag"])
var/new_tag = input(user, "Pick a new tag for the character directory", "Character Tag", pref.directory_tag) as null|anything in GLOB.char_directory_tags var/new_tag = input(user, "Pick a new Vore tag for the character directory", "Character Vore Tag", pref.directory_tag) as null|anything in GLOB.char_directory_tags
if(!new_tag) if(!new_tag)
return return
pref.directory_tag = new_tag pref.directory_tag = new_tag
return TOPIC_REFRESH return TOPIC_REFRESH
else if(href_list["directory_erptag"])
var/new_erptag = input(user, "Pick a new ERP tag for the character directory", "Character ERP Tag", pref.directory_erptag) as null|anything in GLOB.char_directory_erptags
if(!new_erptag)
return
pref.directory_erptag = new_erptag
return TOPIC_REFRESH
else if(href_list["directory_ad"]) else if(href_list["directory_ad"])
var/msg = sanitize(input(user,"Write your advertisement here!", "Flavor Text", html_decode(pref.directory_ad)) as message, extra = 0) //VOREStation Edit: separating out OOC notes var/msg = sanitize(input(user,"Write your advertisement here!", "Flavor Text", html_decode(pref.directory_ad)) as message, extra = 0) //VOREStation Edit: separating out OOC notes
pref.directory_ad = msg pref.directory_ad = msg

View File

@@ -0,0 +1,12 @@
/client/proc/pingfromtime(time)
return ((world.time+world.tick_lag*world.tick_usage/100)-time)*100
/client/verb/display_ping(time as num)
set instant = TRUE
set name = ".display_ping"
to_chat(src, "<span class='notice'>Round trip ping took [round(pingfromtime(time),1)]ms</span>")
/client/verb/ping()
set name = "Ping"
set category = "OOC"
winset(src, null, "command=.display_ping+[world.time+world.tick_lag*world.tick_usage/100]")

View File

@@ -104,7 +104,7 @@
return battery return battery
/obj/item/clothing/gloves/ring/buzzer/Initialize() /obj/item/clothing/gloves/ring/buzzer/Initialize()
..() . = ..()
if(!battery) if(!battery)
battery = new battery_type(src) battery = new battery_type(src)

View File

@@ -130,14 +130,40 @@
armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 100, rad = 100) armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 100, rad = 100)
siemens_coefficient = 0.5 siemens_coefficient = 0.5
icon = 'icons/obj/clothing/hats_vr.dmi' icon = 'icons/obj/clothing/hats_vr.dmi'
enables_planes = list(VIS_CH_ID,VIS_CH_HEALTH_VR,VIS_AUGMENTED)
var/away_planes = null
plane_slots = list(slot_head)
var/hud_active = 1
var/activation_sound = 'sound/items/nif_click.ogg'
/obj/item/clothing/head/helmet/space/void/responseteam/verb/toggle()
set category = "Object"
set name = "Toggle Mark 7 Suit HUD"
set src in usr
if(usr.canmove && !usr.stat && !usr.restrained())
if(src.hud_active)
away_planes = enables_planes
enables_planes = null
to_chat(usr, "You disable the inbuilt heads-up display.")
hud_active = 0
else
enables_planes = away_planes
away_planes = null
to_chat(usr, "You enable the inbuilt heads-up display.")
hud_active = 1
usr << activation_sound
usr.recalculate_vis()
/obj/item/clothing/head/helmet/space/void/responseteam/command /obj/item/clothing/head/helmet/space/void/responseteam/command
name = "Mark VII-C Emergency Response Team Commander Helmet" name = "Mark VII-C Emergency Response Team Commander Helmet"
enables_planes = list(VIS_CH_ID,VIS_CH_HEALTH_VR,VIS_CH_STATUS_R,VIS_CH_BACKUP,VIS_CH_WANTED,VIS_AUGMENTED)
/obj/item/clothing/head/helmet/space/void/responseteam/medical /obj/item/clothing/head/helmet/space/void/responseteam/medical
name = "Mark VII-M Emergency Medical Response Helmet" name = "Mark VII-M Emergency Medical Response Helmet"
icon_state = "erthelmet_m" icon_state = "erthelmet_m"
item_state = "erthelmet_m" item_state = "erthelmet_m"
enables_planes = list(VIS_CH_ID,VIS_CH_HEALTH_VR,VIS_CH_STATUS_R,VIS_CH_BACKUP,VIS_AUGMENTED)
/obj/item/clothing/head/helmet/space/void/responseteam/engineer /obj/item/clothing/head/helmet/space/void/responseteam/engineer
name = "Mark VII-E Emergency Engineering Response Helmet" name = "Mark VII-E Emergency Engineering Response Helmet"
@@ -148,6 +174,7 @@
name = "Mark VII-S Emergency Security Response Helmet" name = "Mark VII-S Emergency Security Response Helmet"
icon_state = "erthelmet_s" icon_state = "erthelmet_s"
item_state = "erthelmet_s" item_state = "erthelmet_s"
enables_planes = list(VIS_CH_ID,VIS_CH_HEALTH_VR,VIS_CH_WANTED,VIS_AUGMENTED)
/obj/item/clothing/head/helmet/space/void/responseteam/janitor /obj/item/clothing/head/helmet/space/void/responseteam/janitor
name = "Mark VII-J Emergency Cleanup Response Helmet" name = "Mark VII-J Emergency Cleanup Response Helmet"

View File

@@ -12,7 +12,7 @@
var/hide_on_roll = FALSE var/hide_on_roll = FALSE
/obj/item/clothing/accessory/storage/Initialize() /obj/item/clothing/accessory/storage/Initialize()
..() . = ..()
hold = new/obj/item/weapon/storage/internal(src) hold = new/obj/item/weapon/storage/internal(src)
hold.max_storage_space = slots * 2 hold.max_storage_space = slots * 2
hold.max_w_class = ITEMSIZE_SMALL hold.max_w_class = ITEMSIZE_SMALL
@@ -95,7 +95,7 @@
slots = 2 slots = 2
/obj/item/clothing/accessory/storage/knifeharness/Initialize() /obj/item/clothing/accessory/storage/knifeharness/Initialize()
..() . = ..()
hold.max_storage_space = ITEMSIZE_COST_SMALL * 2 hold.max_storage_space = ITEMSIZE_COST_SMALL * 2
hold.can_hold = list(/obj/item/weapon/material/knife/machete/hatchet/unathiknife,\ hold.can_hold = list(/obj/item/weapon/material/knife/machete/hatchet/unathiknife,\
/obj/item/weapon/material/knife,\ /obj/item/weapon/material/knife,\

View File

@@ -73,7 +73,7 @@
to_chat(H,"<span class='warning'>You must be WEARING the uniform to change your size.</span>") to_chat(H,"<span class='warning'>You must be WEARING the uniform to change your size.</span>")
return return
var/new_size = input("Put the desired size (25-200%)", "Set Size", 200) as num|null var/new_size = input("Put the desired size (25-200%), or (1-600%) in dormitory areas.", "Set Size", 200) as num|null
//Check AGAIN because we accepted user input which is blocking. //Check AGAIN because we accepted user input which is blocking.
if (src != H.w_uniform) if (src != H.w_uniform)
@@ -89,7 +89,7 @@
H.update_icons() //Just want the matrix transform H.update_icons() //Just want the matrix transform
return return
if (!ISINRANGE(new_size,25,200)) if (!H.size_range_check(new_size))
to_chat(H,"<span class='notice'>The safety features of the uniform prevent you from choosing this size.</span>") to_chat(H,"<span class='notice'>The safety features of the uniform prevent you from choosing this size.</span>")
return return

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